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)

Reply via email to