From: Tom Tromey Date: Thu, 12 Apr 2018 14:05:16 +0000 (-0600) Subject: Conditionally drop the discriminant field in quirk_rust_enum X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bedda9aced2b3a8ab05e0fbf1372e394e32afbde;p=binutils-gdb.git 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. --- 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,