Fix ICE on atomic enumeration type with LTO
This is a strange regression whereby an enumeration type declared as atomic (or volatile) incorrectly triggers the ODR machinery for its values in LTO mode. gcc/ada/ * gcc-interface/decl.c (gnat_to_gnu_entity): Build a TYPE_STUB_DECL for the main variant of an enumeration type declared as volatile. gcc/testsuite/ * gnat.dg/specs/lto25.ads: New test.
This commit is contained in:
parent
da7343a6f4
commit
1c3c12b0a6
@ -4713,6 +4713,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
|
||||
const int quals
|
||||
= TYPE_QUAL_VOLATILE
|
||||
| (Is_Full_Access (gnat_entity) ? TYPE_QUAL_ATOMIC : 0);
|
||||
/* This is required by free_lang_data_in_type to disable the ODR. */
|
||||
if (TREE_CODE (gnu_type) == ENUMERAL_TYPE)
|
||||
TYPE_STUB_DECL (gnu_type)
|
||||
= create_type_stub_decl (TYPE_NAME (gnu_type), gnu_type);
|
||||
gnu_type = change_qualified_type (gnu_type, quals);
|
||||
}
|
||||
|
||||
|
||||
12
gcc/testsuite/gnat.dg/specs/lto25.ads
Normal file
12
gcc/testsuite/gnat.dg/specs/lto25.ads
Normal file
@ -0,0 +1,12 @@
|
||||
-- { dg-do compile }
|
||||
-- { dg-options "-flto" { target lto } }
|
||||
|
||||
package Lto25 is
|
||||
|
||||
type Enum is (One, Two, Three) with Atomic;
|
||||
|
||||
type Rec is record
|
||||
E : Enum := One;
|
||||
end record;
|
||||
|
||||
end Lto25;
|
||||
Loading…
Reference in New Issue
Block a user