File : par-ch12.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                             P A R . C H 1 2                              --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2015, 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 pragma Style_Checks (All_Checks);
  27 --  Turn off subprogram body ordering check. Subprograms are in order
  28 --  by RM section rather than alphabetical
  29 
  30 separate (Par)
  31 package body Ch12 is
  32 
  33    --  Local functions, used only in this chapter
  34 
  35    function P_Formal_Derived_Type_Definition           return Node_Id;
  36    function P_Formal_Discrete_Type_Definition          return Node_Id;
  37    function P_Formal_Fixed_Point_Definition            return Node_Id;
  38    function P_Formal_Floating_Point_Definition         return Node_Id;
  39    function P_Formal_Modular_Type_Definition           return Node_Id;
  40    function P_Formal_Package_Declaration               return Node_Id;
  41    function P_Formal_Private_Type_Definition           return Node_Id;
  42    function P_Formal_Signed_Integer_Type_Definition    return Node_Id;
  43    function P_Formal_Subprogram_Declaration            return Node_Id;
  44    function P_Formal_Type_Declaration                  return Node_Id;
  45    function P_Formal_Type_Definition                   return Node_Id;
  46    function P_Generic_Association                      return Node_Id;
  47 
  48    procedure P_Formal_Object_Declarations (Decls : List_Id);
  49    --  Scans one or more formal object declarations and appends them to
  50    --  Decls. Scans more than one declaration only in the case where the
  51    --  source has a declaration with multiple defining identifiers.
  52 
  53    --------------------------------
  54    -- 12.1  Generic (also 8.5.5) --
  55    --------------------------------
  56 
  57    --  This routine parses either one of the forms of a generic declaration
  58    --  or a generic renaming declaration.
  59 
  60    --  GENERIC_DECLARATION ::=
  61    --    GENERIC_SUBPROGRAM_DECLARATION | GENERIC_PACKAGE_DECLARATION
  62 
  63    --  GENERIC_SUBPROGRAM_DECLARATION ::=
  64    --    GENERIC_FORMAL_PART SUBPROGRAM_SPECIFICATION
  65    --      [ASPECT_SPECIFICATIONS];
  66 
  67    --  GENERIC_PACKAGE_DECLARATION ::=
  68    --    GENERIC_FORMAL_PART PACKAGE_SPECIFICATION
  69    --      [ASPECT_SPECIFICATIONS];
  70 
  71    --  GENERIC_FORMAL_PART ::=
  72    --    generic {GENERIC_FORMAL_PARAMETER_DECLARATION | USE_CLAUSE}
  73 
  74    --  GENERIC_RENAMING_DECLARATION ::=
  75    --    generic package DEFINING_PROGRAM_UNIT_NAME
  76    --      renames generic_package_NAME
  77    --        [ASPECT_SPECIFICATIONS];
  78    --  | generic procedure DEFINING_PROGRAM_UNIT_NAME
  79    --      renames generic_procedure_NAME
  80    --        [ASPECT_SPECIFICATIONS];
  81    --  | generic function DEFINING_PROGRAM_UNIT_NAME
  82    --      renames generic_function_NAME
  83    --        [ASPECT_SPECIFICATIONS];
  84 
  85    --  GENERIC_FORMAL_PARAMETER_DECLARATION ::=
  86    --    FORMAL_OBJECT_DECLARATION
  87    --  | FORMAL_TYPE_DECLARATION
  88    --  | FORMAL_SUBPROGRAM_DECLARATION
  89    --  | FORMAL_PACKAGE_DECLARATION
  90 
  91    --  The caller has checked that the initial token is GENERIC
  92 
  93    --  Error recovery: can raise Error_Resync
  94 
  95    function P_Generic return Node_Id is
  96       Gen_Sloc   : constant Source_Ptr := Token_Ptr;
  97       Gen_Decl   : Node_Id;
  98       Decl_Node  : Node_Id;
  99       Decls      : List_Id;
 100       Def_Unit   : Node_Id;
 101       Ren_Token  : Token_Type;
 102       Scan_State : Saved_Scan_State;
 103 
 104    begin
 105       Scan; -- past GENERIC
 106 
 107       if Token = Tok_Private then
 108          Error_Msg_SC -- CODEFIX
 109            ("PRIVATE goes before GENERIC, not after");
 110          Scan; -- past junk PRIVATE token
 111       end if;
 112 
 113       Save_Scan_State (Scan_State); -- at token past GENERIC
 114 
 115       --  Check for generic renaming declaration case
 116 
 117       if Token = Tok_Package
 118         or else Token = Tok_Function
 119         or else Token = Tok_Procedure
 120       then
 121          Ren_Token := Token;
 122          Scan; -- scan past PACKAGE, FUNCTION or PROCEDURE
 123 
 124          if Token = Tok_Identifier then
 125             Def_Unit := P_Defining_Program_Unit_Name;
 126 
 127             Check_Misspelling_Of (Tok_Renames);
 128 
 129             if Token = Tok_Renames then
 130                if Ren_Token = Tok_Package then
 131                   Decl_Node := New_Node
 132                     (N_Generic_Package_Renaming_Declaration, Gen_Sloc);
 133 
 134                elsif Ren_Token = Tok_Procedure then
 135                   Decl_Node := New_Node
 136                     (N_Generic_Procedure_Renaming_Declaration, Gen_Sloc);
 137 
 138                else -- Ren_Token = Tok_Function then
 139                   Decl_Node := New_Node
 140                     (N_Generic_Function_Renaming_Declaration, Gen_Sloc);
 141                end if;
 142 
 143                Scan; -- past RENAMES
 144                Set_Defining_Unit_Name (Decl_Node, Def_Unit);
 145                Set_Name (Decl_Node, P_Name);
 146 
 147                P_Aspect_Specifications (Decl_Node, Semicolon => False);
 148                TF_Semicolon;
 149                return Decl_Node;
 150             end if;
 151          end if;
 152       end if;
 153 
 154       --  Fall through if this is *not* a generic renaming declaration
 155 
 156       Restore_Scan_State (Scan_State);
 157       Decls := New_List;
 158 
 159       --  Loop through generic parameter declarations and use clauses
 160 
 161       Decl_Loop : loop
 162          P_Pragmas_Opt (Decls);
 163 
 164          if Token = Tok_Private then
 165             Error_Msg_S ("generic private child packages not permitted");
 166             Scan; -- past PRIVATE
 167          end if;
 168 
 169          if Token = Tok_Use then
 170             Append (P_Use_Clause, Decls);
 171 
 172          else
 173             --  Parse a generic parameter declaration
 174 
 175             if Token = Tok_Identifier then
 176                P_Formal_Object_Declarations (Decls);
 177 
 178             elsif Token = Tok_Type then
 179                Append (P_Formal_Type_Declaration, Decls);
 180 
 181             elsif Token = Tok_With then
 182                Scan; -- past WITH
 183 
 184                if Token = Tok_Package then
 185                   Append (P_Formal_Package_Declaration, Decls);
 186 
 187                elsif Token = Tok_Procedure or Token = Tok_Function then
 188                   Append (P_Formal_Subprogram_Declaration, Decls);
 189 
 190                else
 191                   Error_Msg_BC -- CODEFIX
 192                     ("FUNCTION, PROCEDURE or PACKAGE expected here");
 193                   Resync_Past_Semicolon;
 194                end if;
 195 
 196             elsif Token = Tok_Subtype then
 197                Error_Msg_SC ("subtype declaration not allowed " &
 198                                 "as generic parameter declaration!");
 199                Resync_Past_Semicolon;
 200 
 201             else
 202                exit Decl_Loop;
 203             end if;
 204          end if;
 205       end loop Decl_Loop;
 206 
 207       --  Generic formal part is scanned, scan out subprogram or package spec
 208 
 209       if Token = Tok_Package then
 210          Gen_Decl := New_Node (N_Generic_Package_Declaration, Gen_Sloc);
 211          Set_Specification (Gen_Decl, P_Package (Pf_Spcn));
 212 
 213          --  Aspects have been parsed by the package spec. Move them to the
 214          --  generic declaration where they belong.
 215 
 216          Move_Aspects (Specification (Gen_Decl), Gen_Decl);
 217 
 218       else
 219          Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
 220          Set_Specification (Gen_Decl, P_Subprogram_Specification);
 221 
 222          if Nkind (Defining_Unit_Name (Specification (Gen_Decl))) =
 223                                              N_Defining_Program_Unit_Name
 224            and then Scope.Last > 0
 225          then
 226             Error_Msg_SP ("child unit allowed only at library level");
 227          end if;
 228 
 229          P_Aspect_Specifications (Gen_Decl);
 230       end if;
 231 
 232       Set_Generic_Formal_Declarations (Gen_Decl, Decls);
 233       return Gen_Decl;
 234    end P_Generic;
 235 
 236    -------------------------------
 237    -- 12.1  Generic Declaration --
 238    -------------------------------
 239 
 240    --  Parsed by P_Generic (12.1)
 241 
 242    ------------------------------------------
 243    -- 12.1  Generic Subprogram Declaration --
 244    ------------------------------------------
 245 
 246    --  Parsed by P_Generic (12.1)
 247 
 248    ---------------------------------------
 249    -- 12.1  Generic Package Declaration --
 250    ---------------------------------------
 251 
 252    --  Parsed by P_Generic (12.1)
 253 
 254    -------------------------------
 255    -- 12.1  Generic Formal Part --
 256    -------------------------------
 257 
 258    --  Parsed by P_Generic (12.1)
 259 
 260    -------------------------------------------------
 261    -- 12.1   Generic Formal Parameter Declaration --
 262    -------------------------------------------------
 263 
 264    --  Parsed by P_Generic (12.1)
 265 
 266    ---------------------------------
 267    -- 12.3  Generic Instantiation --
 268    ---------------------------------
 269 
 270    --  Generic package instantiation parsed by P_Package (7.1)
 271    --  Generic procedure instantiation parsed by P_Subprogram (6.1)
 272    --  Generic function instantiation parsed by P_Subprogram (6.1)
 273 
 274    -------------------------------
 275    -- 12.3  Generic Actual Part --
 276    -------------------------------
 277 
 278    --  GENERIC_ACTUAL_PART ::=
 279    --    (GENERIC_ASSOCIATION {, GENERIC_ASSOCIATION})
 280 
 281    --  Returns a list of generic associations, or Empty if none are present
 282 
 283    --  Error recovery: cannot raise Error_Resync
 284 
 285    function P_Generic_Actual_Part_Opt return List_Id is
 286       Association_List : List_Id;
 287 
 288    begin
 289       --  Figure out if a generic actual part operation is present. Clearly
 290       --  there is no generic actual part if the current token is semicolon
 291       --  or if we have aspect specifications present.
 292 
 293       if Token = Tok_Semicolon or else Aspect_Specifications_Present then
 294          return No_List;
 295 
 296       --  If we don't have a left paren, then we have an error, and the job
 297       --  is to figure out whether a left paren or semicolon was intended.
 298       --  We assume a missing left paren (and hence a generic actual part
 299       --  present) if the current token is not on a new line, or if it is
 300       --  indented from the subprogram token. Otherwise assume missing
 301       --  semicolon (which will be diagnosed by caller) and no generic part
 302 
 303       elsif Token /= Tok_Left_Paren
 304         and then Token_Is_At_Start_Of_Line
 305         and then Start_Column <= Scope.Table (Scope.Last).Ecol
 306       then
 307          return No_List;
 308 
 309       --  Otherwise we have a generic actual part (either a left paren is
 310       --  present, or we have decided that there must be a missing left paren)
 311 
 312       else
 313          Association_List := New_List;
 314          T_Left_Paren;
 315 
 316          loop
 317             Append (P_Generic_Association, Association_List);
 318             exit when not Comma_Present;
 319          end loop;
 320 
 321          T_Right_Paren;
 322          return Association_List;
 323       end if;
 324 
 325    end P_Generic_Actual_Part_Opt;
 326 
 327    -------------------------------
 328    -- 12.3  Generic Association --
 329    -------------------------------
 330 
 331    --  GENERIC_ASSOCIATION ::=
 332    --    [generic_formal_parameter_SELECTOR_NAME =>]
 333    --      EXPLICIT_GENERIC_ACTUAL_PARAMETER
 334 
 335    --  EXPLICIT_GENERIC_ACTUAL_PARAMETER ::=
 336    --    EXPRESSION      | variable_NAME   | subprogram_NAME
 337    --  | entry_NAME      | SUBTYPE_MARK    | package_instance_NAME
 338 
 339    --  Error recovery: cannot raise Error_Resync
 340 
 341    function P_Generic_Association return Node_Id is
 342       Scan_State         : Saved_Scan_State;
 343       Param_Name_Node    : Node_Id;
 344       Generic_Assoc_Node : Node_Id;
 345 
 346    begin
 347       Generic_Assoc_Node := New_Node (N_Generic_Association, Token_Ptr);
 348 
 349       --  Ada 2005: an association can be given by: others => <>
 350 
 351       if Token = Tok_Others then
 352          if Ada_Version < Ada_2005 then
 353             Error_Msg_SP
 354               ("partial parameterization of formal packages"
 355                & " is an Ada 2005 extension");
 356             Error_Msg_SP
 357               ("\unit must be compiled with -gnat05 switch");
 358          end if;
 359 
 360          Scan;  --  past OTHERS
 361 
 362          if Token /= Tok_Arrow then
 363             Error_Msg_BC  ("expect arrow after others");
 364          else
 365             Scan;  --  past arrow
 366          end if;
 367 
 368          if Token /= Tok_Box then
 369             Error_Msg_BC ("expect Box after arrow");
 370          else
 371             Scan;  --  past box
 372          end if;
 373 
 374          --  Source position of the others choice is beginning of construct
 375 
 376          return New_Node (N_Others_Choice, Sloc (Generic_Assoc_Node));
 377       end if;
 378 
 379       if Token in Token_Class_Desig then
 380          Param_Name_Node := Token_Node;
 381          Save_Scan_State (Scan_State); -- at designator
 382          Scan; -- past simple name or operator symbol
 383 
 384          if Token = Tok_Arrow then
 385             Scan; -- past arrow
 386             Set_Selector_Name (Generic_Assoc_Node, Param_Name_Node);
 387          else
 388             Restore_Scan_State (Scan_State); -- to designator
 389          end if;
 390       end if;
 391 
 392       --  In Ada 2005 the actual can be a box
 393 
 394       if Token = Tok_Box then
 395          Scan;
 396          Set_Box_Present (Generic_Assoc_Node);
 397          Set_Explicit_Generic_Actual_Parameter (Generic_Assoc_Node, Empty);
 398 
 399       else
 400          Set_Explicit_Generic_Actual_Parameter
 401            (Generic_Assoc_Node, P_Expression);
 402       end if;
 403 
 404       return Generic_Assoc_Node;
 405    end P_Generic_Association;
 406 
 407    ---------------------------------------------
 408    -- 12.3  Explicit Generic Actual Parameter --
 409    ---------------------------------------------
 410 
 411    --  Parsed by P_Generic_Association (12.3)
 412 
 413    --------------------------------------
 414    -- 12.4  Formal Object Declarations --
 415    --------------------------------------
 416 
 417    --  FORMAL_OBJECT_DECLARATION ::=
 418    --    DEFINING_IDENTIFIER_LIST :
 419    --      MODE [NULL_EXCLUSION] SUBTYPE_MARK [:= DEFAULT_EXPRESSION]
 420    --        [ASPECT_SPECIFICATIONS];
 421    --  | DEFINING_IDENTIFIER_LIST :
 422    --      MODE ACCESS_DEFINITION [:= DEFAULT_EXPRESSION];
 423    --        [ASPECT_SPECIFICATIONS];
 424 
 425    --  The caller has checked that the initial token is an identifier
 426 
 427    --  Error recovery: cannot raise Error_Resync
 428 
 429    procedure P_Formal_Object_Declarations (Decls : List_Id) is
 430       Decl_Node        : Node_Id;
 431       Ident            : Nat;
 432       Not_Null_Present : Boolean := False;
 433       Num_Idents       : Nat;
 434       Scan_State       : Saved_Scan_State;
 435 
 436       Idents : array (Int range 1 .. 4096) of Entity_Id;
 437       --  This array holds the list of defining identifiers. The upper bound
 438       --  of 4096 is intended to be essentially infinite, and we do not even
 439       --  bother to check for it being exceeded.
 440 
 441    begin
 442       Idents (1) := P_Defining_Identifier (C_Comma_Colon);
 443       Num_Idents := 1;
 444       while Comma_Present loop
 445          Num_Idents := Num_Idents + 1;
 446          Idents (Num_Idents) := P_Defining_Identifier (C_Comma_Colon);
 447       end loop;
 448 
 449       T_Colon;
 450 
 451       --  If there are multiple identifiers, we repeatedly scan the
 452       --  type and initialization expression information by resetting
 453       --  the scan pointer (so that we get completely separate trees
 454       --  for each occurrence).
 455 
 456       if Num_Idents > 1 then
 457          Save_Scan_State (Scan_State);
 458       end if;
 459 
 460       --  Loop through defining identifiers in list
 461 
 462       Ident := 1;
 463       Ident_Loop : loop
 464          Decl_Node := New_Node (N_Formal_Object_Declaration, Token_Ptr);
 465          Set_Defining_Identifier (Decl_Node, Idents (Ident));
 466          P_Mode (Decl_Node);
 467 
 468          Not_Null_Present := P_Null_Exclusion;  --  Ada 2005 (AI-423)
 469 
 470          --  Ada 2005 (AI-423): Formal object with an access definition
 471 
 472          if Token = Tok_Access then
 473 
 474             --  The access definition is still parsed and set even though
 475             --  the compilation may not use the proper switch. This action
 476             --  ensures the required local error recovery.
 477 
 478             Set_Access_Definition (Decl_Node,
 479               P_Access_Definition (Not_Null_Present));
 480 
 481             if Ada_Version < Ada_2005 then
 482                Error_Msg_SP
 483                  ("access definition not allowed in formal object " &
 484                   "declaration");
 485                Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
 486             end if;
 487 
 488          --  Formal object with a subtype mark
 489 
 490          else
 491             Set_Null_Exclusion_Present (Decl_Node, Not_Null_Present);
 492             Set_Subtype_Mark (Decl_Node, P_Subtype_Mark_Resync);
 493          end if;
 494 
 495          No_Constraint;
 496          Set_Default_Expression (Decl_Node, Init_Expr_Opt);
 497          P_Aspect_Specifications (Decl_Node);
 498 
 499          if Ident > 1 then
 500             Set_Prev_Ids (Decl_Node, True);
 501          end if;
 502 
 503          if Ident < Num_Idents then
 504             Set_More_Ids (Decl_Node, True);
 505          end if;
 506 
 507          Append (Decl_Node, Decls);
 508 
 509          exit Ident_Loop when Ident = Num_Idents;
 510          Ident := Ident + 1;
 511          Restore_Scan_State (Scan_State);
 512       end loop Ident_Loop;
 513    end P_Formal_Object_Declarations;
 514 
 515    -----------------------------------
 516    -- 12.5  Formal Type Declaration --
 517    -----------------------------------
 518 
 519    --  FORMAL_TYPE_DECLARATION ::=
 520    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
 521    --      is FORMAL_TYPE_DEFINITION
 522    --        [ASPECT_SPECIFICATIONS];
 523 
 524    --  The caller has checked that the initial token is TYPE
 525 
 526    --  Error recovery: cannot raise Error_Resync
 527 
 528    function P_Formal_Type_Declaration return Node_Id is
 529       Decl_Node  : Node_Id;
 530       Def_Node   : Node_Id;
 531 
 532    begin
 533       Decl_Node := New_Node (N_Formal_Type_Declaration, Token_Ptr);
 534       Scan; -- past TYPE
 535       Set_Defining_Identifier (Decl_Node, P_Defining_Identifier);
 536 
 537       if P_Unknown_Discriminant_Part_Opt then
 538          Set_Unknown_Discriminants_Present (Decl_Node, True);
 539       else
 540          Set_Discriminant_Specifications
 541            (Decl_Node, P_Known_Discriminant_Part_Opt);
 542       end if;
 543 
 544       if Token = Tok_Semicolon then
 545 
 546          --  Ada 2012: Incomplete formal type
 547 
 548          Scan; -- past semicolon
 549 
 550          Error_Msg_Ada_2012_Feature
 551            ("formal incomplete type", Sloc (Decl_Node));
 552 
 553          Set_Formal_Type_Definition
 554            (Decl_Node,
 555             New_Node (N_Formal_Incomplete_Type_Definition, Token_Ptr));
 556          return Decl_Node;
 557 
 558       else
 559          T_Is;
 560       end if;
 561 
 562       Def_Node := P_Formal_Type_Definition;
 563 
 564       if Nkind (Def_Node) = N_Formal_Incomplete_Type_Definition then
 565          Error_Msg_Ada_2012_Feature
 566            ("formal incomplete type", Sloc (Decl_Node));
 567       end if;
 568 
 569       if Def_Node /= Error then
 570          Set_Formal_Type_Definition (Decl_Node, Def_Node);
 571          P_Aspect_Specifications (Decl_Node);
 572 
 573       else
 574          Decl_Node := Error;
 575 
 576          --  If we have aspect specifications, skip them
 577 
 578          if Aspect_Specifications_Present then
 579             P_Aspect_Specifications (Error);
 580 
 581          --  If we have semicolon, skip it to avoid cascaded errors
 582 
 583          elsif Token = Tok_Semicolon then
 584             Scan; -- past semicolon
 585          end if;
 586       end if;
 587 
 588       return Decl_Node;
 589    end P_Formal_Type_Declaration;
 590 
 591    ----------------------------------
 592    -- 12.5  Formal Type Definition --
 593    ----------------------------------
 594 
 595    --  FORMAL_TYPE_DEFINITION ::=
 596    --    FORMAL_PRIVATE_TYPE_DEFINITION
 597    --  | FORMAL_INCOMPLETE_TYPE_DEFINITION
 598    --  | FORMAL_DERIVED_TYPE_DEFINITION
 599    --  | FORMAL_DISCRETE_TYPE_DEFINITION
 600    --  | FORMAL_SIGNED_INTEGER_TYPE_DEFINITION
 601    --  | FORMAL_MODULAR_TYPE_DEFINITION
 602    --  | FORMAL_FLOATING_POINT_DEFINITION
 603    --  | FORMAL_ORDINARY_FIXED_POINT_DEFINITION
 604    --  | FORMAL_DECIMAL_FIXED_POINT_DEFINITION
 605    --  | FORMAL_ARRAY_TYPE_DEFINITION
 606    --  | FORMAL_ACCESS_TYPE_DEFINITION
 607    --  | FORMAL_INTERFACE_TYPE_DEFINITION
 608 
 609    --  FORMAL_ARRAY_TYPE_DEFINITION ::= ARRAY_TYPE_DEFINITION
 610 
 611    --  FORMAL_ACCESS_TYPE_DEFINITION ::= ACCESS_TYPE_DEFINITION
 612 
 613    --  FORMAL_INTERFACE_TYPE_DEFINITION ::= INTERFACE_TYPE_DEFINITION
 614 
 615    function P_Formal_Type_Definition return Node_Id is
 616       Scan_State   : Saved_Scan_State;
 617       Typedef_Node : Node_Id;
 618 
 619    begin
 620       if Token_Name = Name_Abstract then
 621          Check_95_Keyword (Tok_Abstract, Tok_Tagged);
 622       end if;
 623 
 624       if Token_Name = Name_Tagged then
 625          Check_95_Keyword (Tok_Tagged, Tok_Private);
 626          Check_95_Keyword (Tok_Tagged, Tok_Limited);
 627       end if;
 628 
 629       case Token is
 630 
 631          --  Mostly we can tell what we have from the initial token. The one
 632          --  exception is ABSTRACT, where we have to scan ahead to see if we
 633          --  have a formal derived type or a formal private type definition.
 634 
 635          --  In addition, in Ada 2005 LIMITED may appear after abstract, so
 636          --  that the lookahead must be extended by one more token.
 637 
 638          when Tok_Abstract =>
 639             Save_Scan_State (Scan_State);
 640             Scan; -- past ABSTRACT
 641 
 642             if Token = Tok_New then
 643                Restore_Scan_State (Scan_State); -- to ABSTRACT
 644                return P_Formal_Derived_Type_Definition;
 645 
 646             elsif Token = Tok_Limited then
 647                Scan;  --  past LIMITED
 648 
 649                if Token = Tok_New then
 650                   Restore_Scan_State (Scan_State); -- to ABSTRACT
 651                   return P_Formal_Derived_Type_Definition;
 652 
 653                else
 654                   Restore_Scan_State (Scan_State); -- to ABSTRACT
 655                   return P_Formal_Private_Type_Definition;
 656                end if;
 657 
 658             --  Ada 2005 (AI-443): Abstract synchronized formal derived type
 659 
 660             elsif Token = Tok_Synchronized then
 661                Restore_Scan_State (Scan_State); -- to ABSTRACT
 662                return P_Formal_Derived_Type_Definition;
 663 
 664             else
 665                Restore_Scan_State (Scan_State); -- to ABSTRACT
 666                return P_Formal_Private_Type_Definition;
 667             end if;
 668 
 669          when Tok_Access =>
 670             return P_Access_Type_Definition;
 671 
 672          when Tok_Array =>
 673             return P_Array_Type_Definition;
 674 
 675          when Tok_Delta =>
 676             return P_Formal_Fixed_Point_Definition;
 677 
 678          when Tok_Digits =>
 679             return P_Formal_Floating_Point_Definition;
 680 
 681          when Tok_Interface => --  Ada 2005 (AI-251)
 682             return P_Interface_Type_Definition (Abstract_Present => False);
 683 
 684          when Tok_Left_Paren =>
 685             return P_Formal_Discrete_Type_Definition;
 686 
 687          when Tok_Limited =>
 688             Save_Scan_State (Scan_State);
 689             Scan; --  past LIMITED
 690 
 691             if Token = Tok_Interface then
 692                Typedef_Node :=
 693                  P_Interface_Type_Definition (Abstract_Present => False);
 694                Set_Limited_Present (Typedef_Node);
 695                return Typedef_Node;
 696 
 697             elsif Token = Tok_New then
 698                Restore_Scan_State (Scan_State); -- to LIMITED
 699                return P_Formal_Derived_Type_Definition;
 700 
 701             else
 702                if Token = Tok_Abstract then
 703                   Error_Msg_SC -- CODEFIX
 704                     ("ABSTRACT must come before LIMITED");
 705                   Scan;  --  past improper ABSTRACT
 706 
 707                   if Token = Tok_New then
 708                      Restore_Scan_State (Scan_State); -- to LIMITED
 709                      return P_Formal_Derived_Type_Definition;
 710 
 711                   else
 712                      Restore_Scan_State (Scan_State);
 713                      return P_Formal_Private_Type_Definition;
 714                   end if;
 715                end if;
 716 
 717                Restore_Scan_State (Scan_State);
 718                return P_Formal_Private_Type_Definition;
 719             end if;
 720 
 721          when Tok_Mod =>
 722             return P_Formal_Modular_Type_Definition;
 723 
 724          when Tok_New =>
 725             return P_Formal_Derived_Type_Definition;
 726 
 727          when Tok_Not =>
 728             if P_Null_Exclusion then
 729                Typedef_Node := P_Access_Type_Definition;
 730                Set_Null_Exclusion_Present (Typedef_Node);
 731                return Typedef_Node;
 732 
 733             else
 734                Error_Msg_SC ("expect valid formal access definition!");
 735                Resync_Past_Semicolon;
 736                return Error;
 737             end if;
 738 
 739          when Tok_Private =>
 740             return P_Formal_Private_Type_Definition;
 741 
 742          when Tok_Tagged =>
 743             if Next_Token_Is (Tok_Semicolon) then
 744                Typedef_Node :=
 745                  New_Node (N_Formal_Incomplete_Type_Definition, Token_Ptr);
 746                Set_Tagged_Present (Typedef_Node);
 747 
 748                Scan;  --  past tagged
 749                return Typedef_Node;
 750 
 751             else
 752                return P_Formal_Private_Type_Definition;
 753             end if;
 754 
 755          when Tok_Range =>
 756             return P_Formal_Signed_Integer_Type_Definition;
 757 
 758          when Tok_Record =>
 759             Error_Msg_SC ("record not allowed in generic type definition!");
 760             Discard_Junk_Node (P_Record_Definition);
 761             return Error;
 762 
 763          --  Ada 2005 (AI-345): Task, Protected or Synchronized interface or
 764          --  (AI-443): Synchronized formal derived type declaration.
 765 
 766          when Tok_Protected    |
 767               Tok_Synchronized |
 768               Tok_Task         =>
 769 
 770             declare
 771                Saved_Token : constant Token_Type := Token;
 772 
 773             begin
 774                Scan; -- past TASK, PROTECTED or SYNCHRONIZED
 775 
 776                --  Synchronized derived type
 777 
 778                if Token = Tok_New then
 779                   Typedef_Node := P_Formal_Derived_Type_Definition;
 780 
 781                   if Saved_Token = Tok_Synchronized then
 782                      Set_Synchronized_Present (Typedef_Node);
 783                   else
 784                      Error_Msg_SC ("invalid kind of formal derived type");
 785                   end if;
 786 
 787                --  Interface
 788 
 789                else
 790                   Typedef_Node :=
 791                     P_Interface_Type_Definition (Abstract_Present => False);
 792 
 793                   case Saved_Token is
 794                      when Tok_Task =>
 795                         Set_Task_Present         (Typedef_Node);
 796 
 797                      when Tok_Protected =>
 798                         Set_Protected_Present    (Typedef_Node);
 799 
 800                      when Tok_Synchronized =>
 801                         Set_Synchronized_Present (Typedef_Node);
 802 
 803                      when others =>
 804                         null;
 805                   end case;
 806                end if;
 807 
 808                return Typedef_Node;
 809             end;
 810 
 811          when others =>
 812             Error_Msg_BC ("expecting generic type definition here");
 813             Resync_Past_Semicolon;
 814             return Error;
 815 
 816       end case;
 817    end P_Formal_Type_Definition;
 818 
 819    --------------------------------------------
 820    -- 12.5.1  Formal Private Type Definition --
 821    --------------------------------------------
 822 
 823    --  FORMAL_PRIVATE_TYPE_DEFINITION ::=
 824    --    [[abstract] tagged] [limited] private
 825 
 826    --  The caller has checked the initial token is PRIVATE, ABSTRACT,
 827    --   TAGGED or LIMITED
 828 
 829    --  Error recovery: cannot raise Error_Resync
 830 
 831    function P_Formal_Private_Type_Definition return Node_Id is
 832       Def_Node : Node_Id;
 833 
 834    begin
 835       Def_Node := New_Node (N_Formal_Private_Type_Definition, Token_Ptr);
 836 
 837       if Token = Tok_Abstract then
 838          Scan; -- past ABSTRACT
 839 
 840          if Token_Name = Name_Tagged then
 841             Check_95_Keyword (Tok_Tagged, Tok_Private);
 842             Check_95_Keyword (Tok_Tagged, Tok_Limited);
 843          end if;
 844 
 845          if Token /= Tok_Tagged then
 846             Error_Msg_SP ("ABSTRACT must be followed by TAGGED");
 847          else
 848             Set_Abstract_Present (Def_Node, True);
 849          end if;
 850       end if;
 851 
 852       if Token = Tok_Tagged then
 853          Set_Tagged_Present (Def_Node, True);
 854          Scan; -- past TAGGED
 855       end if;
 856 
 857       if Token = Tok_Limited then
 858          Set_Limited_Present (Def_Node, True);
 859          Scan; -- past LIMITED
 860       end if;
 861 
 862       if Token = Tok_Abstract then
 863          if Prev_Token = Tok_Tagged then
 864             Error_Msg_SC -- CODEFIX
 865               ("ABSTRACT must come before TAGGED");
 866          elsif Prev_Token = Tok_Limited then
 867             Error_Msg_SC -- CODEFIX
 868               ("ABSTRACT must come before LIMITED");
 869          end if;
 870 
 871          Resync_Past_Semicolon;
 872 
 873       elsif Token = Tok_Tagged then
 874          Error_Msg_SC -- CODEFIX
 875            ("TAGGED must come before LIMITED");
 876          Resync_Past_Semicolon;
 877       end if;
 878 
 879       Set_Sloc (Def_Node, Token_Ptr);
 880       T_Private;
 881 
 882       if Token = Tok_Tagged then -- CODEFIX
 883          Error_Msg_SC ("TAGGED must come before PRIVATE");
 884          Scan; -- past TAGGED
 885 
 886       elsif Token = Tok_Abstract then -- CODEFIX
 887          Error_Msg_SC ("`ABSTRACT TAGGED` must come before PRIVATE");
 888          Scan; -- past ABSTRACT
 889 
 890          if Token = Tok_Tagged then
 891             Scan; -- past TAGGED
 892          end if;
 893       end if;
 894 
 895       return Def_Node;
 896    end P_Formal_Private_Type_Definition;
 897 
 898    --------------------------------------------
 899    -- 12.5.1  Formal Derived Type Definition --
 900    --------------------------------------------
 901 
 902    --  FORMAL_DERIVED_TYPE_DEFINITION ::=
 903    --    [abstract] [limited | synchronized]
 904    --         new SUBTYPE_MARK [[and INTERFACE_LIST] with private]
 905 
 906    --  The caller has checked the initial token(s) is/are NEW, ABSTRACT NEW,
 907    --  or LIMITED NEW, ABSTRACT LIMITED NEW, SYNCHRONIZED NEW or ABSTRACT
 908    --  SYNCHRONIZED NEW.
 909 
 910    --  Error recovery: cannot raise Error_Resync
 911 
 912    function P_Formal_Derived_Type_Definition return Node_Id is
 913       Def_Node : Node_Id;
 914 
 915    begin
 916       Def_Node := New_Node (N_Formal_Derived_Type_Definition, Token_Ptr);
 917 
 918       if Token = Tok_Abstract then
 919          Set_Abstract_Present (Def_Node);
 920          Scan; -- past ABSTRACT
 921       end if;
 922 
 923       if Token = Tok_Limited then
 924          Set_Limited_Present (Def_Node);
 925          Scan;  --  past LIMITED
 926 
 927          if Ada_Version < Ada_2005 then
 928             Error_Msg_SP
 929               ("LIMITED in derived type is an Ada 2005 extension");
 930             Error_Msg_SP
 931               ("\unit must be compiled with -gnat05 switch");
 932          end if;
 933 
 934       elsif Token = Tok_Synchronized then
 935          Set_Synchronized_Present (Def_Node);
 936          Scan;  --  past SYNCHRONIZED
 937 
 938          if Ada_Version < Ada_2005 then
 939             Error_Msg_SP
 940               ("SYNCHRONIZED in derived type is an Ada 2005 extension");
 941             Error_Msg_SP
 942               ("\unit must be compiled with -gnat05 switch");
 943          end if;
 944       end if;
 945 
 946       if Token = Tok_Abstract then
 947          Scan;  --  past ABSTRACT, diagnosed already in caller.
 948       end if;
 949 
 950       Scan; -- past NEW;
 951       Set_Subtype_Mark (Def_Node, P_Subtype_Mark);
 952       No_Constraint;
 953 
 954       --  Ada 2005 (AI-251): Deal with interfaces
 955 
 956       if Token = Tok_And then
 957          Scan; -- past AND
 958 
 959          if Ada_Version < Ada_2005 then
 960             Error_Msg_SP
 961               ("abstract interface is an Ada 2005 extension");
 962             Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
 963          end if;
 964 
 965          Set_Interface_List (Def_Node, New_List);
 966 
 967          loop
 968             Append (P_Qualified_Simple_Name, Interface_List (Def_Node));
 969             exit when Token /= Tok_And;
 970             Scan; -- past AND
 971          end loop;
 972       end if;
 973 
 974       if Token = Tok_With then
 975          Scan; -- past WITH
 976          Set_Private_Present (Def_Node, True);
 977          T_Private;
 978 
 979       elsif Token = Tok_Tagged then
 980          Scan;
 981 
 982          if Token = Tok_Private then
 983             Error_Msg_SC  -- CODEFIX
 984               ("TAGGED should be WITH");
 985             Set_Private_Present (Def_Node, True);
 986             T_Private;
 987          else
 988             Ignore (Tok_Tagged);
 989          end if;
 990       end if;
 991 
 992       return Def_Node;
 993    end P_Formal_Derived_Type_Definition;
 994 
 995    ---------------------------------------------
 996    -- 12.5.2  Formal Discrete Type Definition --
 997    ---------------------------------------------
 998 
 999    --  FORMAL_DISCRETE_TYPE_DEFINITION ::= (<>)
1000 
1001    --  The caller has checked the initial token is left paren
1002 
1003    --  Error recovery: cannot raise Error_Resync
1004 
1005    function P_Formal_Discrete_Type_Definition return Node_Id is
1006       Def_Node : Node_Id;
1007 
1008    begin
1009       Def_Node := New_Node (N_Formal_Discrete_Type_Definition, Token_Ptr);
1010       Scan; -- past left paren
1011       T_Box;
1012       T_Right_Paren;
1013       return Def_Node;
1014    end P_Formal_Discrete_Type_Definition;
1015 
1016    ---------------------------------------------------
1017    -- 12.5.2  Formal Signed Integer Type Definition --
1018    ---------------------------------------------------
1019 
1020    --  FORMAL_SIGNED_INTEGER_TYPE_DEFINITION ::= range <>
1021 
1022    --  The caller has checked the initial token is RANGE
1023 
1024    --  Error recovery: cannot raise Error_Resync
1025 
1026    function P_Formal_Signed_Integer_Type_Definition return Node_Id is
1027       Def_Node : Node_Id;
1028 
1029    begin
1030       Def_Node :=
1031         New_Node (N_Formal_Signed_Integer_Type_Definition, Token_Ptr);
1032       Scan; -- past RANGE
1033       T_Box;
1034       return Def_Node;
1035    end P_Formal_Signed_Integer_Type_Definition;
1036 
1037    --------------------------------------------
1038    -- 12.5.2  Formal Modular Type Definition --
1039    --------------------------------------------
1040 
1041    --  FORMAL_MODULAR_TYPE_DEFINITION ::= mod <>
1042 
1043    --  The caller has checked the initial token is MOD
1044 
1045    --  Error recovery: cannot raise Error_Resync
1046 
1047    function P_Formal_Modular_Type_Definition return Node_Id is
1048       Def_Node : Node_Id;
1049 
1050    begin
1051       Def_Node :=
1052         New_Node (N_Formal_Modular_Type_Definition, Token_Ptr);
1053       Scan; -- past MOD
1054       T_Box;
1055       return Def_Node;
1056    end P_Formal_Modular_Type_Definition;
1057 
1058    ----------------------------------------------
1059    -- 12.5.2  Formal Floating Point Definition --
1060    ----------------------------------------------
1061 
1062    --  FORMAL_FLOATING_POINT_DEFINITION ::= digits <>
1063 
1064    --  The caller has checked the initial token is DIGITS
1065 
1066    --  Error recovery: cannot raise Error_Resync
1067 
1068    function P_Formal_Floating_Point_Definition return Node_Id is
1069       Def_Node : Node_Id;
1070 
1071    begin
1072       Def_Node :=
1073         New_Node (N_Formal_Floating_Point_Definition, Token_Ptr);
1074       Scan; -- past DIGITS
1075       T_Box;
1076       return Def_Node;
1077    end P_Formal_Floating_Point_Definition;
1078 
1079    -------------------------------------------
1080    -- 12.5.2  Formal Fixed Point Definition --
1081    -------------------------------------------
1082 
1083    --  This routine parses either a formal ordinary fixed point definition
1084    --  or a formal decimal fixed point definition:
1085 
1086    --  FORMAL_ORDINARY_FIXED_POINT_DEFINITION ::= delta <>
1087 
1088    --  FORMAL_DECIMAL_FIXED_POINT_DEFINITION ::= delta <> digits <>
1089 
1090    --  The caller has checked the initial token is DELTA
1091 
1092    --  Error recovery: cannot raise Error_Resync
1093 
1094    function P_Formal_Fixed_Point_Definition return Node_Id is
1095       Def_Node   : Node_Id;
1096       Delta_Sloc : Source_Ptr;
1097 
1098    begin
1099       Delta_Sloc := Token_Ptr;
1100       Scan; -- past DELTA
1101       T_Box;
1102 
1103       if Token = Tok_Digits then
1104          Def_Node :=
1105            New_Node (N_Formal_Decimal_Fixed_Point_Definition, Delta_Sloc);
1106          Scan; -- past DIGITS
1107          T_Box;
1108       else
1109          Def_Node :=
1110            New_Node (N_Formal_Ordinary_Fixed_Point_Definition, Delta_Sloc);
1111       end if;
1112 
1113       return Def_Node;
1114    end P_Formal_Fixed_Point_Definition;
1115 
1116    ----------------------------------------------------
1117    -- 12.5.2  Formal Ordinary Fixed Point Definition --
1118    ----------------------------------------------------
1119 
1120    --  Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
1121 
1122    ---------------------------------------------------
1123    -- 12.5.2  Formal Decimal Fixed Point Definition --
1124    ---------------------------------------------------
1125 
1126    --  Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
1127 
1128    ------------------------------------------
1129    -- 12.5.3  Formal Array Type Definition --
1130    ------------------------------------------
1131 
1132    --  Parsed by P_Formal_Type_Definition (12.5)
1133 
1134    -------------------------------------------
1135    -- 12.5.4  Formal Access Type Definition --
1136    -------------------------------------------
1137 
1138    --  Parsed by P_Formal_Type_Definition (12.5)
1139 
1140    -----------------------------------------
1141    -- 12.6  Formal Subprogram Declaration --
1142    -----------------------------------------
1143 
1144    --  FORMAL_SUBPROGRAM_DECLARATION ::=
1145    --    FORMAL_CONCRETE_SUBPROGRAM_DECLARATION
1146    --  | FORMAL_ABSTRACT_SUBPROGRAM_DECLARATION
1147 
1148    --  FORMAL_CONCRETE_SUBPROGRAM_DECLARATION ::=
1149    --    with SUBPROGRAM_SPECIFICATION [is SUBPROGRAM_DEFAULT]
1150    --      [ASPECT_SPECIFICATIONS];
1151 
1152    --  FORMAL_ABSTRACT_SUBPROGRAM_DECLARATION ::=
1153    --    with SUBPROGRAM_SPECIFICATION is abstract [SUBPROGRAM_DEFAULT]
1154    --      [ASPECT_SPECIFICATIONS];
1155 
1156    --  SUBPROGRAM_DEFAULT ::= DEFAULT_NAME | <>
1157 
1158    --  DEFAULT_NAME ::= NAME | null
1159 
1160    --  The caller has checked that the initial tokens are WITH FUNCTION or
1161    --  WITH PROCEDURE, and the initial WITH has been scanned out.
1162 
1163    --  A null default is an Ada 2005 feature
1164 
1165    --  Error recovery: cannot raise Error_Resync
1166 
1167    function P_Formal_Subprogram_Declaration return Node_Id is
1168       Prev_Sloc : constant Source_Ptr := Prev_Token_Ptr;
1169       Spec_Node : constant Node_Id    := P_Subprogram_Specification;
1170       Def_Node  : Node_Id;
1171 
1172    begin
1173       if Token = Tok_Is then
1174          T_Is; -- past IS, skip extra IS or ";"
1175 
1176          if Token = Tok_Abstract then
1177             Def_Node :=
1178               New_Node (N_Formal_Abstract_Subprogram_Declaration, Prev_Sloc);
1179             Scan; -- past ABSTRACT
1180 
1181             if Ada_Version < Ada_2005 then
1182                Error_Msg_SP
1183                  ("formal abstract subprograms are an Ada 2005 extension");
1184                Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
1185             end if;
1186 
1187          else
1188             Def_Node :=
1189               New_Node (N_Formal_Concrete_Subprogram_Declaration, Prev_Sloc);
1190          end if;
1191 
1192          Set_Specification (Def_Node, Spec_Node);
1193 
1194          if Token = Tok_Semicolon then
1195             null;
1196 
1197          elsif Aspect_Specifications_Present then
1198             null;
1199 
1200          elsif Token = Tok_Box then
1201             Set_Box_Present (Def_Node, True);
1202             Scan; -- past <>
1203 
1204          elsif Token = Tok_Null then
1205             if Ada_Version < Ada_2005 then
1206                Error_Msg_SP
1207                  ("null default subprograms are an Ada 2005 extension");
1208                Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
1209             end if;
1210 
1211             if Nkind (Spec_Node) = N_Procedure_Specification then
1212                Set_Null_Present (Spec_Node);
1213             else
1214                Error_Msg_SP ("only procedures can be null");
1215             end if;
1216 
1217             Scan;  --  past NULL
1218 
1219          else
1220             Set_Default_Name (Def_Node, P_Name);
1221          end if;
1222 
1223       else
1224          Def_Node :=
1225            New_Node (N_Formal_Concrete_Subprogram_Declaration, Prev_Sloc);
1226          Set_Specification (Def_Node, Spec_Node);
1227       end if;
1228 
1229       P_Aspect_Specifications (Def_Node);
1230       return Def_Node;
1231    end P_Formal_Subprogram_Declaration;
1232 
1233    ------------------------------
1234    -- 12.6  Subprogram Default --
1235    ------------------------------
1236 
1237    --  Parsed by P_Formal_Procedure_Declaration (12.6)
1238 
1239    ------------------------
1240    -- 12.6  Default Name --
1241    ------------------------
1242 
1243    --  Parsed by P_Formal_Procedure_Declaration (12.6)
1244 
1245    --------------------------------------
1246    -- 12.7  Formal Package Declaration --
1247    --------------------------------------
1248 
1249    --  FORMAL_PACKAGE_DECLARATION ::=
1250    --    with package DEFINING_IDENTIFIER
1251    --      is new generic_package_NAME FORMAL_PACKAGE_ACTUAL_PART
1252    --        [ASPECT_SPECIFICATIONS];
1253 
1254    --  FORMAL_PACKAGE_ACTUAL_PART ::=
1255    --    ([OTHERS =>] <>) |
1256    --    [GENERIC_ACTUAL_PART]
1257    --    (FORMAL_PACKAGE_ASSOCIATION {, FORMAL_PACKAGE_ASSOCIATION}
1258    --      [, OTHERS => <>)
1259 
1260    --  FORMAL_PACKAGE_ASSOCIATION ::=
1261    --    GENERIC_ASSOCIATION
1262    --    | GENERIC_FORMAL_PARAMETER_SELECTOR_NAME => <>
1263 
1264    --  The caller has checked that the initial tokens are WITH PACKAGE,
1265    --  and the initial WITH has been scanned out (so Token = Tok_Package).
1266 
1267    --  Error recovery: cannot raise Error_Resync
1268 
1269    function P_Formal_Package_Declaration return Node_Id is
1270       Def_Node : Node_Id;
1271       Scan_State : Saved_Scan_State;
1272 
1273    begin
1274       Def_Node := New_Node (N_Formal_Package_Declaration, Prev_Token_Ptr);
1275       Scan; -- past PACKAGE
1276       Set_Defining_Identifier (Def_Node, P_Defining_Identifier (C_Is));
1277       T_Is;
1278       T_New;
1279       Set_Name (Def_Node, P_Qualified_Simple_Name);
1280 
1281       if Token = Tok_Left_Paren then
1282          Save_Scan_State (Scan_State); -- at the left paren
1283          Scan; -- past the left paren
1284 
1285          if Token = Tok_Box then
1286             Set_Box_Present (Def_Node, True);
1287             Scan; -- past box
1288             T_Right_Paren;
1289 
1290          else
1291             Restore_Scan_State (Scan_State); -- to the left paren
1292             Set_Generic_Associations (Def_Node, P_Generic_Actual_Part_Opt);
1293          end if;
1294       end if;
1295 
1296       P_Aspect_Specifications (Def_Node);
1297       return Def_Node;
1298    end P_Formal_Package_Declaration;
1299 
1300    --------------------------------------
1301    -- 12.7  Formal Package Actual Part --
1302    --------------------------------------
1303 
1304    --  Parsed by P_Formal_Package_Declaration (12.7)
1305 
1306 end Ch12;