Commit f073e741 by Robert Dewar Committed by Arnaud Charlet

re PR ada/15613 (Accepts named parameters not last)

2005-06-14  Robert Dewar  <dewar@adacore.com>

	PR ada/15613

	* par-ch2.adb (Scan_Pragma_Argument): New procedure
	(P_Pragma): Implement RM 2.8(4) check for no pos args after named args

From-SVN: r101051
parent 96f2e32f
...@@ -33,7 +33,14 @@ package body Ch2 is ...@@ -33,7 +33,14 @@ package body Ch2 is
-- Local functions, used only in this chapter -- Local functions, used only in this chapter
function P_Pragma_Argument_Association return Node_Id; procedure Scan_Pragma_Argument_Association
(Identifier_Seen : in out Boolean;
Association : out Node_Id);
-- Scans out a pragma argument association. Identifier_Seen is true on
-- entry if a previous association had an identifier, and gets set True if
-- the scanned association has an identifier (this is used to check the
-- rule that no associations without identifiers can follow an association
-- which has an identifier). The result is returned in Association.
--------------------- ---------------------
-- 2.3 Identifier -- -- 2.3 Identifier --
...@@ -55,11 +62,12 @@ package body Ch2 is ...@@ -55,11 +62,12 @@ package body Ch2 is
if Token = Tok_Identifier then if Token = Tok_Identifier then
-- Ada 2005 (AI-284): Compiling in Ada95 mode we notify -- Ada 2005 (AI-284): Compiling in Ada95 mode we warn that INTERFACE,
-- that interface, overriding, and synchronized are -- OVERRIDING, and SYNCHRONIZED are new reserved words.
-- new reserved words
if Ada_Version = Ada_95 then if Ada_Version = Ada_95
and then Warn_On_Ada_2005_Compatibility
then
if Token_Name = Name_Overriding if Token_Name = Name_Overriding
or else Token_Name = Name_Synchronized or else Token_Name = Name_Synchronized
or else (Token_Name = Name_Interface or else (Token_Name = Name_Interface
...@@ -231,6 +239,10 @@ package body Ch2 is ...@@ -231,6 +239,10 @@ package body Ch2 is
Arg_Count : Int := 0; Arg_Count : Int := 0;
-- Number of argument associations processed -- Number of argument associations processed
Identifier_Seen : Boolean := False;
-- Set True if an identifier is encountered for a pragma argument. Used
-- to check that there are no more arguments without identifiers.
Pragma_Node : Node_Id; Pragma_Node : Node_Id;
Pragma_Name : Name_Id; Pragma_Name : Name_Id;
Semicolon_Loc : Source_Ptr; Semicolon_Loc : Source_Ptr;
...@@ -305,7 +317,7 @@ package body Ch2 is ...@@ -305,7 +317,7 @@ package body Ch2 is
loop loop
Arg_Count := Arg_Count + 1; Arg_Count := Arg_Count + 1;
Assoc_Node := P_Pragma_Argument_Association; Scan_Pragma_Argument_Association (Identifier_Seen, Assoc_Node);
if Arg_Count = 2 if Arg_Count = 2
and then (Interface_Check_Required or else Import_Check_Required) and then (Interface_Check_Required or else Import_Check_Required)
...@@ -438,14 +450,16 @@ package body Ch2 is ...@@ -438,14 +450,16 @@ package body Ch2 is
-- Error recovery: cannot raise Error_Resync -- Error recovery: cannot raise Error_Resync
function P_Pragma_Argument_Association return Node_Id is procedure Scan_Pragma_Argument_Association
(Identifier_Seen : in out Boolean;
Association : out Node_Id)
is
Scan_State : Saved_Scan_State; Scan_State : Saved_Scan_State;
Pragma_Arg_Node : Node_Id;
Identifier_Node : Node_Id; Identifier_Node : Node_Id;
begin begin
Pragma_Arg_Node := New_Node (N_Pragma_Argument_Association, Token_Ptr); Association := New_Node (N_Pragma_Argument_Association, Token_Ptr);
Set_Chars (Pragma_Arg_Node, No_Name); Set_Chars (Association, No_Name);
if Token = Tok_Identifier then if Token = Tok_Identifier then
Identifier_Node := Token_Node; Identifier_Node := Token_Node;
...@@ -453,17 +467,24 @@ package body Ch2 is ...@@ -453,17 +467,24 @@ package body Ch2 is
Scan; -- past Identifier Scan; -- past Identifier
if Token = Tok_Arrow then if Token = Tok_Arrow then
Identifier_Seen := True;
Scan; -- past arrow Scan; -- past arrow
Set_Chars (Pragma_Arg_Node, Chars (Identifier_Node)); Set_Chars (Association, Chars (Identifier_Node));
Delete_Node (Identifier_Node); Delete_Node (Identifier_Node);
-- Case of argument with no identifier
else else
Restore_Scan_State (Scan_State); -- to Identifier Restore_Scan_State (Scan_State); -- to Identifier
if Identifier_Seen then
Error_Msg_SC
("|pragma argument identifier required here ('R'M' 2.8(4))");
end if;
end if; end if;
end if; end if;
Set_Expression (Pragma_Arg_Node, P_Expression); Set_Expression (Association, P_Expression);
return Pragma_Arg_Node; end Scan_Pragma_Argument_Association;
end P_Pragma_Argument_Association;
end Ch2; end Ch2;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment