trans.c (gnat_to_gnu): Try again to translate the prefix after the field if it is...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 6 Sep 2017 12:23:36 +0000 (12:23 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 6 Sep 2017 12:23:36 +0000 (14:23 +0200)
2017-09-06  Eric Botcazou  <ebotcazou@adacore.com>

* gcc-interface/trans.c (gnat_to_gnu) <N_Selected_Component>: Try
again to translate the prefix after the field if it is incomplete.

From-SVN: r251788

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index 264dd9b34d3c53adf31b7b03f7c8e5359edbb640..385c663d6013aee171e9b9baf5bd4b85ab11060e 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+        * gcc-interface/trans.c (gnat_to_gnu) <N_Selected_Component>: Try
+        again to translate the prefix after the field if it is incomplete.
+
 2017-09-06  Bob Duff  <duff@adacore.com>
 
        * exp_util.adb (Is_Displace_Call): Make sure it works for indirect
index 9163eb10a7c86eb901229b34c00406916134cea3..5c85c4aa4222847d811897acb5d3eb95e198a552 100644 (file)
@@ -6465,6 +6465,17 @@ gnat_to_gnu (Node_Id gnat_node)
          {
            tree gnu_field = gnat_to_gnu_field_decl (gnat_field);
 
+           /* If the prefix has incomplete type, try again to translate it.
+              The idea is that the translation of the field just above may
+              have completed it through gnat_to_gnu_entity, in case it is
+              the dereference of an access to Taft Amendment type used in
+              the instantiation of a generic body from an external unit.  */
+           if (!COMPLETE_TYPE_P (TREE_TYPE (gnu_prefix)))
+             {
+               gnu_prefix = gnat_to_gnu (gnat_prefix);
+               gnu_prefix = maybe_implicit_deref (gnu_prefix);
+             }
+               
            gnu_result
              = build_component_ref (gnu_prefix, gnu_field,
                                     (Nkind (Parent (gnat_node))