decl.c (gnat_to_gnu_entity): Look into expressions for external constants that are aggregates.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Constant>: Look into expressions for external constants that are aggregates. * gcc-interface/utils2.c (build_simple_component_ref): If the field is an inherited component in an extension, look through the extension. From-SVN: r164414
This commit is contained in:
parent
b146446c53
commit
50a6af053a
|
@ -1,3 +1,10 @@
|
|||
2010-09-19 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Constant>: Look into
|
||||
expressions for external constants that are aggregates.
|
||||
* gcc-interface/utils2.c (build_simple_component_ref): If the field
|
||||
is an inherited component in an extension, look through the extension.
|
||||
|
||||
2010-09-10 Vincent Celier <celier@adacore.com>
|
||||
|
||||
* projects.texi: Add documentation for package extensions
|
||||
|
|
|
@ -421,17 +421,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||
}
|
||||
|
||||
/* If we have an external constant that we are not defining, get the
|
||||
expression that is was defined to represent. We may throw that
|
||||
expression away later if it is not a constant. Do not retrieve the
|
||||
expression if it is an aggregate or allocator, because in complex
|
||||
instantiation contexts it may not be expanded */
|
||||
expression that is was defined to represent. We may throw it away
|
||||
later if it is not a constant. But do not retrieve the expression
|
||||
if it is an allocator because the designated type might be dummy
|
||||
at this point. */
|
||||
if (!definition
|
||||
&& Present (Expression (Declaration_Node (gnat_entity)))
|
||||
&& !No_Initialization (Declaration_Node (gnat_entity))
|
||||
&& (Nkind (Expression (Declaration_Node (gnat_entity)))
|
||||
!= N_Aggregate)
|
||||
&& (Nkind (Expression (Declaration_Node (gnat_entity)))
|
||||
!= N_Allocator))
|
||||
&& Present (Expression (Declaration_Node (gnat_entity)))
|
||||
&& Nkind (Expression (Declaration_Node (gnat_entity)))
|
||||
!= N_Allocator)
|
||||
gnu_expr = gnat_to_gnu (Expression (Declaration_Node (gnat_entity)));
|
||||
|
||||
/* Ignore deferred constant definitions without address clause since
|
||||
|
|
|
@ -1603,10 +1603,9 @@ build_simple_component_ref (tree record_variable, tree component,
|
|||
if (!field)
|
||||
return NULL_TREE;
|
||||
|
||||
/* If this field is not in the specified record, see if we can find
|
||||
something in the record whose original field is the same as this one. */
|
||||
/* If this field is not in the specified record, see if we can find a field
|
||||
in the specified record whose original field is the same as this one. */
|
||||
if (DECL_CONTEXT (field) != record_type)
|
||||
/* Check if there is a field with name COMPONENT in the record. */
|
||||
{
|
||||
tree new_field;
|
||||
|
||||
|
@ -1616,6 +1615,21 @@ build_simple_component_ref (tree record_variable, tree component,
|
|||
if (SAME_FIELD_P (field, new_field))
|
||||
break;
|
||||
|
||||
/* Next, see if we're looking for an inherited component in an extension.
|
||||
If so, look thru the extension directly. */
|
||||
if (!new_field
|
||||
&& TREE_CODE (record_variable) == VIEW_CONVERT_EXPR
|
||||
&& TYPE_ALIGN_OK (record_type)
|
||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (record_variable, 0)))
|
||||
== RECORD_TYPE
|
||||
&& TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (record_variable, 0))))
|
||||
{
|
||||
ref = build_simple_component_ref (TREE_OPERAND (record_variable, 0),
|
||||
NULL_TREE, field, no_fold_p);
|
||||
if (ref)
|
||||
return ref;
|
||||
}
|
||||
|
||||
/* Next, loop thru DECL_INTERNAL_P components if we haven't found
|
||||
the component in the first search. Doing this search in 2 steps
|
||||
is required to avoiding hidden homonymous fields in the
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-09-19 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/specs/constant1.ads: New test.
|
||||
* gnat.dg/specs/constant1_pkg.ads: New helper.
|
||||
|
||||
2010-09-18 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR tree-optimization/45453
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
-- { dg-do compile }
|
||||
|
||||
with Constant1_Pkg;
|
||||
|
||||
package Constant1 is
|
||||
|
||||
type Timer_Id_T is new Constant1_Pkg.Timer_Id_T with null record;
|
||||
|
||||
type Timer_Op_T (Pending : Boolean := False) is
|
||||
record
|
||||
case Pending is
|
||||
when True =>
|
||||
Timer_Id : Timer_Id_T;
|
||||
when False =>
|
||||
null;
|
||||
end case;
|
||||
end record;
|
||||
|
||||
Timer : Timer_Op_T
|
||||
:= (True, Timer_Id_T'(Constant1_Pkg.Null_Timer_Id with null record));
|
||||
|
||||
end Constant1;
|
|
@ -0,0 +1,11 @@
|
|||
package Constant1_Pkg is
|
||||
|
||||
type Id_T is mod Natural'Last + 1;
|
||||
|
||||
type Timer_Id_T is tagged record
|
||||
Id : Id_T := Id_T'Last;
|
||||
end record;
|
||||
|
||||
Null_Timer_Id : constant Timer_Id_T := (Id => Id_T'Last - 1);
|
||||
|
||||
end Constant1_Pkg;
|
Loading…
Reference in New Issue