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:
parent
a037790ec5
commit
bedda9aced
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue