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.
This commit is contained in:
Tom Tromey 2018-04-12 08:05:16 -06:00
parent a037790ec5
commit bedda9aced
2 changed files with 11 additions and 3 deletions

View File

@ -1,3 +1,8 @@
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.

View File

@ -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,