OSDN Git Service

* gcc-interface/utils2.c (build_simple_component_ref): Do not look
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jul 2012 08:52:34 +0000 (08:52 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jul 2012 08:52:34 +0000 (08:52 +0000)
through an extension if the type contains a placeholder.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189203 138bc75d-0d04-0410-961f-82ee72b054a4

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 f511a7f..d2f81a6 100644 (file)
@@ -1,5 +1,10 @@
 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
        the designated subprogram type and also set Is_Dispatch_Table_Entity.
        (Expand_Interface_Thunk): Propagate the convention on the thunk.
index 332d730..e368ca6 100644 (file)
@@ -1902,10 +1902,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 1953982..1310d41 100644 (file)
@@ -1,3 +1,7 @@
+2012-07-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/discr37.ad[sb]: New test.
+
 2012-07-02  Jason Merrill  <jason@redhat.com>
 
        PR c++/53816
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;