Commit f3e0f7c3 by Bob Duff Committed by Arnaud Charlet

sem_attr.adb (Eval_Attribute): The code was assuming that X'Enum_Rep...

2016-07-04  Bob Duff  <duff@adacore.com>

	* sem_attr.adb (Eval_Attribute): The code was assuming
	that X'Enum_Rep, where X denotes a constant, can be constant
	folded. Fix it so it makes that assumption only when X denotes
	a STATIC constant.

From-SVN: r237975
parent aceb8afe
2016-07-04 Bob Duff <duff@adacore.com>
* sem_attr.adb (Eval_Attribute): The code was assuming
that X'Enum_Rep, where X denotes a constant, can be constant
folded. Fix it so it makes that assumption only when X denotes
a STATIC constant.
2016-07-04 Ed Schonberg <schonberg@adacore.com> 2016-07-04 Ed Schonberg <schonberg@adacore.com>
* sem_ch4.adb (Compatible_Types_In_Predicate): New function * sem_ch4.adb (Compatible_Types_In_Predicate): New function
......
...@@ -7424,35 +7424,49 @@ package body Sem_Attr is ...@@ -7424,35 +7424,49 @@ package body Sem_Attr is
elsif Id = Attribute_Enum_Rep then elsif Id = Attribute_Enum_Rep then
if Is_Entity_Name (P) then if Is_Entity_Name (P) then
-- The prefix denotes a constant or an enumeration literal, the declare
-- attribute can be folded. A generated loop variable for an Enum_Expr : Node_Id;
-- iterator is a constant, but cannot be constant-folded. -- The enumeration-type expression of interest
begin
-- P'Enum_Rep case
if Ekind (Entity (P)) = E_Enumeration_Literal if Ekind_In
or else (Entity (P), E_Constant, E_Enumeration_Literal)
(Ekind (Entity (P)) = E_Constant then
and then Ekind (Scope (Entity (P))) /= E_Loop) Enum_Expr := P;
then
P_Entity := Etype (P);
-- The prefix denotes an enumeration type. Folding can occur -- Enum_Type'Enum_Rep (E1) case
-- when the argument is a constant or an enumeration literal.
elsif Is_Enumeration_Type (Entity (P)) elsif Is_Enumeration_Type (Entity (P)) then
and then Present (E1) Enum_Expr := E1;
and then Is_Entity_Name (E1)
and then Ekind_In (Entity (E1), E_Constant,
E_Enumeration_Literal)
then
P_Entity := Etype (P);
-- Otherwise the attribute must be expanded into a conversion -- Otherwise the attribute must be expanded into a
-- and evaluated at run time. -- conversion and evaluated at run time.
else else
Check_Expressions; Check_Expressions;
return; return;
end if; end if;
-- We can fold if the expression is an enumeration
-- literal, or if it denotes a static constant.
if Nkind (Enum_Expr) in N_Has_Entity
and then (Ekind (Entity (Enum_Expr)) =
E_Enumeration_Literal
or else
(Ekind (Entity (Enum_Expr)) = E_Constant
and then Nkind (Parent (Entity (Enum_Expr))) =
N_Object_Declaration
and then Is_Static_Expression
(Expression (Parent (Entity (P))))))
then
P_Entity := Etype (P);
else
Check_Expressions;
return;
end if;
end;
-- Otherwise the attribute is illegal, do not attempt to perform -- Otherwise the attribute is illegal, do not attempt to perform
-- any kind of folding. -- any kind of folding.
......
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