This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[FYI] 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  <tom@tromey.com>

	PR rust/21097:
	* rust-lang.c (rust_print_type) <TYPE_CODE_UNION>: Handle enums
	with a single member.

2017-02-03  Tom Tromey  <tom@tromey.com>

	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 2016c81..f13305c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2017-02-03  Tom Tromey  <tom@tromey.com>
+
+	PR rust/21097:
+	* rust-lang.c (rust_print_type) <TYPE_CODE_UNION>: Handle enums
+	with a single member.
+
 2017-02-03  Pedro Alves  <palves@redhat.com>
 
 	* cli/cli-interp.c (cli_interp_base::cli_interp_base)
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index a804824..105b094 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 8c59428..c098bd0 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-03  Tom Tromey  <tom@tromey.com>
+
+	PR rust/21097:
+	* gdb.rust/simple.exp: Add new tests.
+
 2017-02-02  Pedro Alves  <palves@redhat.com>
 
 	* 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 50ed70b..0bcc83e 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.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]