mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 19:41:29 +08:00
[Ada] Unnesting: fix for constrained arrays and improve static constants
2018-12-11 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_unst.adb (Needs_Fat_Pointer): A fat pointer is required if the entity has a private type whose full view is an unconstrained array type. (Rewrite_One_Ref): If the reference is to a static constant, use its value rather than create a reference through the activation record. This is more efficient, and furthermore indispensable if the context requires a static constant, such as in a branch of a case statement. From-SVN: r267003
This commit is contained in:
parent
0a4578b6c6
commit
1d499c15a8
@ -1,3 +1,14 @@
|
||||
2018-12-11 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* exp_unst.adb (Needs_Fat_Pointer): A fat pointer is required if
|
||||
the entity has a private type whose full view is an
|
||||
unconstrained array type.
|
||||
(Rewrite_One_Ref): If the reference is to a static constant, use
|
||||
its value rather than create a reference through the activation
|
||||
record. This is more efficient, and furthermore indispensable if
|
||||
the context requires a static constant, such as in a branch of a
|
||||
case statement.
|
||||
|
||||
2018-12-11 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* sem_ch3.adb (Analyze_Object_Declaration): Apply
|
||||
|
@ -246,10 +246,19 @@ package body Exp_Unst is
|
||||
-----------------------
|
||||
|
||||
function Needs_Fat_Pointer (E : Entity_Id) return Boolean is
|
||||
Typ : Entity_Id;
|
||||
begin
|
||||
return Is_Formal (E)
|
||||
and then Is_Array_Type (Etype (E))
|
||||
and then not Is_Constrained (Etype (E));
|
||||
if Is_Formal (E) then
|
||||
Typ := Etype (E);
|
||||
if Is_Private_Type (Typ) and then Present (Full_View (Typ)) then
|
||||
Typ := Full_View (Typ);
|
||||
end if;
|
||||
|
||||
return Is_Array_Type (Typ)
|
||||
and then not Is_Constrained (Typ);
|
||||
else
|
||||
return False;
|
||||
end if;
|
||||
end Needs_Fat_Pointer;
|
||||
|
||||
----------------
|
||||
@ -2168,6 +2177,21 @@ package body Exp_Unst is
|
||||
goto Continue;
|
||||
end if;
|
||||
|
||||
-- If this is a reference to a global constant, use its value
|
||||
-- rather than create a reference. It is more efficient and
|
||||
-- furthermore indispensable if the context requires a
|
||||
-- constant, such as a branch of a case statement.
|
||||
|
||||
if Ekind (UPJ.Ent) = E_Constant
|
||||
and then Is_True_Constant (UPJ.Ent)
|
||||
and then Present (Constant_Value (UPJ.Ent))
|
||||
and then Is_Static_Expression (Constant_Value (UPJ.Ent))
|
||||
then
|
||||
Rewrite (UPJ.Ref,
|
||||
New_Copy_Tree (Constant_Value (UPJ.Ent)));
|
||||
goto Continue;
|
||||
end if;
|
||||
|
||||
-- Push the current scope, so that the pointer type Tnn, and
|
||||
-- any subsidiary entities resulting from the analysis of the
|
||||
-- rewritten reference, go in the right entity chain.
|
||||
|
Loading…
x
Reference in New Issue
Block a user