This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Fix ICE on array type with aggregate component as bound
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 8 Apr 2011 22:21:43 +0200
- Subject: [Ada] Fix ICE on array type with aggregate component as bound
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 <ebotcazou@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 <ebotcazou@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;