summaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/decl.c
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-16 09:40:14 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-16 09:40:14 +0000
commit94f867e51a6b23bbee82eedd002f24a5ead3d61f (patch)
tree0bd3eb619cedaa1be5a78f3f4c2a1f349eca4efc /gcc/ada/gcc-interface/decl.c
parent13194e938deb9b6e668164e105915fa1591715ef (diff)
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221447 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r--gcc/ada/gcc-interface/decl.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 90ffcb303441..0027d6f2f0c8 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -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. */