From patchwork Mon Jun 27 15:52:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manish Goregaokar X-Patchwork-Id: 13406 Received: (qmail 95353 invoked by alias); 27 Jun 2016 15:52:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 95316 invoked by uid 89); 27 Jun 2016 15:52:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=Empty, x0, 1175, TYPE_NAME X-HELO: mail-wm0-f46.google.com Received: from mail-wm0-f46.google.com (HELO mail-wm0-f46.google.com) (74.125.82.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 27 Jun 2016 15:52:41 +0000 Received: by mail-wm0-f46.google.com with SMTP id f126so106188602wma.1 for ; Mon, 27 Jun 2016 08:52:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=wXWxjgfJiSMJcEJYHDvFp3Ghos1v2DzKnP5PAraQL5w=; b=U2F/NmRM2ZqVnWNR1UY2Xi60BHx4TGBpPU3KWq5b/PPbK57ci08RFXg76CEDOBFDGQ 6xGkvQ6SiCOSdq6ExrajKfKh0CQ/HB1f/P8glhQ/UFfXAfH+1fnOtTNPnwOKUmHSzNZs hM6MZD9nGpvwZFG9dsuEJXopRfzHIoqPDWoZ1CuluXhwfF3F6Cotl/QoHVXwvTcxs6uF z2mYE7dcFkj5Ie68XViqzVM4H68cZGuMA0pxC3kmTUbvOWDEJRyv1B5lueKXSTbbDLPO krWZuy5M6aSp4BeZVqnlSyzviRQGEnBLM0EIDa4MJEJgH8bcKBVdOg7ONGI/DDNpolDo NJNA== X-Gm-Message-State: ALyK8tJoOTdCjNx8aGaEb7X6BtqJxz2R4ELU+nBHhum4Qqi7VBXB4IZydMnSjzmw67ktv7JHhHaoO+zYAbVy608j X-Received: by 10.194.109.232 with SMTP id hv8mr1539272wjb.115.1467042753709; Mon, 27 Jun 2016 08:52:33 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.36.215 with HTTP; Mon, 27 Jun 2016 08:52:33 -0700 (PDT) From: Manish Goregaokar Date: Mon, 27 Jun 2016 21:22:33 +0530 Message-ID: Subject: [PATCH] Print void types correctly in Rust To: gdb-patches@sourceware.org, Tom Tromey X-IsSubscribed: yes Rust prefers to not specify the return type of a function when it is unit (`()`). The type is also referred to as "void" in debuginfo but not in actual usage, so we should never be printing "void" when the language is Rust. gdb/ChangeLog: * rust-lang.c: Print unit types as "()" * rust-lang.c: Omit return type for functions returning unit gdb/testsuite/ChangeLog: 2016-06-27 Manish Goregaokar * gdb.rust/simple.rs: Add test for returning unit in a function * gdb.rust/simple.exp: Add expectation for functions returning unit --- gdb/rust-lang.c | 22 ++++++++++++++++++---- gdb/testsuite/gdb.rust/simple.exp | 1 + gdb/testsuite/gdb.rust/simple.rs | 7 +++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 0c56a0f..2b115ee 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -446,7 +446,7 @@ static const struct generic_val_print_decorations rust_decorations = " * I", "true", "false", - "void", + "()", "[", "]" }; @@ -729,13 +729,22 @@ rust_print_type (struct type *type, const char *varstring, if (show <= 0 && TYPE_NAME (type) != NULL) { - fputs_filtered (TYPE_NAME (type), stream); + /* Rust calls the unit type "void" in its debuginfo, + but we don't want to print it as that. */ + if (TYPE_CODE (type) == TYPE_CODE_VOID) + fputs_filtered ("()", stream); + else + fputs_filtered (TYPE_NAME (type), stream); return; } type = check_typedef (type); switch (TYPE_CODE (type)) { + case TYPE_CODE_VOID: + fputs_filtered ("()", stream); + break; + case TYPE_CODE_FUNC: /* Delegate varargs to the C printer. */ if (TYPE_VARARGS (type)) @@ -753,8 +762,13 @@ rust_print_type (struct type *type, const char *varstring, rust_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0, flags); } - fputs_filtered (") -> ", stream); - rust_print_type (TYPE_TARGET_TYPE (type), "", stream, -1, 0, flags); + fputs_filtered (")", stream); + /* If it returns unit, we can omit the return type. */ + if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) + { + fputs_filtered (" -> ", stream); + rust_print_type (TYPE_TARGET_TYPE (type), "", stream, -1, 0, flags); + } break; case TYPE_CODE_ARRAY: diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 88f1c89..4622f75 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -149,6 +149,7 @@ gdb_test "print self::diff2(8, 9)" " = -1" gdb_test "print ::diff2(23, -23)" " = 46" gdb_test "ptype diff2" "fn \\(i32, i32\\) -> i32" +gdb_test "ptype empty" "fn \\(\\)" gdb_test "print (diff2 as fn(i32, i32) -> i32)(19, -2)" " = 21" diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs index 32da580..3d28e27 100644 --- a/gdb/testsuite/gdb.rust/simple.rs +++ b/gdb/testsuite/gdb.rust/simple.rs @@ -48,6 +48,12 @@ fn diff2(x: i32, y: i32) -> i32 { x - y } +// Empty function, should not have "void" +// or "()" in its return type +fn empty() { + +} + pub struct Unit; // This triggers the non-zero optimization that yields a different @@ -111,4 +117,5 @@ fn main () { println!("{}, {}", x.0, x.1); // set breakpoint here println!("{}", diff2(92, 45)); + empty(); }