-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2004 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING. If not, write --
--- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
--- MA 02111-1307, USA. --
+-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
+-- Boston, MA 02110-1301, USA. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
with Fname.UF; use Fname.UF;
with Osint; use Osint;
+with Rident; use Rident;
+with Restrict; use Restrict;
with Stringt; use Stringt;
with Stylesw; use Stylesw;
with Uintp; use Uintp;
function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is
Pragma_Name : constant Name_Id := Chars (Pragma_Node);
+ Prag_Id : constant Pragma_Id := Get_Pragma_Id (Pragma_Name);
Pragma_Sloc : constant Source_Ptr := Sloc (Pragma_Node);
Arg_Count : Nat;
Arg_Node : Node_Id;
-- Same as Check_Optional_Identifier, except that the name is required
-- to be present and to match the given Id value.
+ procedure Process_Restrictions_Or_Restriction_Warnings;
+ -- Common processing for Restrictions and Restriction_Warnings pragmas.
+ -- This routine only processes the case of No_Obsolescent_Features,
+ -- which is the only restriction that has syntactic effects. No general
+ -- error checking is done, since this will be done in Sem_Prag. The
+ -- other case processed is pragma Restrictions No_Dependence, since
+ -- otherwise this is done too late.
+
----------
-- Arg1 --
----------
end if;
end Check_Required_Identifier;
- ----------
- -- Prag --
- ----------
+ --------------------------------------------------
+ -- Process_Restrictions_Or_Restriction_Warnings --
+ --------------------------------------------------
+
+ procedure Process_Restrictions_Or_Restriction_Warnings is
+ Arg : Node_Id;
+ Id : Name_Id;
+ Expr : Node_Id;
+
+ begin
+ Arg := Arg1;
+ while Present (Arg) loop
+ Id := Chars (Arg);
+ Expr := Expression (Arg);
+
+ if Id = No_Name
+ and then Nkind (Expr) = N_Identifier
+ and then Get_Restriction_Id (Chars (Expr)) = No_Obsolescent_Features
+ then
+ Set_Restriction (No_Obsolescent_Features, Pragma_Node);
+ Restriction_Warnings (No_Obsolescent_Features) :=
+ Prag_Id = Pragma_Restriction_Warnings;
+
+ elsif Id = Name_No_Dependence then
+ Set_Restriction_No_Dependence
+ (Unit => Expr,
+ Warn => Prag_Id = Pragma_Restriction_Warnings);
+ end if;
+
+ Next (Arg);
+ end loop;
+ end Process_Restrictions_Or_Restriction_Warnings;
+
+-- Start if processing for Prag
begin
Error_Msg_Name_1 := Pragma_Name;
-- it is a semantic error, not a syntactic one (we have already checked
-- the syntax for the unrecognized pragma as required by (RM 2.8(11)).
- if not Is_Pragma_Name (Chars (Pragma_Node)) then
+ if Prag_Id = Unknown_Pragma then
return Pragma_Node;
end if;
-- Remaining processing is pragma dependent
- case Get_Pragma_Id (Pragma_Name) is
+ case Prag_Id is
------------
-- Ada_83 --
------------
-- This pragma must be processed at parse time, since we want to set
- -- the Ada 83 and Ada 95 switches properly at parse time to recognize
- -- Ada 83 syntax or Ada 95 syntax as appropriate.
+ -- the Ada version properly at parse time to recognize the appropriate
+ -- Ada version syntax.
when Pragma_Ada_83 =>
- Ada_83 := True;
- Ada_95 := False;
+ Ada_Version := Ada_83;
+ Ada_Version_Explicit := Ada_Version;
------------
-- Ada_95 --
------------
-- This pragma must be processed at parse time, since we want to set
- -- the Ada 83 and Ada_95 switches properly at parse time to recognize
- -- Ada 83 syntax or Ada 95 syntax as appropriate.
+ -- the Ada version properly at parse time to recognize the appropriate
+ -- Ada version syntax.
when Pragma_Ada_95 =>
- Ada_83 := False;
- Ada_95 := True;
+ Ada_Version := Ada_95;
+ Ada_Version_Explicit := Ada_Version;
+
+ ---------------------
+ -- Ada_05/Ada_2005 --
+ ---------------------
+
+ -- This pragma must be processed at parse time, since we want to set
+ -- the Ada version properly at parse time to recognize the appropriate
+ -- Ada version syntax. However, it is only the zero argument form that
+ -- must be processed at parse time.
+
+ when Pragma_Ada_05 | Pragma_Ada_2005 =>
+ if Arg_Count = 0 then
+ Ada_Version := Ada_05;
+ Ada_Version_Explicit := Ada_05;
+ end if;
-----------
-- Debug --
-- semantically we treat it as a procedure call (which has exactly the
-- same syntactic form, so that's why we can get away with this!)
- when Pragma_Debug =>
- Check_Arg_Count (1);
- Check_No_Identifier (Arg1);
+ when Pragma_Debug => Debug : declare
+ Expr : Node_Id;
- declare
- Expr : constant Node_Id := New_Copy (Expression (Arg1));
+ begin
+ if Arg_Count = 2 then
+ Check_No_Identifier (Arg1);
+ Check_No_Identifier (Arg2);
+ Expr := New_Copy (Expression (Arg2));
- begin
- if Nkind (Expr) /= N_Indexed_Component
- and then Nkind (Expr) /= N_Function_Call
- and then Nkind (Expr) /= N_Identifier
- and then Nkind (Expr) /= N_Selected_Component
- then
- Error_Msg
- ("argument of pragma% is not procedure call", Sloc (Expr));
- raise Error_Resync;
- else
- Set_Debug_Statement
- (Pragma_Node, P_Statement_Name (Expr));
- end if;
- end;
+ else
+ Check_Arg_Count (1);
+ Check_No_Identifier (Arg1);
+ Expr := New_Copy (Expression (Arg1));
+ end if;
+
+ if Nkind (Expr) /= N_Indexed_Component
+ and then Nkind (Expr) /= N_Function_Call
+ and then Nkind (Expr) /= N_Identifier
+ and then Nkind (Expr) /= N_Selected_Component
+ then
+ Error_Msg
+ ("argument of pragma% is not procedure call", Sloc (Expr));
+ raise Error_Resync;
+ else
+ Set_Debug_Statement
+ (Pragma_Node, P_Statement_Name (Expr));
+ end if;
+ end Debug;
-------------------------------
-- Extensions_Allowed (GNAT) --
Check_Arg_Count (1);
Check_No_Identifier (Arg1);
Check_Arg_Is_On_Or_Off (Arg1);
- Opt.Extensions_Allowed := (Chars (Expression (Arg1)) = Name_On);
+
+ if Chars (Expression (Arg1)) = Name_On then
+ Extensions_Allowed := True;
+ Ada_Version := Ada_Version_Type'Last;
+ else
+ Extensions_Allowed := False;
+ Ada_Version := Ada_Version_Type'Min (Ada_Version, Ada_95);
+ end if;
+
+ Ada_Version_Explicit := Ada_Version;
----------------
-- List (2.8) --
List_Pragmas.Increment_Last;
List_Pragmas.Table (List_Pragmas.Last) := (Page, Semi);
+ ------------------
+ -- Restrictions --
+ ------------------
+
+ -- pragma Restrictions (RESTRICTION {, RESTRICTION});
+
+ -- RESTRICTION ::=
+ -- restriction_IDENTIFIER
+ -- | restriction_parameter_IDENTIFIER => EXPRESSION
+
+ -- We process the case of No_Obsolescent_Features, since this has
+ -- a syntactic effect that we need to detect at parse time (the use
+ -- of replacement characters such as colon for pound sign).
+
+ when Pragma_Restrictions =>
+ Process_Restrictions_Or_Restriction_Warnings;
+
+ --------------------------
+ -- Restriction_Warnings --
+ --------------------------
+
+ -- pragma Restriction_Warnings (RESTRICTION {, RESTRICTION});
+
+ -- RESTRICTION ::=
+ -- restriction_IDENTIFIER
+ -- | restriction_parameter_IDENTIFIER => EXPRESSION
+
+ -- See above comment for pragma Restrictions
+
+ when Pragma_Restriction_Warnings =>
+ Process_Restrictions_Or_Restriction_Warnings;
+
----------------------------------------------------------
-- Source_File_Name and Source_File_Name_Project (GNAT) --
----------------------------------------------------------
if Nast /= 1 then
Error_Msg_N
("file name pattern must have exactly one * character",
- Arg2);
+ Arg1);
return Pragma_Node;
end if;
if not OK then
Error_Msg
- ("invalid style check option",
+ (Style_Msg_Buf (1 .. Style_Msg_Len),
Sloc (Expression (Arg1)) + Source_Ptr (Ptr));
raise Error_Resync;
end if;
---------------------
-- pragma Warnings (On | Off, [LOCAL_NAME])
+ -- pragma Warnings (static_string_EXPRESSION);
- -- The one argument case is processed by the parser, since it may
- -- control parser warnings as well as semantic warnings, and in any
- -- case we want to be absolutely sure that the range in the warnings
- -- table is set well before any semantic analysis is performed.
+ -- The one argument ON/OFF case is processed by the parser, since it may
+ -- control parser warnings as well as semantic warnings, and in any case
+ -- we want to be absolutely sure that the range in the warnings table is
+ -- set well before any semantic analysis is performed.
when Pragma_Warnings =>
if Arg_Count = 1 then
Check_No_Identifier (Arg1);
- Check_Arg_Is_On_Or_Off (Arg1);
- if Chars (Expression (Arg1)) = Name_On then
- Set_Warnings_Mode_On (Pragma_Sloc);
- else
- Set_Warnings_Mode_Off (Pragma_Sloc);
- end if;
+ declare
+ Argx : constant Node_Id := Expression (Arg1);
+ begin
+ if Nkind (Argx) = N_Identifier then
+ if Chars (Argx) = Name_On then
+ Set_Warnings_Mode_On (Pragma_Sloc);
+ elsif Chars (Argx) = Name_Off then
+ Set_Warnings_Mode_Off (Pragma_Sloc);
+ end if;
+ end if;
+ end;
end if;
-----------------------
-- entirely in Sem_Prag, and no further checking is done by Par.
when Pragma_Abort_Defer |
+ Pragma_Assertion_Policy |
Pragma_AST_Entry |
Pragma_All_Calls_Remote |
Pragma_Annotate |
Pragma_C_Pass_By_Copy |
Pragma_Comment |
Pragma_Common_Object |
+ Pragma_Complete_Representation |
Pragma_Complex_Representation |
Pragma_Component_Alignment |
Pragma_Controlled |
Pragma_Convention |
+ Pragma_Debug_Policy |
+ Pragma_Detect_Blocking |
Pragma_Discard_Names |
Pragma_Eliminate |
Pragma_Elaborate |
Pragma_License |
Pragma_Link_With |
Pragma_Linker_Alias |
+ Pragma_Linker_Constructor |
+ Pragma_Linker_Destructor |
Pragma_Linker_Options |
Pragma_Linker_Section |
Pragma_Locking_Policy |
Pragma_Normalize_Scalars |
Pragma_Optimize |
Pragma_Optional_Overriding |
- Pragma_Overriding |
Pragma_Pack |
Pragma_Passive |
Pragma_Polling |
- Pragma_Persistent_Data |
- Pragma_Persistent_Object |
+ Pragma_Persistent_BSS |
Pragma_Preelaborate |
+ Pragma_Preelaborate_05 |
Pragma_Priority |
Pragma_Profile |
+ Pragma_Profile_Warnings |
Pragma_Propagate_Exceptions |
Pragma_Psect_Object |
Pragma_Pure |
+ Pragma_Pure_05 |
Pragma_Pure_Function |
Pragma_Queuing_Policy |
Pragma_Remote_Call_Interface |
Pragma_Remote_Types |
- Pragma_Restrictions |
- Pragma_Restriction_Warnings |
Pragma_Restricted_Run_Time |
Pragma_Ravenscar |
Pragma_Reviewable |