https://gcc.gnu.org/g:c78f1484aeb6b35bf1ae905e664a45a0a33e2fde
commit r17-1960-gc78f1484aeb6b35bf1ae905e664a45a0a33e2fde Author: Piotr Trojanek <[email protected]> Date: Fri Jun 5 15:53:31 2026 +0200 ada: Accept Modifies contract as a pragma Typically, the recently added Modifies contract for SPARK will appear as an aspect, but we also allow it to appear as a pragma, just like we do for Global, Depends and other SPARK contracts. gcc/ada/ChangeLog: * par-ch13.adb (P_Modifies_Specification): Now public, so it can be reused when parsing a pragma. * par-ch2.adb (P_Pragma): Parse pragma Modifies with a custom syntax. * par-prag.adb (Prag): A ??? comment is now implemented. * par.adb (P_Modifies_Specification): Now public, so it can be reused. Diff: --- gcc/ada/par-ch13.adb | 1 - gcc/ada/par-ch2.adb | 20 +++++++++++++++----- gcc/ada/par-prag.adb | 2 +- gcc/ada/par.adb | 4 ++++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/gcc/ada/par-ch13.adb b/gcc/ada/par-ch13.adb index 1bca0b44b8a8..b043cf509a8b 100644 --- a/gcc/ada/par-ch13.adb +++ b/gcc/ada/par-ch13.adb @@ -36,7 +36,6 @@ package body Ch13 is function P_Component_Clause return Node_Id; function P_Mod_Clause return Node_Id; - function P_Modifies_Specification return Node_Id; ----------------------------------- -- Aspect_Specifications_Present -- diff --git a/gcc/ada/par-ch2.adb b/gcc/ada/par-ch2.adb index a83f145236b3..e661dd7b8212 100644 --- a/gcc/ada/par-ch2.adb +++ b/gcc/ada/par-ch2.adb @@ -403,11 +403,21 @@ package body Ch2 is loop Arg_Count := Arg_Count + 1; - Scan_Pragma_Argument_Association - (Identifier_Seen => Identifier_Seen, - Association => Assoc_Node, - Reserved_Words_OK => - Prag_Name in Name_Restriction_Warnings | Name_Restrictions); + -- Syntax of the Modifies contract requires custom parsing + + if Chars (Ident_Node) = Name_Modifies then + Assoc_Node := + New_Node (N_Pragma_Argument_Association, Token_Ptr); + Set_Chars (Assoc_Node, No_Name); + Set_Expression (Assoc_Node, Ch13.P_Modifies_Specification); + else + Scan_Pragma_Argument_Association + (Identifier_Seen => Identifier_Seen, + Association => Assoc_Node, + Reserved_Words_OK => + Prag_Name in Name_Restriction_Warnings + | Name_Restrictions); + end if; if Arg_Count = 2 and then Import_Check_Required then -- Here is where we cancel the SIS active status if this pragma diff --git a/gcc/ada/par-prag.adb b/gcc/ada/par-prag.adb index f93f7b4da16f..d73c5d8cce74 100644 --- a/gcc/ada/par-prag.adb +++ b/gcc/ada/par-prag.adb @@ -1507,7 +1507,7 @@ begin | Pragma_Max_Entry_Queue_Length | Pragma_Max_Queue_Length | Pragma_Memory_Size - | Pragma_Modifies -- ??? this pragma needs custom parsing + | Pragma_Modifies | Pragma_No_Body | Pragma_No_Caching | Pragma_No_Component_Reordering diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb index f776bfb9da65..27491e673f18 100644 --- a/gcc/ada/par.adb +++ b/gcc/ada/par.adb @@ -1086,6 +1086,10 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is -- identifier or a selected component). The current token is an -- apostrophe and the following token is either a left paren or -- RANGE (the latter being an error to be caught by P_Code_Statement. + + function P_Modifies_Specification return Node_Id; + -- Parse a Modifies contract specification, which is also allowed to + -- appear as a pragma for compatibility with old versions of Ada. end Ch13; -- Note: the parsing for annexe J features (i.e. obsolescent features)
