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:
Eric Botcazou 2021-03-10 12:04:25 +01:00
parent da7343a6f4
commit 1c3c12b0a6
2 changed files with 16 additions and 0 deletions

View File

@ -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);
}

View 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;