decl.c (gnat_to_gnu_entity): For a definition of a type coming from a limited_with...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 1 Jun 2015 08:41:30 +0000 (08:41 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 1 Jun 2015 08:41:30 +0000 (08:41 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Incomplete_Type>: For a
definition of a type coming from a limited_with, get to the full view
if it is not in the main code unit.

From-SVN: r223919

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

index a61837284a4e01ccc749f787ec0e27e66dcf5d81..fe91cc4a4606e1e285b34f989203fdebcd0641d9 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Incomplete_Type>: For a
+       definition of a type coming from a limited_with, get to the full view
+       if it is not in the main code unit.
+
 2015-06-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils.c (create_var_decl_1): If an assembler name is
index 21f5f701b979791ae404a6d76758ce330b88949e..35930e0bfe0258c7e4251dc80a3650c6604f91f4 100644 (file)
@@ -4638,13 +4638,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
     case E_Record_Type_With_Private:
     case E_Record_Subtype_With_Private:
       {
+       bool is_from_limited_with
+         = (IN (kind, Incomplete_Kind) && From_Limited_With (gnat_entity));
        /* Get the "full view" of this entity.  If this is an incomplete
           entity from a limited with, treat its non-limited view as the
           full view.  Otherwise, use either the full view or the underlying
           full view, whichever is present.  This is used in all the tests
           below.  */
        Entity_Id full_view
-         = (IN (kind, Incomplete_Kind) && From_Limited_With (gnat_entity))
+         = is_from_limited_with
            ? Non_Limited_View (gnat_entity)
            : Present (Full_View (gnat_entity))
              ? Full_View (gnat_entity)
@@ -4680,10 +4682,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
 
        /* Otherwise, if we are not defining the type now, get the type
           from the full view.  But always get the type from the full view
-          for define on use types, since otherwise we won't see them!  */
+          for define on use types, since otherwise we won't see them.
+          Likewise if this is a non-limited view not declared in the main
+          unit, which can happen for incomplete formal types instantiated
+          on a type coming from a limited_with clause.  */
        else if (!definition
                 || (Is_Itype (full_view) && No (Freeze_Node (gnat_entity)))
-                || (Is_Itype (gnat_entity) && No (Freeze_Node (full_view))))
+                || (Is_Itype (gnat_entity) && No (Freeze_Node (full_view)))
+                || (is_from_limited_with
+                    && !In_Extended_Main_Code_Unit (full_view)))
          {
            gnu_decl = gnat_to_gnu_entity (full_view, NULL_TREE, 0);
            maybe_present = true;