File : par-prag.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                             P A R . P R A G                              --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 --  Generally the parser checks the basic syntax of pragmas, but does not
  27 --  do specialized syntax checks for individual pragmas, these are deferred
  28 --  to semantic analysis time (see unit Sem_Prag). There are some pragmas
  29 --  which require recognition and either partial or complete processing
  30 --  during parsing, and this unit performs this required processing.
  31 
  32 with Fname.UF; use Fname.UF;
  33 with Osint;    use Osint;
  34 with Rident;   use Rident;
  35 with Restrict; use Restrict;
  36 with Stringt;  use Stringt;
  37 with Stylesw;  use Stylesw;
  38 with Uintp;    use Uintp;
  39 with Uname;    use Uname;
  40 
  41 with System.WCh_Con; use System.WCh_Con;
  42 
  43 separate (Par)
  44 
  45 function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is
  46    Prag_Name   : constant Name_Id    := Pragma_Name (Pragma_Node);
  47    Prag_Id     : constant Pragma_Id  := Get_Pragma_Id (Prag_Name);
  48    Pragma_Sloc : constant Source_Ptr := Sloc (Pragma_Node);
  49    Arg_Count   : Nat;
  50    Arg_Node    : Node_Id;
  51 
  52    -----------------------
  53    -- Local Subprograms --
  54    -----------------------
  55 
  56    procedure Add_List_Pragma_Entry (PT : List_Pragma_Type; Loc : Source_Ptr);
  57    --  Make a new entry in the List_Pragmas table if this entry is not already
  58    --  in the table (it will always be the last one if there is a duplication
  59    --  resulting from the use of Save/Restore_Scan_State).
  60 
  61    function Arg1 return Node_Id;
  62    function Arg2 return Node_Id;
  63    function Arg3 return Node_Id;
  64    --  Obtain specified Pragma_Argument_Association. It is allowable to call
  65    --  the routine for the argument one past the last present argument, but
  66    --  that is the only case in which a non-present argument can be referenced.
  67 
  68    procedure Check_Arg_Count (Required : Int);
  69    --  Check argument count for pragma = Required. If not give error and raise
  70    --  Error_Resync.
  71 
  72    procedure Check_Arg_Is_String_Literal (Arg : Node_Id);
  73    --  Check the expression of the specified argument to make sure that it
  74    --  is a string literal. If not give error and raise Error_Resync.
  75 
  76    procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id);
  77    --  Check the expression of the specified argument to make sure that it
  78    --  is an identifier which is either ON or OFF, and if not, then issue
  79    --  an error message and raise Error_Resync.
  80 
  81    procedure Check_No_Identifier (Arg : Node_Id);
  82    --  Checks that the given argument does not have an identifier. If
  83    --  an identifier is present, then an error message is issued, and
  84    --  Error_Resync is raised.
  85 
  86    procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id);
  87    --  Checks if the given argument has an identifier, and if so, requires
  88    --  it to match the given identifier name. If there is a non-matching
  89    --  identifier, then an error message is given and Error_Resync raised.
  90 
  91    procedure Check_Required_Identifier (Arg : Node_Id; Id : Name_Id);
  92    --  Same as Check_Optional_Identifier, except that the name is required
  93    --  to be present and to match the given Id value.
  94 
  95    procedure Process_Restrictions_Or_Restriction_Warnings;
  96    --  Common processing for Restrictions and Restriction_Warnings pragmas.
  97    --  For the most part, restrictions need not be processed at parse time,
  98    --  since they only affect semantic processing. This routine handles the
  99    --  exceptions as follows
 100    --
 101    --    No_Obsolescent_Features must be processed at parse time, since there
 102    --    are some obsolescent features (e.g. character replacements) which are
 103    --    handled at parse time.
 104    --
 105    --    SPARK must be processed at parse time, since this restriction controls
 106    --    whether the scanner recognizes a spark HIDE directive formatted as an
 107    --    Ada comment (and generates a Tok_SPARK_Hide token for the directive).
 108    --
 109    --    No_Dependence must be processed at parse time, since otherwise it gets
 110    --    handled too late.
 111    --
 112    --  Note that we don't need to do full error checking for badly formed cases
 113    --  of restrictions, since these will be caught during semantic analysis.
 114 
 115    ---------------------------
 116    -- Add_List_Pragma_Entry --
 117    ---------------------------
 118 
 119    procedure Add_List_Pragma_Entry (PT : List_Pragma_Type; Loc : Source_Ptr) is
 120    begin
 121       if List_Pragmas.Last < List_Pragmas.First
 122         or else (List_Pragmas.Table (List_Pragmas.Last)) /= ((PT, Loc))
 123       then
 124          List_Pragmas.Append ((PT, Loc));
 125       end if;
 126    end Add_List_Pragma_Entry;
 127 
 128    ----------
 129    -- Arg1 --
 130    ----------
 131 
 132    function Arg1 return Node_Id is
 133    begin
 134       return First (Pragma_Argument_Associations (Pragma_Node));
 135    end Arg1;
 136 
 137    ----------
 138    -- Arg2 --
 139    ----------
 140 
 141    function Arg2 return Node_Id is
 142    begin
 143       return Next (Arg1);
 144    end Arg2;
 145 
 146    ----------
 147    -- Arg3 --
 148    ----------
 149 
 150    function Arg3 return Node_Id is
 151    begin
 152       return Next (Arg2);
 153    end Arg3;
 154 
 155    ---------------------
 156    -- Check_Arg_Count --
 157    ---------------------
 158 
 159    procedure Check_Arg_Count (Required : Int) is
 160    begin
 161       if Arg_Count /= Required then
 162          Error_Msg ("wrong number of arguments for pragma%", Pragma_Sloc);
 163          raise Error_Resync;
 164       end if;
 165    end Check_Arg_Count;
 166 
 167    ----------------------------
 168    -- Check_Arg_Is_On_Or_Off --
 169    ----------------------------
 170 
 171    procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id) is
 172       Argx : constant Node_Id := Expression (Arg);
 173 
 174    begin
 175       if Nkind (Expression (Arg)) /= N_Identifier
 176         or else not Nam_In (Chars (Argx), Name_On, Name_Off)
 177       then
 178          Error_Msg_Name_2 := Name_On;
 179          Error_Msg_Name_3 := Name_Off;
 180 
 181          Error_Msg ("argument for pragma% must be% or%", Sloc (Argx));
 182          raise Error_Resync;
 183       end if;
 184    end Check_Arg_Is_On_Or_Off;
 185 
 186    ---------------------------------
 187    -- Check_Arg_Is_String_Literal --
 188    ---------------------------------
 189 
 190    procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is
 191    begin
 192       if Nkind (Expression (Arg)) /= N_String_Literal then
 193          Error_Msg
 194            ("argument for pragma% must be string literal",
 195              Sloc (Expression (Arg)));
 196          raise Error_Resync;
 197       end if;
 198    end Check_Arg_Is_String_Literal;
 199 
 200    -------------------------
 201    -- Check_No_Identifier --
 202    -------------------------
 203 
 204    procedure Check_No_Identifier (Arg : Node_Id) is
 205    begin
 206       if Chars (Arg) /= No_Name then
 207          Error_Msg_N ("pragma% does not permit named arguments", Arg);
 208          raise Error_Resync;
 209       end if;
 210    end Check_No_Identifier;
 211 
 212    -------------------------------
 213    -- Check_Optional_Identifier --
 214    -------------------------------
 215 
 216    procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id) is
 217    begin
 218       if Present (Arg) and then Chars (Arg) /= No_Name then
 219          if Chars (Arg) /= Id then
 220             Error_Msg_Name_2 := Id;
 221             Error_Msg_N ("pragma% argument expects identifier%", Arg);
 222          end if;
 223       end if;
 224    end Check_Optional_Identifier;
 225 
 226    -------------------------------
 227    -- Check_Required_Identifier --
 228    -------------------------------
 229 
 230    procedure Check_Required_Identifier (Arg : Node_Id; Id : Name_Id) is
 231    begin
 232       if Chars (Arg) /= Id then
 233          Error_Msg_Name_2 := Id;
 234          Error_Msg_N ("pragma% argument must have identifier%", Arg);
 235       end if;
 236    end Check_Required_Identifier;
 237 
 238    --------------------------------------------------
 239    -- Process_Restrictions_Or_Restriction_Warnings --
 240    --------------------------------------------------
 241 
 242    procedure Process_Restrictions_Or_Restriction_Warnings is
 243       Arg  : Node_Id;
 244       Id   : Name_Id;
 245       Expr : Node_Id;
 246 
 247    begin
 248       Arg := Arg1;
 249       while Present (Arg) loop
 250          Id := Chars (Arg);
 251          Expr := Expression (Arg);
 252 
 253          if Id = No_Name and then Nkind (Expr) = N_Identifier then
 254             case Chars (Expr) is
 255                when Name_No_Obsolescent_Features =>
 256                   Set_Restriction (No_Obsolescent_Features, Pragma_Node);
 257                   Restriction_Warnings (No_Obsolescent_Features) :=
 258                     Prag_Id = Pragma_Restriction_Warnings;
 259 
 260                when Name_SPARK | Name_SPARK_05 =>
 261                   Set_Restriction (SPARK_05, Pragma_Node);
 262                   Restriction_Warnings (SPARK_05) :=
 263                     Prag_Id = Pragma_Restriction_Warnings;
 264 
 265                when others =>
 266                   null;
 267             end case;
 268 
 269          elsif Id = Name_No_Dependence then
 270             Set_Restriction_No_Dependence
 271               (Unit => Expr,
 272                Warn => Prag_Id = Pragma_Restriction_Warnings
 273                          or else Treat_Restrictions_As_Warnings);
 274          end if;
 275 
 276          Next (Arg);
 277       end loop;
 278    end Process_Restrictions_Or_Restriction_Warnings;
 279 
 280 --  Start of processing for Prag
 281 
 282 begin
 283    Error_Msg_Name_1 := Prag_Name;
 284 
 285    --  Ignore unrecognized pragma. We let Sem post the warning for this, since
 286    --  it is a semantic error, not a syntactic one (we have already checked
 287    --  the syntax for the unrecognized pragma as required by (RM 2.8(11)).
 288 
 289    if Prag_Id = Unknown_Pragma then
 290       return Pragma_Node;
 291    end if;
 292 
 293    --  Ignore pragma previously flagged by Ignore_Pragma
 294 
 295    if Get_Name_Table_Boolean3 (Prag_Name) then
 296       return Pragma_Node;
 297    end if;
 298 
 299    --  Count number of arguments. This loop also checks if any of the arguments
 300    --  are Error, indicating a syntax error as they were parsed. If so, we
 301    --  simply return, because we get into trouble with cascaded errors if we
 302    --  try to perform our error checks on junk arguments.
 303 
 304    Arg_Count := 0;
 305 
 306    if Present (Pragma_Argument_Associations (Pragma_Node)) then
 307       Arg_Node := Arg1;
 308       while Arg_Node /= Empty loop
 309          Arg_Count := Arg_Count + 1;
 310 
 311          if Expression (Arg_Node) = Error then
 312             return Error;
 313          end if;
 314 
 315          Next (Arg_Node);
 316       end loop;
 317    end if;
 318 
 319    --  Remaining processing is pragma dependent
 320 
 321    case Prag_Id is
 322 
 323       ------------
 324       -- Ada_83 --
 325       ------------
 326 
 327       --  This pragma must be processed at parse time, since we want to set
 328       --  the Ada version properly at parse time to recognize the appropriate
 329       --  Ada version syntax.
 330 
 331       when Pragma_Ada_83 =>
 332          if not Latest_Ada_Only then
 333             Ada_Version := Ada_83;
 334             Ada_Version_Explicit := Ada_83;
 335             Ada_Version_Pragma := Pragma_Node;
 336          end if;
 337 
 338       ------------
 339       -- Ada_95 --
 340       ------------
 341 
 342       --  This pragma must be processed at parse time, since we want to set
 343       --  the Ada version properly at parse time to recognize the appropriate
 344       --  Ada version syntax.
 345 
 346       when Pragma_Ada_95 =>
 347          if not Latest_Ada_Only then
 348             Ada_Version := Ada_95;
 349             Ada_Version_Explicit := Ada_95;
 350             Ada_Version_Pragma := Pragma_Node;
 351          end if;
 352 
 353       ---------------------
 354       -- Ada_05/Ada_2005 --
 355       ---------------------
 356 
 357       --  These pragmas must be processed at parse time, since we want to set
 358       --  the Ada version properly at parse time to recognize the appropriate
 359       --  Ada version syntax. However, it is only the zero argument form that
 360       --  must be processed at parse time.
 361 
 362       when Pragma_Ada_05 | Pragma_Ada_2005 =>
 363          if Arg_Count = 0 and not Latest_Ada_Only then
 364             Ada_Version := Ada_2005;
 365             Ada_Version_Explicit := Ada_2005;
 366             Ada_Version_Pragma := Pragma_Node;
 367          end if;
 368 
 369       ---------------------
 370       -- Ada_12/Ada_2012 --
 371       ---------------------
 372 
 373       --  These pragmas must be processed at parse time, since we want to set
 374       --  the Ada version properly at parse time to recognize the appropriate
 375       --  Ada version syntax. However, it is only the zero argument form that
 376       --  must be processed at parse time.
 377 
 378       when Pragma_Ada_12 | Pragma_Ada_2012 =>
 379          if Arg_Count = 0 then
 380             Ada_Version := Ada_2012;
 381             Ada_Version_Explicit := Ada_2012;
 382             Ada_Version_Pragma := Pragma_Node;
 383          end if;
 384 
 385       ---------------------------
 386       -- Compiler_Unit_Warning --
 387       ---------------------------
 388 
 389       --  This pragma must be processed at parse time, since the resulting
 390       --  status may be tested during the parsing of the program.
 391 
 392       when Pragma_Compiler_Unit | Pragma_Compiler_Unit_Warning =>
 393          Check_Arg_Count (0);
 394 
 395          --  Only recognized in main unit
 396 
 397          if Current_Source_Unit = Main_Unit then
 398             Compiler_Unit := True;
 399          end if;
 400 
 401       -----------
 402       -- Debug --
 403       -----------
 404 
 405       --  pragma Debug ([boolean_EXPRESSION,] PROCEDURE_CALL_STATEMENT);
 406 
 407       when Pragma_Debug =>
 408          Check_No_Identifier (Arg1);
 409 
 410          if Arg_Count = 2 then
 411             Check_No_Identifier (Arg2);
 412          else
 413             Check_Arg_Count (1);
 414          end if;
 415 
 416       -------------------------------
 417       -- Extensions_Allowed (GNAT) --
 418       -------------------------------
 419 
 420       --  pragma Extensions_Allowed (Off | On)
 421 
 422       --  The processing for pragma Extensions_Allowed must be done at
 423       --  parse time, since extensions mode may affect what is accepted.
 424 
 425       when Pragma_Extensions_Allowed =>
 426          Check_Arg_Count (1);
 427          Check_No_Identifier (Arg1);
 428          Check_Arg_Is_On_Or_Off (Arg1);
 429 
 430          if Chars (Expression (Arg1)) = Name_On then
 431             Extensions_Allowed := True;
 432             Ada_Version := Ada_2012;
 433          else
 434             Extensions_Allowed := False;
 435             Ada_Version := Ada_Version_Explicit;
 436          end if;
 437 
 438       -------------------
 439       -- Ignore_Pragma --
 440       -------------------
 441 
 442       --  Processing for this pragma must be done at parse time, since we want
 443       --  be able to ignore pragmas that are otherwise processed at parse time.
 444 
 445       when Pragma_Ignore_Pragma => Ignore_Pragma : declare
 446          A : Node_Id;
 447 
 448       begin
 449          Check_Arg_Count (1);
 450          Check_No_Identifier (Arg1);
 451          A := Expression (Arg1);
 452 
 453          if Nkind (A) /= N_Identifier then
 454             Error_Msg ("incorrect argument for pragma %", Sloc (A));
 455          else
 456             Set_Name_Table_Boolean3 (Chars (A), True);
 457          end if;
 458       end Ignore_Pragma;
 459 
 460       ----------------
 461       -- List (2.8) --
 462       ----------------
 463 
 464       --  pragma List (Off | On)
 465 
 466       --  The processing for pragma List must be done at parse time, since a
 467       --  listing can be generated in parse only mode.
 468 
 469       when Pragma_List =>
 470          Check_Arg_Count (1);
 471          Check_No_Identifier (Arg1);
 472          Check_Arg_Is_On_Or_Off (Arg1);
 473 
 474          --  We unconditionally make a List_On entry for the pragma, so that
 475          --  in the List (Off) case, the pragma will print even in a region
 476          --  of code with listing turned off (this is required).
 477 
 478          Add_List_Pragma_Entry (List_On, Sloc (Pragma_Node));
 479 
 480          --  Now generate the list off entry for pragma List (Off)
 481 
 482          if Chars (Expression (Arg1)) = Name_Off then
 483             Add_List_Pragma_Entry (List_Off, Semi);
 484          end if;
 485 
 486       ----------------
 487       -- Page (2.8) --
 488       ----------------
 489 
 490       --  pragma Page;
 491 
 492       --  Processing for this pragma must be done at parse time, since a
 493       --  listing can be generated in parse only mode with semantics off.
 494 
 495       when Pragma_Page =>
 496          Check_Arg_Count (0);
 497          Add_List_Pragma_Entry (Page, Semi);
 498 
 499       ------------------
 500       -- Restrictions --
 501       ------------------
 502 
 503       --  pragma Restrictions (RESTRICTION {, RESTRICTION});
 504 
 505       --  RESTRICTION ::=
 506       --    restriction_IDENTIFIER
 507       --  | restriction_parameter_IDENTIFIER => EXPRESSION
 508 
 509       --  We process the case of No_Obsolescent_Features, since this has
 510       --  a syntactic effect that we need to detect at parse time (the use
 511       --  of replacement characters such as colon for pound sign).
 512 
 513       when Pragma_Restrictions =>
 514          Process_Restrictions_Or_Restriction_Warnings;
 515 
 516       --------------------------
 517       -- Restriction_Warnings --
 518       --------------------------
 519 
 520       --  pragma Restriction_Warnings (RESTRICTION {, RESTRICTION});
 521 
 522       --  RESTRICTION ::=
 523       --    restriction_IDENTIFIER
 524       --  | restriction_parameter_IDENTIFIER => EXPRESSION
 525 
 526       --  See above comment for pragma Restrictions
 527 
 528       when Pragma_Restriction_Warnings =>
 529          Process_Restrictions_Or_Restriction_Warnings;
 530 
 531       ----------------------------------------------------------
 532       -- Source_File_Name and Source_File_Name_Project (GNAT) --
 533       ----------------------------------------------------------
 534 
 535       --  These two pragmas have the same syntax and semantics.
 536       --  There are five forms of these pragmas:
 537 
 538       --  pragma Source_File_Name[_Project] (
 539       --    [UNIT_NAME      =>] unit_NAME,
 540       --     BODY_FILE_NAME =>  STRING_LITERAL
 541       --    [, [INDEX =>] INTEGER_LITERAL]);
 542 
 543       --  pragma Source_File_Name[_Project] (
 544       --    [UNIT_NAME      =>] unit_NAME,
 545       --     SPEC_FILE_NAME =>  STRING_LITERAL
 546       --    [, [INDEX =>] INTEGER_LITERAL]);
 547 
 548       --  pragma Source_File_Name[_Project] (
 549       --     BODY_FILE_NAME  => STRING_LITERAL
 550       --  [, DOT_REPLACEMENT => STRING_LITERAL]
 551       --  [, CASING          => CASING_SPEC]);
 552 
 553       --  pragma Source_File_Name[_Project] (
 554       --     SPEC_FILE_NAME  => STRING_LITERAL
 555       --  [, DOT_REPLACEMENT => STRING_LITERAL]
 556       --  [, CASING          => CASING_SPEC]);
 557 
 558       --  pragma Source_File_Name[_Project] (
 559       --     SUBUNIT_FILE_NAME  => STRING_LITERAL
 560       --  [, DOT_REPLACEMENT    => STRING_LITERAL]
 561       --  [, CASING             => CASING_SPEC]);
 562 
 563       --  CASING_SPEC ::= Uppercase | Lowercase | Mixedcase
 564 
 565       --  Pragma Source_File_Name_Project (SFNP) is equivalent to pragma
 566       --  Source_File_Name (SFN), however their usage is exclusive:
 567       --  SFN can only be used when no project file is used, while
 568       --  SFNP can only be used when a project file is used.
 569 
 570       --  The Project Manager produces a configuration pragmas file that
 571       --  is communicated to the compiler with -gnatec switch. This file
 572       --  contains only SFNP pragmas (at least two for the default naming
 573       --  scheme. As this configuration pragmas file is always the first
 574       --  processed by the compiler, it prevents the use of pragmas SFN in
 575       --  other config files when a project file is in use.
 576 
 577       --  Note: we process this during parsing, since we need to have the
 578       --  source file names set well before the semantic analysis starts,
 579       --  since we load the spec and with'ed packages before analysis.
 580 
 581       when Pragma_Source_File_Name | Pragma_Source_File_Name_Project =>
 582          Source_File_Name : declare
 583             Unam  : Unit_Name_Type;
 584             Expr1 : Node_Id;
 585             Pat   : String_Ptr;
 586             Typ   : Character;
 587             Dot   : String_Ptr;
 588             Cas   : Casing_Type;
 589             Nast  : Nat;
 590             Expr  : Node_Id;
 591             Index : Nat;
 592 
 593             function Get_Fname (Arg : Node_Id) return File_Name_Type;
 594             --  Process file name from unit name form of pragma
 595 
 596             function Get_String_Argument (Arg : Node_Id) return String_Ptr;
 597             --  Process string literal value from argument
 598 
 599             procedure Process_Casing (Arg : Node_Id);
 600             --  Process Casing argument of pattern form of pragma
 601 
 602             procedure Process_Dot_Replacement (Arg : Node_Id);
 603             --  Process Dot_Replacement argument of pattern form of pragma
 604 
 605             ---------------
 606             -- Get_Fname --
 607             ---------------
 608 
 609             function Get_Fname (Arg : Node_Id) return File_Name_Type is
 610             begin
 611                String_To_Name_Buffer (Strval (Expression (Arg)));
 612 
 613                for J in 1 .. Name_Len loop
 614                   if Is_Directory_Separator (Name_Buffer (J)) then
 615                      Error_Msg
 616                        ("directory separator character not allowed",
 617                         Sloc (Expression (Arg)) + Source_Ptr (J));
 618                   end if;
 619                end loop;
 620 
 621                return Name_Find;
 622             end Get_Fname;
 623 
 624             -------------------------
 625             -- Get_String_Argument --
 626             -------------------------
 627 
 628             function Get_String_Argument (Arg : Node_Id) return String_Ptr is
 629                Str : String_Id;
 630 
 631             begin
 632                if Nkind (Expression (Arg)) /= N_String_Literal
 633                  and then
 634                   Nkind (Expression (Arg)) /= N_Operator_Symbol
 635                then
 636                   Error_Msg_N
 637                     ("argument for pragma% must be string literal", Arg);
 638                   raise Error_Resync;
 639                end if;
 640 
 641                Str := Strval (Expression (Arg));
 642 
 643                --  Check string has no wide chars
 644 
 645                for J in 1 .. String_Length (Str) loop
 646                   if Get_String_Char (Str, J) > 255 then
 647                      Error_Msg
 648                        ("wide character not allowed in pattern for pragma%",
 649                         Sloc (Expression (Arg2)) + Text_Ptr (J) - 1);
 650                   end if;
 651                end loop;
 652 
 653                --  Acquire string
 654 
 655                String_To_Name_Buffer (Str);
 656                return new String'(Name_Buffer (1 .. Name_Len));
 657             end Get_String_Argument;
 658 
 659             --------------------
 660             -- Process_Casing --
 661             --------------------
 662 
 663             procedure Process_Casing (Arg : Node_Id) is
 664                Expr : constant Node_Id := Expression (Arg);
 665 
 666             begin
 667                Check_Required_Identifier (Arg, Name_Casing);
 668 
 669                if Nkind (Expr) = N_Identifier then
 670                   if Chars (Expr) = Name_Lowercase then
 671                      Cas := All_Lower_Case;
 672                      return;
 673                   elsif Chars (Expr) = Name_Uppercase then
 674                      Cas := All_Upper_Case;
 675                      return;
 676                   elsif Chars (Expr) = Name_Mixedcase then
 677                      Cas := Mixed_Case;
 678                      return;
 679                   end if;
 680                end if;
 681 
 682                Error_Msg_N
 683                  ("Casing argument for pragma% must be " &
 684                   "one of Mixedcase, Lowercase, Uppercase",
 685                   Arg);
 686             end Process_Casing;
 687 
 688             -----------------------------
 689             -- Process_Dot_Replacement --
 690             -----------------------------
 691 
 692             procedure Process_Dot_Replacement (Arg : Node_Id) is
 693             begin
 694                Check_Required_Identifier (Arg, Name_Dot_Replacement);
 695                Dot := Get_String_Argument (Arg);
 696             end Process_Dot_Replacement;
 697 
 698          --  Start of processing for Source_File_Name and
 699          --  Source_File_Name_Project pragmas.
 700 
 701          begin
 702             if Prag_Id = Pragma_Source_File_Name then
 703                if Project_File_In_Use = In_Use then
 704                   Error_Msg
 705                     ("pragma Source_File_Name cannot be used " &
 706                      "with a project file", Pragma_Sloc);
 707 
 708                else
 709                   Project_File_In_Use := Not_In_Use;
 710                end if;
 711 
 712             else
 713                if Project_File_In_Use = Not_In_Use then
 714                   Error_Msg
 715                     ("pragma Source_File_Name_Project should only be used " &
 716                      "with a project file", Pragma_Sloc);
 717                else
 718                   Project_File_In_Use := In_Use;
 719                end if;
 720             end if;
 721 
 722             --  We permit from 1 to 3 arguments
 723 
 724             if Arg_Count not in 1 .. 3 then
 725                Check_Arg_Count (1);
 726             end if;
 727 
 728             Expr1 := Expression (Arg1);
 729 
 730             --  If first argument is identifier or selected component, then
 731             --  we have the specific file case of the Source_File_Name pragma,
 732             --  and the first argument is a unit name.
 733 
 734             if Nkind (Expr1) = N_Identifier
 735               or else
 736                 (Nkind (Expr1) = N_Selected_Component
 737                   and then
 738                  Nkind (Selector_Name (Expr1)) = N_Identifier)
 739             then
 740                if Nkind (Expr1) = N_Identifier
 741                  and then Chars (Expr1) = Name_System
 742                then
 743                   Error_Msg_N
 744                     ("pragma Source_File_Name may not be used for System",
 745                      Arg1);
 746                   return Error;
 747                end if;
 748 
 749                --  Process index argument if present
 750 
 751                if Arg_Count = 3 then
 752                   Expr := Expression (Arg3);
 753 
 754                   if Nkind (Expr) /= N_Integer_Literal
 755                     or else not UI_Is_In_Int_Range (Intval (Expr))
 756                     or else Intval (Expr) > 999
 757                     or else Intval (Expr) <= 0
 758                   then
 759                      Error_Msg
 760                        ("pragma% index must be integer literal" &
 761                         " in range 1 .. 999", Sloc (Expr));
 762                      raise Error_Resync;
 763                   else
 764                      Index := UI_To_Int (Intval (Expr));
 765                   end if;
 766 
 767                --  No index argument present
 768 
 769                else
 770                   Check_Arg_Count (2);
 771                   Index := 0;
 772                end if;
 773 
 774                Check_Optional_Identifier (Arg1, Name_Unit_Name);
 775                Unam := Get_Unit_Name (Expr1);
 776 
 777                Check_Arg_Is_String_Literal (Arg2);
 778 
 779                if Chars (Arg2) = Name_Spec_File_Name then
 780                   Set_File_Name
 781                     (Get_Spec_Name (Unam), Get_Fname (Arg2), Index);
 782 
 783                elsif Chars (Arg2) = Name_Body_File_Name then
 784                   Set_File_Name
 785                     (Unam, Get_Fname (Arg2), Index);
 786 
 787                else
 788                   Error_Msg_N
 789                     ("pragma% argument has incorrect identifier", Arg2);
 790                   return Pragma_Node;
 791                end if;
 792 
 793             --  If the first argument is not an identifier, then we must have
 794             --  the pattern form of the pragma, and the first argument must be
 795             --  the pattern string with an appropriate name.
 796 
 797             else
 798                if Chars (Arg1) = Name_Spec_File_Name then
 799                   Typ := 's';
 800 
 801                elsif Chars (Arg1) = Name_Body_File_Name then
 802                   Typ := 'b';
 803 
 804                elsif Chars (Arg1) = Name_Subunit_File_Name then
 805                   Typ := 'u';
 806 
 807                elsif Chars (Arg1) = Name_Unit_Name then
 808                   Error_Msg_N
 809                     ("Unit_Name parameter for pragma% must be an identifier",
 810                      Arg1);
 811                   raise Error_Resync;
 812 
 813                else
 814                   Error_Msg_N
 815                     ("pragma% argument has incorrect identifier", Arg1);
 816                   raise Error_Resync;
 817                end if;
 818 
 819                Pat := Get_String_Argument (Arg1);
 820 
 821                --  Check pattern has exactly one asterisk
 822 
 823                Nast := 0;
 824                for J in Pat'Range loop
 825                   if Pat (J) = '*' then
 826                      Nast := Nast + 1;
 827                   end if;
 828                end loop;
 829 
 830                if Nast /= 1 then
 831                   Error_Msg_N
 832                     ("file name pattern must have exactly one * character",
 833                      Arg1);
 834                   return Pragma_Node;
 835                end if;
 836 
 837                --  Set defaults for Casing and Dot_Separator parameters
 838 
 839                Cas := All_Lower_Case;
 840                Dot := new String'(".");
 841 
 842                --  Process second and third arguments if present
 843 
 844                if Arg_Count > 1 then
 845                   if Chars (Arg2) = Name_Casing then
 846                      Process_Casing (Arg2);
 847 
 848                      if Arg_Count = 3 then
 849                         Process_Dot_Replacement (Arg3);
 850                      end if;
 851 
 852                   else
 853                      Process_Dot_Replacement (Arg2);
 854 
 855                      if Arg_Count = 3 then
 856                         Process_Casing (Arg3);
 857                      end if;
 858                   end if;
 859                end if;
 860 
 861                Set_File_Name_Pattern (Pat, Typ, Dot, Cas);
 862             end if;
 863          end Source_File_Name;
 864 
 865       -----------------------------
 866       -- Source_Reference (GNAT) --
 867       -----------------------------
 868 
 869       --  pragma Source_Reference
 870       --    (INTEGER_LITERAL [, STRING_LITERAL] );
 871 
 872       --  Processing for this pragma must be done at parse time, since error
 873       --  messages needing the proper line numbers can be generated in parse
 874       --  only mode with semantic checking turned off, and indeed we usually
 875       --  turn off semantic checking anyway if any parse errors are found.
 876 
 877       when Pragma_Source_Reference => Source_Reference : declare
 878          Fname : File_Name_Type;
 879 
 880       begin
 881          if Arg_Count /= 1 then
 882             Check_Arg_Count (2);
 883             Check_No_Identifier (Arg2);
 884          end if;
 885 
 886          --  Check that this is first line of file. We skip this test if
 887          --  we are in syntax check only mode, since we may be dealing with
 888          --  multiple compilation units.
 889 
 890          if Get_Physical_Line_Number (Pragma_Sloc) /= 1
 891            and then Num_SRef_Pragmas (Current_Source_File) = 0
 892            and then Operating_Mode /= Check_Syntax
 893          then
 894             Error_Msg -- CODEFIX
 895               ("first % pragma must be first line of file", Pragma_Sloc);
 896             raise Error_Resync;
 897          end if;
 898 
 899          Check_No_Identifier (Arg1);
 900 
 901          if Arg_Count = 1 then
 902             if Num_SRef_Pragmas (Current_Source_File) = 0 then
 903                Error_Msg
 904                  ("file name required for first % pragma in file",
 905                   Pragma_Sloc);
 906                raise Error_Resync;
 907             else
 908                Fname := No_File;
 909             end if;
 910 
 911          --  File name present
 912 
 913          else
 914             Check_Arg_Is_String_Literal (Arg2);
 915             String_To_Name_Buffer (Strval (Expression (Arg2)));
 916             Fname := Name_Find;
 917 
 918             if Num_SRef_Pragmas (Current_Source_File) > 0 then
 919                if Fname /= Full_Ref_Name (Current_Source_File) then
 920                   Error_Msg
 921                     ("file name must be same in all % pragmas", Pragma_Sloc);
 922                   raise Error_Resync;
 923                end if;
 924             end if;
 925          end if;
 926 
 927          if Nkind (Expression (Arg1)) /= N_Integer_Literal then
 928             Error_Msg
 929               ("argument for pragma% must be integer literal",
 930                 Sloc (Expression (Arg1)));
 931             raise Error_Resync;
 932 
 933          --  OK, this source reference pragma is effective, however, we
 934          --  ignore it if it is not in the first unit in the multiple unit
 935          --  case. This is because the only purpose in this case is to
 936          --  provide source pragmas for subsequent use by gnatchop.
 937 
 938          else
 939             if Num_Library_Units = 1 then
 940                Register_Source_Ref_Pragma
 941                  (Fname,
 942                   Strip_Directory (Fname),
 943                   UI_To_Int (Intval (Expression (Arg1))),
 944                   Get_Physical_Line_Number (Pragma_Sloc) + 1);
 945             end if;
 946          end if;
 947       end Source_Reference;
 948 
 949       -------------------------
 950       -- Style_Checks (GNAT) --
 951       -------------------------
 952 
 953       --  pragma Style_Checks (On | Off | ALL_CHECKS | STRING_LITERAL);
 954 
 955       --  This is processed by the parser since some of the style
 956       --  checks take place during source scanning and parsing.
 957 
 958       when Pragma_Style_Checks => Style_Checks : declare
 959          A  : Node_Id;
 960          S  : String_Id;
 961          C  : Char_Code;
 962          OK : Boolean := True;
 963 
 964       begin
 965          --  Two argument case is only for semantics
 966 
 967          if Arg_Count = 2 then
 968             null;
 969 
 970          else
 971             Check_Arg_Count (1);
 972             Check_No_Identifier (Arg1);
 973             A := Expression (Arg1);
 974 
 975             if Nkind (A) = N_String_Literal then
 976                S := Strval (A);
 977 
 978                declare
 979                   Slen    : constant Natural := Natural (String_Length (S));
 980                   Options : String (1 .. Slen);
 981                   J       : Positive;
 982                   Ptr     : Positive;
 983 
 984                begin
 985                   J := 1;
 986                   loop
 987                      C := Get_String_Char (S, Pos (J));
 988 
 989                      if not In_Character_Range (C) then
 990                         OK := False;
 991                         Ptr := J;
 992                         exit;
 993 
 994                      else
 995                         Options (J) := Get_Character (C);
 996                      end if;
 997 
 998                      if J = Slen then
 999                         if not Ignore_Style_Checks_Pragmas then
1000                            Set_Style_Check_Options (Options, OK, Ptr);
1001                         end if;
1002 
1003                         exit;
1004 
1005                      else
1006                         J := J + 1;
1007                      end if;
1008                   end loop;
1009 
1010                   if not OK then
1011                      Error_Msg
1012                        (Style_Msg_Buf (1 .. Style_Msg_Len),
1013                         Sloc (Expression (Arg1)) + Source_Ptr (Ptr));
1014                      raise Error_Resync;
1015                   end if;
1016                end;
1017 
1018             elsif Nkind (A) /= N_Identifier then
1019                OK := False;
1020 
1021             elsif Chars (A) = Name_All_Checks then
1022                if not Ignore_Style_Checks_Pragmas then
1023                   if GNAT_Mode then
1024                      Stylesw.Set_GNAT_Style_Check_Options;
1025                   else
1026                      Stylesw.Set_Default_Style_Check_Options;
1027                   end if;
1028                end if;
1029 
1030             elsif Chars (A) = Name_On then
1031                if not Ignore_Style_Checks_Pragmas then
1032                   Style_Check := True;
1033                end if;
1034 
1035             elsif Chars (A) = Name_Off then
1036                if not Ignore_Style_Checks_Pragmas then
1037                   Style_Check := False;
1038                end if;
1039 
1040             else
1041                OK := False;
1042             end if;
1043 
1044             if not OK then
1045                Error_Msg ("incorrect argument for pragma%", Sloc (A));
1046                raise Error_Resync;
1047             end if;
1048          end if;
1049       end Style_Checks;
1050 
1051       -------------------------
1052       -- Suppress_All (GNAT) --
1053       -------------------------
1054 
1055       --  pragma Suppress_All
1056 
1057       --  This is a rather odd pragma, because other compilers allow it in
1058       --  strange places. DEC allows it at the end of units, and Rational
1059       --  allows it as a program unit pragma, when it would be more natural
1060       --  if it were a configuration pragma.
1061 
1062       --  Since the reason we provide this pragma is for compatibility with
1063       --  these other compilers, we want to accommodate these strange placement
1064       --  rules, and the easiest thing is simply to allow it anywhere in a
1065       --  unit. If this pragma appears anywhere within a unit, then the effect
1066       --  is as though a pragma Suppress (All_Checks) had appeared as the first
1067       --  line of the current file, i.e. as the first configuration pragma in
1068       --  the current unit.
1069 
1070       --  To get this effect, we set the flag Has_Pragma_Suppress_All in the
1071       --  compilation unit node for the current source file then in the last
1072       --  stage of parsing a file, if this flag is set, we materialize the
1073       --  Suppress (All_Checks) pragma, marked as not coming from Source.
1074 
1075       when Pragma_Suppress_All =>
1076          Set_Has_Pragma_Suppress_All (Cunit (Current_Source_Unit));
1077 
1078       ---------------------
1079       -- Warnings (GNAT) --
1080       ---------------------
1081 
1082       --  pragma Warnings ([TOOL_NAME,] DETAILS [, REASON]);
1083 
1084       --  DETAILS ::= On | Off
1085       --  DETAILS ::= On | Off, local_NAME
1086       --  DETAILS ::= static_string_EXPRESSION
1087       --  DETAILS ::= On | Off, static_string_EXPRESSION
1088 
1089       --  TOOL_NAME ::= GNAT | GNATProve
1090 
1091       --  REASON ::= Reason => STRING_LITERAL {& STRING_LITERAL}
1092 
1093       --  Note: If the first argument matches an allowed tool name, it is
1094       --  always considered to be a tool name, even if there is a string
1095       --  variable of that name.
1096 
1097       --  The one argument ON/OFF case is processed by the parser, since it may
1098       --  control parser warnings as well as semantic warnings, and in any case
1099       --  we want to be absolutely sure that the range in the warnings table is
1100       --  set well before any semantic analysis is performed. Note that we
1101       --  ignore this pragma if debug flag -gnatd.i is set.
1102 
1103       --  Also note that the "one argument" case may have two or three
1104       --  arguments if the first one is a tool name, and/or the last one is a
1105       --  reason argument.
1106 
1107       when Pragma_Warnings => Warnings : declare
1108          function First_Arg_Is_Matching_Tool_Name return Boolean;
1109          --  Returns True if the first argument is a tool name matching the
1110          --  current tool being run.
1111 
1112          function Last_Arg return Node_Id;
1113          --  Returns the last argument
1114 
1115          function Last_Arg_Is_Reason return Boolean;
1116          --  Returns True if the last argument is a reason argument
1117 
1118          function Get_Reason return String_Id;
1119          --  Analyzes Reason argument and returns corresponding String_Id
1120          --  value, or null if there is no Reason argument, or if the
1121          --  argument is not of the required form.
1122 
1123          -------------------------------------
1124          -- First_Arg_Is_Matching_Tool_Name --
1125          -------------------------------------
1126 
1127          function First_Arg_Is_Matching_Tool_Name return Boolean is
1128          begin
1129             return Nkind (Arg1) = N_Identifier
1130 
1131               --  Return True if the tool name is GNAT, and we're not in
1132               --  GNATprove or CodePeer or ASIS mode...
1133 
1134               and then ((Chars (Arg1) = Name_Gnat
1135                           and then not
1136                             (CodePeer_Mode or GNATprove_Mode or ASIS_Mode))
1137 
1138               --  or if the tool name is GNATprove, and we're in GNATprove
1139               --  mode.
1140 
1141                         or else
1142                         (Chars (Arg1) = Name_Gnatprove
1143                           and then GNATprove_Mode));
1144          end First_Arg_Is_Matching_Tool_Name;
1145 
1146          ----------------
1147          -- Get_Reason --
1148          ----------------
1149 
1150          function Get_Reason return String_Id is
1151             Arg : constant Node_Id := Last_Arg;
1152          begin
1153             if Last_Arg_Is_Reason then
1154                Start_String;
1155                Get_Reason_String (Expression (Arg));
1156                return End_String;
1157             else
1158                return Null_String_Id;
1159             end if;
1160          end Get_Reason;
1161 
1162          --------------
1163          -- Last_Arg --
1164          --------------
1165 
1166          function Last_Arg return Node_Id is
1167                Last_Arg : Node_Id;
1168 
1169          begin
1170             if Arg_Count = 1 then
1171                Last_Arg := Arg1;
1172             elsif Arg_Count = 2 then
1173                Last_Arg := Arg2;
1174             elsif Arg_Count = 3 then
1175                Last_Arg := Arg3;
1176             elsif Arg_Count = 4 then
1177                Last_Arg := Next (Arg3);
1178 
1179             --  Illegal case, error issued in semantic analysis
1180 
1181             else
1182                Last_Arg := Empty;
1183             end if;
1184 
1185             return Last_Arg;
1186          end Last_Arg;
1187 
1188          ------------------------
1189          -- Last_Arg_Is_Reason --
1190          ------------------------
1191 
1192          function Last_Arg_Is_Reason return Boolean is
1193             Arg : constant Node_Id := Last_Arg;
1194          begin
1195             return Nkind (Arg) in N_Has_Chars
1196               and then Chars (Arg) = Name_Reason;
1197          end Last_Arg_Is_Reason;
1198 
1199          The_Arg : Node_Id;  --  On/Off argument
1200          Argx    : Node_Id;
1201 
1202       --  Start of processing for Warnings
1203 
1204       begin
1205          if not Debug_Flag_Dot_I
1206            and then (Arg_Count = 1
1207                        or else (Arg_Count = 2
1208                                   and then (First_Arg_Is_Matching_Tool_Name
1209                                               or else
1210                                             Last_Arg_Is_Reason))
1211                        or else (Arg_Count = 3
1212                                   and then First_Arg_Is_Matching_Tool_Name
1213                                   and then Last_Arg_Is_Reason))
1214          then
1215             if First_Arg_Is_Matching_Tool_Name then
1216                The_Arg := Arg2;
1217             else
1218                The_Arg := Arg1;
1219             end if;
1220 
1221             Check_No_Identifier (The_Arg);
1222             Argx := Expression (The_Arg);
1223 
1224             if Nkind (Argx) = N_Identifier then
1225                if Chars (Argx) = Name_On then
1226                   Set_Warnings_Mode_On (Pragma_Sloc);
1227                elsif Chars (Argx) = Name_Off then
1228                   Set_Warnings_Mode_Off (Pragma_Sloc, Get_Reason);
1229                end if;
1230             end if;
1231          end if;
1232       end Warnings;
1233 
1234       -----------------------------
1235       -- Wide_Character_Encoding --
1236       -----------------------------
1237 
1238       --  pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL);
1239 
1240       --  This is processed by the parser, since the scanner is affected
1241 
1242       when Pragma_Wide_Character_Encoding => Wide_Character_Encoding : declare
1243          A : Node_Id;
1244 
1245       begin
1246          Check_Arg_Count (1);
1247          Check_No_Identifier (Arg1);
1248          A := Expression (Arg1);
1249 
1250          if Nkind (A) = N_Identifier then
1251             Get_Name_String (Chars (A));
1252             Wide_Character_Encoding_Method :=
1253               Get_WC_Encoding_Method (Name_Buffer (1 .. Name_Len));
1254 
1255          elsif Nkind (A) = N_Character_Literal then
1256             declare
1257                R : constant Char_Code :=
1258                      Char_Code (UI_To_Int (Char_Literal_Value (A)));
1259             begin
1260                if In_Character_Range (R) then
1261                   Wide_Character_Encoding_Method :=
1262                     Get_WC_Encoding_Method (Get_Character (R));
1263                else
1264                   raise Constraint_Error;
1265                end if;
1266             end;
1267 
1268          else
1269             raise Constraint_Error;
1270          end if;
1271 
1272          Upper_Half_Encoding :=
1273            Wide_Character_Encoding_Method in
1274              WC_Upper_Half_Encoding_Method;
1275 
1276       exception
1277          when Constraint_Error =>
1278             Error_Msg_N ("invalid argument for pragma%", Arg1);
1279       end Wide_Character_Encoding;
1280 
1281       -----------------------
1282       -- All Other Pragmas --
1283       -----------------------
1284 
1285       --  For all other pragmas, checking and processing is handled
1286       --  entirely in Sem_Prag, and no further checking is done by Par.
1287 
1288       when Pragma_Abort_Defer                    |
1289            Pragma_Abstract_State                 |
1290            Pragma_Async_Readers                  |
1291            Pragma_Async_Writers                  |
1292            Pragma_Assertion_Policy               |
1293            Pragma_Assume                         |
1294            Pragma_Assume_No_Invalid_Values       |
1295            Pragma_All_Calls_Remote               |
1296            Pragma_Allow_Integer_Address          |
1297            Pragma_Annotate                       |
1298            Pragma_Assert                         |
1299            Pragma_Assert_And_Cut                 |
1300            Pragma_Asynchronous                   |
1301            Pragma_Atomic                         |
1302            Pragma_Atomic_Components              |
1303            Pragma_Attach_Handler                 |
1304            Pragma_Attribute_Definition           |
1305            Pragma_Check                          |
1306            Pragma_Check_Float_Overflow           |
1307            Pragma_Check_Name                     |
1308            Pragma_Check_Policy                   |
1309            Pragma_Compile_Time_Error             |
1310            Pragma_Compile_Time_Warning           |
1311            Pragma_Constant_After_Elaboration     |
1312            Pragma_Contract_Cases                 |
1313            Pragma_Convention_Identifier          |
1314            Pragma_CPP_Class                      |
1315            Pragma_CPP_Constructor                |
1316            Pragma_CPP_Virtual                    |
1317            Pragma_CPP_Vtable                     |
1318            Pragma_CPU                            |
1319            Pragma_C_Pass_By_Copy                 |
1320            Pragma_Comment                        |
1321            Pragma_Common_Object                  |
1322            Pragma_Complete_Representation        |
1323            Pragma_Complex_Representation         |
1324            Pragma_Component_Alignment            |
1325            Pragma_Controlled                     |
1326            Pragma_Convention                     |
1327            Pragma_Debug_Policy                   |
1328            Pragma_Depends                        |
1329            Pragma_Detect_Blocking                |
1330            Pragma_Default_Initial_Condition      |
1331            Pragma_Default_Scalar_Storage_Order   |
1332            Pragma_Default_Storage_Pool           |
1333            Pragma_Disable_Atomic_Synchronization |
1334            Pragma_Discard_Names                  |
1335            Pragma_Dispatching_Domain             |
1336            Pragma_Effective_Reads                |
1337            Pragma_Effective_Writes               |
1338            Pragma_Eliminate                      |
1339            Pragma_Elaborate                      |
1340            Pragma_Elaborate_All                  |
1341            Pragma_Elaborate_Body                 |
1342            Pragma_Elaboration_Checks             |
1343            Pragma_Enable_Atomic_Synchronization  |
1344            Pragma_Export                         |
1345            Pragma_Export_Function                |
1346            Pragma_Export_Object                  |
1347            Pragma_Export_Procedure               |
1348            Pragma_Export_Value                   |
1349            Pragma_Export_Valued_Procedure        |
1350            Pragma_Extend_System                  |
1351            Pragma_Extensions_Visible             |
1352            Pragma_External                       |
1353            Pragma_External_Name_Casing           |
1354            Pragma_Favor_Top_Level                |
1355            Pragma_Fast_Math                      |
1356            Pragma_Finalize_Storage_Only          |
1357            Pragma_Ghost                          |
1358            Pragma_Global                         |
1359            Pragma_Ident                          |
1360            Pragma_Implementation_Defined         |
1361            Pragma_Implemented                    |
1362            Pragma_Implicit_Packing               |
1363            Pragma_Import                         |
1364            Pragma_Import_Function                |
1365            Pragma_Import_Object                  |
1366            Pragma_Import_Procedure               |
1367            Pragma_Import_Valued_Procedure        |
1368            Pragma_Independent                    |
1369            Pragma_Independent_Components         |
1370            Pragma_Initial_Condition              |
1371            Pragma_Initialize_Scalars             |
1372            Pragma_Initializes                    |
1373            Pragma_Inline                         |
1374            Pragma_Inline_Always                  |
1375            Pragma_Inline_Generic                 |
1376            Pragma_Inspection_Point               |
1377            Pragma_Interface                      |
1378            Pragma_Interface_Name                 |
1379            Pragma_Interrupt_Handler              |
1380            Pragma_Interrupt_State                |
1381            Pragma_Interrupt_Priority             |
1382            Pragma_Invariant                      |
1383            Pragma_Keep_Names                     |
1384            Pragma_License                        |
1385            Pragma_Link_With                      |
1386            Pragma_Linker_Alias                   |
1387            Pragma_Linker_Constructor             |
1388            Pragma_Linker_Destructor              |
1389            Pragma_Linker_Options                 |
1390            Pragma_Linker_Section                 |
1391            Pragma_Lock_Free                      |
1392            Pragma_Locking_Policy                 |
1393            Pragma_Loop_Invariant                 |
1394            Pragma_Loop_Optimize                  |
1395            Pragma_Loop_Variant                   |
1396            Pragma_Machine_Attribute              |
1397            Pragma_Main                           |
1398            Pragma_Main_Storage                   |
1399            Pragma_Memory_Size                    |
1400            Pragma_No_Body                        |
1401            Pragma_No_Elaboration_Code_All        |
1402            Pragma_No_Inline                      |
1403            Pragma_No_Return                      |
1404            Pragma_No_Run_Time                    |
1405            Pragma_No_Strict_Aliasing             |
1406            Pragma_No_Tagged_Streams              |
1407            Pragma_Normalize_Scalars              |
1408            Pragma_Obsolescent                    |
1409            Pragma_Ordered                        |
1410            Pragma_Optimize                       |
1411            Pragma_Optimize_Alignment             |
1412            Pragma_Overflow_Mode                  |
1413            Pragma_Overriding_Renamings           |
1414            Pragma_Pack                           |
1415            Pragma_Part_Of                        |
1416            Pragma_Partition_Elaboration_Policy   |
1417            Pragma_Passive                        |
1418            Pragma_Preelaborable_Initialization   |
1419            Pragma_Polling                        |
1420            Pragma_Prefix_Exception_Messages      |
1421            Pragma_Persistent_BSS                 |
1422            Pragma_Post                           |
1423            Pragma_Postcondition                  |
1424            Pragma_Post_Class                     |
1425            Pragma_Pre                            |
1426            Pragma_Precondition                   |
1427            Pragma_Predicate                      |
1428            Pragma_Predicate_Failure              |
1429            Pragma_Preelaborate                   |
1430            Pragma_Pre_Class                      |
1431            Pragma_Priority                       |
1432            Pragma_Priority_Specific_Dispatching  |
1433            Pragma_Profile                        |
1434            Pragma_Profile_Warnings               |
1435            Pragma_Propagate_Exceptions           |
1436            Pragma_Provide_Shift_Operators        |
1437            Pragma_Psect_Object                   |
1438            Pragma_Pure                           |
1439            Pragma_Pure_Function                  |
1440            Pragma_Queuing_Policy                 |
1441            Pragma_Refined_Depends                |
1442            Pragma_Refined_Global                 |
1443            Pragma_Refined_Post                   |
1444            Pragma_Refined_State                  |
1445            Pragma_Relative_Deadline              |
1446            Pragma_Remote_Access_Type             |
1447            Pragma_Remote_Call_Interface          |
1448            Pragma_Remote_Types                   |
1449            Pragma_Restricted_Run_Time            |
1450            Pragma_Rational                       |
1451            Pragma_Ravenscar                      |
1452            Pragma_Reviewable                     |
1453            Pragma_Share_Generic                  |
1454            Pragma_Shared                         |
1455            Pragma_Shared_Passive                 |
1456            Pragma_Short_Circuit_And_Or           |
1457            Pragma_Short_Descriptors              |
1458            Pragma_Simple_Storage_Pool_Type       |
1459            Pragma_SPARK_Mode                     |
1460            Pragma_Storage_Size                   |
1461            Pragma_Storage_Unit                   |
1462            Pragma_Static_Elaboration_Desired     |
1463            Pragma_Stream_Convert                 |
1464            Pragma_Subtitle                       |
1465            Pragma_Suppress                       |
1466            Pragma_Suppress_Debug_Info            |
1467            Pragma_Suppress_Exception_Locations   |
1468            Pragma_Suppress_Initialization        |
1469            Pragma_System_Name                    |
1470            Pragma_Task_Dispatching_Policy        |
1471            Pragma_Task_Info                      |
1472            Pragma_Task_Name                      |
1473            Pragma_Task_Storage                   |
1474            Pragma_Test_Case                      |
1475            Pragma_Thread_Local_Storage           |
1476            Pragma_Time_Slice                     |
1477            Pragma_Title                          |
1478            Pragma_Type_Invariant                 |
1479            Pragma_Type_Invariant_Class           |
1480            Pragma_Unchecked_Union                |
1481            Pragma_Unevaluated_Use_Of_Old         |
1482            Pragma_Unimplemented_Unit             |
1483            Pragma_Universal_Aliasing             |
1484            Pragma_Universal_Data                 |
1485            Pragma_Unmodified                     |
1486            Pragma_Unreferenced                   |
1487            Pragma_Unreferenced_Objects           |
1488            Pragma_Unreserve_All_Interrupts       |
1489            Pragma_Unsuppress                     |
1490            Pragma_Unused                         |
1491            Pragma_Use_VADS_Size                  |
1492            Pragma_Volatile                       |
1493            Pragma_Volatile_Components            |
1494            Pragma_Volatile_Full_Access           |
1495            Pragma_Volatile_Function              |
1496            Pragma_Warning_As_Error               |
1497            Pragma_Weak_External                  |
1498            Pragma_Validity_Checks                =>
1499          null;
1500 
1501       --------------------
1502       -- Unknown_Pragma --
1503       --------------------
1504 
1505       --  Should be impossible, since we excluded this case earlier on
1506 
1507       when Unknown_Pragma =>
1508          raise Program_Error;
1509 
1510    end case;
1511 
1512    return Pragma_Node;
1513 
1514    --------------------
1515    -- Error Handling --
1516    --------------------
1517 
1518 exception
1519    when Error_Resync =>
1520       return Error;
1521 
1522 end Prag;