This is a regression present on the mainline and 4.7 branch.  The compiler 
aborts on the renaming of an object with a derived discriminated tagged type 
converted to the parent type, if the parent type is itself derived from a root 
discriminated tagged type and the renaming is later used as a prefix in the 
selection of a component inherited from the root type.

Tested on i586-suse-linux, applied on mainline and 4.7 branch.


2012-07-03  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/utils2.c (build_simple_component_ref): Do not look
        through an extension if the type contains a placeholder.


2012-07-03  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/discr37.ad[sb]: New test.


-- 
Eric Botcazou
Index: gcc-interface/utils2.c
===================================================================
--- gcc-interface/utils2.c	(revision 189034)
+++ gcc-interface/utils2.c	(working copy)
@@ -1912,10 +1912,12 @@ build_simple_component_ref (tree record_
 	  break;
 
       /* Next, see if we're looking for an inherited component in an extension.
-	 If so, look thru the extension directly.  */
+	 If so, look thru the extension directly, but not if the type contains
+	 a placeholder, as it might be needed for a later substitution.  */
       if (!new_field
 	  && TREE_CODE (record_variable) == VIEW_CONVERT_EXPR
 	  && TYPE_ALIGN_OK (record_type)
+	  && !type_contains_placeholder_p (record_type)
 	  && TREE_CODE (TREE_TYPE (TREE_OPERAND (record_variable, 0)))
 	     == RECORD_TYPE
 	  && TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (record_variable, 0))))
-- { dg-do compile }

package body Discr37 is

  procedure Proc (A : access Child) is
    B : Derived renames Derived (A.F(1).all);
    C : Derived renames Derived (B.S(1).all);
  begin
    null;
  end;

end Discr37;
package Discr37 is

  subtype Index is Integer range 0 .. 100;

  type Root;
  type Frame_Ptr is access all Root'Class;

  type Arr is array (Index range <>) of Frame_Ptr;

  type Root (Level : Index) is tagged record
    S : Arr (0 .. Level);
  end record;

  type Derived (Level : Index) is new Root (Level) with null record;

  type Child is new Derived (0) with record
    F : Arr (0 .. 100);
  end record;

  procedure Proc (A : access Child);

end Discr37;

Reply via email to