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;