decl.c (gnat_to_gnu_entity): For a definition of a type coming from a limited_with...

* 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
This commit is contained in:
Eric Botcazou 2015-06-01 08:41:30 +00:00 committed by Eric Botcazou
parent 2b50232a5d
commit bd769c8325
2 changed files with 16 additions and 3 deletions

View 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

View 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;