* [Ada] Fix ICE on array type with aggregate component as bound
@ 2011-04-08 20:22 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2011-04-08 20:22 UTC (permalink / raw)
To: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 656 bytes --]
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
[-- Attachment #2: p.diff --]
[-- Type: text/x-diff, Size: 1076 bytes --]
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));
[-- Attachment #3: aggr17.adb --]
[-- Type: text/x-adasrc, Size: 554 bytes --]
-- { 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;
[-- Attachment #4: aggr18.adb --]
[-- Type: text/x-adasrc, Size: 545 bytes --]
-- { 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;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-04-08 20:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-08 20:22 [Ada] Fix ICE on array type with aggregate component as bound Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).