The compiler aborts on the declaration of an array type whose upper bound is a component of an aggregate whose nominal subtype is a discriminated record type which contains a component whose nominal subtype is a volatile discriminated record type with a variant part and a size clause.
Tested on i586-suse-linux, applied on the mainline. 2011-04-08 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/trans.c (Identifier_to_gnu): Do not return initializers of aggregate types that contain a placeholder. 2011-04-08 Eric Botcazou <ebotca...@adacore.com> * gnat.dg/aggr17.adb: New test. * gnat.dg/aggr18.adb: Likewise. -- Eric Botcazou
Index: gcc-interface/trans.c =================================================================== --- gcc-interface/trans.c (revision 172166) +++ gcc-interface/trans.c (working copy) @@ -1058,10 +1058,14 @@ Identifier_to_gnu (Node_Id gnat_node, tr /* If we have a constant declaration and its initializer, try to return the latter to avoid the need to call fold in lots of places and the need for - elaboration code if this identifier is used as an initializer itself. */ + elaboration code if this identifier is used as an initializer itself. + Don't do it for aggregate types that contain a placeholder since their + initializers cannot be manipulated easily. */ if (TREE_CONSTANT (gnu_result) && DECL_P (gnu_result) - && DECL_INITIAL (gnu_result)) + && DECL_INITIAL (gnu_result) + && !(AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)) + && type_contains_placeholder_p (TREE_TYPE (gnu_result)))) { bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL && !DECL_CONST_CORRESPONDING_VAR (gnu_result));
-- { dg-do compile } -- { dg-options "-gnatws" } procedure Aggr17 is type Enum is (A, B); type Rec (D : Enum := Enum'First) is record case D is when A => X : Integer; when B => null; end case; end record; for Rec'Size use 128; pragma Volatile (Rec); type Config_T (D : Enum := Enum'First) is record N : Natural; R : Rec (D); end record; C : constant Config_T := (D => A, N => 1, R => (D => A, X => 0)); type Arr is array (Natural range 1 .. C.N) of Boolean; begin null; end;
-- { dg-do compile } -- { dg-options "-gnatws" } procedure Aggr18 is type Enum is (A, B); type Rec (D : Enum := Enum'First) is record case D is when A => X : Integer; when B => null; end case; end record; for Rec'Size use 128; pragma Volatile (Rec); type Config_T (D : Enum := Enum'First) is record N : Natural; R : Rec (D); end record; C : Config_T := (D => A, N => 1, R => (D => A, X => 0)); type Arr is array (Natural range 1 .. C.N) of Boolean; begin null; end;