From f0fd41c1926984fd1a524ff551286cba694539a0 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 3 Feb 2017 22:11:46 -0700 Subject: [PATCH] Fix ptype of single-member Rust enums While looking into PR rust/21097, I found that ptype of a single-element enum in Rust did not always format the result properly. In particular, it would leave out the members of a tuple struct. Further testing showed that it also did the wrong thing for ordinary struct members as well. This patch fixes these problems. I'm marking it as being associated with the PR, since that is where the discovery was made; but this doesn't actually fix that PR (which I think ultimately is due to a Rust compiler bug). Built and regtested on x86-64 Fedora 25, using the system Rust compiler. I'm checking this in. 2017-02-03 Tom Tromey PR rust/21097: * rust-lang.c (rust_print_type) : Handle enums with a single member. 2017-02-03 Tom Tromey PR rust/21097: * gdb.rust/simple.exp: Add new tests. --- gdb/ChangeLog | 6 ++++++ gdb/rust-lang.c | 6 +++++- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.rust/simple.exp | 12 ++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2016c816cf..f13305ce3e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2017-02-03 Tom Tromey + + PR rust/21097: + * rust-lang.c (rust_print_type) : Handle enums + with a single member. + 2017-02-03 Pedro Alves * cli/cli-interp.c (cli_interp_base::cli_interp_base) diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index a804824286..105b094e57 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -977,6 +977,8 @@ rust_print_type (struct type *type, const char *varstring, skip_to = 0; } } + else if (TYPE_NFIELDS (type) == 1) + skip_to = 0; for (i = 0; i < TYPE_NFIELDS (type); ++i) { @@ -989,7 +991,9 @@ rust_print_type (struct type *type, const char *varstring, if (TYPE_NFIELDS (variant_type) > skip_to) { int first = 1; - bool is_tuple = rust_tuple_variant_type_p (variant_type); + bool is_tuple = (TYPE_NFIELDS (type) == 1 + ? rust_tuple_struct_type_p (variant_type) + : rust_tuple_variant_type_p (variant_type)); int j; fputs_filtered (is_tuple ? "(" : "{", stream); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8c5942859a..c098bd01c7 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-03 Tom Tromey + + PR rust/21097: + * gdb.rust/simple.exp: Add new tests. + 2017-02-02 Pedro Alves * gdb.mi/mi-logging.exp: Add "redirect while already logging" diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 50ed70b606..0bcc83e822 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -110,6 +110,18 @@ gdb_test "print univariant.a" " = 1" gdb_test "print univariant_anon" " = simple::UnivariantAnon::Foo\\(1\\)" gdb_test "print univariant_anon.0" " = 1" +gdb_test_sequence "ptype simple::Univariant" "" { + "type = enum simple::Univariant \\{" + " Foo\\{a: u8\\}," + "\\}" +} + +gdb_test_sequence "ptype simple::UnivariantAnon" "" { + "type = enum simple::UnivariantAnon \\{" + " Foo\\(u8\\)," + "\\}" +} + gdb_test_sequence "ptype simple::ByeBob" "" { " = struct simple::ByeBob \\(" " i32," -- 2.34.1