This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]