[gcc(refs/users/aoliva/heads/testbase)] [Ada] Fold Enum_Rep attribute in evaluation and not in expansion
Alexandre Oliva
aoliva@gcc.gnu.org
Wed Jun 10 21:18:08 GMT 2020
https://gcc.gnu.org/g:c64ac479d37f32198f75eee496d32c175fc4260b
commit c64ac479d37f32198f75eee496d32c175fc4260b
Author: Piotr Trojanek <trojanek@adacore.com>
Date: Thu Mar 5 11:46:59 2020 +0100
[Ada] Fold Enum_Rep attribute in evaluation and not in expansion
2020-06-10 Piotr Trojanek <trojanek@adacore.com>
gcc/ada/
* exp_attr.adb (Expand_N_Attribute_Reference): Remove folding
for Enum_Rep attribute.
* exp_spark.adb (Expand_SPARK_N_Attribute_Reference): Remove
duplicated code for folding Enum_Rep attribute.
* sem_attr.adb (Eval_Attribute): Relax condition for folding
Enum_Rep attribute; previously dead code is now executed when
the attribute prefix is an enumeration literal; refine type in
processing of Enum_Val.
Diff:
---
gcc/ada/exp_attr.adb | 15 +++------------
gcc/ada/exp_spark.adb | 23 -----------------------
gcc/ada/sem_attr.adb | 8 ++++++--
3 files changed, 9 insertions(+), 37 deletions(-)
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 67a18c66ed1..356d3dbd069 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -3159,17 +3159,8 @@ package body Exp_Attr is
Expr := Pref;
end if;
- -- If the expression is an enumeration literal, it is replaced by the
- -- literal value.
-
- if Nkind (Expr) in N_Has_Entity
- and then Ekind (Entity (Expr)) = E_Enumeration_Literal
- then
- Rewrite (N,
- Make_Integer_Literal (Loc, Enumeration_Rep (Entity (Expr))));
-
- -- If not constant-folded above, Enum_Type'Enum_Rep (X) or
- -- X'Enum_Rep expands to
+ -- If not constant-folded, Enum_Type'Enum_Rep (X) or X'Enum_Rep
+ -- expands to
-- target-type (X)
@@ -3185,7 +3176,7 @@ package body Exp_Attr is
-- first convert to a small signed integer type in order not to lose
-- the size information.
- elsif Is_Enumeration_Type (Ptyp) then
+ if Is_Enumeration_Type (Ptyp) then
Psiz := RM_Size (Base_Type (Ptyp));
if Psiz < 8 then
diff --git a/gcc/ada/exp_spark.adb b/gcc/ada/exp_spark.adb
index c115a453228..cab48f49b5c 100644
--- a/gcc/ada/exp_spark.adb
+++ b/gcc/ada/exp_spark.adb
@@ -199,29 +199,6 @@ package body Exp_SPARK is
Parameter_Associations => New_List (Expr)));
Analyze_And_Resolve (N, Typ);
- -- Whenever possible, replace a prefix which is an enumeration literal
- -- by the corresponding literal value, just like it happens in the GNAT
- -- expander.
-
- elsif Attr_Id = Attribute_Enum_Rep then
- declare
- Exprs : constant List_Id := Expressions (N);
- begin
- if Is_Non_Empty_List (Exprs) then
- Expr := First (Exprs);
- else
- Expr := Prefix (N);
- end if;
-
- -- If the argument is a literal, expand it
-
- if Nkind (Expr) in N_Has_Entity
- and then Ekind (Entity (Expr)) = E_Enumeration_Literal
- then
- Exp_Attr.Expand_N_Attribute_Reference (N);
- end if;
- end;
-
elsif Attr_Id = Attribute_Object_Size
or else Attr_Id = Attribute_Size
or else Attr_Id = Attribute_Value_Size
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index e82082bc07a..d2ac4c77298 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -7719,7 +7719,11 @@ package body Sem_Attr is
-- purpose, a string literal counts as an object (attributes of string
-- literals can only appear in generated code).
- if Is_Object_Reference (P) or else Nkind (P) = N_String_Literal then
+ if Is_Object_Reference (P)
+ or else Nkind (P) = N_String_Literal
+ or else (Is_Entity_Name (P)
+ and then Ekind (Entity (P)) = E_Enumeration_Literal)
+ then
-- For Component_Size, the prefix is an array object, and we apply
-- the attribute to the type of the object. This is allowed for both
@@ -8533,7 +8537,7 @@ package body Sem_Attr is
--------------
when Attribute_Enum_Val => Enum_Val : declare
- Lit : Node_Id;
+ Lit : Entity_Id;
begin
-- We have something like Enum_Type'Enum_Val (23), so search for a
More information about the Gcc-cvs
mailing list