From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 54035 invoked by alias); 27 Jun 2016 16:53:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 54026 invoked by uid 89); 27 Jun 2016 16:53:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:3802 X-HELO: mail-wm0-f54.google.com Received: from mail-wm0-f54.google.com (HELO mail-wm0-f54.google.com) (74.125.82.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 27 Jun 2016 16:53:43 +0000 Received: by mail-wm0-f54.google.com with SMTP id v199so108010083wmv.0 for ; Mon, 27 Jun 2016 09:53:42 -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:in-reply-to:references:from:date :message-id:subject:to; bh=2MrvBSpAR8d+ZZLdRoZE1wE1wWQ8aFobn6+2g4VSkjA=; b=SCCOTpA88asiLiDY0Ga6MJbI05D0xf6L0eQmJE6G2WcTgaHZTnaIj5vlJ4V2l2bmt9 1I4UOteiUZ0A5cygc1DSR25ccKzkZZOC+rXUw28WsSRK9n8bYIPf7d7uj1bAqrDRtq8R EwGvxk7mCjsC+hlUwjjR52N+CzlqOkUwJa5gEBpNJKps/4wmnNWBNkFh2Rc4nOhZwJKM uiPVDwn9WjQVgZ/q1NCyVMWCVQHWBjVvoqUz7sxcx4ykSqcloJImDRTNlGgQc3ZUYbR9 zl46CERFdoDY+2ouf7u0Fg8TGEgt13iTYbV/oMjTaHRCKSb7GBoLwt5Ga16P5hshEUFV EKYw== X-Gm-Message-State: ALyK8tJXw4MjrGxlGlLchA7/DHripj4h5IOMGih5p0NbHl0xDROrSveP1WEwTv4CUOesFWWJo/QaOPp6owQ2hg+O X-Received: by 10.194.200.164 with SMTP id jt4mr1880836wjc.18.1467046420012; Mon, 27 Jun 2016 09:53:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.36.215 with HTTP; Mon, 27 Jun 2016 09:53:38 -0700 (PDT) In-Reply-To: References: From: Manish Goregaokar Date: Mon, 27 Jun 2016 16:53:00 -0000 Message-ID: Subject: Re: [PATCH] Print void types correctly in Rust To: gdb-patches@sourceware.org, Tom Tromey Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2016-06/txt/msg00452.txt.bz2 Landed as https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=921d8f549f9e35d3f83c7b1a381146a7dc1246f4, with a changelog fix at https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=6763d566a8d30d1ad65dfd060a919c621dad86c4. Thanks, -Manish On Mon, Jun 27, 2016 at 9:22 PM, Manish Goregaokar wrote: > 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(); > } > -- > 2.8.3