diff options
Diffstat (limited to 'gcc/ada/sem_ch9.adb')
-rw-r--r-- | gcc/ada/sem_ch9.adb | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb index 8c570449..6a9fedf2 100644 --- a/gcc/ada/sem_ch9.adb +++ b/gcc/ada/sem_ch9.adb @@ -244,12 +244,71 @@ package body Sem_Ch9 is ---------------- function Check_Node (N : Node_Id) return Traverse_Result is + function Is_Static_Function (Attr : Node_Id) return Boolean; + -- Given an attribute reference node Attr, return True if + -- Attr denotes a static function according to the rules in + -- (RM 4.9 (22)). + + ------------------------ + -- Is_Static_Function -- + ------------------------ + + function Is_Static_Function + (Attr : Node_Id) return Boolean + is + Para : Node_Id; + + begin + pragma Assert (Nkind (Attr) = N_Attribute_Reference); + + case Attribute_Name (Attr) is + when Name_Min | + Name_Max | + Name_Pred | + Name_Succ | + Name_Value | + Name_Wide_Value | + Name_Wide_Wide_Value => + + -- A language-defined attribute denotes a static + -- function if the prefix denotes a static scalar + -- subtype, and if the parameter and result types + -- are scalar (RM 4.9 (22)). + + if Is_Scalar_Type (Etype (Attr)) + and then Is_Scalar_Type (Etype (Prefix (Attr))) + and then Is_Static_Subtype (Etype (Prefix (Attr))) + then + Para := First (Expressions (Attr)); + + while Present (Para) loop + if not Is_Scalar_Type (Etype (Para)) then + return False; + end if; + + Next (Para); + end loop; + + return True; + + else + return False; + end if; + + when others => return False; + end case; + end Is_Static_Function; + + -- Start of processing for Check_Node + begin if Is_Procedure then - -- Function calls and attribute references must be static + -- Attribute references must be static or denote a static + -- function. if Nkind (N) = N_Attribute_Reference and then not Is_Static_Expression (N) + and then not Is_Static_Function (N) then if Complain then Error_Msg_N @@ -258,6 +317,8 @@ package body Sem_Ch9 is return Abandon; + -- Function calls must be static + elsif Nkind (N) = N_Function_Call and then not Is_Static_Expression (N) then |