This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Conditionally drop the discriminant field in quirk_rust_enum


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bedda9aced2b3a8ab05e0fbf1372e394e32afbde

commit bedda9aced2b3a8ab05e0fbf1372e394e32afbde
Author: Tom Tromey <tom@tromey.com>
Date:   Thu Apr 12 08:05:16 2018 -0600

    Conditionally drop the discriminant field in quirk_rust_enum
    
    While debugging the crash that Jan reported, I noticed that in some
    situations we could end up with a situation where one branch of a Rust
    enum type ended up with a field count of -1.
    
    The fix is simple: only conditionally drop the discriminant field when
    rewriting the enum variants.
    
    I couldn't find a way to test this; I only noticed it while debugging
    the DWARF reader.
    
    2018-04-17  Tom Tromey  <tom@tromey.com>
    
    	* dwarf2read.c (quirk_rust_enum): Conditionally drop the
    	discriminant field.

Diff:
---
 gdb/ChangeLog    | 5 +++++
 gdb/dwarf2read.c | 9 ++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 35072e8..55bdd14 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2018-04-17  Tom Tromey  <tom@tromey.com>
 
+	* dwarf2read.c (quirk_rust_enum): Conditionally drop the
+	discriminant field.
+
+2018-04-17  Tom Tromey  <tom@tromey.com>
+
 	* dwarf2read.c (quirk_rust_enum): Handle unions correctly.
 
 2018-04-17  Andreas Arnez  <arnez@linux.vnet.ibm.com>
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 0d3af00..4207e4c 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -10079,10 +10079,13 @@ quirk_rust_enum (struct type *type, struct objfile *objfile)
 	  if (iter != discriminant_map.end ())
 	    disc->discriminants[i] = iter->second;
 
-	  /* Remove the discriminant field.  */
+	  /* Remove the discriminant field, if it exists.  */
 	  struct type *sub_type = TYPE_FIELD_TYPE (union_type, i);
-	  --TYPE_NFIELDS (sub_type);
-	  ++TYPE_FIELDS (sub_type);
+	  if (TYPE_NFIELDS (sub_type) > 0)
+	    {
+	      --TYPE_NFIELDS (sub_type);
+	      ++TYPE_FIELDS (sub_type);
+	    }
 	  TYPE_FIELD_NAME (union_type, i) = variant_name;
 	  TYPE_NAME (sub_type)
 	    = rust_fully_qualify (&objfile->objfile_obstack,


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