utils2.c (build_simple_component_ref): Do not look through an extension if the type...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 3 Jul 2012 08:49:54 +0000 (08:49 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 3 Jul 2012 08:49:54 +0000 (08:49 +0000)
* gcc-interface/utils2.c (build_simple_component_ref): Do not look
through an extension if the type contains a placeholder.

From-SVN: r189202

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils2.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/discr37.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/discr37.ads [new file with mode: 0644]

index 0e0456c874016c385c13510c4347ef6b96c41c87..f6eb89b9d3a11a5eacd9ab730af29cac124662f6 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-03  Eric Botcazou  <ebotcazou@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  <ebotcazou@adacore.com>
 
        * exp_disp.adb (Expand_Dispatching_Call): Propagate the convention on
index c7dfe98fce26e540772c061db1608d41d50562e4..b72ebedcea335ed6559fff8c680fe360630486da 100644 (file)
@@ -1912,10 +1912,12 @@ build_simple_component_ref (tree record_variable, tree component,
          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))))
index 0dc8e2580db4348ac5d1b77a179263a2c7132cf2..539dfd3b4c204f7417e9c9134a425f2abd4fe5d5 100644 (file)
@@ -1,3 +1,7 @@
+2012-07-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/discr37.ad[sb]: New test.
+
 2012-07-03  Oleg Endo  <olegendo@gcc.gnu.org>
 
        * g++.dg/other/packed1.C: Remove SH from xfail list.
diff --git a/gcc/testsuite/gnat.dg/discr37.adb b/gcc/testsuite/gnat.dg/discr37.adb
new file mode 100644 (file)
index 0000000..b0e750e
--- /dev/null
@@ -0,0 +1,12 @@
+-- { 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;
diff --git a/gcc/testsuite/gnat.dg/discr37.ads b/gcc/testsuite/gnat.dg/discr37.ads
new file mode 100644 (file)
index 0000000..7d91b2d
--- /dev/null
@@ -0,0 +1,22 @@
+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;