diff mbox

[Ada] Fix internal error on renaming with private discriminated type

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

Commit Message

Eric Botcazou May 6, 2012, 11:09 a.m. UTC
We failed to use the padded type for the renaming as in the non-private case.

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


2012-05-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: In the renaming
	case, use the padded type if the renamed object has an unconstrained
	type with default discriminant.


2012-05-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/specs/renamings.ads: Rename to...
	* gnat.dg/specs/renaming1.ads: ...this.
	* gnat.dg/specs/renaming2.ads: New test.
	* gnat.dg/specs/renaming2_pkg1.ads: New helper.
	* gnat.dg/specs/renaming2_pkg2.ads: Likewise.
	* gnat.dg/specs/renaming2_pkg3.ads: Likewise.
	* gnat.dg/specs/renaming2_pkg4.ad[sb]: Likewise.
diff mbox

Patch

Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 187206)
+++ gcc-interface/decl.c	(working copy)
@@ -938,6 +938,14 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 		gnu_type = TREE_TYPE (gnu_expr);
 	      }
 
+	    /* Or else, if the renamed object has an unconstrained type with
+	       default discriminant, use the padded type.  */
+	    else if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_expr))
+		     && TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_expr)))
+			== gnu_type
+		     && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
+	      gnu_type = TREE_TYPE (gnu_expr);
+
 	    /* Case 1: If this is a constant renaming stemming from a function
 	       call, treat it as a normal object whose initial value is what
 	       is being renamed.  RM 3.3 says that the result of evaluating a