This makes it so that the Ada compiler preserves unconstrained array types in the debug info when they are declared in the sources and a constrained subtype is referenced in the same unit.
Tested on i586-suse-linux, applied on the mainline. 2011-04-02 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Do not make fat pointer types artificial unconditionally. <E_Array_Subtype>: Attach the base array type as a parallel type if it isn't artificial. -- Eric Botcazou
Index: gcc-interface/decl.c =================================================================== --- gcc-interface/decl.c (revision 171882) +++ gcc-interface/decl.c (working copy) @@ -2175,7 +2175,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit else gnat_name = gnat_entity; create_type_decl (create_concat_name (gnat_name, "XUP"), - gnu_fat_type, NULL, true, + gnu_fat_type, NULL, !Comes_From_Source (gnat_entity), debug_info_p, gnat_entity); /* Create the type to be used as what a thin pointer designates: @@ -2537,14 +2537,25 @@ gnat_to_gnu_entity (Entity_Id gnat_entit add_parallel_type (TYPE_STUB_DECL (gnu_type), gnu_bound_rec); } - /* Otherwise, for a packed array, make the original array type a - parallel type. */ - else if (debug_info_p - && Is_Packed_Array_Type (gnat_entity) - && present_gnu_tree (Original_Array_Type (gnat_entity))) - add_parallel_type (TYPE_STUB_DECL (gnu_type), - gnat_to_gnu_type - (Original_Array_Type (gnat_entity))); + /* If this is a packed array type, make the original array type a + parallel type. Otherwise, do it for the base array type if it + isn't artificial to make sure it is kept in the debug info. */ + if (debug_info_p) + { + if (Is_Packed_Array_Type (gnat_entity) + && present_gnu_tree (Original_Array_Type (gnat_entity))) + add_parallel_type (TYPE_STUB_DECL (gnu_type), + gnat_to_gnu_type + (Original_Array_Type (gnat_entity))); + else + { + tree gnu_base_decl + = gnat_to_gnu_entity (Etype (gnat_entity), NULL_TREE, 0); + if (!DECL_ARTIFICIAL (gnu_base_decl)) + add_parallel_type (TYPE_STUB_DECL (gnu_type), + TREE_TYPE (TREE_TYPE (gnu_base_decl))); + } + } TYPE_CONVENTION_FORTRAN_P (gnu_type) = convention_fortran_p; TYPE_PACKED_ARRAY_TYPE_P (gnu_type)