diff mbox

[Ada] Fix ICE on twin pair of dynamically-sized arrays

Message ID 201103231033.53825.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou March 23, 2011, 9:33 a.m. UTC
The ICE occurs during RTL expansion but the problem is an incorrect sharing of 
a tree node between two types.  Classical issue with dynamically-sized types.

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


2011-03-23  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Create TYPE_DECL
	for the padded type built in order to support a specified alignment.
	Fix incorrect formatting.


2011-03-23  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/array14.ad[sb]: New test.
	* gnat.dg/array14_pkg.ads: New helper.
diff mbox

Patch

Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 171254)
+++ gcc-interface/decl.c	(working copy)
@@ -687,6 +687,7 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	if (kind != E_Exception && Known_Alignment (gnat_entity))
 	  {
 	    gcc_assert (Present (Alignment (gnat_entity)));
+
 	    align = validate_alignment (Alignment (gnat_entity), gnat_entity,
 					TYPE_ALIGN (gnu_type));
 
@@ -695,9 +696,20 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	    if (Present (Address_Clause (gnat_entity)))
 	      align = 0;
 	    else
-	      gnu_type
-		= maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
-				  false, false, definition, true);
+	      {
+		tree orig_type = gnu_type;
+
+		gnu_type
+		  = maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
+				    false, false, definition, true);
+
+		/* If a padding record was made, declare it now since it will
+		   never be declared otherwise.  This is necessary to ensure
+		   that its subtrees are properly marked.  */
+		if (gnu_type != orig_type && !DECL_P (TYPE_NAME (gnu_type)))
+		  create_type_decl (TYPE_NAME (gnu_type), gnu_type, NULL, true,
+				    debug_info_p, gnat_entity);
+	      }
 	  }
 
 	/* If we are defining the object, see if it has a Size and validate it
@@ -865,16 +877,15 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
 	    && Is_Array_Type (Etype (gnat_entity))
 	    && !type_annotate_only)
-	{
-	  tree gnu_fat
-	    = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
-
-	  gnu_type
-	    = build_unc_object_type_from_ptr (gnu_fat, gnu_type,
-					      concat_name (gnu_entity_name,
-							   "UNC"),
-					      debug_info_p);
-	}
+	  {
+	    tree gnu_fat
+	      = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
+	    gnu_type
+	      = build_unc_object_type_from_ptr (gnu_fat, gnu_type,
+						concat_name (gnu_entity_name,
+							     "UNC"),
+						debug_info_p);
+	  }
 
 #ifdef MINIMUM_ATOMIC_ALIGNMENT
 	/* If the size is a constant and no alignment is specified, force