| ------------------------------------------------------------------------------ |
| -- -- |
| -- GNAT COMPILER COMPONENTS -- |
| -- -- |
| -- P A R . P R A G -- |
| -- -- |
| -- B o d y -- |
| -- -- |
| -- Copyright (C) 1992-2015, 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- -- |
| -- ware Foundation; either version 3, or (at your option) any later ver- -- |
| -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- |
| -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- |
| -- 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 COPYING3. If not, go to -- |
| -- http://www.gnu.org/licenses for a complete copy of the license. -- |
| -- -- |
| -- GNAT was originally developed by the GNAT team at New York University. -- |
| -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
| -- -- |
| ------------------------------------------------------------------------------ |
| |
| -- Generally the parser checks the basic syntax of pragmas, but does not |
| -- do specialized syntax checks for individual pragmas, these are deferred |
| -- to semantic analysis time (see unit Sem_Prag). There are some pragmas |
| -- which require recognition and either partial or complete processing |
| -- during parsing, and this unit performs this required processing. |
| |
| 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; |
| with Uname; use Uname; |
| |
| with System.WCh_Con; use System.WCh_Con; |
| |
| separate (Par) |
| |
| function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is |
| Prag_Name : constant Name_Id := Pragma_Name (Pragma_Node); |
| Prag_Id : constant Pragma_Id := Get_Pragma_Id (Prag_Name); |
| Pragma_Sloc : constant Source_Ptr := Sloc (Pragma_Node); |
| Arg_Count : Nat; |
| Arg_Node : Node_Id; |
| |
| ----------------------- |
| -- Local Subprograms -- |
| ----------------------- |
| |
| procedure Add_List_Pragma_Entry (PT : List_Pragma_Type; Loc : Source_Ptr); |
| -- Make a new entry in the List_Pragmas table if this entry is not already |
| -- in the table (it will always be the last one if there is a duplication |
| -- resulting from the use of Save/Restore_Scan_State). |
| |
| function Arg1 return Node_Id; |
| function Arg2 return Node_Id; |
| function Arg3 return Node_Id; |
| -- Obtain specified Pragma_Argument_Association. It is allowable to call |
| -- the routine for the argument one past the last present argument, but |
| -- that is the only case in which a non-present argument can be referenced. |
| |
| procedure Check_Arg_Count (Required : Int); |
| -- Check argument count for pragma = Required. If not give error and raise |
| -- Error_Resync. |
| |
| procedure Check_Arg_Is_String_Literal (Arg : Node_Id); |
| -- Check the expression of the specified argument to make sure that it |
| -- is a string literal. If not give error and raise Error_Resync. |
| |
| procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id); |
| -- Check the expression of the specified argument to make sure that it |
| -- is an identifier which is either ON or OFF, and if not, then issue |
| -- an error message and raise Error_Resync. |
| |
| procedure Check_No_Identifier (Arg : Node_Id); |
| -- Checks that the given argument does not have an identifier. If |
| -- an identifier is present, then an error message is issued, and |
| -- Error_Resync is raised. |
| |
| procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id); |
| -- Checks if the given argument has an identifier, and if so, requires |
| -- it to match the given identifier name. If there is a non-matching |
| -- identifier, then an error message is given and Error_Resync raised. |
| |
| procedure Check_Required_Identifier (Arg : Node_Id; Id : Name_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. |
| -- For the most part, restrictions need not be processed at parse time, |
| -- since they only affect semantic processing. This routine handles the |
| -- exceptions as follows |
| -- |
| -- No_Obsolescent_Features must be processed at parse time, since there |
| -- are some obsolescent features (e.g. character replacements) which are |
| -- handled at parse time. |
| -- |
| -- SPARK must be processed at parse time, since this restriction controls |
| -- whether the scanner recognizes a spark HIDE directive formatted as an |
| -- Ada comment (and generates a Tok_SPARK_Hide token for the directive). |
| -- |
| -- No_Dependence must be processed at parse time, since otherwise it gets |
| -- handled too late. |
| -- |
| -- Note that we don't need to do full error checking for badly formed cases |
| -- of restrictions, since these will be caught during semantic analysis. |
| |
| --------------------------- |
| -- Add_List_Pragma_Entry -- |
| --------------------------- |
| |
| procedure Add_List_Pragma_Entry (PT : List_Pragma_Type; Loc : Source_Ptr) is |
| begin |
| if List_Pragmas.Last < List_Pragmas.First |
| or else (List_Pragmas.Table (List_Pragmas.Last)) /= ((PT, Loc)) |
| then |
| List_Pragmas.Append ((PT, Loc)); |
| end if; |
| end Add_List_Pragma_Entry; |
| |
| ---------- |
| -- Arg1 -- |
| ---------- |
| |
| function Arg1 return Node_Id is |
| begin |
| return First (Pragma_Argument_Associations (Pragma_Node)); |
| end Arg1; |
| |
| ---------- |
| -- Arg2 -- |
| ---------- |
| |
| function Arg2 return Node_Id is |
| begin |
| return Next (Arg1); |
| end Arg2; |
| |
| ---------- |
| -- Arg3 -- |
| ---------- |
| |
| function Arg3 return Node_Id is |
| begin |
| return Next (Arg2); |
| end Arg3; |
| |
| --------------------- |
| -- Check_Arg_Count -- |
| --------------------- |
| |
| procedure Check_Arg_Count (Required : Int) is |
| begin |
| if Arg_Count /= Required then |
| Error_Msg ("wrong number of arguments for pragma%", Pragma_Sloc); |
| raise Error_Resync; |
| end if; |
| end Check_Arg_Count; |
| |
| ---------------------------- |
| -- Check_Arg_Is_On_Or_Off -- |
| ---------------------------- |
| |
| procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id) is |
| Argx : constant Node_Id := Expression (Arg); |
| |
| begin |
| if Nkind (Expression (Arg)) /= N_Identifier |
| or else not Nam_In (Chars (Argx), Name_On, Name_Off) |
| then |
| Error_Msg_Name_2 := Name_On; |
| Error_Msg_Name_3 := Name_Off; |
| |
| Error_Msg ("argument for pragma% must be% or%", Sloc (Argx)); |
| raise Error_Resync; |
| end if; |
| end Check_Arg_Is_On_Or_Off; |
| |
| --------------------------------- |
| -- Check_Arg_Is_String_Literal -- |
| --------------------------------- |
| |
| procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is |
| begin |
| if Nkind (Expression (Arg)) /= N_String_Literal then |
| Error_Msg |
| ("argument for pragma% must be string literal", |
| Sloc (Expression (Arg))); |
| raise Error_Resync; |
| end if; |
| end Check_Arg_Is_String_Literal; |
| |
| ------------------------- |
| -- Check_No_Identifier -- |
| ------------------------- |
| |
| procedure Check_No_Identifier (Arg : Node_Id) is |
| begin |
| if Chars (Arg) /= No_Name then |
| Error_Msg_N ("pragma% does not permit named arguments", Arg); |
| raise Error_Resync; |
| end if; |
| end Check_No_Identifier; |
| |
| ------------------------------- |
| -- Check_Optional_Identifier -- |
| ------------------------------- |
| |
| procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id) is |
| begin |
| if Present (Arg) and then Chars (Arg) /= No_Name then |
| if Chars (Arg) /= Id then |
| Error_Msg_Name_2 := Id; |
| Error_Msg_N ("pragma% argument expects identifier%", Arg); |
| end if; |
| end if; |
| end Check_Optional_Identifier; |
| |
| ------------------------------- |
| -- Check_Required_Identifier -- |
| ------------------------------- |
| |
| procedure Check_Required_Identifier (Arg : Node_Id; Id : Name_Id) is |
| begin |
| if Chars (Arg) /= Id then |
| Error_Msg_Name_2 := Id; |
| Error_Msg_N ("pragma% argument must have identifier%", Arg); |
| end if; |
| end Check_Required_Identifier; |
| |
| -------------------------------------------------- |
| -- 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 then |
| case Chars (Expr) is |
| when Name_No_Obsolescent_Features => |
| Set_Restriction (No_Obsolescent_Features, Pragma_Node); |
| Restriction_Warnings (No_Obsolescent_Features) := |
| Prag_Id = Pragma_Restriction_Warnings; |
| |
| when Name_SPARK | Name_SPARK_05 => |
| Set_Restriction (SPARK_05, Pragma_Node); |
| Restriction_Warnings (SPARK_05) := |
| Prag_Id = Pragma_Restriction_Warnings; |
| |
| when others => |
| null; |
| end case; |
| |
| elsif Id = Name_No_Dependence then |
| Set_Restriction_No_Dependence |
| (Unit => Expr, |
| Warn => Prag_Id = Pragma_Restriction_Warnings |
| or else Treat_Restrictions_As_Warnings); |
| end if; |
| |
| Next (Arg); |
| end loop; |
| end Process_Restrictions_Or_Restriction_Warnings; |
| |
| -- Start of processing for Prag |
| |
| begin |
| Error_Msg_Name_1 := Prag_Name; |
| |
| -- Ignore unrecognized pragma. We let Sem post the warning for this, since |
| -- 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 Prag_Id = Unknown_Pragma then |
| return Pragma_Node; |
| end if; |
| |
| -- Count number of arguments. This loop also checks if any of the arguments |
| -- are Error, indicating a syntax error as they were parsed. If so, we |
| -- simply return, because we get into trouble with cascaded errors if we |
| -- try to perform our error checks on junk arguments. |
| |
| Arg_Count := 0; |
| |
| if Present (Pragma_Argument_Associations (Pragma_Node)) then |
| Arg_Node := Arg1; |
| while Arg_Node /= Empty loop |
| Arg_Count := Arg_Count + 1; |
| |
| if Expression (Arg_Node) = Error then |
| return Error; |
| end if; |
| |
| Next (Arg_Node); |
| end loop; |
| end if; |
| |
| -- Remaining processing is pragma dependent |
| |
| case Prag_Id is |
| |
| ------------ |
| -- Ada_83 -- |
| ------------ |
| |
| -- 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. |
| |
| when Pragma_Ada_83 => |
| Ada_Version := Ada_83; |
| Ada_Version_Explicit := Ada_83; |
| Ada_Version_Pragma := Pragma_Node; |
| |
| ------------ |
| -- Ada_95 -- |
| ------------ |
| |
| -- 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. |
| |
| when Pragma_Ada_95 => |
| Ada_Version := Ada_95; |
| Ada_Version_Explicit := Ada_95; |
| Ada_Version_Pragma := Pragma_Node; |
| |
| --------------------- |
| -- Ada_05/Ada_2005 -- |
| --------------------- |
| |
| -- These pragmas 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_2005; |
| Ada_Version_Explicit := Ada_2005; |
| Ada_Version_Pragma := Pragma_Node; |
| end if; |
| |
| --------------------- |
| -- Ada_12/Ada_2012 -- |
| --------------------- |
| |
| -- These pragmas 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_12 | Pragma_Ada_2012 => |
| if Arg_Count = 0 then |
| Ada_Version := Ada_2012; |
| Ada_Version_Explicit := Ada_2012; |
| Ada_Version_Pragma := Pragma_Node; |
| end if; |
| |
| --------------------------- |
| -- Compiler_Unit_Warning -- |
| --------------------------- |
| |
| -- This pragma must be processed at parse time, since the resulting |
| -- status may be tested during the parsing of the program. |
| |
| when Pragma_Compiler_Unit | Pragma_Compiler_Unit_Warning => |
| Check_Arg_Count (0); |
| |
| -- Only recognized in main unit |
| |
| if Current_Source_Unit = Main_Unit then |
| Compiler_Unit := True; |
| end if; |
| |
| ----------- |
| -- Debug -- |
| ----------- |
| |
| -- pragma Debug ([boolean_EXPRESSION,] PROCEDURE_CALL_STATEMENT); |
| |
| when Pragma_Debug => |
| Check_No_Identifier (Arg1); |
| |
| if Arg_Count = 2 then |
| Check_No_Identifier (Arg2); |
| else |
| Check_Arg_Count (1); |
| end if; |
| |
| ------------------------------- |
| -- Extensions_Allowed (GNAT) -- |
| ------------------------------- |
| |
| -- pragma Extensions_Allowed (Off | On) |
| |
| -- The processing for pragma Extensions_Allowed must be done at |
| -- parse time, since extensions mode may affect what is accepted. |
| |
| when Pragma_Extensions_Allowed => |
| Check_Arg_Count (1); |
| Check_No_Identifier (Arg1); |
| Check_Arg_Is_On_Or_Off (Arg1); |
| |
| if Chars (Expression (Arg1)) = Name_On then |
| Extensions_Allowed := True; |
| Ada_Version := Ada_2012; |
| else |
| Extensions_Allowed := False; |
| Ada_Version := Ada_Version_Explicit; |
| end if; |
| |
| ---------------- |
| -- List (2.8) -- |
| ---------------- |
| |
| -- pragma List (Off | On) |
| |
| -- The processing for pragma List must be done at parse time, since a |
| -- listing can be generated in parse only mode. |
| |
| when Pragma_List => |
| Check_Arg_Count (1); |
| Check_No_Identifier (Arg1); |
| Check_Arg_Is_On_Or_Off (Arg1); |
| |
| -- We unconditionally make a List_On entry for the pragma, so that |
| -- in the List (Off) case, the pragma will print even in a region |
| -- of code with listing turned off (this is required). |
| |
| Add_List_Pragma_Entry (List_On, Sloc (Pragma_Node)); |
| |
| -- Now generate the list off entry for pragma List (Off) |
| |
| if Chars (Expression (Arg1)) = Name_Off then |
| Add_List_Pragma_Entry (List_Off, Semi); |
| end if; |
| |
| ---------------- |
| -- Page (2.8) -- |
| ---------------- |
| |
| -- pragma Page; |
| |
| -- Processing for this pragma must be done at parse time, since a |
| -- listing can be generated in parse only mode with semantics off. |
| |
| when Pragma_Page => |
| Check_Arg_Count (0); |
| Add_List_Pragma_Entry (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) -- |
| ---------------------------------------------------------- |
| |
| -- These two pragmas have the same syntax and semantics. |
| -- There are five forms of these pragmas: |
| |
| -- pragma Source_File_Name[_Project] ( |
| -- [UNIT_NAME =>] unit_NAME, |
| -- BODY_FILE_NAME => STRING_LITERAL |
| -- [, [INDEX =>] INTEGER_LITERAL]); |
| |
| -- pragma Source_File_Name[_Project] ( |
| -- [UNIT_NAME =>] unit_NAME, |
| -- SPEC_FILE_NAME => STRING_LITERAL |
| -- [, [INDEX =>] INTEGER_LITERAL]); |
| |
| -- pragma Source_File_Name[_Project] ( |
| -- BODY_FILE_NAME => STRING_LITERAL |
| -- [, DOT_REPLACEMENT => STRING_LITERAL] |
| -- [, CASING => CASING_SPEC]); |
| |
| -- pragma Source_File_Name[_Project] ( |
| -- SPEC_FILE_NAME => STRING_LITERAL |
| -- [, DOT_REPLACEMENT => STRING_LITERAL] |
| -- [, CASING => CASING_SPEC]); |
| |
| -- pragma Source_File_Name[_Project] ( |
| -- SUBUNIT_FILE_NAME => STRING_LITERAL |
| -- [, DOT_REPLACEMENT => STRING_LITERAL] |
| -- [, CASING => CASING_SPEC]); |
| |
| -- CASING_SPEC ::= Uppercase | Lowercase | Mixedcase |
| |
| -- Pragma Source_File_Name_Project (SFNP) is equivalent to pragma |
| -- Source_File_Name (SFN), however their usage is exclusive: |
| -- SFN can only be used when no project file is used, while |
| -- SFNP can only be used when a project file is used. |
| |
| -- The Project Manager produces a configuration pragmas file that |
| -- is communicated to the compiler with -gnatec switch. This file |
| -- contains only SFNP pragmas (at least two for the default naming |
| -- scheme. As this configuration pragmas file is always the first |
| -- processed by the compiler, it prevents the use of pragmas SFN in |
| -- other config files when a project file is in use. |
| |
| -- Note: we process this during parsing, since we need to have the |
| -- source file names set well before the semantic analysis starts, |
| -- since we load the spec and with'ed packages before analysis. |
| |
| when Pragma_Source_File_Name | Pragma_Source_File_Name_Project => |
| Source_File_Name : declare |
| Unam : Unit_Name_Type; |
| Expr1 : Node_Id; |
| Pat : String_Ptr; |
| Typ : Character; |
| Dot : String_Ptr; |
| Cas : Casing_Type; |
| Nast : Nat; |
| Expr : Node_Id; |
| Index : Nat; |
| |
| function Get_Fname (Arg : Node_Id) return File_Name_Type; |
| -- Process file name from unit name form of pragma |
| |
| function Get_String_Argument (Arg : Node_Id) return String_Ptr; |
| -- Process string literal value from argument |
| |
| procedure Process_Casing (Arg : Node_Id); |
| -- Process Casing argument of pattern form of pragma |
| |
| procedure Process_Dot_Replacement (Arg : Node_Id); |
| -- Process Dot_Replacement argument of pattern form of pragma |
| |
| --------------- |
| -- Get_Fname -- |
| --------------- |
| |
| function Get_Fname (Arg : Node_Id) return File_Name_Type is |
| begin |
| String_To_Name_Buffer (Strval (Expression (Arg))); |
| |
| for J in 1 .. Name_Len loop |
| if Is_Directory_Separator (Name_Buffer (J)) then |
| Error_Msg |
| ("directory separator character not allowed", |
| Sloc (Expression (Arg)) + Source_Ptr (J)); |
| end if; |
| end loop; |
| |
| return Name_Find; |
| end Get_Fname; |
| |
| ------------------------- |
| -- Get_String_Argument -- |
| ------------------------- |
| |
| function Get_String_Argument (Arg : Node_Id) return String_Ptr is |
| Str : String_Id; |
| |
| begin |
| if Nkind (Expression (Arg)) /= N_String_Literal |
| and then |
| Nkind (Expression (Arg)) /= N_Operator_Symbol |
| then |
| Error_Msg_N |
| ("argument for pragma% must be string literal", Arg); |
| raise Error_Resync; |
| end if; |
| |
| Str := Strval (Expression (Arg)); |
| |
| -- Check string has no wide chars |
| |
| for J in 1 .. String_Length (Str) loop |
| if Get_String_Char (Str, J) > 255 then |
| Error_Msg |
| ("wide character not allowed in pattern for pragma%", |
| Sloc (Expression (Arg2)) + Text_Ptr (J) - 1); |
| end if; |
| end loop; |
| |
| -- Acquire string |
| |
| String_To_Name_Buffer (Str); |
| return new String'(Name_Buffer (1 .. Name_Len)); |
| end Get_String_Argument; |
| |
| -------------------- |
| -- Process_Casing -- |
| -------------------- |
| |
| procedure Process_Casing (Arg : Node_Id) is |
| Expr : constant Node_Id := Expression (Arg); |
| |
| begin |
| Check_Required_Identifier (Arg, Name_Casing); |
| |
| if Nkind (Expr) = N_Identifier then |
| if Chars (Expr) = Name_Lowercase then |
| Cas := All_Lower_Case; |
| return; |
| elsif Chars (Expr) = Name_Uppercase then |
| Cas := All_Upper_Case; |
| return; |
| elsif Chars (Expr) = Name_Mixedcase then |
| Cas := Mixed_Case; |
| return; |
| end if; |
| end if; |
| |
| Error_Msg_N |
| ("Casing argument for pragma% must be " & |
| "one of Mixedcase, Lowercase, Uppercase", |
| Arg); |
| end Process_Casing; |
| |
| ----------------------------- |
| -- Process_Dot_Replacement -- |
| ----------------------------- |
| |
| procedure Process_Dot_Replacement (Arg : Node_Id) is |
| begin |
| Check_Required_Identifier (Arg, Name_Dot_Replacement); |
| Dot := Get_String_Argument (Arg); |
| end Process_Dot_Replacement; |
| |
| -- Start of processing for Source_File_Name and |
| -- Source_File_Name_Project pragmas. |
| |
| begin |
| if Prag_Id = Pragma_Source_File_Name then |
| if Project_File_In_Use = In_Use then |
| Error_Msg |
| ("pragma Source_File_Name cannot be used " & |
| "with a project file", Pragma_Sloc); |
| |
| else |
| Project_File_In_Use := Not_In_Use; |
| end if; |
| |
| else |
| if Project_File_In_Use = Not_In_Use then |
| Error_Msg |
| ("pragma Source_File_Name_Project should only be used " & |
| "with a project file", Pragma_Sloc); |
| else |
| Project_File_In_Use := In_Use; |
| end if; |
| end if; |
| |
| -- We permit from 1 to 3 arguments |
| |
| if Arg_Count not in 1 .. 3 then |
| Check_Arg_Count (1); |
| end if; |
| |
| Expr1 := Expression (Arg1); |
| |
| -- If first argument is identifier or selected component, then |
| -- we have the specific file case of the Source_File_Name pragma, |
| -- and the first argument is a unit name. |
| |
| if Nkind (Expr1) = N_Identifier |
| or else |
| (Nkind (Expr1) = N_Selected_Component |
| and then |
| Nkind (Selector_Name (Expr1)) = N_Identifier) |
| then |
| if Nkind (Expr1) = N_Identifier |
| and then Chars (Expr1) = Name_System |
| then |
| Error_Msg_N |
| ("pragma Source_File_Name may not be used for System", |
| Arg1); |
| return Error; |
| end if; |
| |
| -- Process index argument if present |
| |
| if Arg_Count = 3 then |
| Expr := Expression (Arg3); |
| |
| if Nkind (Expr) /= N_Integer_Literal |
| or else not UI_Is_In_Int_Range (Intval (Expr)) |
| or else Intval (Expr) > 999 |
| or else Intval (Expr) <= 0 |
| then |
| Error_Msg |
| ("pragma% index must be integer literal" & |
| " in range 1 .. 999", Sloc (Expr)); |
| raise Error_Resync; |
| else |
| Index := UI_To_Int (Intval (Expr)); |
| end if; |
| |
| -- No index argument present |
| |
| else |
| Check_Arg_Count (2); |
| Index := 0; |
| end if; |
| |
| Check_Optional_Identifier (Arg1, Name_Unit_Name); |
| Unam := Get_Unit_Name (Expr1); |
| |
| Check_Arg_Is_String_Literal (Arg2); |
| |
| if Chars (Arg2) = Name_Spec_File_Name then |
| Set_File_Name |
| (Get_Spec_Name (Unam), Get_Fname (Arg2), Index); |
| |
| elsif Chars (Arg2) = Name_Body_File_Name then |
| Set_File_Name |
| (Unam, Get_Fname (Arg2), Index); |
| |
| else |
| Error_Msg_N |
| ("pragma% argument has incorrect identifier", Arg2); |
| return Pragma_Node; |
| end if; |
| |
| -- If the first argument is not an identifier, then we must have |
| -- the pattern form of the pragma, and the first argument must be |
| -- the pattern string with an appropriate name. |
| |
| else |
| if Chars (Arg1) = Name_Spec_File_Name then |
| Typ := 's'; |
| |
| elsif Chars (Arg1) = Name_Body_File_Name then |
| Typ := 'b'; |
| |
| elsif Chars (Arg1) = Name_Subunit_File_Name then |
| Typ := 'u'; |
| |
| elsif Chars (Arg1) = Name_Unit_Name then |
| Error_Msg_N |
| ("Unit_Name parameter for pragma% must be an identifier", |
| Arg1); |
| raise Error_Resync; |
| |
| else |
| Error_Msg_N |
| ("pragma% argument has incorrect identifier", Arg1); |
| raise Error_Resync; |
| end if; |
| |
| Pat := Get_String_Argument (Arg1); |
| |
| -- Check pattern has exactly one asterisk |
| |
| Nast := 0; |
| for J in Pat'Range loop |
| if Pat (J) = '*' then |
| Nast := Nast + 1; |
| end if; |
| end loop; |
| |
| if Nast /= 1 then |
| Error_Msg_N |
| ("file name pattern must have exactly one * character", |
| Arg1); |
| return Pragma_Node; |
| end if; |
| |
| -- Set defaults for Casing and Dot_Separator parameters |
| |
| Cas := All_Lower_Case; |
| Dot := new String'("."); |
| |
| -- Process second and third arguments if present |
| |
| if Arg_Count > 1 then |
| if Chars (Arg2) = Name_Casing then |
| Process_Casing (Arg2); |
| |
| if Arg_Count = 3 then |
| Process_Dot_Replacement (Arg3); |
| end if; |
| |
| else |
| Process_Dot_Replacement (Arg2); |
| |
| if Arg_Count = 3 then |
| Process_Casing (Arg3); |
| end if; |
| end if; |
| end if; |
| |
| Set_File_Name_Pattern (Pat, Typ, Dot, Cas); |
| end if; |
| end Source_File_Name; |
| |
| ----------------------------- |
| -- Source_Reference (GNAT) -- |
| ----------------------------- |
| |
| -- pragma Source_Reference |
| -- (INTEGER_LITERAL [, STRING_LITERAL] ); |
| |
| -- Processing for this pragma must be done at parse time, since error |
| -- messages needing the proper line numbers can be generated in parse |
| -- only mode with semantic checking turned off, and indeed we usually |
| -- turn off semantic checking anyway if any parse errors are found. |
| |
| when Pragma_Source_Reference => Source_Reference : declare |
| Fname : File_Name_Type; |
| |
| begin |
| if Arg_Count /= 1 then |
| Check_Arg_Count (2); |
| Check_No_Identifier (Arg2); |
| end if; |
| |
| -- Check that this is first line of file. We skip this test if |
| -- we are in syntax check only mode, since we may be dealing with |
| -- multiple compilation units. |
| |
| if Get_Physical_Line_Number (Pragma_Sloc) /= 1 |
| and then Num_SRef_Pragmas (Current_Source_File) = 0 |
| and then Operating_Mode /= Check_Syntax |
| then |
| Error_Msg -- CODEFIX |
| ("first % pragma must be first line of file", Pragma_Sloc); |
| raise Error_Resync; |
| end if; |
| |
| Check_No_Identifier (Arg1); |
| |
| if Arg_Count = 1 then |
| if Num_SRef_Pragmas (Current_Source_File) = 0 then |
| Error_Msg |
| ("file name required for first % pragma in file", |
| Pragma_Sloc); |
| raise Error_Resync; |
| else |
| Fname := No_File; |
| end if; |
| |
| -- File name present |
| |
| else |
| Check_Arg_Is_String_Literal (Arg2); |
| String_To_Name_Buffer (Strval (Expression (Arg2))); |
| Fname := Name_Find; |
| |
| if Num_SRef_Pragmas (Current_Source_File) > 0 then |
| if Fname /= Full_Ref_Name (Current_Source_File) then |
| Error_Msg |
| ("file name must be same in all % pragmas", Pragma_Sloc); |
| raise Error_Resync; |
| end if; |
| end if; |
| end if; |
| |
| if Nkind (Expression (Arg1)) /= N_Integer_Literal then |
| Error_Msg |
| ("argument for pragma% must be integer literal", |
| Sloc (Expression (Arg1))); |
| raise Error_Resync; |
| |
| -- OK, this source reference pragma is effective, however, we |
| -- ignore it if it is not in the first unit in the multiple unit |
| -- case. This is because the only purpose in this case is to |
| -- provide source pragmas for subsequent use by gnatchop. |
| |
| else |
| if Num_Library_Units = 1 then |
| Register_Source_Ref_Pragma |
| (Fname, |
| Strip_Directory (Fname), |
| UI_To_Int (Intval (Expression (Arg1))), |
| Get_Physical_Line_Number (Pragma_Sloc) + 1); |
| end if; |
| end if; |
| end Source_Reference; |
| |
| ------------------------- |
| -- Style_Checks (GNAT) -- |
| ------------------------- |
| |
| -- pragma Style_Checks (On | Off | ALL_CHECKS | STRING_LITERAL); |
| |
| -- This is processed by the parser since some of the style |
| -- checks take place during source scanning and parsing. |
| |
| when Pragma_Style_Checks => Style_Checks : declare |
| A : Node_Id; |
| S : String_Id; |
| C : Char_Code; |
| OK : Boolean := True; |
| |
| begin |
| -- Two argument case is only for semantics |
| |
| if Arg_Count = 2 then |
| null; |
| |
| else |
| Check_Arg_Count (1); |
| Check_No_Identifier (Arg1); |
| A := Expression (Arg1); |
| |
| if Nkind (A) = N_String_Literal then |
| S := Strval (A); |
| |
| declare |
| Slen : constant Natural := Natural (String_Length (S)); |
| Options : String (1 .. Slen); |
| J : Natural; |
| Ptr : Natural; |
| |
| begin |
| J := 1; |
| loop |
| C := Get_String_Char (S, Int (J)); |
| |
| if not In_Character_Range (C) then |
| OK := False; |
| Ptr := J; |
| exit; |
| |
| else |
| Options (J) := Get_Character (C); |
| end if; |
| |
| if J = Slen then |
| if not Ignore_Style_Checks_Pragmas then |
| Set_Style_Check_Options (Options, OK, Ptr); |
| end if; |
| |
| exit; |
| |
| else |
| J := J + 1; |
| end if; |
| end loop; |
| |
| if not OK then |
| Error_Msg |
| (Style_Msg_Buf (1 .. Style_Msg_Len), |
| Sloc (Expression (Arg1)) + Source_Ptr (Ptr)); |
| raise Error_Resync; |
| end if; |
| end; |
| |
| elsif Nkind (A) /= N_Identifier then |
| OK := False; |
| |
| elsif Chars (A) = Name_All_Checks then |
| if not Ignore_Style_Checks_Pragmas then |
| if GNAT_Mode then |
| Stylesw.Set_GNAT_Style_Check_Options; |
| else |
| Stylesw.Set_Default_Style_Check_Options; |
| end if; |
| end if; |
| |
| elsif Chars (A) = Name_On then |
| if not Ignore_Style_Checks_Pragmas then |
| Style_Check := True; |
| end if; |
| |
| elsif Chars (A) = Name_Off then |
| if not Ignore_Style_Checks_Pragmas then |
| Style_Check := False; |
| end if; |
| |
| else |
| OK := False; |
| end if; |
| |
| if not OK then |
| Error_Msg ("incorrect argument for pragma%", Sloc (A)); |
| raise Error_Resync; |
| end if; |
| end if; |
| end Style_Checks; |
| |
| ------------------------- |
| -- Suppress_All (GNAT) -- |
| ------------------------- |
| |
| -- pragma Suppress_All |
| |
| -- This is a rather odd pragma, because other compilers allow it in |
| -- strange places. DEC allows it at the end of units, and Rational |
| -- allows it as a program unit pragma, when it would be more natural |
| -- if it were a configuration pragma. |
| |
| -- Since the reason we provide this pragma is for compatibility with |
| -- these other compilers, we want to accommodate these strange placement |
| -- rules, and the easiest thing is simply to allow it anywhere in a |
| -- unit. If this pragma appears anywhere within a unit, then the effect |
| -- is as though a pragma Suppress (All_Checks) had appeared as the first |
| -- line of the current file, i.e. as the first configuration pragma in |
| -- the current unit. |
| |
| -- To get this effect, we set the flag Has_Pragma_Suppress_All in the |
| -- compilation unit node for the current source file then in the last |
| -- stage of parsing a file, if this flag is set, we materialize the |
| -- Suppress (All_Checks) pragma, marked as not coming from Source. |
| |
| when Pragma_Suppress_All => |
| Set_Has_Pragma_Suppress_All (Cunit (Current_Source_Unit)); |
| |
| --------------------- |
| -- Warnings (GNAT) -- |
| --------------------- |
| |
| -- pragma Warnings ([TOOL_NAME,] DETAILS [, REASON]); |
| |
| -- DETAILS ::= On | Off |
| -- DETAILS ::= On | Off, local_NAME |
| -- DETAILS ::= static_string_EXPRESSION |
| -- DETAILS ::= On | Off, static_string_EXPRESSION |
| |
| -- TOOL_NAME ::= GNAT | GNATProve |
| |
| -- REASON ::= Reason => STRING_LITERAL {& STRING_LITERAL} |
| |
| -- Note: If the first argument matches an allowed tool name, it is |
| -- always considered to be a tool name, even if there is a string |
| -- variable of that name. |
| |
| -- 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. Note that we |
| -- ignore this pragma if debug flag -gnatd.i is set. |
| |
| -- Also note that the "one argument" case may have two or three |
| -- arguments if the first one is a tool name, and/or the last one is a |
| -- reason argument. |
| |
| when Pragma_Warnings => Warnings : declare |
| function First_Arg_Is_Matching_Tool_Name return Boolean; |
| -- Returns True if the first argument is a tool name matching the |
| -- current tool being run. |
| |
| function Last_Arg return Node_Id; |
| -- Returns the last argument |
| |
| function Last_Arg_Is_Reason return Boolean; |
| -- Returns True if the last argument is a reason argument |
| |
| function Get_Reason return String_Id; |
| -- Analyzes Reason argument and returns corresponding String_Id |
| -- value, or null if there is no Reason argument, or if the |
| -- argument is not of the required form. |
| |
| ------------------------------------- |
| -- First_Arg_Is_Matching_Tool_Name -- |
| ------------------------------------- |
| |
| function First_Arg_Is_Matching_Tool_Name return Boolean is |
| begin |
| return Nkind (Arg1) = N_Identifier |
| |
| -- Return True if the tool name is GNAT, and we're not in |
| -- GNATprove or CodePeer or ASIS mode... |
| |
| and then ((Chars (Arg1) = Name_Gnat |
| and then not |
| (CodePeer_Mode or GNATprove_Mode or ASIS_Mode)) |
| |
| -- or if the tool name is GNATprove, and we're in GNATprove |
| -- mode. |
| |
| or else |
| (Chars (Arg1) = Name_Gnatprove |
| and then GNATprove_Mode)); |
| end First_Arg_Is_Matching_Tool_Name; |
| |
| ---------------- |
| -- Get_Reason -- |
| ---------------- |
| |
| function Get_Reason return String_Id is |
| Arg : constant Node_Id := Last_Arg; |
| begin |
| if Last_Arg_Is_Reason then |
| Start_String; |
| Get_Reason_String (Expression (Arg)); |
| return End_String; |
| else |
| return Null_String_Id; |
| end if; |
| end Get_Reason; |
| |
| -------------- |
| -- Last_Arg -- |
| -------------- |
| |
| function Last_Arg return Node_Id is |
| Last_Arg : Node_Id; |
| |
| begin |
| if Arg_Count = 1 then |
| Last_Arg := Arg1; |
| elsif Arg_Count = 2 then |
| Last_Arg := Arg2; |
| elsif Arg_Count = 3 then |
| Last_Arg := Arg3; |
| elsif Arg_Count = 4 then |
| Last_Arg := Next (Arg3); |
| |
| -- Illegal case, error issued in semantic analysis |
| |
| else |
| Last_Arg := Empty; |
| end if; |
| |
| return Last_Arg; |
| end Last_Arg; |
| |
| ------------------------ |
| -- Last_Arg_Is_Reason -- |
| ------------------------ |
| |
| function Last_Arg_Is_Reason return Boolean is |
| Arg : constant Node_Id := Last_Arg; |
| begin |
| return Nkind (Arg) in N_Has_Chars |
| and then Chars (Arg) = Name_Reason; |
| end Last_Arg_Is_Reason; |
| |
| The_Arg : Node_Id; -- On/Off argument |
| Argx : Node_Id; |
| |
| -- Start of processing for Warnings |
| |
| begin |
| if not Debug_Flag_Dot_I |
| and then (Arg_Count = 1 |
| or else (Arg_Count = 2 |
| and then (First_Arg_Is_Matching_Tool_Name |
| or else |
| Last_Arg_Is_Reason)) |
| or else (Arg_Count = 3 |
| and then First_Arg_Is_Matching_Tool_Name |
| and then Last_Arg_Is_Reason)) |
| then |
| if First_Arg_Is_Matching_Tool_Name then |
| The_Arg := Arg2; |
| else |
| The_Arg := Arg1; |
| end if; |
| |
| Check_No_Identifier (The_Arg); |
| Argx := Expression (The_Arg); |
| |
| 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, Get_Reason); |
| end if; |
| end if; |
| end if; |
| end Warnings; |
| |
| ----------------------------- |
| -- Wide_Character_Encoding -- |
| ----------------------------- |
| |
| -- pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL); |
| |
| -- This is processed by the parser, since the scanner is affected |
| |
| when Pragma_Wide_Character_Encoding => Wide_Character_Encoding : declare |
| A : Node_Id; |
| |
| begin |
| Check_Arg_Count (1); |
| Check_No_Identifier (Arg1); |
| A := Expression (Arg1); |
| |
| if Nkind (A) = N_Identifier then |
| Get_Name_String (Chars (A)); |
| Wide_Character_Encoding_Method := |
| Get_WC_Encoding_Method (Name_Buffer (1 .. Name_Len)); |
| |
| elsif Nkind (A) = N_Character_Literal then |
| declare |
| R : constant Char_Code := |
| Char_Code (UI_To_Int (Char_Literal_Value (A))); |
| begin |
| if In_Character_Range (R) then |
| Wide_Character_Encoding_Method := |
| Get_WC_Encoding_Method (Get_Character (R)); |
| else |
| raise Constraint_Error; |
| end if; |
| end; |
| |
| else |
| raise Constraint_Error; |
| end if; |
| |
| Upper_Half_Encoding := |
| Wide_Character_Encoding_Method in |
| WC_Upper_Half_Encoding_Method; |
| |
| exception |
| when Constraint_Error => |
| Error_Msg_N ("invalid argument for pragma%", Arg1); |
| end Wide_Character_Encoding; |
| |
| ----------------------- |
| -- All Other Pragmas -- |
| ----------------------- |
| |
| -- For all other pragmas, checking and processing is handled |
| -- entirely in Sem_Prag, and no further checking is done by Par. |
| |
| when Pragma_Abort_Defer | |
| Pragma_Abstract_State | |
| Pragma_Async_Readers | |
| Pragma_Async_Writers | |
| Pragma_Assertion_Policy | |
| Pragma_Assume | |
| Pragma_Assume_No_Invalid_Values | |
| Pragma_All_Calls_Remote | |
| Pragma_Allow_Integer_Address | |
| Pragma_Annotate | |
| Pragma_Assert | |
| Pragma_Assert_And_Cut | |
| Pragma_Asynchronous | |
| Pragma_Atomic | |
| Pragma_Atomic_Components | |
| Pragma_Attach_Handler | |
| Pragma_Attribute_Definition | |
| Pragma_Check | |
| Pragma_Check_Float_Overflow | |
| Pragma_Check_Name | |
| Pragma_Check_Policy | |
| Pragma_CIL_Constructor | |
| Pragma_Compile_Time_Error | |
| Pragma_Compile_Time_Warning | |
| Pragma_Contract_Cases | |
| Pragma_Convention_Identifier | |
| Pragma_CPP_Class | |
| Pragma_CPP_Constructor | |
| Pragma_CPP_Virtual | |
| Pragma_CPP_Vtable | |
| Pragma_CPU | |
| 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_Depends | |
| Pragma_Detect_Blocking | |
| Pragma_Default_Initial_Condition | |
| Pragma_Default_Scalar_Storage_Order | |
| Pragma_Default_Storage_Pool | |
| Pragma_Disable_Atomic_Synchronization | |
| Pragma_Discard_Names | |
| Pragma_Dispatching_Domain | |
| Pragma_Effective_Reads | |
| Pragma_Effective_Writes | |
| Pragma_Eliminate | |
| Pragma_Elaborate | |
| Pragma_Elaborate_All | |
| Pragma_Elaborate_Body | |
| Pragma_Elaboration_Checks | |
| Pragma_Enable_Atomic_Synchronization | |
| Pragma_Export | |
| Pragma_Export_Function | |
| Pragma_Export_Object | |
| Pragma_Export_Procedure | |
| Pragma_Export_Value | |
| Pragma_Export_Valued_Procedure | |
| Pragma_Extend_System | |
| Pragma_Extensions_Visible | |
| Pragma_External | |
| Pragma_External_Name_Casing | |
| Pragma_Favor_Top_Level | |
| Pragma_Fast_Math | |
| Pragma_Finalize_Storage_Only | |
| Pragma_Ghost | |
| Pragma_Global | |
| Pragma_Ident | |
| Pragma_Implementation_Defined | |
| Pragma_Implemented | |
| Pragma_Implicit_Packing | |
| Pragma_Import | |
| Pragma_Import_Function | |
| Pragma_Import_Object | |
| Pragma_Import_Procedure | |
| Pragma_Import_Valued_Procedure | |
| Pragma_Independent | |
| Pragma_Independent_Components | |
| Pragma_Initial_Condition | |
| Pragma_Initialize_Scalars | |
| Pragma_Initializes | |
| Pragma_Inline | |
| Pragma_Inline_Always | |
| Pragma_Inline_Generic | |
| Pragma_Inspection_Point | |
| Pragma_Interface | |
| Pragma_Interface_Name | |
| Pragma_Interrupt_Handler | |
| Pragma_Interrupt_State | |
| Pragma_Interrupt_Priority | |
| Pragma_Invariant | |
| Pragma_Java_Constructor | |
| Pragma_Java_Interface | |
| Pragma_Keep_Names | |
| Pragma_License | |
| Pragma_Link_With | |
| Pragma_Linker_Alias | |
| Pragma_Linker_Constructor | |
| Pragma_Linker_Destructor | |
| Pragma_Linker_Options | |
| Pragma_Linker_Section | |
| Pragma_Lock_Free | |
| Pragma_Locking_Policy | |
| Pragma_Loop_Invariant | |
| Pragma_Loop_Optimize | |
| Pragma_Loop_Variant | |
| Pragma_Machine_Attribute | |
| Pragma_Main | |
| Pragma_Main_Storage | |
| Pragma_Memory_Size | |
| Pragma_No_Body | |
| Pragma_No_Elaboration_Code_All | |
| Pragma_No_Inline | |
| Pragma_No_Return | |
| Pragma_No_Run_Time | |
| Pragma_No_Strict_Aliasing | |
| Pragma_No_Tagged_Streams | |
| Pragma_Normalize_Scalars | |
| Pragma_Obsolescent | |
| Pragma_Ordered | |
| Pragma_Optimize | |
| Pragma_Optimize_Alignment | |
| Pragma_Overflow_Mode | |
| Pragma_Overriding_Renamings | |
| Pragma_Pack | |
| Pragma_Part_Of | |
| Pragma_Partition_Elaboration_Policy | |
| Pragma_Passive | |
| Pragma_Preelaborable_Initialization | |
| Pragma_Polling | |
| Pragma_Prefix_Exception_Messages | |
| Pragma_Persistent_BSS | |
| Pragma_Post | |
| Pragma_Postcondition | |
| Pragma_Post_Class | |
| Pragma_Pre | |
| Pragma_Precondition | |
| Pragma_Predicate | |
| Pragma_Preelaborate | |
| Pragma_Pre_Class | |
| Pragma_Priority | |
| Pragma_Priority_Specific_Dispatching | |
| Pragma_Profile | |
| Pragma_Profile_Warnings | |
| Pragma_Propagate_Exceptions | |
| Pragma_Provide_Shift_Operators | |
| Pragma_Psect_Object | |
| Pragma_Pure | |
| Pragma_Pure_Function | |
| Pragma_Queuing_Policy | |
| Pragma_Refined_Depends | |
| Pragma_Refined_Global | |
| Pragma_Refined_Post | |
| Pragma_Refined_State | |
| Pragma_Relative_Deadline | |
| Pragma_Remote_Access_Type | |
| Pragma_Remote_Call_Interface | |
| Pragma_Remote_Types | |
| Pragma_Restricted_Run_Time | |
| Pragma_Rational | |
| Pragma_Ravenscar | |
| Pragma_Reviewable | |
| Pragma_Share_Generic | |
| Pragma_Shared | |
| Pragma_Shared_Passive | |
| Pragma_Short_Circuit_And_Or | |
| Pragma_Short_Descriptors | |
| Pragma_Simple_Storage_Pool_Type | |
| Pragma_SPARK_Mode | |
| Pragma_Storage_Size | |
| Pragma_Storage_Unit | |
| Pragma_Static_Elaboration_Desired | |
| Pragma_Stream_Convert | |
| Pragma_Subtitle | |
| Pragma_Suppress | |
| Pragma_Suppress_Debug_Info | |
| Pragma_Suppress_Exception_Locations | |
| Pragma_Suppress_Initialization | |
| Pragma_System_Name | |
| Pragma_Task_Dispatching_Policy | |
| Pragma_Task_Info | |
| Pragma_Task_Name | |
| Pragma_Task_Storage | |
| Pragma_Test_Case | |
| Pragma_Thread_Local_Storage | |
| Pragma_Time_Slice | |
| Pragma_Title | |
| Pragma_Type_Invariant | |
| Pragma_Type_Invariant_Class | |
| Pragma_Unchecked_Union | |
| Pragma_Unevaluated_Use_Of_Old | |
| Pragma_Unimplemented_Unit | |
| Pragma_Universal_Aliasing | |
| Pragma_Universal_Data | |
| Pragma_Unmodified | |
| Pragma_Unreferenced | |
| Pragma_Unreferenced_Objects | |
| Pragma_Unreserve_All_Interrupts | |
| Pragma_Unsuppress | |
| Pragma_Use_VADS_Size | |
| Pragma_Volatile | |
| Pragma_Volatile_Components | |
| Pragma_Warning_As_Error | |
| Pragma_Weak_External | |
| Pragma_Validity_Checks => |
| null; |
| |
| -------------------- |
| -- Unknown_Pragma -- |
| -------------------- |
| |
| -- Should be impossible, since we excluded this case earlier on |
| |
| when Unknown_Pragma => |
| raise Program_Error; |
| |
| end case; |
| |
| return Pragma_Node; |
| |
| -------------------- |
| -- Error Handling -- |
| -------------------- |
| |
| exception |
| when Error_Resync => |
| return Error; |
| |
| end Prag; |