Commit cdaa0e0b by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): When adjusting the discriminant nodes in an extension...

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: When
	adjusting the discriminant nodes in an extension, use the full view
	of the parent subtype if it is of a private kind.

From-SVN: r148125
parent a6a29d0c
2009-06-03 Eric Botcazou <ebotcazou@adacore.com> 2009-06-03 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: When
adjusting the discriminant nodes in an extension, use the full view
of the parent subtype if it is of a private kind.
2009-06-03 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Add the * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Add the
_Parent field, if any, to the record before adding the other fields. _Parent field, if any, to the record before adding the other fields.
<E_Record_Subtype>: Put the _Controller field before the other fields <E_Record_Subtype>: Put the _Controller field before the other fields
......
...@@ -2899,22 +2899,33 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2899,22 +2899,33 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
of the parent subtype and not those of its base type for the of the parent subtype and not those of its base type for the
placeholder machinery to properly work. */ placeholder machinery to properly work. */
if (Has_Discriminants (gnat_entity)) if (Has_Discriminants (gnat_entity))
for (gnat_field = First_Stored_Discriminant (gnat_entity); {
Present (gnat_field); /* The actual parent subtype is the full view. */
gnat_field = Next_Stored_Discriminant (gnat_field)) if (IN (Ekind (gnat_parent), Private_Kind))
if (Present (Corresponding_Discriminant (gnat_field)))
{ {
Entity_Id field = Empty; if (Present (Full_View (gnat_parent)))
for (field = First_Stored_Discriminant (gnat_parent); gnat_parent = Full_View (gnat_parent);
Present (field); else
field = Next_Stored_Discriminant (field)) gnat_parent = Underlying_Full_View (gnat_parent);
if (same_discriminant_p (gnat_field, field))
break;
gcc_assert (Present (field));
TREE_OPERAND (get_gnu_tree (gnat_field), 1)
= gnat_to_gnu_field_decl (field);
} }
for (gnat_field = First_Stored_Discriminant (gnat_entity);
Present (gnat_field);
gnat_field = Next_Stored_Discriminant (gnat_field))
if (Present (Corresponding_Discriminant (gnat_field)))
{
Entity_Id field = Empty;
for (field = First_Stored_Discriminant (gnat_parent);
Present (field);
field = Next_Stored_Discriminant (field))
if (same_discriminant_p (gnat_field, field))
break;
gcc_assert (Present (field));
TREE_OPERAND (get_gnu_tree (gnat_field), 1)
= gnat_to_gnu_field_decl (field);
}
}
/* The "get to the parent" COMPONENT_REF must be given its /* The "get to the parent" COMPONENT_REF must be given its
proper type... */ proper type... */
TREE_TYPE (gnu_get_parent) = gnu_parent; TREE_TYPE (gnu_get_parent) = gnu_parent;
......
2009-06-03 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/root.ads: New test.
* gnat.dg/specs/root-level_1.ads: Likewise.
* gnat.dg/specs/root-level_2.ads: Likewise.
* gnat.dg/specs/root-level_1-level_2.ads: Likewise.
2009-06-02 Mark Mitchell <mark@codesourcery.com> 2009-06-02 Mark Mitchell <mark@codesourcery.com>
* g++.dg/init/ref15.C: Require unwrapped targets. * g++.dg/init/ref15.C: Require unwrapped targets.
......
package Root.Level_1.Level_2 is
type Level_2_Type (First : Natural;
Second : Natural) is new
Level_1.Level_1_Type (First => First, Second => Second) with null record;
end Root.Level_1.Level_2;
package Root.Level_1 is
type Level_1_Type (First : Natural;
Second : Natural) is new Root_Type with private;
private
type Level_1_Type (First : Natural;
Second : Natural) is new Root_Type (First => First)
with record
Buffer_1 : Buffer_Type (1 .. Second);
end record;
end Root.Level_1;
with Root.Level_1;
package Root.Level_2 is
type Level_2_Type (First : Natural;
Second : Natural) is new
Level_1.Level_1_Type (First => First, Second => Second) with null record;
end Root.Level_2;
package Root is
type Buffer_Type is array (Positive range <>) of Natural;
type Root_Type (First : Natural) is abstract tagged record
Buffer_Root : Buffer_Type (1 .. First);
end record;
end Root;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment