From f3e0f7c3c189b07f56e8758ab5174bd2820d7ea5 Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Mon, 4 Jul 2016 12:30:44 +0000 Subject: [PATCH] sem_attr.adb (Eval_Attribute): The code was assuming that X'Enum_Rep... 2016-07-04 Bob Duff * 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 --- gcc/ada/ChangeLog | 7 +++++ gcc/ada/sem_attr.adb | 62 +++++++++++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2e6926d006a..9af2d5f8a80 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2016-07-04 Bob Duff + + * 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 * sem_ch4.adb (Compatible_Types_In_Predicate): New function diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index eefeabe63d6..389f83004df 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -7424,35 +7424,49 @@ package body Sem_Attr is elsif Id = Attribute_Enum_Rep then if Is_Entity_Name (P) then - -- The prefix denotes a constant or an enumeration literal, the - -- attribute can be folded. A generated loop variable for an - -- iterator is a constant, but cannot be constant-folded. + declare + Enum_Expr : Node_Id; + -- The enumeration-type expression of interest + begin + -- P'Enum_Rep case - if Ekind (Entity (P)) = E_Enumeration_Literal - or else - (Ekind (Entity (P)) = E_Constant - and then Ekind (Scope (Entity (P))) /= E_Loop) - then - P_Entity := Etype (P); + if Ekind_In + (Entity (P), E_Constant, E_Enumeration_Literal) + then + Enum_Expr := P; - -- The prefix denotes an enumeration type. Folding can occur - -- when the argument is a constant or an enumeration literal. + -- Enum_Type'Enum_Rep (E1) case - elsif Is_Enumeration_Type (Entity (P)) - and then Present (E1) - and then Is_Entity_Name (E1) - and then Ekind_In (Entity (E1), E_Constant, - E_Enumeration_Literal) - then - P_Entity := Etype (P); + elsif Is_Enumeration_Type (Entity (P)) then + Enum_Expr := E1; - -- Otherwise the attribute must be expanded into a conversion - -- and evaluated at run time. + -- Otherwise the attribute must be expanded into a + -- conversion and evaluated at run time. - else - Check_Expressions; - return; - end if; + else + Check_Expressions; + return; + 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 -- any kind of folding. -- 2.30.2