From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 857 invoked by alias); 30 Oct 2016 03:06:06 -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 532 invoked by uid 89); 30 Oct 2016 03:05:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=wind, tom@tromey.com, U*tom, D*tromey.com X-HELO: mail-wm0-f45.google.com Received: from mail-wm0-f45.google.com (HELO mail-wm0-f45.google.com) (74.125.82.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 30 Oct 2016 03:05:24 +0000 Received: by mail-wm0-f45.google.com with SMTP id 140so131168204wmv.0 for ; Sat, 29 Oct 2016 20:05:24 -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:cc; bh=54r+uInZKIXPCnEasGQfNcMSQFyzpbyvjOtUVOKS+rs=; b=Gvp2TfdRGuirdOyuRujPGlq5C2+zTkQ9bxckoGxtWU7vvjQAcVenNnowS1h/30ArP0 1WJftx0x2ze4IhzwwpgCS+Y4DWwWgvjZN2BZhXzIKB3TCvcY+KIX4w0VKUZczv82iYas om8ielYk797OtU1chDv4/LlXVUNYVdubPbWh8Anah4vY4dzGietnKhn/3BMTqD5Sqzfd 5qAIJN1udhpM+QM1aoGDqnEvD+LiGUPH3xbBLvJBdVx5lhnq4WPsr7GsveDWnaEnagQb Z7F2QFnz1IQTtPkfHdxE3hhTJrksbZXgJCTEV0G6qet/WIM3xsFmFRHBT6UU5V6Kh2hR t+Jw== X-Gm-Message-State: ABUngvdrCDVUPMzeMhjDM0KAR6v7QAl4URI1xSjv0W30a/vZ3WlN/LntEbToimnC8vNvvkoXWoObrJUaX/mfEBNk X-Received: by 10.194.205.136 with SMTP id lg8mr16936810wjc.1.1477796722329; Sat, 29 Oct 2016 20:05:22 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.131.21 with HTTP; Sat, 29 Oct 2016 20:05:02 -0700 (PDT) In-Reply-To: References: <87pomiwo1z.fsf@tromey.com> <87lgx6wntm.fsf@tromey.com> From: Manish Goregaokar Date: Sun, 30 Oct 2016 03:06:00 -0000 Message-ID: Subject: Re: [PATCH] Fix handling of discriminantless univariant enums in Rust To: Tom Tromey Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2016-10/txt/msg00844.txt.bz2 The same test works fine with a univariant tuple enum and STRUCTOP_ANONYMOUS fwiw. (added a univariant_anon test to my local patch) -Manish On Sat, Oct 29, 2016 at 7:58 PM, Manish Goregaokar wrote: > `print univariant.a` works for me. > > New patch (fixed style, added univariant.a test) > > > 2016-10-27 Manish Goregaokar > > gdb/ChangeLog: > * rust-lang.c (rust_get_disr_info): Treat univariant enums > without discriminants as encoded enums with a real field > > gdb/testsuite/ChangeLog: > * simple.rs: Add test for univariant enums without discriminants > * simple.exp: Add test expectations > --- > gdb/rust-lang.c | 13 ++++++++++++- > gdb/testsuite/gdb.rust/simple.exp | 3 +++ > gdb/testsuite/gdb.rust/simple.rs | 6 ++++++ > 3 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c > index 82cd3f9..7b1ff8a 100644 > --- a/gdb/rust-lang.c > +++ b/gdb/rust-lang.c > @@ -194,7 +194,18 @@ rust_get_disr_info (struct type *type, const > gdb_byte *valaddr, > has changed its debuginfo format. */ > error (_("Could not find enum discriminant field")); > } > - > + else if (TYPE_NFIELDS (type) == 1) { > + /* Sometimes univariant enums are encoded without a > + discriminant. In that case, treating it as an encoded enum > + with the first field being the actual type works. */ > + const char* field_name = TYPE_NAME (TYPE_FIELD_TYPE (type, 0)); > + ret.name = concat (TYPE_NAME (type), "::", > + rust_last_path_segment (field_name), > + (char *) NULL); > + ret.field_no = RUST_ENCODED_ENUM_REAL; > + ret.is_encoded = 1; > + return ret; > + } > if (strcmp (TYPE_FIELD_NAME (disr_type, 0), "RUST$ENUM$DISR") != 0) > error (_("Rust debug format has changed")); > > diff --git a/gdb/testsuite/gdb.rust/simple.exp > b/gdb/testsuite/gdb.rust/simple.exp > index 5e00b03..c9e8e57 100644 > --- a/gdb/testsuite/gdb.rust/simple.exp > +++ b/gdb/testsuite/gdb.rust/simple.exp > @@ -103,6 +103,9 @@ gdb_test_sequence "ptype z" "" { > } > gdb_test "print z.1" " = 8" > > +gdb_test "print univariant" " = simple::Univariant::Foo{a: 1}" > +gdb_test "print univariant.a" " = 1" > + > gdb_test_sequence "ptype simple::ByeBob" "" { > " = struct simple::ByeBob \\(" > " i32," > diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs > index eeff3d7..b2e29ae 100644 > --- a/gdb/testsuite/gdb.rust/simple.rs > +++ b/gdb/testsuite/gdb.rust/simple.rs > @@ -63,6 +63,10 @@ enum SpaceSaver { > Nothing, > } > > +enum Univariant { > + Foo {a: u8} > +} > + > fn main () { > let a = (); > let b : [i32; 0] = []; > @@ -93,6 +97,8 @@ fn main () { > let y = HiBob {field1: 7, field2: 8}; > let z = ByeBob(7, 8); > > + let univariant = Univariant::Foo {a : 1}; > + > let slice = &w[2..3]; > let fromslice = slice[0]; > let slice2 = &slice[0..1]; > -- > 2.10.1 > > -Manish > > > On Sat, Oct 29, 2016 at 7:52 PM, Tom Tromey wrote: >>>>>>> "Tom" == Tom Tromey writes: >> >> Tom> Also, I suspect this will wind up doing the wrong thing in the >> Tom> STRUCTOP_ANONYMOUS case in rust_evaluate_subexp. In particular I wonder >> Tom> if an additional "print univariant.0.a" test will work correctly? >> >> Oh duh, I see that this isn't a correct counter-example. >> What about just "print univariant.a"? >> It seems to me that this will hit this: >> >> start = disr.is_encoded ? 0 : 1; >> >> ... choosing 1 here, but: >> >> for (i = start; i < TYPE_NFIELDS (variant_type); i++) >> >> ... failing this because TYPE_NFIELDS == 1; and then: >> >> if (i == TYPE_NFIELDS (variant_type)) >> /* We didn't find it. */ >> error(_("Could not find field %s of struct variant %s"), >> >> Tom