From bedda9aced2b3a8ab05e0fbf1372e394e32afbde Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 12 Apr 2018 08:05:16 -0600 Subject: [PATCH] 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 * dwarf2read.c (quirk_rust_enum): Conditionally drop the discriminant field. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2read.c | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 35072e85db0..55bdd148951 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-04-17 Tom Tromey + + * dwarf2read.c (quirk_rust_enum): Conditionally drop the + discriminant field. + 2018-04-17 Tom Tromey * dwarf2read.c (quirk_rust_enum): Handle unions correctly. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 0d3af00c463..4207e4c5317 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, -- 2.30.2