This is a regression present on the mainline.  The compiler generates very 
large data if a variable whose type is an access to an unconstrained array is 
initialized with a constant object declaration whose expression is null.  The 
assembler may issue a warning on the construct.

Tested on i586-suse-linux, applied on the mainline.


2012-02-27  Tristan Gingold  <ging...@adacore.com>

        * gcc-interface/decl.c (gnat_to_gnu_entity) [E_String_Type,
        E_Array_Type]: Reuse dummy fat type for gnu_ptr_template and
        gnu_template_type.


2012-02-27  Tristan Gingold  <ging...@adacore.com>

        * gnat.dg/array20.ad[sb]: New test.


-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 184594)
+++ gcc-interface/decl.c	(working copy)
@@ -2003,8 +2003,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	const bool convention_fortran_p
 	  = (Convention (gnat_entity) == Convention_Fortran);
 	const int ndim = Number_Dimensions (gnat_entity);
-	tree gnu_template_type = make_node (RECORD_TYPE);
-	tree gnu_ptr_template = build_pointer_type (gnu_template_type);
+	tree gnu_template_type;
+	tree gnu_ptr_template;
 	tree gnu_template_reference, gnu_template_fields, gnu_fat_type;
 	tree *gnu_index_types = XALLOCAVEC (tree, ndim);
 	tree *gnu_temp_fields = XALLOCAVEC (tree, ndim);
@@ -2035,9 +2035,16 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	    TYPE_NAME (gnu_fat_type) = NULL_TREE;
 	    /* Save the contents of the dummy type for update_pointer_to.  */
 	    TYPE_POINTER_TO (gnu_type) = copy_type (gnu_fat_type);
+	    gnu_ptr_template =
+	      TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_fat_type)));
+	    gnu_template_type = TREE_TYPE (gnu_ptr_template);
 	  }
 	else
-	  gnu_fat_type = make_node (RECORD_TYPE);
+	  {
+	    gnu_fat_type = make_node (RECORD_TYPE);
+	    gnu_template_type = make_node (RECORD_TYPE);
+	    gnu_ptr_template = build_pointer_type (gnu_template_type);
+	  }
 
 	/* Make a node for the array.  If we are not defining the array
 	   suppress expanding incomplete types.  */
-- { dg-do assemble }

package body Array20 is

   type Arr is array (Positive range <>) of Integer;

   type P_Arr is access Arr;

   N : constant P_Arr := null;

   Table : P_Arr := N;

end Array20;
package Array20 is

   pragma Elaborate_Body;

end array20;

Reply via email to