decl.c (is_from_limited_with_of_main): New predicate.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 16 Mar 2015 09:40:14 +0000 (09:40 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 16 Mar 2015 09:40:14 +0000 (09:40 +0000)
* gcc-interface/decl.c (is_from_limited_with_of_main): New predicate.
(gnat_to_gnu_entity) <E_Subprogram_Type>: Invoke it on return and
parameter types to detect circularities in ASIS mode.
* gcc-interface/trans.c (Attribute_to_gnu): Mention AI05-0151.

From-SVN: r221447

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

index 0977c485a2b8251c48957169ef938d07cfee2999..bfda926a163899dad88909fd1281dc8afa715304 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (is_from_limited_with_of_main): New predicate.
+       (gnat_to_gnu_entity) <E_Subprogram_Type>: Invoke it on return and
+       parameter types to detect circularities in ASIS mode.
+       * gcc-interface/trans.c (Attribute_to_gnu): Mention AI05-0151.
+
 2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Abstract_State>: Do not
index 90ffcb303441d7736bd960dbb318edd01494bfbe..0027d6f2f0c88ab9a6f6f5152abd8862b4190b32 100644 (file)
@@ -182,6 +182,7 @@ static tree gnat_to_gnu_component_type (Entity_Id, bool, bool);
 static tree gnat_to_gnu_param (Entity_Id, Mechanism_Type, Entity_Id, bool,
                               bool *);
 static tree gnat_to_gnu_field (Entity_Id, tree, int, bool, bool);
+static bool is_from_limited_with_of_main (Entity_Id);
 static tree change_qualified_type (tree, int);
 static bool same_discriminant_p (Entity_Id, Entity_Id);
 static bool array_type_has_nonaliased_component (tree, Entity_Id);
@@ -4252,11 +4253,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
               context may now appear in parameter and result profiles.  If
               we are only annotating types, break circularities here.  */
            if (type_annotate_only
-               && IN (Ekind (gnat_return_type), Incomplete_Kind)
-               && From_Limited_With (gnat_return_type)
-               && In_Extended_Main_Code_Unit
-                  (Non_Limited_View (gnat_return_type))
-               && !present_gnu_tree (Non_Limited_View (gnat_return_type)))
+               && is_from_limited_with_of_main (gnat_return_type))
              gnu_return_type = ptr_void_type_node;
            else
              gnu_return_type = gnat_to_gnu_type (gnat_return_type);
@@ -4365,11 +4362,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
               context may now appear in parameter and result profiles.  If
               we are only annotating types, break circularities here.  */
            if (type_annotate_only
-               && IN (Ekind (gnat_param_type), Incomplete_Kind)
-               && From_Limited_With (Etype (gnat_param_type))
-               && In_Extended_Main_Code_Unit
-                  (Non_Limited_View (gnat_param_type))
-               && !present_gnu_tree (Non_Limited_View (gnat_param_type)))
+               && is_from_limited_with_of_main (gnat_param_type))
              {
                gnu_param_type = ptr_void_type_node;
                fake_param_type = true;
@@ -5810,6 +5803,30 @@ gnat_to_gnu_param (Entity_Id gnat_param, Mechanism_Type mech,
   return gnu_param;
 }
 
+/* Return true if GNAT_ENTITY is an incomplete entity coming from a limited
+   with of the main unit and whose full view has not been elaborated yet.  */
+
+static bool
+is_from_limited_with_of_main (Entity_Id gnat_entity)
+{
+  /* Class-wide types are always transformed into their root type.  */
+  if (Ekind (gnat_entity) == E_Class_Wide_Type)
+    gnat_entity = Root_Type (gnat_entity);
+
+  if (IN (Ekind (gnat_entity), Incomplete_Kind)
+      && From_Limited_With (gnat_entity))
+    {
+      Entity_Id gnat_full_view = Non_Limited_View (gnat_entity);
+
+      if (present_gnu_tree (gnat_full_view))
+       return false;
+
+      return In_Extended_Main_Code_Unit (gnat_full_view);
+    }
+
+  return false;
+}
+
 /* Like build_qualified_type, but TYPE_QUALS is added to the existing
    qualifiers on TYPE.  */
 
index 2b5485f9c8e975a95ee6fa8ef88be1d09d9863e7..fe4ecae082cf849f9e660eb8d1aac5670eba4aca 100644 (file)
@@ -1593,8 +1593,9 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
   bool prefix_unused = false;
 
   /* ??? If this is an access attribute for a public subprogram to be used in
-     a dispatch table, do not translate its type as it's useless there and the
-     parameter types might be incomplete types coming from a limited with.  */
+     a dispatch table, do not translate its type as it's useless in this case
+     and the parameter types might be incomplete types coming from a limited
+     context in Ada 2012 (AI05-0151).  */
   if (Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
       && Is_Dispatch_Table_Entity (Etype (gnat_node))
       && Nkind (gnat_prefix) == N_Identifier