From: Arnaud Charlet Date: Mon, 4 Jul 2016 12:32:22 +0000 (+0200) Subject: [multiple changes] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0c3f76bac4d10283ab9d6fc9a64ccb0140a0b91e;p=gcc.git [multiple changes] 2016-07-04 Ed Schonberg * sem_attr.adb (Analyze_Attribute_Old_Result): The attributes can appear in the postcondition of a subprogram renaming declaration, when the renamed entity is an attribute reference that is a function (such as 'Value). * sem_attr.adb (Eval_Attribute): It doesn't need to be static, just known at compile time, so use Compile_Time_Known_Value instead of Is_Static_Expression. This is an efficiency improvement over the previous bug fix. * sem_ch13.adb (Analyze_One_Aspect): Use Original_Node to detect illegal aspects on subprogram renaming declarations that may have been rewritten as bodies. 2016-07-04 Arnaud Charlet * sem_intr.adb (Errint): Do not emit error message in Relaxed_RM_Semantics mode. From-SVN: r237976 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 9af2d5f8a80..92032ab358f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,22 @@ +2016-07-04 Ed Schonberg + + * sem_attr.adb (Analyze_Attribute_Old_Result): The attributes can + appear in the postcondition of a subprogram renaming declaration, + when the renamed entity is an attribute reference that is a + function (such as 'Value). + * sem_attr.adb (Eval_Attribute): It doesn't + need to be static, just known at compile time, so use + Compile_Time_Known_Value instead of Is_Static_Expression. + This is an efficiency improvement over the previous bug fix. + * sem_ch13.adb (Analyze_One_Aspect): Use Original_Node to detect + illegal aspects on subprogram renaming declarations that may + have been rewritten as bodies. + +2016-07-04 Arnaud Charlet + + * sem_intr.adb (Errint): Do not emit error message in + Relaxed_RM_Semantics mode. + 2016-07-04 Bob Duff * sem_attr.adb (Eval_Attribute): The code was assuming diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index 389f83004df..d6d850994be 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -1354,14 +1354,17 @@ package body Sem_Attr is -- The aspect or pragma where the attribute resides should be -- associated with a subprogram declaration or a body. If this is not -- the case, then the aspect or pragma is illegal. Return as analysis - -- cannot be carried out. + -- cannot be carried out. Note that it is legal to have the aspect + -- appear on a subprogram renaming, when the renamed entity is an + -- attribute reference. if not Nkind_In (Subp_Decl, N_Abstract_Subprogram_Declaration, N_Entry_Declaration, N_Generic_Subprogram_Declaration, N_Subprogram_Body, N_Subprogram_Body_Stub, - N_Subprogram_Declaration) + N_Subprogram_Declaration, + N_Subprogram_Renaming_Declaration) then return; end if; @@ -7427,11 +7430,12 @@ package body Sem_Attr is declare Enum_Expr : Node_Id; -- The enumeration-type expression of interest + begin -- P'Enum_Rep case - if Ekind_In - (Entity (P), E_Constant, E_Enumeration_Literal) + if Ekind_In (Entity (P), E_Constant, + E_Enumeration_Literal) then Enum_Expr := P; @@ -7449,7 +7453,8 @@ package body Sem_Attr is end if; -- We can fold if the expression is an enumeration - -- literal, or if it denotes a static constant. + -- literal, or if it denotes a constant whose value + -- is known at compile time. if Nkind (Enum_Expr) in N_Has_Entity and then (Ekind (Entity (Enum_Expr)) = @@ -7458,7 +7463,7 @@ package body Sem_Attr is (Ekind (Entity (Enum_Expr)) = E_Constant and then Nkind (Parent (Entity (Enum_Expr))) = N_Object_Declaration - and then Is_Static_Expression + and then Compile_Time_Known_Value (Expression (Parent (Entity (P)))))) then P_Entity := Etype (P); diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 163f8d68d11..fc9c4c494bf 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -1937,9 +1937,11 @@ package body Sem_Ch13 is if not Implementation_Defined_Aspect (A_Id) then Error_Msg_Name_1 := Nam; - -- Not allowed for renaming declarations + -- Not allowed for renaming declarations. Examine original + -- node because a subprogram renaming may have been rewritten + -- as a body. - if Nkind (N) in N_Renaming_Declaration then + if Nkind (Original_Node (N)) in N_Renaming_Declaration then Error_Msg_N ("aspect % not allowed for renaming declaration", Aspect); diff --git a/gcc/ada/sem_intr.adb b/gcc/ada/sem_intr.adb index a15e95cb3cf..e26443aa980 100644 --- a/gcc/ada/sem_intr.adb +++ b/gcc/ada/sem_intr.adb @@ -31,6 +31,7 @@ with Errout; use Errout; with Fname; use Fname; with Lib; use Lib; with Namet; use Namet; +with Opt; use Opt; with Sem_Aux; use Sem_Aux; with Sem_Eval; use Sem_Eval; with Sem_Util; use Sem_Util; @@ -466,8 +467,13 @@ package body Sem_Intr is procedure Errint (Msg : String; S : Node_Id; N : Node_Id) is begin - Error_Msg_N (Msg, S); - Error_Msg_N ("incorrect intrinsic subprogram, see spec", N); + -- Ignore errors on Intrinsic in Relaxed_RM_Semantics mode where we can + -- be more liberal. + + if not Relaxed_RM_Semantics then + Error_Msg_N (Msg, S); + Error_Msg_N ("incorrect intrinsic subprogram, see spec", N); + end if; end Errint; end Sem_Intr;