home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / sem_prag.adb < prev    next >
Text File  |  1996-09-28  |  125KB  |  3,682 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ P R A G                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.207 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  This unit contains the semantic processing for all pragmas, both language
  26. --  and implementation defined. For most pragmas, the parser only does the
  27. --  most basic job of checking the syntax, so Sem_Prag also contains the code
  28. --  to complete the syntax checks. Certain pragmas are handled partially or
  29. --  completely by the parser (see Par.Prag for further details).
  30.  
  31. with Atree;    use Atree;
  32. with Debug;    use Debug;
  33. with Einfo;    use Einfo;
  34. with Elists;   use Elists;
  35. with Errout;   use Errout;
  36. with Exp_Util; use Exp_Util;
  37. with Features; use Features;
  38. with Lib;      use Lib;
  39. with Lib.Writ; use Lib.Writ;
  40. with Namet;    use Namet;
  41. with Nlists;   use Nlists;
  42. with Nmake;    use Nmake;
  43. with Opt;      use Opt;
  44. with Output;   use Output;
  45. with Rtsfind;  use Rtsfind;
  46. with Sem;      use Sem;
  47. with Sem_Ch8;  use Sem_Ch8;
  48. with Sem_Disp; use Sem_Disp;
  49. with Sem_Dist; use Sem_Dist;
  50. with Sem_Eval; use Sem_Eval;
  51. with Sem_Intr; use Sem_Intr;
  52. with Sem_Res;  use Sem_Res;
  53. with Sem_Util; use Sem_Util;
  54. with Stand;    use Stand;
  55. with Sinfo;    use Sinfo;
  56. with Snames;   use Snames;
  57. with Stringt;  use Stringt;
  58. with Tbuild;   use Tbuild;
  59. with Ttypes;
  60. with Uintp;    use Uintp;
  61.  
  62. package body Sem_Prag is
  63.  
  64.    --------------------------------------------------------
  65.    -- Description of GNAT Implementation-Defined Pragmas --
  66.    --------------------------------------------------------
  67.  
  68.    --  pragma Abort_Defer;
  69.    --
  70.    --    This pragma is implementation (GNAT) defined. It must appear at
  71.    --    the start of the statement sequence of a handled sequence of
  72.    --    statements (right after the begin). It has the effect of deferring
  73.    --    aborts for the sequence of statements (but not for the declarations
  74.    --    or handlers, if any, associated with this statement sequence).
  75.  
  76.    --  pragma Ada_83;
  77.    --
  78.    --    This pragma is an implementation (GNAT) defined configuration
  79.    --    pragma whose effect is to establish Ada 83 mode for the unit to
  80.    --    which it applies, regardless of the mode set by the command line
  81.    --    switches.
  82.  
  83.    --  pragma Ada_95;
  84.    --
  85.    --    This pragma is an implementation (GNAT) defined configuration
  86.    --    pragma whose effect is to establish Ada 95 mode for the unit to
  87.    --    which it applies, regardless of the mode set by the command line
  88.    --    switches. Note that this mode is set automatically for Ada and System
  89.    --    and their children, so it need not be given in these contexts.
  90.  
  91.    --  pragma Annotate (IDENTIFIER {, ARG);
  92.    --  ARG ::= NAME | EXPRESSION
  93.  
  94.    --    This pragma is an implementation (GNAT) defined pragma used to
  95.    --    annotate programs. The first argument is simply an identifier
  96.    --    that identifies the type of annotation. GNAT verifies that this
  97.    --    is an identifier, but does not otherwise analyze it. The arguments
  98.    --    following this identifier are analyzed as follows:
  99.    --
  100.    --      String literals are assumed to be of type Standard.String
  101.    --      Names of entities are simply analyzed as entity names
  102.    --      All other expressions are analyzed as expressions, and must
  103.    --       be unambiguous
  104.    --
  105.    --   The analyzed pragma is retained in the tree, but not otherwise
  106.    --   processed by any part of the GNAT compiler. This pragma is intended
  107.    --   for use by external tools.
  108.  
  109.    --  pragma Assert (Boolean_EXPRESSION [,static_string_EXPRESSION]);
  110.    --
  111.    --    This pragma is implementation (GNAT) defined. Its effect depends
  112.    --    on whether the corresponding command line switch is set to activate
  113.    --    assertions. If assertions are inactive, the pragma has no effect.
  114.    --    If asserts are enabled, then the semantics of the pragma is exactly
  115.    --    equivalent to:
  116.    --
  117.    --      if not Boolean_EXPRESSION then
  118.    --         System.Assertions.Raise_Assert_Failure (string_EXPRESSION);
  119.    --      end if;
  120.    --
  121.    --    The effect of the call is to raise System.Assertions.Assert_Failure.
  122.    --    The string argument, if given, is the message associated with the
  123.    --    exception occurrence. If no second argument is given, the default
  124.    --    message is "file:nnn", where file is the name of the source file
  125.    --    containing the assert, and nnn is the line number of the assert.
  126.    --
  127.    --    Note: a pragma is not a statement, so if a statement sequence
  128.    --    contains nothing but a pragma assert, then a null statement is
  129.    --    required in addition, as in:
  130.    --
  131.    --       ...
  132.    --       if J > 3 then
  133.    --          pragma (Assert (K > 3, "Bad value for K"));
  134.    --          null;
  135.    --       end if;
  136.    --
  137.    --    Note: if the boolean expression has side effects, then these side
  138.    --    effects will turn on and off with the setting of the assertions mode,
  139.    --    resulting in assertions that have an effect on the program. This
  140.    --    should generally be avoided.
  141.    --
  142.    --    Note: the maximum length of the string given as the second argument
  143.    --    is 200 characters (the maximum lengh of an exception occurrence
  144.    --    message).
  145.  
  146.    --  pragma CPP_Class ([Entity =>] LOCAL_NAME)
  147.  
  148.    --    The argument denotes an entity in the current declarative region
  149.    --    that is declared as a tagged or untagged record type. It indicates
  150.    --    that the type corresponds to an externally declared C++ class type,
  151.    --    and is to be layed out the same way that C++ would lay out the type.
  152.    --    If (and only if) the type is tagged, at least one component in the
  153.    --    record must be of type Interfaces.CPP.Vtable_Ptr, corresponding to
  154.    --    the C++ Vtable (or Vtables in the case of multiple inheritance)
  155.    --    used for dispatching.
  156.    --
  157.    --    Types for which CPP_Class is defined do not have assignment or
  158.    --    equality operators defined (such operations can be imported or
  159.    --    declared as subprograms as required). Initialization is allowed
  160.    --    only by constructor functions (see pragma CPP_Constructor).
  161.  
  162.    --  pragma CPP_Constructor ([Entity =>] LOCAL_NAME);
  163.  
  164.    --    This pragma identifies an imported function (imported in the usual
  165.    --    way with pragma Import) as corresponding to a C++ constructor. The
  166.    --    identified function must be previously mentioned in a pragma Import
  167.    --    with convention C++, and must be of one of the following forms:
  168.    --
  169.    --      function Fname return T'Class;
  170.    --      function Fname (<parameters>) return T'Class;
  171.    --
  172.    --    where T is a tagged type to which the pragma CPP_Class applies.
  173.    --
  174.    --    The first form is the default constructor, used when an object
  175.    --    of type T is created on the Ada side with no explicit constructor.
  176.    --    Other constructors (including the copy constructor, which is simply
  177.    --    a special case of the second form in which the one and only argument
  178.    --    is of type T), can only appear in two contexts:
  179.    --
  180.    --      On the right side of an initialization of an object of type T
  181.    --      In an extension aggregate for an object of a type derived from T
  182.    --
  183.    --    Note that although the constructor is described as a function that
  184.    --    returns a value on the Ada side, it is typically a procedure with
  185.    --    an extra implicit argument (the object being initialized) at the
  186.    --    implementation level. GNAT takes care of issuing the appropriate
  187.    --    call, whatever it is, to get the object properly initialized.
  188.    --
  189.    --    Note: in the case of derived objects, there are two possible forms
  190.    --    for declaring and creating an object:
  191.    --
  192.    --      New_Object : Derived_T;
  193.    --      New_Object : Derived_T := (constructor-function-call with ...);
  194.    --
  195.    --    In the first case the default constructor is called, and extension
  196.    --    fields if any are initialized according to the default initialization
  197.    --    expressions in the Ada declaration. In the second case, the given
  198.    --    constructor is called, and the extension aggregate indicates the
  199.    --    explicit values of the extension fields.
  200.    --
  201.    --    Note: if no constructors are imported then it is impossible to
  202.    --    create any objects on the Ada side. If no default constructor is
  203.    --    imported, then only the initialization forms using an explicit
  204.    --    call to a constructor are permitted.
  205.  
  206.    --  pragma CPP_Destructor ([Entity =>] LOCAL_NAME);
  207.    --
  208.    --    This pragma identifies an imported procedure (imported in the usual
  209.    --    way with pragma Import) as corresponding to a C++ destructor. The
  210.    --    identified procedure must be previously mentioned in a pragma Import
  211.    --    with convention C++, and must be of the following forms:
  212.    --
  213.    --      procedure Fname (obj : in out T'Class);
  214.    --
  215.    --    where T is a tagged type to which the pragma CPP_Class applies.
  216.    --    This procedure will be called automaticlly on scope exit if any
  217.    --    objects of T are created on the Ada side.
  218.  
  219.    --  pragma CPP_Virtual
  220.    --      [Entity =>]       LOCAL_NAME
  221.    --    [ [Vtable_Ptr =>]   Component_NAME,
  222.    --      [Position =>]     static_integer_EXPRESSION]);
  223.    --
  224.    --    This pragma serves the same function as pragma Import for the case
  225.    --    of a virtual function that is imported from C++. Entity must refer
  226.    --    to a primitive subprogram of a tagged type to which pragma CPP_Class
  227.    --    applies. Vtable_Ptr specifies the Vtable_Ptr component which contains
  228.    --    the entry for this virtual function, and Position is the sequential
  229.    --    number counting virtual functions for this Vtable starting at 1.
  230.    --
  231.    --    The Vtable_Ptr and Position arguments may be omitted if there is
  232.    --    one Vtable_Ptr present (single inheritance case), and all virtual
  233.    --    functions are imported, since then the compiler can deduce both
  234.    --    these values.
  235.    --
  236.    --    Note that no External_Name or Link_Name arguments are required for
  237.    --    a virtual function, since it is always accessed indirectly via the
  238.    --    appropriate Vtable entry.
  239.  
  240.    --  pragma CPP_Vtable (
  241.    --    [Entity =>]       LOCAL_NAME
  242.    --    [Vtable_Ptr =>]   Component_NAME,
  243.    --    [Entry_Count =>]  static_integer_EXPRESSION);
  244.    --
  245.    --    One CPP_Vtable pragma can be present for each component of type
  246.    --    CPP.Interfaces.Vtable_Ptr in a record to which pragma CPP_Class
  247.    --    applies. Entity is the tagged type, Vtable_Ptr is the record field
  248.    --    of type Vtable_Ptr, and Entry_Count is the number of virtual
  249.    --    functions on the C++ side (not all of which need to be imported
  250.    --    on the Ada side).
  251.    --
  252.    --    It is permissible to omit the CPP_Vtable pragma if there is only
  253.    --    one Vtable_Ptr component in the record, and all virtual functions
  254.    --    are imported on the Ada side (the default value for the entry count
  255.    --    in this case is simply the total number of virtual functions).
  256.  
  257.    --  pragma Debug (PROCEDURE_CALL_STATEMENT);
  258.    --
  259.    --    This pragma is implementation (GNAT) defined. Its effect depends
  260.    --    on the setting of the Assertions_Enabled flag in Opt. If this
  261.    --    flag is off (False), then the pragma has no effect. If the flag
  262.    --    is on (True), then the semantics of the pragma is equivalent to
  263.    --    the procedure call.
  264.  
  265.    --  pragma Error_Monitoring (ON | OFF, STRING_LITERAL)
  266.    --
  267.    --    This pragma is implementation (GNAT) defined. It is used to bracket
  268.    --    a section of code, using one pragma with argument ON to start the
  269.    --    section, and another with argument OFF to end the section. Within
  270.    --    the monitored section of code, any error message issued will be
  271.    --    considered a warning from the point of view of the return code
  272.    --    issued by the compilation. Furthermore at least one such error
  273.    --    must occur within each monitored region. If no error occurs, a
  274.    --    fatal (non-warning) message is issued. The use of the pragma
  275.    --    Error_Monitoring causes code generation to be turned off (since
  276.    --    there really are errors in the program).
  277.    --
  278.    --    If a second argument is given, then there is an additional check
  279.    --    that the first error issued in the monitored region exactly matches
  280.    --    the characters given in the string literal. The second argument is
  281.    --    only relevant for the ON case, it is ignored for the OFF case.
  282.    --
  283.    --    This pragma is provided to allow easy automation of error message
  284.    --    generation, e.g. in ACVC B tests, and is primarily intended for
  285.    --    compiler testing purposes.
  286.  
  287.    --  pragma Interface_Name (
  288.    --      [Entity =>]         LOCAL_NAME
  289.    --    [,[External_Name =>]  static_string_EXPRESSION]]
  290.    --    [,[Link_Name =>]      static_string_EXPRESSION]] );
  291.    --
  292.    --    This pragma is implementation (GNAT) defined. It is an alternative
  293.    --    way of specifying the interface name for an interfaced subprogram,
  294.    --    and is provided for compatibility with Ada 83 compilers that use
  295.    --    the pragma for this purpose. At least one of the arguments external
  296.    --    name or link name must be present.
  297.  
  298.    --  pragma Machine_Attribute (
  299.    --      [Attribute_Name =>] static_string_EXPRESSION
  300.    --     ,[Entity =>]         LOCAL_NAME );
  301.    --
  302.    --    This pragma is implementation (GNAT) defined. Machine dependent
  303.    --    attributes can be specified for types and/or declarations. Currently
  304.    --    only subprogram entities are supported. This pragma is semantically
  305.    --    equivalent to __attribute__(( <Attribute_Name> )) in Gnu C, where
  306.    --    <Attribute_Name> is recognized by the Gnu C macros:
  307.    --
  308.    --       VALID_MACHINE_TYPE_ATTRIBUTE
  309.    --       VALID_MACHINE_DECL_ATTRIBUTE,
  310.    --
  311.    --    which are defined in the configuration header file tm.h.  Further
  312.    --    documentation can be found in the gcc distribution document: tm.texi.
  313.  
  314.    --  pragma Source_Reference (INTEGER_LITERAL [, STRING_LITERAL]);
  315.    --
  316.    --    This pragma is implementation (GNAT) defined. It typically appears
  317.    --    as the first line of a source file. The integer value is the logical
  318.    --    line number of the line following the pragma line (for use in error
  319.    --    messages and debugging information). The second argument is a static
  320.    --    string constant that specifies the file name to be used in error
  321.    --    messages and debugging information. This is most notably used for
  322.    --    the output of gnatchop with the -r switch, to make sure that the
  323.    --    original unchopped source file is the one referred to.
  324.    --
  325.    --    Note: the second argument must be a string literal, it cannot be
  326.    --    a static string expression other than a string literal. This is
  327.    --    because its value is needed for error messages issued by all phases
  328.    --    of the compiler.
  329.  
  330.    --  pragma Unimplemented_Unit;
  331.    --
  332.    --    This pragma is implementation (GNAT) defined. If it occurs in a
  333.    --    unit that is processed by the compiler, the compilation is aborted
  334.    --    with the message xxx not implemented, where xxx is the name of
  335.    --    the current compilation unit followed by a compiler abort. This
  336.    --    pragma is intended to allow the compiler to handle unimplemented
  337.    --    library units in a clean manner.
  338.    --
  339.    --    The abort only hapens if code is being generated. This allows the
  340.    --    use of specs of unimplemented packages in syntax or semantic
  341.    --    checking mode.
  342.  
  343.    --  pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
  344.    --
  345.    --    This pragma is implementation (GNAT) defined. It undoes the effect
  346.    --    of a previous pragma Unsuppress. If there is no corresponding
  347.    --    pragma Suppress in effect, then it has no effect. The range of
  348.    --    the effect is the same as for pragma Suppress. The meaning of the
  349.    --    arguments is identical to that used in pragma Suppress.
  350.    --
  351.    --    One important application is to ensure that checks are on in cases
  352.    --    where code depends on the checks for its correct functioning, so
  353.    --    that the code will compile correctly even if the compiler switches
  354.    --    are set to suppress checks.
  355.  
  356.    -----------------------
  357.    -- Local Subprograms --
  358.    -----------------------
  359.  
  360.    function Is_Generic_Subprogram (Id : Entity_Id) return Boolean;
  361.    --  Return True if Id is a generic procedure or a function
  362.  
  363.    --------------------
  364.    -- Analyze_Pragma --
  365.    --------------------
  366.  
  367.    procedure Analyze_Pragma (N : Node_Id) is
  368.       Loc     : constant Source_Ptr := Sloc (N);
  369.       Prag_Id : constant Pragma_Id  := Get_Pragma_Id (Chars (N));
  370.  
  371.       Pragma_Error : exception;
  372.       --  This is exception is raised if any error is detected in a pragma
  373.  
  374.       Arg_Count : Int;
  375.       --  Number of pragma argument associations
  376.  
  377.       function Arg1 return Node_Id;
  378.       function Arg2 return Node_Id;
  379.       function Arg3 return Node_Id;
  380.       function Arg4 return Node_Id;
  381.       --  Obtain specified Pragma_Argument_Association. It is allowable to
  382.       --  call the routine for the argument one past the last present argument,
  383.       --  but that is the only case in which a non-present argument can be
  384.       --  referenced.
  385.  
  386.       procedure Check_Ada_83_Warning;
  387.       --  Issues a warning message for the current pragma if operating in Ada
  388.       --  83 mode (used for language pragmas that are not a standard part of
  389.       --  Ada 83). This procedure does not raise Error_Pragma. Also notes use
  390.       --  of 95 pragma.
  391.  
  392.       procedure Check_Arg_Count (Required : Int);
  393.       --  Check argument count for pragma is equal to given parameter.
  394.       --  If not, then issue an error message and raise Error_Resync.
  395.  
  396.       procedure Check_Arg_Is_Convention (Arg : Node_Id);
  397.       --  Check the expression of the specified argument to make sure that it
  398.       --  is a valid convention name. If not give error and raise Pragma_Error.
  399.       --  This procedure also checks for the possible allowed presence of the
  400.       --  identifier Convention for this argument.
  401.  
  402.       procedure Check_Arg_Is_Identifier (Arg : Node_Id);
  403.       --  Check the expression of the specified argument to make sure that
  404.       --  it is an identifier. If not give error and raise Pragma_Error.
  405.  
  406.       procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id);
  407.       --  Check the expression of the specified argument to make sure that it
  408.       --  is an integer literal. If not give error and raise Pragma_Error.
  409.  
  410.       procedure Check_Arg_Is_Local_Name (Arg : Node_Id);
  411.       --  Check the expression of the specified argument to make sure that
  412.       --  it has the proper syntactic form for a local name and meets the
  413.       --  semantic requirements for a local name. The local name is analyzed
  414.       --  as part of the processing for this call.
  415.  
  416.       procedure Check_Arg_Is_Locking_Policy (Arg : Node_Id);
  417.       --  Check the expression of the specified argument to make sure that
  418.       --  it is a valid locking policy name. If not give error and raise
  419.       --  Pragma_Error.
  420.  
  421.       procedure Check_Arg_Is_One_Of (Arg : Node_Id; N1, N2 : Name_Id);
  422.       procedure Check_Arg_Is_One_Of (Arg : Node_Id; N1, N2, N3 : Name_Id);
  423.       --  Check the expression of the specified argument to make sure that it
  424.       --  is an identifier whose name matches either N1 or N2 (or N3). If not,
  425.       --  then issue an error message and raise Error_Resync.
  426.  
  427.       procedure Check_Arg_Is_Queuing_Policy (Arg : Node_Id);
  428.       --  Check the expression of the specified argument to make sure that
  429.       --  it is a valid queuing policy name. If not give error and raise
  430.       --  Pragma_Error.
  431.  
  432.       procedure Check_Arg_Is_Task_Dispatching_Policy (Arg : Node_Id);
  433.       --  Check the expression of the specified argument to make sure that
  434.       --  it is a valid task dispatching policy name. If not give error and
  435.       --  raise Pragma_Error.
  436.  
  437.       procedure Check_At_Least_One_Argument;
  438.       --  Check there is at least one argument.
  439.  
  440.       procedure Check_Is_In_Decl_Part_Or_Package_Spec;
  441.       --  Check that pragma appears in a declarative part, or in a package
  442.       --  specification, i.e. that it does not occur in a statement sequence
  443.       --  in a body.
  444.  
  445.       procedure Check_No_Identifier (Arg : Node_Id);
  446.       --  Checks that the given argument does not have an identifier. If
  447.       --  an identifier is present, then an error message is issued, and
  448.       --  Pragma_Error is raised.
  449.  
  450.       procedure Check_No_Identifiers;
  451.       --  Checks that none of the arguments to the pragma has an identifier.
  452.       --  If any argument has an identifier, then an error message is issued,
  453.       --  and Pragma_Error is raised.
  454.  
  455.       procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id);
  456.       --  Checks if the given argument has an identifier, and if so, requires
  457.       --  it to match the given identifier name. If there is a non-matching
  458.       --  identifier, then an error message is given and Error_Pragmas raised.
  459.  
  460.       procedure Check_Static_String_Expr (Expr : Node_Id);
  461.       --  Checks that the given argument expression is a static string
  462.       --  expression. Note that the argument is the expression, not the
  463.       --  pragma argument association.
  464.  
  465.       procedure Check_Valid_Configuration_Pragma;
  466.       --  Legality checks for placement of a configuration pragma
  467.  
  468.       procedure Check_Valid_Library_Unit_Pragma;
  469.       --  Legality checks for library unit pragmas
  470.  
  471.       procedure Error_Pragma (Msg : String);
  472.       --  Outputs error message for current pragma. The message contains an %
  473.       --  that will be replaced with the pragma name, and the flag is placed
  474.       --  on the pragma itself. Pragma_Error is then raised.
  475.  
  476.       procedure Error_Pragma_Arg (Msg : String; Arg : Node_Id);
  477.       --  Outputs error message for current pragma. The message contains an %
  478.       --  that will be replaced with the pragma name, and the flag is placed
  479.       --  on the expression of the pragma argument specified by Arg. After
  480.       --  placing the message, Pragma_Error is raised.
  481.  
  482.       function Find_Lib_Unit_Name return Entity_Id;
  483.       --  Find the defining entity of the spec library unit name.
  484.  
  485.       procedure Find_Program_Unit_Name (Id : Node_Id);
  486.       --  If the pragma is a compilation unit pragma, the id must denote the
  487.       --  compilation unit in the same compilation, and the pragma must appear
  488.       --  in the list of preceding or trailing pragmas. If it is a program
  489.       --  unit pragma that is not a compilation unit pragma, then the
  490.       --  identifier must be visible.
  491.  
  492.       function Is_Before_First_Decl
  493.         (Pragma_Node : Node_Id;
  494.          Decls       : List_Id)
  495.          return        Boolean;
  496.       --  Return True if Pragma_Node is before the first declarative item in
  497.       --  Decls where Decls is the list of declarative items.
  498.  
  499.       function Is_Configuration_Pragma return Boolean;
  500.       --  Deterermines if the placement of the current pragma is appropriate
  501.       --  for a configuration pragma (precedes the current compilation unit)
  502.  
  503.       function Is_Inside_Generic_Instantiation
  504.         (Pragma_Node : Node_Id)
  505.          return        Boolean;
  506.       --  Return True if Pragma_Node is inside a generic instantiation.
  507.  
  508.       procedure Pragma_Misplaced;
  509.       --  Issue fatal error message for misplaced pragma
  510.  
  511.       procedure Pragma_Not_Implemented;
  512.       --  Issue warning message for unimplemented pragma
  513.  
  514.       procedure Process_Convention (C : out Convention_Id; E : out Entity_Id);
  515.       --  Common procesing for Convention, Interface, Import and Export.
  516.       --  Checks first two arguments of pragma, and sets the appropriate
  517.       --  convention value in the specified entity or entities. On return
  518.       --  C is the convention, E is the referenced entity.
  519.  
  520.       procedure Process_Interface_Name
  521.         (Subprogram_Def : Entity_Id;
  522.          Ext_Arg        : Node_Id;
  523.          Link_Arg       : Node_Id);
  524.       --  Given the last two arguments of pragma Import, pragma Export, or
  525.       --  pragma Interface_Name, performs validity checks and sets the
  526.       --  Interface_Name field of the given subprogram entity to the
  527.       --  appropriate external or link name, depending on the arguments
  528.       --  given. Ext_Arg is always present, but Link_Arg may be missing.
  529.       --  Note that Ext_Arg may represent the Link_Name if Link_Arg is
  530.       --  missing, and appropriate named notation is used for Ext_Arg.
  531.  
  532.       procedure Process_Suppress_Unsuppress (Sense : Boolean);
  533.       --  Common processing for Suppress and Unsuppress
  534.  
  535.       ----------
  536.       -- Arg1 --
  537.       ----------
  538.  
  539.       function Arg1 return Node_Id is
  540.       begin
  541.          return First (Pragma_Argument_Associations (N));
  542.       end Arg1;
  543.  
  544.       ----------
  545.       -- Arg2 --
  546.       ----------
  547.  
  548.       function Arg2 return Node_Id is
  549.       begin
  550.          return Next (Arg1);
  551.       end Arg2;
  552.  
  553.       ----------
  554.       -- Arg3 --
  555.       ----------
  556.  
  557.       function Arg3 return Node_Id is
  558.       begin
  559.          return Next (Arg2);
  560.       end Arg3;
  561.  
  562.       ----------
  563.       -- Arg4 --
  564.       ----------
  565.  
  566.       function Arg4 return Node_Id is
  567.       begin
  568.          return Next (Arg3);
  569.       end Arg4;
  570.  
  571.       --------------------------
  572.       -- Check_Ada_83_Warning --
  573.       --------------------------
  574.  
  575.       procedure Check_Ada_83_Warning is
  576.       begin
  577.          Note_Feature (New_Pragmas, Loc);
  578.  
  579.          if Ada_83 and then Comes_From_Source (N) then
  580.             Error_Msg_N ("(Ada 83) pragma& is non-standard?", N);
  581.          end if;
  582.       end Check_Ada_83_Warning;
  583.  
  584.       ---------------------
  585.       -- Check_Arg_Count --
  586.       ---------------------
  587.  
  588.       procedure Check_Arg_Count (Required : Int) is
  589.       begin
  590.          if Arg_Count /= Required then
  591.             Error_Pragma ("wrong number of arguments for pragma%");
  592.          end if;
  593.       end Check_Arg_Count;
  594.  
  595.       -----------------------------
  596.       -- Check_Arg_Is_Convention --
  597.       -----------------------------
  598.  
  599.       procedure Check_Arg_Is_Convention (Arg : Node_Id) is
  600.       begin
  601.          Check_Arg_Is_Identifier (Arg);
  602.          Check_Optional_Identifier (Arg, Name_Convention);
  603.  
  604.          if not Is_Convention_Name (Chars (Expression (Arg))) then
  605.             Error_Pragma_Arg
  606.               ("argument of pragma% is not valid convention name", Arg);
  607.          end if;
  608.       end Check_Arg_Is_Convention;
  609.  
  610.       -----------------------------
  611.       -- Check_Arg_Is_Identifier --
  612.       -----------------------------
  613.  
  614.       procedure Check_Arg_Is_Identifier (Arg : Node_Id) is
  615.       begin
  616.          if Nkind (Expression (Arg)) /= N_Identifier then
  617.             Error_Pragma_Arg ("argument for pragma% must be identifier", Arg);
  618.          end if;
  619.       end Check_Arg_Is_Identifier;
  620.  
  621.       ----------------------------------
  622.       -- Check_Arg_Is_Integer_Literal --
  623.       ----------------------------------
  624.  
  625.       procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id) is
  626.       begin
  627.          if Nkind (Expression (Arg)) /= N_Integer_Literal then
  628.             Error_Pragma_Arg
  629.               ("argument for pragma% must be integer literal", Arg);
  630.          end if;
  631.       end Check_Arg_Is_Integer_Literal;
  632.  
  633.       -----------------------------
  634.       -- Check_Arg_Is_Local_Name --
  635.       -----------------------------
  636.  
  637.       --  LOCAL_NAME ::=
  638.       --    DIRECT_NAME
  639.       --  | DIRECT_NAME'ATTRIBUTE_DESIGNATOR
  640.       --  | library_unit_NAME
  641.  
  642.       procedure Check_Arg_Is_Local_Name (Arg : Node_Id) is
  643.          Argx : constant Node_Id := Expression (Arg);
  644.  
  645.       begin
  646.          if Nkind (Argx) not in N_Direct_Name
  647.            and then (Nkind (Argx) /= N_Selected_Component
  648.                       or else Nkind (Selector_Name (Argx)) /= N_Identifier)
  649.            and then (Nkind (Argx) /= N_Attribute_Reference
  650.                       or else Present (Expressions (Argx))
  651.                       or else Nkind (Prefix (Argx)) /= N_Identifier)
  652.          then
  653.             Error_Pragma_Arg ("argument for pragma% must be local name", Arg);
  654.          end if;
  655.  
  656.          Analyze (Argx);
  657.  
  658.          --  Semantic checking required here ???
  659.  
  660.       end Check_Arg_Is_Local_Name;
  661.  
  662.       ---------------------------------
  663.       -- Check_Arg_Is_Locking_Policy --
  664.       ---------------------------------
  665.  
  666.       procedure Check_Arg_Is_Locking_Policy (Arg : Node_Id) is
  667.       begin
  668.          Check_Arg_Is_Identifier (Arg);
  669.  
  670.          if not Is_Locking_Policy_Name (Chars (Expression (Arg))) then
  671.             Error_Pragma_Arg
  672.               ("argument of pragma% is not valid locking policy name", Arg1);
  673.          end if;
  674.       end Check_Arg_Is_Locking_Policy;
  675.  
  676.       -------------------------
  677.       -- Check_Arg_Is_One_Of --
  678.       -------------------------
  679.  
  680.       procedure Check_Arg_Is_One_Of (Arg : Node_Id; N1, N2 : Name_Id) is
  681.          Argx : constant Node_Id := Expression (Arg);
  682.  
  683.       begin
  684.          Check_Arg_Is_Identifier (Arg);
  685.  
  686.          if Chars (Argx) /= N1 and then Chars (Argx) /= N2 then
  687.             Error_Msg_Name_2 := N1;
  688.             Error_Msg_Name_3 := N2;
  689.             Error_Pragma_Arg ("argument for pragma% must be% or%", Arg);
  690.          end if;
  691.       end Check_Arg_Is_One_Of;
  692.  
  693.       procedure Check_Arg_Is_One_Of
  694.         (Arg        : Node_Id;
  695.          N1, N2, N3 : Name_Id)
  696.       is
  697.          Argx : constant Node_Id := Expression (Arg);
  698.  
  699.       begin
  700.          Check_Arg_Is_Identifier (Arg);
  701.  
  702.          if Chars (Argx) /= N1
  703.            and then Chars (Argx) /= N2
  704.            and then Chars (Argx) /= N3
  705.          then
  706.             Error_Pragma_Arg ("invalid argument for pragma%", Arg);
  707.          end if;
  708.       end Check_Arg_Is_One_Of;
  709.  
  710.       ---------------------------------
  711.       -- Check_Arg_Is_Queuing_Policy --
  712.       ---------------------------------
  713.  
  714.       procedure Check_Arg_Is_Queuing_Policy (Arg : Node_Id) is
  715.       begin
  716.          Check_Arg_Is_Identifier (Arg);
  717.  
  718.          if not Is_Queuing_Policy_Name (Chars (Expression (Arg))) then
  719.             Error_Pragma_Arg
  720.               ("argument of pragma% is not valid queuing policy name", Arg1);
  721.          end if;
  722.       end Check_Arg_Is_Queuing_Policy;
  723.  
  724.       ------------------------------------------
  725.       -- Check_Arg_Is_Task_Dispatching_Policy --
  726.       ------------------------------------------
  727.  
  728.       procedure Check_Arg_Is_Task_Dispatching_Policy (Arg : Node_Id) is
  729.       begin
  730.          Check_Arg_Is_Identifier (Arg);
  731.  
  732.          if not Is_Task_Dispatching_Policy_Name (Chars (Expression (Arg))) then
  733.             Error_Pragma_Arg
  734.               ("argument of pragma% is not valid task dispatching policy name",
  735.                 Arg);
  736.          end if;
  737.       end Check_Arg_Is_Task_Dispatching_Policy;
  738.  
  739.       ---------------------------------
  740.       -- Check_At_Least_One_Argument --
  741.       ---------------------------------
  742.  
  743.       procedure Check_At_Least_One_Argument is
  744.       begin
  745.          if Arg_Count = 0 then
  746.             Error_Pragma ("pragma% requires at least one argument");
  747.          end if;
  748.       end Check_At_Least_One_Argument;
  749.  
  750.       -------------------------------------------
  751.       -- Check_Is_In_Decl_Part_Or_Package_Spec --
  752.       -------------------------------------------
  753.  
  754.       procedure Check_Is_In_Decl_Part_Or_Package_Spec is
  755.          P : Node_Id;
  756.  
  757.       begin
  758.          P := Parent (N);
  759.  
  760.          loop
  761.             if No (P) then
  762.                exit;
  763.  
  764.             elsif Nkind (P) = N_Handled_Sequence_Of_Statements then
  765.                exit;
  766.  
  767.             elsif Nkind (P) = N_Package_Specification then
  768.                return;
  769.  
  770.             elsif Nkind (P) = N_Block_Statement then
  771.                return;
  772.  
  773.             --  Note: the following tests seem a little peculiar, because
  774.             --  they test for bodies, but if we were in the statement part
  775.             --  of the body, we would already have hit the handled statement
  776.             --  sequence, so the only way we get here is by being in the
  777.             --  declarative part of the body.
  778.  
  779.             elsif Nkind (P) = N_Subprogram_Body
  780.               or else Nkind (P) = N_Package_Body
  781.               or else Nkind (P) = N_Task_Body
  782.               or else Nkind (P) = N_Entry_Body
  783.             then
  784.                return;
  785.             end if;
  786.  
  787.             P := Parent (P);
  788.          end loop;
  789.  
  790.          Error_Pragma ("pragma% is not in declarative part or package spec");
  791.  
  792.       end Check_Is_In_Decl_Part_Or_Package_Spec;
  793.  
  794.       -------------------------
  795.       -- Check_No_Identifier --
  796.       -------------------------
  797.  
  798.       procedure Check_No_Identifier (Arg : Node_Id) is
  799.       begin
  800.          if Chars (Arg) /= No_Name then
  801.             Error_Pragma_Arg ("pragma% does not permit named arguments", Arg);
  802.          end if;
  803.       end Check_No_Identifier;
  804.  
  805.       --------------------------
  806.       -- Check_No_Identifiers --
  807.       --------------------------
  808.  
  809.       procedure Check_No_Identifiers is
  810.          Arg_Node : Node_Id;
  811.  
  812.       begin
  813.          if Arg_Count > 0 then
  814.             Arg_Node := Arg1;
  815.  
  816.             while Present (Arg_Node) loop
  817.                Check_No_Identifier (Arg_Node);
  818.                Arg_Node := Next (Arg_Node);
  819.             end loop;
  820.          end if;
  821.       end Check_No_Identifiers;
  822.  
  823.       -------------------------------
  824.       -- Check_Optional_Identifier --
  825.       -------------------------------
  826.  
  827.       procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id) is
  828.       begin
  829.          if Present (Arg) and then Chars (Arg) /= No_Name then
  830.             if Chars (Arg) /= Id then
  831.                Error_Msg_Name_1 := Chars (N);
  832.                Error_Msg_Name_2 := Id;
  833.                Error_Msg_N ("pragma% argument expects identifier%", Arg);
  834.                raise Pragma_Error;
  835.             end if;
  836.          end if;
  837.       end Check_Optional_Identifier;
  838.  
  839.       ------------------------------
  840.       -- Check_Static_String_Expr --
  841.       ------------------------------
  842.  
  843.       procedure Check_Static_String_Expr (Expr : Node_Id) is
  844.       begin
  845.          Analyze (Expr);
  846.          Resolve (Expr, Standard_String);
  847.  
  848.          if Etype (Expr) = Any_Type then
  849.             raise Pragma_Error;
  850.  
  851.          elsif not Is_Static_Expression (Expr) then
  852.             Error_Pragma_Arg
  853.               ("static string expression required here", Parent (Expr));
  854.          end if;
  855.       end Check_Static_String_Expr;
  856.  
  857.       --------------------------------------
  858.       -- Check_Valid_Configuration_Pragma --
  859.       --------------------------------------
  860.  
  861.       --  A configuration pragma must appear in the context clause of
  862.       --  a compilation unit, at the start of the list (i.e. only other
  863.       --  pragmas may precede it).
  864.  
  865.       procedure Check_Valid_Configuration_Pragma is
  866.       begin
  867.          if not Is_Configuration_Pragma then
  868.             Error_Pragma ("incorrect placement for configuration pragma%");
  869.          end if;
  870.       end Check_Valid_Configuration_Pragma;
  871.  
  872.       -------------------------------------
  873.       -- Check_Valid_Library_Unit_Pragma --
  874.       -------------------------------------
  875.  
  876.       procedure Check_Valid_Library_Unit_Pragma is
  877.          Decl        : Node_Id;
  878.          Plist       : List_Id;
  879.          Parent_Node : Node_Id;
  880.          Unit_Name   : Entity_Id;
  881.          Valid       : Boolean := True;
  882.          Unit_Kind   : Node_Kind;
  883.          Unit_Node   : Node_Id;
  884.  
  885.       begin
  886.          if not Is_List_Member (N) then
  887.             Pragma_Misplaced;
  888.             Valid := False;
  889.  
  890.          else
  891.             Plist := List_Containing (N);
  892.             Parent_Node := Parent (Plist);
  893.  
  894.             if Parent_Node = Empty then
  895.                Pragma_Misplaced;
  896.  
  897.             elsif Nkind (Parent_Node) = N_Compilation_Unit then
  898.  
  899.                --  Pragma must appear after a compilation_unit, and must have
  900.                --  an argument with the right name.
  901.  
  902.                if Plist /= Following_Pragmas (Parent_Node) then
  903.                   Pragma_Misplaced;
  904.  
  905.                elsif Arg_Count > 0 then
  906.                   Check_No_Identifiers;
  907.                   Check_Arg_Count (1);
  908.                   Unit_Node := Unit (Parent_Node);
  909.                   Unit_Kind := Nkind (Unit_Node);
  910.  
  911.                   Analyze (Expression (Arg1));
  912.  
  913.                   if Unit_Kind = N_Generic_Subprogram_Declaration
  914.                     or else Unit_Kind = N_Subprogram_Declaration
  915.                   then
  916.                      Unit_Name :=
  917.                        Defining_Unit_Simple_Name (Specification (Unit_Node));
  918.  
  919.                   elsif Unit_Kind = N_Function_Instantiation
  920.                     or else Unit_Kind = N_Package_Instantiation
  921.                     or else Unit_Kind = N_Procedure_Instantiation
  922.                   then
  923.                      Unit_Name := Defining_Unit_Simple_Name (Unit_Node);
  924.  
  925.                   --  Special case for generic instantiation. The library
  926.                   --  unit entity fetched using the normal (non-instantiation
  927.                   --  scope-wise) mechanism differs from the value obtained
  928.                   --  from Cunit_Entity (Current_Sem_Unit) in the case of an
  929.                   --  instantiation. The latter is used in Lib.Writ and in
  930.                   --  other situations.  ???
  931.  
  932.                   elsif Unit_Kind = N_Package_Declaration
  933.                     and then Present (Generic_Parent (Specification
  934.                       (Unit_Node)))
  935.                   then
  936.                      Unit_Name :=
  937.                        Defining_Unit_Simple_Name (Specification (Unit_Node));
  938.  
  939.                      case Prag_Id is
  940.                         when Pragma_Preelaborate =>
  941.                            Set_Is_Preelaborated (Cunit_Entity (
  942.                              Current_Sem_Unit));
  943.  
  944.                         when Pragma_Pure =>
  945.                            Set_Is_Pure (Cunit_Entity (Current_Sem_Unit));
  946.  
  947.                         when Pragma_Remote_Call_Interface =>
  948.                            Set_Is_Remote_Call_Interface (Cunit_Entity
  949.                              (Current_Sem_Unit));
  950.  
  951.                         when Pragma_Remote_Types =>
  952.                            Set_Is_Remote_Types (Cunit_Entity
  953.                              (Current_Sem_Unit));
  954.  
  955.                         when Pragma_Shared_Passive =>
  956.                            Set_Is_Shared_Passive (Cunit_Entity
  957.                              (Current_Sem_Unit));
  958.  
  959.                         when Pragma_All_Calls_Remote =>
  960.                            Set_Has_All_Calls_Remote (Cunit_Entity
  961.                              (Current_Sem_Unit));
  962.  
  963.                         when others => null;
  964.                      end case;
  965.  
  966.                   else
  967.                      Unit_Name := Cunit_Entity (Current_Sem_Unit);
  968.                   end if;
  969.  
  970.                   if Unit_Name /= Entity (Expression (Arg1)) then
  971.                      Error_Pragma_Arg
  972.                        ("pragma% argument is not current unit name", Arg1);
  973.                   end if;
  974.  
  975.                else
  976.                   Error_Pragma ("missing argument in pragma%");
  977.                end if;
  978.  
  979.             elsif Is_Before_First_Decl (N, Plist) then
  980.  
  981.                --  Name is optional, pragma applies to enclosing unit.
  982.  
  983.                Unit_Node := Get_Declaration_Node (Current_Scope);
  984.                Unit_Kind := Nkind (Unit_Node);
  985.  
  986.                if (Unit_Kind = N_Package_Declaration
  987.                      and then
  988.                        Present (Generic_Parent (Specification (Unit_Node))))
  989.                  or else Nkind (Original_Node (Unit_Node)) =
  990.                                                N_Formal_Package_Declaration
  991.                then
  992.                   --  The pragma appears in (the equivalent of) an instance.
  993.                   --  validation takes place in the generic itself.
  994.  
  995.                   return;
  996.  
  997.                elsif Nkind (Parent (Unit_Node)) /= N_Compilation_Unit then
  998.                   Pragma_Misplaced;
  999.  
  1000.                elsif Unit_Kind = N_Package_Body
  1001.                  or else Unit_Kind = N_Subprogram_Body
  1002.                then
  1003.                   Pragma_Misplaced;
  1004.  
  1005.                elsif Arg_Count > 0 then
  1006.                   Analyze (Expression (Arg1));
  1007.  
  1008.                   if Entity (Expression (Arg1)) /= Current_Scope then
  1009.                      Error_Pragma_Arg
  1010.                        ("name in pragma% must be enclosing unit", Arg1);
  1011.                   end if;
  1012.  
  1013.                else
  1014.                   --  Pragma with no argument is legal here.
  1015.  
  1016.                   return;
  1017.                end if;
  1018.  
  1019.             --  If not first in declarative part, name is required.
  1020.  
  1021.             elsif Arg_Count > 0 then
  1022.                Analyze (Expression (Arg1));
  1023.                Unit_Name := Entity (Expression (Arg1));
  1024.                Unit_Node := Get_Declaration_Node (Unit_Name);
  1025.  
  1026.                if Scope (Unit_Name) /= Current_Scope then
  1027.                   Error_Pragma_Arg
  1028.                     ("argument of pragma% is not in current scope", Arg1);
  1029.  
  1030.                elsif Nkind (Unit_Node) not in N_Generic_Instantiation
  1031.                  and then Nkind (Unit_Node) /= N_Generic_Subprogram_Declaration
  1032.                  and then Nkind (Unit_Node) /= N_Subprogram_Declaration
  1033.                then
  1034.                   Error_Pragma_Arg ("invalid name in pragma%", Arg1);
  1035.                end if;
  1036.  
  1037.             else
  1038.                Error_Pragma ("missing argument in pragma%");
  1039.             end if;
  1040.          end if;
  1041.  
  1042.       end Check_Valid_Library_Unit_Pragma;
  1043.  
  1044.       ------------------
  1045.       -- Error_Pragma --
  1046.       ------------------
  1047.  
  1048.       procedure Error_Pragma (Msg : String) is
  1049.       begin
  1050.          Error_Msg_Name_1 := Chars (N);
  1051.          Error_Msg_N (Msg, N);
  1052.          raise Pragma_Error;
  1053.       end Error_Pragma;
  1054.  
  1055.       ---------------------------
  1056.       -- Error_Pragma_Arg --
  1057.       ---------------------------
  1058.  
  1059.       procedure Error_Pragma_Arg (Msg : String; Arg : Node_Id) is
  1060.       begin
  1061.          Error_Msg_Name_1 := Chars (N);
  1062.          Error_Msg_N (Msg, Expression (Arg));
  1063.          raise Pragma_Error;
  1064.       end Error_Pragma_Arg;
  1065.  
  1066.       ------------------------
  1067.       -- Find_Lib_Unit_Name --
  1068.       ------------------------
  1069.  
  1070.       function Find_Lib_Unit_Name return Entity_Id is
  1071.          Lib_Unit    : constant Node_Id := Enclosing_Lib_Unit_Node (N);
  1072.          Unit_Entity : Entity_Id        := Current_Scope;
  1073.          Unit_Kind   : Node_Kind        := Nkind (Unit (Lib_Unit));
  1074.  
  1075.       begin
  1076.          --  This routine is used for categorization pragmas that are
  1077.          --  inside the compilation (library) unit.
  1078.  
  1079.          if Unit_Kind in N_Generic_Renaming_Declaration
  1080.            or else Unit_Kind = N_Package_Renaming_Declaration
  1081.            or else Unit_Kind = N_Subprogram_Renaming_Declaration
  1082.          then
  1083.             --  Library_Unit_Renaming not allowed for Pure, Preelaborate
  1084.  
  1085.             Error_Msg_N ("pragma& cannot follow library unit renaming", N);
  1086.             Unit_Entity := Empty;
  1087.          end if;
  1088.  
  1089.          --  Return inner compilation unit entity, in case of anested
  1090.          --  categorization pragmas. This happens in a nested package
  1091.          --  renaming of an instantiation of a generic package whose
  1092.          --  spec has a categorization pragma. N is the pragma node.
  1093.  
  1094.          if Nkind (Parent (N)) = N_Package_Specification
  1095.            and then Defining_Unit_Simple_Name (Parent (N)) /= Unit_Entity
  1096.          then
  1097.             return Defining_Unit_Simple_Name (Parent (N));
  1098.          end if;
  1099.  
  1100.          return Unit_Entity;
  1101.       end Find_Lib_Unit_Name;
  1102.  
  1103.       ----------------------------
  1104.       -- Find_Program_Unit_Name --
  1105.       ----------------------------
  1106.  
  1107.       procedure Find_Program_Unit_Name (Id : Node_Id) is
  1108.          Unit_Name : Entity_Id;
  1109.          Unit_Kind : Node_Kind;
  1110.          P         : constant Node_Id := Parent (N);
  1111.  
  1112.       begin
  1113.          if Nkind (P) = N_Compilation_Unit then
  1114.             Unit_Kind := Nkind (Unit (P));
  1115.  
  1116.             if Unit_Kind = N_Subprogram_Declaration
  1117.               or else Unit_Kind = N_Package_Declaration
  1118.               or else Unit_Kind in N_Generic_Declaration
  1119.             then
  1120.                Unit_Name :=
  1121.                  Defining_Unit_Simple_Name (Specification (Unit (P)));
  1122.  
  1123.                if Chars (Id) = Chars (Unit_Name) then
  1124.                   Set_Entity (Id, Unit_Name);
  1125.                   Set_Etype (Id, Etype (Unit_Name));
  1126.                else
  1127.                   Set_Etype (Id, Any_Type);
  1128.                   Error_Pragma
  1129.                     ("cannot find program unit referenced by pragma%");
  1130.                end if;
  1131.  
  1132.             else
  1133.                Set_Etype (Id, Any_Type);
  1134.                Error_Pragma ("pragma% inapplicable to this unit");
  1135.             end if;
  1136.  
  1137.          else
  1138.             Analyze (Id);
  1139.          end if;
  1140.  
  1141.       end Find_Program_Unit_Name;
  1142.  
  1143.       --------------------------
  1144.       -- Is_Before_First_Decl --
  1145.       --------------------------
  1146.  
  1147.       function Is_Before_First_Decl
  1148.         (Pragma_Node : Node_Id;
  1149.          Decls       : List_Id)
  1150.          return        Boolean
  1151.       is
  1152.          Item            : Node_Id := First (Decls);
  1153.  
  1154.       begin
  1155.          if Is_Inside_Generic_Instantiation (Pragma_Node) then
  1156.             return True;
  1157.          end if;
  1158.  
  1159.          --  Only pragmas can come before this Pragma_Node.
  1160.  
  1161.          loop
  1162.             if No (Item) or else Nkind (Item) /= N_Pragma then
  1163.                return False;
  1164.  
  1165.             elsif Item = Pragma_Node then
  1166.                return True;
  1167.             end if;
  1168.  
  1169.             Item := Next (Item);
  1170.          end loop;
  1171.  
  1172.       end Is_Before_First_Decl;
  1173.  
  1174.       -----------------------------
  1175.       -- Is_Configuration_Pragma --
  1176.       -----------------------------
  1177.  
  1178.       --  A configuration pragma must appear in the context clause of
  1179.       --  a compilation unit, at the start of the list (i.e. only other
  1180.       --  pragmas may precede it).
  1181.  
  1182.       function Is_Configuration_Pragma return Boolean is
  1183.          Lis : constant List_Id := List_Containing (N);
  1184.          Par : constant Node_Id := Parent (N);
  1185.          Prg : Node_Id;
  1186.  
  1187.       begin
  1188.          if Nkind (Par) = N_Compilation_Unit
  1189.            and then Context_Items (Par) = Lis
  1190.          then
  1191.             Prg := First (Lis);
  1192.  
  1193.             loop
  1194.                if Prg = N then
  1195.                   return True;
  1196.                elsif Nkind (Prg) /= N_Pragma then
  1197.                   return False;
  1198.                end if;
  1199.  
  1200.                Prg := Next (Prg);
  1201.             end loop;
  1202.  
  1203.          else
  1204.             return False;
  1205.          end if;
  1206.  
  1207.       end Is_Configuration_Pragma;
  1208.  
  1209.       -------------------------------------
  1210.       -- Is_Inside_Generic_Instantiation --
  1211.       -------------------------------------
  1212.  
  1213.       function Is_Inside_Generic_Instantiation
  1214.         (Pragma_Node     : Node_Id)
  1215.          return            Boolean
  1216.       is
  1217.          Parent_Node : Node_Id   := Parent (Pragma_Node);
  1218.          Parent_Kind : Node_Kind := Nkind (Parent_Node);
  1219.  
  1220.       begin
  1221.          --  Notice that a library unit pragma inside generic body is
  1222.          --  misplaced and will be found later.
  1223.  
  1224.          if Parent_Kind = N_Package_Specification then
  1225.             if Present (Generic_Parent (Parent_Node)) then
  1226.                return True;
  1227.             end if;
  1228.  
  1229.          --  It is impossible to be inside (generic) subprogram_spec
  1230.  
  1231.          elsif Parent_Kind = N_Subprogram_Body then
  1232.             if Present (Generic_Parent (Parent (Corresponding_Spec (
  1233.               Parent (Parent_Node))))) then
  1234.                return True;
  1235.             end if;
  1236.          end if;
  1237.  
  1238.          return False;
  1239.  
  1240.       end Is_Inside_Generic_Instantiation;
  1241.  
  1242.       ----------------------
  1243.       -- Pragma_Misplaced --
  1244.       ----------------------
  1245.  
  1246.       procedure Pragma_Misplaced is
  1247.       begin
  1248.          Error_Pragma ("incorrect placement of pragma%");
  1249.       end Pragma_Misplaced;
  1250.  
  1251.       ----------------------------
  1252.       -- Pragma_Not_Implemented --
  1253.       ----------------------------
  1254.  
  1255.       procedure Pragma_Not_Implemented is
  1256.       begin
  1257.          Error_Pragma ("pragma% not implemented?");
  1258.       end Pragma_Not_Implemented;
  1259.  
  1260.       ------------------------
  1261.       -- Process_Convention --
  1262.       ------------------------
  1263.  
  1264.       procedure Process_Convention
  1265.         (C : out Convention_Id;
  1266.          E : out Entity_Id)
  1267.       is
  1268.          Id : Node_Id;
  1269.          E1 : Entity_Id;
  1270.          Compilation_Unit : Node_Id;
  1271.  
  1272.          function Get_Compilation_Unit (N : Node_Id) return Node_Id;
  1273.  
  1274.          function Get_Compilation_Unit (N : Node_Id) return Node_Id is
  1275.             Unit : Node_Id := N;
  1276.          begin
  1277.             while Nkind (Unit) /= N_Compilation_Unit loop
  1278.                Unit := Parent (Unit);
  1279.             end loop;
  1280.             return Unit;
  1281.          end Get_Compilation_Unit;
  1282.  
  1283.       begin
  1284.          Check_Arg_Is_Convention (Arg1);
  1285.          Check_Arg_Is_Local_Name (Arg2);
  1286.          Check_Optional_Identifier (Arg2, Name_Entity);
  1287.  
  1288.          C := Get_Convention_Id (Chars (Expression (Arg1)));
  1289.  
  1290.          Id := Expression (Arg2);
  1291.  
  1292.          --  The following if is highly suspicious. It was derived from
  1293.          --  the code in 1.181 which handles intrinsic quite separately.
  1294.          --  It does not work to do Analyze (Id) for the case of an
  1295.          --  operator symbol to which pragma Convention Intrinsic is
  1296.          --  applied, so presumably this code is wrong for specifying
  1297.          --  a foreign convention for an operator ???
  1298.  
  1299.          if C = Convention_Intrinsic then
  1300.             Find_Program_Unit_Name (Id);
  1301.          else
  1302.             Analyze (Id);
  1303.  
  1304.             if not Is_Entity_Name (Id) then
  1305.                Error_Pragma_Arg ("entity name required", Arg2);
  1306.             end if;
  1307.          end if;
  1308.  
  1309.          if Etype (Id) = Any_Type then
  1310.             raise Pragma_Error;
  1311.          end if;
  1312.  
  1313.          E := Entity (Id);
  1314.  
  1315.          --  For Intrinsic or Stdcall, a subprogram is required
  1316.  
  1317.          if (C = Convention_Intrinsic or else C = Convention_Stdcall)
  1318.            and then not Is_Subprogram (E)
  1319.            and then not Is_Generic_Subprogram (E)
  1320.          then
  1321.             Error_Pragma_Arg
  1322.               ("second argument of pragma% must be a subprogram", Arg2);
  1323.          end if;
  1324.  
  1325.          if Scope (E) /= Current_Scope then
  1326.             Error_Pragma_Arg
  1327.               ("pragma% must be in same declarative part", Arg2);
  1328.          end if;
  1329.  
  1330.          if not Is_Subprogram (E)
  1331.            and then not Is_Generic_Subprogram (E)
  1332.          then
  1333.             Set_Convention (E, C);
  1334.  
  1335.          else
  1336.             E1 := E;
  1337.  
  1338.             --  Only Homonyms in the same compilation unit count
  1339.  
  1340.             Compilation_Unit := Get_Compilation_Unit (E1);
  1341.             while Present (E1)
  1342.               and then Scope (E1) = Current_Scope
  1343.             loop
  1344.                if Compilation_Unit = Get_Compilation_Unit (E1) then
  1345.                   Set_Convention (E1, C);
  1346.                end if;
  1347.                E1 := Homonym (E1);
  1348.             end loop;
  1349.  
  1350.          end if;
  1351.       end Process_Convention;
  1352.  
  1353.       ----------------------------
  1354.       -- Process_Interface_Name --
  1355.       ----------------------------
  1356.  
  1357.       procedure Process_Interface_Name
  1358.         (Subprogram_Def : Entity_Id;
  1359.          Ext_Arg        : Node_Id;
  1360.          Link_Arg       : Node_Id)
  1361.       is
  1362.          Ext_Nam  : Node_Id;
  1363.          Link_Nam : Node_Id;
  1364.  
  1365.       begin
  1366.          if No (Link_Arg) then
  1367.             if Chars (Ext_Arg) = No_Name
  1368.               or else Chars (Ext_Arg) = Name_External_Name
  1369.             then
  1370.                Ext_Nam  := Expression (Ext_Arg);
  1371.                Link_Nam := Empty;
  1372.             else
  1373.                Ext_Nam  := Empty;
  1374.                Link_Nam := Expression (Ext_Arg);
  1375.             end if;
  1376.  
  1377.          else
  1378.             Ext_Nam  := Expression (Ext_Arg);
  1379.             Link_Nam := Expression (Link_Arg);
  1380.          end if;
  1381.  
  1382.          --  Check expressions for external name and link name are static
  1383.  
  1384.          if Present (Ext_Nam) then
  1385.             Check_Static_String_Expr (Ext_Nam);
  1386.          end if;
  1387.  
  1388.          if Present (Link_Nam) then
  1389.             Check_Static_String_Expr (Link_Nam);
  1390.          end if;
  1391.  
  1392.          --  If there is no link name, just set the external name
  1393.  
  1394.          if No (Link_Nam) then
  1395.             Set_Interface_Name (Subprogram_Def, Ext_Nam);
  1396.  
  1397.          --  For the Link_Name case, the given literal is preceded by an
  1398.          --  asterisk, which indicates to GCC that the given name should
  1399.          --  be taken literally, and in particular that no prepending of
  1400.          --  underlines should occur, even in systems where this is the
  1401.          --  normal default.
  1402.  
  1403.          else
  1404.             Start_String;
  1405.             Store_String_Char (Get_Char_Code ('*'));
  1406.  
  1407.             for J in 1 .. String_Length (Strval (Link_Nam)) loop
  1408.                Store_String_Char (Get_String_Char (Strval (Link_Nam), J));
  1409.             end loop;
  1410.  
  1411.             Link_Nam :=
  1412.               Make_String_Literal (Sloc (Link_Nam), End_String);
  1413.  
  1414.             Set_Interface_Name (Subprogram_Def, Link_Nam);
  1415.          end if;
  1416.       end Process_Interface_Name;
  1417.  
  1418.       ---------------------------------
  1419.       -- Process_Suppress_Unsuppress --
  1420.       ---------------------------------
  1421.  
  1422.       procedure Process_Suppress_Unsuppress (Sense : Boolean) is
  1423.          C         : constant Check_Id :=
  1424.                        Get_Check_Id (Chars (Expression (Arg1)));
  1425.          E_Id      : Node_Id;
  1426.          E         : Entity_Id;
  1427.          Effective : Boolean;
  1428.  
  1429.          procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id);
  1430.          --  Used to suppress a single check on the given entity
  1431.  
  1432.          procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id) is
  1433.          begin
  1434.  
  1435.             --  First set appropriate suppress flags in the entity
  1436.  
  1437.             case C is
  1438.                when Access_Check =>
  1439.                   Effective := Suppress_Access_Checks (E);
  1440.                   Set_Suppress_Access_Checks (E, Sense);
  1441.  
  1442.                when Accessibility_Check =>
  1443.                   Effective := Suppress_Accessibility_Checks (E);
  1444.                   Set_Suppress_Accessibility_Checks (E, Sense);
  1445.  
  1446.                when Discriminant_Check =>
  1447.                   Effective := Suppress_Discriminant_Checks  (E);
  1448.                   Set_Suppress_Discriminant_Checks (E, Sense);
  1449.  
  1450.                when Division_Check =>
  1451.                   Effective := Suppress_Division_Checks (E);
  1452.                   Set_Suppress_Division_Checks (E, Sense);
  1453.  
  1454.                when Elaboration_Check =>
  1455.                   Effective := Suppress_Elaboration_Checks (E);
  1456.                   Set_Suppress_Elaboration_Checks (E, Sense);
  1457.  
  1458.                when Index_Check =>
  1459.                   Effective := Suppress_Index_Checks (E);
  1460.                   Set_Suppress_Index_Checks (E, Sense);
  1461.  
  1462.                when Length_Check =>
  1463.                   Effective := Suppress_Length_Checks (E);
  1464.                   Set_Suppress_Length_Checks (E, Sense);
  1465.  
  1466.                when Overflow_Check =>
  1467.                   Effective := Suppress_Overflow_Checks (E);
  1468.                   Set_Suppress_Overflow_Checks (E, Sense);
  1469.  
  1470.                when Range_Check =>
  1471.                   Effective := Suppress_Range_Checks (E);
  1472.                   Set_Suppress_Range_Checks (E, Sense);
  1473.  
  1474.                when Storage_Check =>
  1475.                   Effective := Suppress_Storage_Checks (E);
  1476.                   Set_Suppress_Storage_Checks (E, Sense);
  1477.  
  1478.                when Tag_Check =>
  1479.                   Effective := Suppress_Tag_Checks (E);
  1480.                   Set_Suppress_Tag_Checks (E, Sense);
  1481.  
  1482.                when All_Checks =>
  1483.                   Suppress_Unsuppress_Echeck (E, Access_Check);
  1484.                   Suppress_Unsuppress_Echeck (E, Accessibility_Check);
  1485.                   Suppress_Unsuppress_Echeck (E, Discriminant_Check);
  1486.                   Suppress_Unsuppress_Echeck (E, Division_Check);
  1487.                   Suppress_Unsuppress_Echeck (E, Elaboration_Check);
  1488.                   Suppress_Unsuppress_Echeck (E, Index_Check);
  1489.                   Suppress_Unsuppress_Echeck (E, Length_Check);
  1490.                   Suppress_Unsuppress_Echeck (E, Overflow_Check);
  1491.                   Suppress_Unsuppress_Echeck (E, Range_Check);
  1492.                   Suppress_Unsuppress_Echeck (E, Storage_Check);
  1493.                   Suppress_Unsuppress_Echeck (E, Tag_Check);
  1494.             end case;
  1495.  
  1496.             --  If the entity is not declared in the current scope, then we
  1497.             --  make an entry in the Entity_Suppress table so that the flag
  1498.             --  will be removed on exit. This entry is only made if the
  1499.             --  suppress did something (i.e. the flag was not already set).
  1500.  
  1501.             if Effective and then Scope (E) /= Current_Scope then
  1502.                Entity_Suppress.Increment_Last;
  1503.                Entity_Suppress.Table
  1504.                  (Entity_Suppress.Last).Entity := E;
  1505.                Entity_Suppress.Table
  1506.                  (Entity_Suppress.Last).Check  := C;
  1507.             end if;
  1508.          end Suppress_Unsuppress_Echeck;
  1509.  
  1510.       --  Start of processing for Process_Suppress_Unsuppress
  1511.  
  1512.       begin
  1513.          if Arg_Count = 1 then
  1514.             case C is
  1515.                when Access_Check =>
  1516.                   Scope_Suppress.Access_Checks := Sense;
  1517.  
  1518.                when Accessibility_Check =>
  1519.                   Scope_Suppress.Accessibility_Checks := Sense;
  1520.  
  1521.                when Discriminant_Check =>
  1522.                   Scope_Suppress.Discriminant_Checks := Sense;
  1523.  
  1524.                when Division_Check =>
  1525.                   Scope_Suppress.Division_Checks := Sense;
  1526.  
  1527.                when Elaboration_Check =>
  1528.                   Scope_Suppress.Elaboration_Checks := Sense;
  1529.  
  1530.                when Index_Check =>
  1531.                   Scope_Suppress.Index_Checks := Sense;
  1532.  
  1533.                when Length_Check =>
  1534.                   Scope_Suppress.Length_Checks := Sense;
  1535.  
  1536.                when Overflow_Check =>
  1537.                   Scope_Suppress.Overflow_Checks := Sense;
  1538.  
  1539.                when Range_Check =>
  1540.                   Scope_Suppress.Range_Checks := Sense;
  1541.  
  1542.                when Storage_Check =>
  1543.                   Scope_Suppress.Storage_Checks := Sense;
  1544.  
  1545.                when Tag_Check =>
  1546.                   Scope_Suppress.Tag_Checks := Sense;
  1547.  
  1548.                when All_Checks =>
  1549.                   Scope_Suppress := (others => Sense);
  1550.  
  1551.             end case;
  1552.  
  1553.          --  Case of two arguments present, where the check is
  1554.          --  suppressed for a specified entity (given as the second
  1555.          --  argument of the pragma)
  1556.  
  1557.          else
  1558.             E_Id := Expression (Arg2);
  1559.             Analyze (E_Id);
  1560.             E := Entity (E_Id);
  1561.  
  1562.             if E = Any_Id then
  1563.                return;
  1564.             else
  1565.                Suppress_Unsuppress_Echeck (E, C);
  1566.  
  1567.                while Present (Homonym (E)) loop
  1568.                   E := Homonym (E);
  1569.                   Suppress_Unsuppress_Echeck (E, C);
  1570.                end loop;
  1571.             end if;
  1572.          end if;
  1573.  
  1574.       end Process_Suppress_Unsuppress;
  1575.  
  1576.    --------------------------------------------
  1577.    -- Start of processing for Analyze_Pragma --
  1578.    --------------------------------------------
  1579.  
  1580.    begin
  1581.       --  Count number of arguments
  1582.  
  1583.       declare
  1584.          Arg_Node : Node_Id;
  1585.  
  1586.       begin
  1587.          Arg_Count := 0;
  1588.  
  1589.          if Present (Pragma_Argument_Associations (N)) then
  1590.             Arg_Node := Arg1;
  1591.  
  1592.             while Arg_Node /= Empty loop
  1593.                Arg_Count := Arg_Count + 1;
  1594.                Arg_Node := Next (Arg_Node);
  1595.             end loop;
  1596.          end if;
  1597.       end;
  1598.  
  1599.       --  An enumeration type defines the pragmas that are supported by the
  1600.       --  implementation. Get_Pragma_Id (in package Prag) transorms a name
  1601.       --  into the corresponding enumeration value for the following case.
  1602.  
  1603.       case Prag_Id is
  1604.  
  1605.          -----------------
  1606.          -- Abort_Defer --
  1607.          -----------------
  1608.  
  1609.          --  pragma Abort_Defer;
  1610.  
  1611.          when Pragma_Abort_Defer =>
  1612.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  1613.             Check_Arg_Count (0);
  1614.  
  1615.             --  The only required semantic processing is to check the
  1616.             --  placement. This pragma must appear at the start of the
  1617.             --  statement sequence of a handled sequence of statements.
  1618.  
  1619.             if Nkind (Parent (N)) /= N_Handled_Sequence_Of_Statements
  1620.               or else N /= First (Statements (Parent (N)))
  1621.             then
  1622.                Pragma_Misplaced;
  1623.             end if;
  1624.  
  1625.          ------------
  1626.          -- Ada_83 --
  1627.          ------------
  1628.  
  1629.          --  pragma Ada_83;
  1630.  
  1631.          --  Note: this pragma also has some specific processing in Par.Prag
  1632.          --  because we want to set the Ada 83 mode switch during parsing.
  1633.  
  1634.          when Pragma_Ada_83 =>
  1635.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  1636.             Ada_83 := True;
  1637.             Ada_95 := False;
  1638.             Check_Arg_Count (0);
  1639.             Check_Valid_Configuration_Pragma;
  1640.  
  1641.          ------------
  1642.          -- Ada_95 --
  1643.          ------------
  1644.  
  1645.          --  pragma Ada_83;
  1646.  
  1647.          --  Note: this pragma also has some specific processing in Par.Prag
  1648.  
  1649.          --  because we want to set the Ada 83 mode switch during parsing.
  1650.          when Pragma_Ada_95 =>
  1651.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  1652.             Ada_83 := False;
  1653.             Ada_95 := True;
  1654.             Check_Arg_Count (0);
  1655.             Check_Valid_Configuration_Pragma;
  1656.  
  1657.          ----------------------
  1658.          -- All_Calls_Remote --
  1659.          ----------------------
  1660.  
  1661.          --  pragma All_Calls_Remote [(library_package_NAME)];
  1662.  
  1663.          when Pragma_All_Calls_Remote => All_Calls_Remote : declare
  1664.             Ey : Entity_Id;
  1665.  
  1666.          begin
  1667.             Check_Ada_83_Warning;
  1668.             Check_Valid_Library_Unit_Pragma;
  1669.             Ey := Find_Lib_Unit_Name;
  1670.  
  1671.             --  This pragma should only apply to a RCI unit (RM E.2.3(23)).
  1672.  
  1673.             if Present (Ey)
  1674.               and then not Debug_Flag_U
  1675.             then
  1676.                if not Is_Remote_Call_Interface (Ey) then
  1677.                   Error_Pragma ("pragma% only apply to rci unit");
  1678.  
  1679.                --  Set flag for entity of the library unit
  1680.  
  1681.                else
  1682.                   Set_Has_All_Calls_Remote (Ey);
  1683.                end if;
  1684.  
  1685.             end if;
  1686.          end All_Calls_Remote;
  1687.  
  1688.          --------------
  1689.          -- Annotate --
  1690.          --------------
  1691.  
  1692.          --  pragma Annotate (IDENTIFIER {, ARG);
  1693.          --  ARG ::= NAME | EXPRESSION
  1694.  
  1695.          when Pragma_Annotate => Annotate : begin
  1696.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  1697.             Check_At_Least_One_Argument;
  1698.             Check_Arg_Is_Identifier (Arg1);
  1699.  
  1700.             declare
  1701.                Arg : Node_Id := Arg2;
  1702.  
  1703.             begin
  1704.                while Present (Arg) loop
  1705.                   Analyze (Arg);
  1706.  
  1707.                   if Is_Entity_Name (Arg) then
  1708.                      null;
  1709.  
  1710.                   elsif Nkind (Arg) = N_String_Literal then
  1711.                      Resolve (Arg, Standard_String);
  1712.  
  1713.                   elsif Is_Overloaded (Arg) then
  1714.                      Error_Pragma_Arg ("ambiguous argument for pragma%", Arg);
  1715.  
  1716.                   else
  1717.                      Resolve (Arg, Etype (Arg));
  1718.                   end if;
  1719.                end loop;
  1720.             end;
  1721.          end Annotate;
  1722.  
  1723.          ------------
  1724.          -- Assert --
  1725.          ------------
  1726.  
  1727.          --  pragma Assert (Boolean_EXPRESSION);
  1728.  
  1729.          when Pragma_Assert =>
  1730.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  1731.             Check_No_Identifiers;
  1732.  
  1733.             if Arg_Count > 1 then
  1734.                Check_Arg_Count (2);
  1735.                Check_Static_String_Expr (Expression (Arg2));
  1736.             end if;
  1737.  
  1738.          ------------------
  1739.          -- Asynchronous --
  1740.          ------------------
  1741.  
  1742.          --  pragma Asynchronous (LOCAL_NAME);
  1743.  
  1744.          when Pragma_Asynchronous => Asynchronous : declare
  1745.             Ey : constant Entity_Id := Find_Lib_Unit_Name;
  1746.             F  : Boolean;
  1747.             Nm : Entity_Id;
  1748.             L  : List_Id;
  1749.             S  : Node_Id;
  1750.             N  : Node_Id;
  1751.             I  : Entity_Id;
  1752.  
  1753.          begin
  1754.             Check_Ada_83_Warning;
  1755.             Check_No_Identifiers;
  1756.             Check_Arg_Count (1);
  1757.             Check_Arg_Is_Local_Name (Arg1);
  1758.  
  1759.             if not Present (Ey) or else Debug_Flag_U then
  1760.                return;
  1761.             end if;
  1762.  
  1763.             Analyze (Expression (Arg1));
  1764.             Nm := Entity (Expression (Arg1));
  1765.  
  1766.             if not Is_Remote_Call_Interface (Ey)
  1767.               and then not Is_Remote_Types (Ey)
  1768.             then
  1769.                --  This pragma should only appear in an RCI or Remote Types
  1770.                --  unit. AARM E.4.1(4,4a)
  1771.  
  1772.                Error_Pragma ("pragma% not in rci or remote types unit");
  1773.  
  1774.             elsif not Is_Remote_Call_Interface (Nm)
  1775.               and then not Is_Remote_Types (Ey)
  1776.             then
  1777.                --  The argumnet should be declared in RCI or Remote Types
  1778.                --  unit AARM E.4.1(4,4a)
  1779.  
  1780.                Error_Pragma_Arg
  1781.                  ("pragma% argument not in rci/remote types unit", Arg1);
  1782.             end if;
  1783.  
  1784.             if Ekind (Nm) = E_Procedure
  1785.               and then Nkind (Parent (Nm)) = N_Procedure_Specification
  1786.             then
  1787.                L := Parameter_Specifications (Parent (Nm));
  1788.  
  1789.                if not Present (L) then
  1790.                   Set_Is_Asynchronous (Nm);
  1791.                   return;
  1792.                end if;
  1793.  
  1794.                --  The formals should be of mode in E.4.1(6)
  1795.  
  1796.                S := First (L);
  1797.                while Present (S) loop
  1798.                   I := Defining_Identifier (S);
  1799.  
  1800.                   if Nkind (I) = N_Defining_Identifier
  1801.                     and then Ekind (I) /= E_In_Parameter
  1802.                   then
  1803.                      Error_Pragma_Arg
  1804.                        ("pragma% remote procedure with mode in only"
  1805.                        , Arg1);
  1806.                   end if;
  1807.  
  1808.                   S := Next (S);
  1809.                end loop;
  1810.  
  1811.                Set_Is_Asynchronous (Nm);
  1812.                return;
  1813.  
  1814.             elsif Ekind (Nm) = E_Access_Subprogram_Type then
  1815.                N := Declaration_Node (Nm);
  1816.  
  1817.                if Nkind (N) = N_Full_Type_Declaration
  1818.                  and then Nkind (Type_Definition (N)) =
  1819.                                      N_Access_Procedure_Definition
  1820.                then
  1821.                   L := Parameter_Specifications (Type_Definition (N));
  1822.  
  1823.                   if not Present (L) then
  1824.                      Set_Is_Asynchronous (Nm);
  1825.                      return;
  1826.                   end if;
  1827.  
  1828.                   --  The formals should be of mode in E.4.1(7)
  1829.  
  1830.                   S := First (L);
  1831.                   while Present (S) loop
  1832.                      I := Defining_Identifier (S);
  1833.  
  1834.                      if Nkind (I) = N_Defining_Identifier
  1835.                        and then Ekind (I) /= E_In_Parameter
  1836.                      then
  1837.                         Error_Pragma_Arg
  1838.                           ("pragma% remote procedure with mode in only",
  1839.                             Arg1);
  1840.                      end if;
  1841.  
  1842.                      S := Next (S);
  1843.                   end loop;
  1844.  
  1845.                   Set_Is_Asynchronous (Nm);
  1846.  
  1847.                else
  1848.                   Error_Pragma_Arg
  1849.                     ("pragma% remote access-to-procedure type only",
  1850.                     Arg1);
  1851.                end if;
  1852.  
  1853.             else
  1854.                --  Access-to-class-wide type
  1855.  
  1856.                Set_Is_Asynchronous (Nm);
  1857.             end if;
  1858.  
  1859.          end Asynchronous;
  1860.  
  1861.          ------------
  1862.          -- Atomic --
  1863.          ------------
  1864.  
  1865.          --  pragma Atomic (LOCAL_NAME);
  1866.  
  1867.          --  The old Ada 83 pragma Shared is treated like pragma Atomic
  1868.          --  Volatile shares the same circuit
  1869.  
  1870.          when Pragma_Atomic |
  1871.               Pragma_Shared |
  1872.               Pragma_Volatile =>
  1873.  
  1874.          Atomic : declare
  1875.             E_Id : Node_Id := Expression (Arg1);
  1876.             E    : Entity_Id;
  1877.             D    : Node_Id;
  1878.             K    : Node_Kind;
  1879.  
  1880.          begin
  1881.             Note_Feature (New_Representation_Pragmas, Loc);
  1882.             Check_Ada_83_Warning;
  1883.             Check_No_Identifiers;
  1884.             Check_Arg_Count (1);
  1885.             Check_Arg_Is_Local_Name (Arg1);
  1886.  
  1887.             if Etype (E_Id) = Any_Type then
  1888.                return;
  1889.             end if;
  1890.  
  1891.             E := Entity (E_Id);
  1892.             D := Declaration_Node (E);
  1893.             K := Nkind (D);
  1894.  
  1895.             if K = N_Object_Declaration
  1896.               or else K = N_Full_Type_Declaration
  1897.               or else (K = N_Component_Declaration
  1898.                         and then Original_Record_Component (E) = E)
  1899.             then
  1900.                if Prag_Id /= Pragma_Volatile then
  1901.                   Set_Is_Atomic (E);
  1902.                end if;
  1903.  
  1904.                Set_Is_Volatile (E);
  1905.  
  1906.             else
  1907.                Error_Pragma_Arg
  1908.                  ("inappropriate entity for pragma%", Arg1);
  1909.             end if;
  1910.          end Atomic;
  1911.  
  1912.          -----------------------
  1913.          -- Atomic_Components --
  1914.          -----------------------
  1915.  
  1916.          --  pragma Atomic_Components (array_LOCAL_NAME);
  1917.  
  1918.          --  This processing is shared by Volatile_Components
  1919.  
  1920.          when Pragma_Atomic_Components   |
  1921.               Pragma_Volatile_Components =>
  1922.  
  1923.          Atomic_Components : declare
  1924.             E_Id : Node_Id := Expression (Arg1);
  1925.             E    : Entity_Id;
  1926.             D    : Node_Id;
  1927.             K    : Node_Kind;
  1928.  
  1929.          begin
  1930.             Note_Feature (New_Representation_Pragmas, Loc);
  1931.             Check_Ada_83_Warning;
  1932.             Check_No_Identifiers;
  1933.             Check_Arg_Count (1);
  1934.             Check_Arg_Is_Local_Name (Arg1);
  1935.  
  1936.             if Etype (E_Id) = Any_Type then
  1937.                return;
  1938.             end if;
  1939.  
  1940.             E := Entity (E_Id);
  1941.             D := Declaration_Node (E);
  1942.             K := Nkind (D);
  1943.  
  1944.             if (K = N_Full_Type_Declaration and then Is_Array_Type (E))
  1945.               or else
  1946.                 ((Ekind (E) = E_Constant or else Ekind (E) = E_Variable)
  1947.                    and then Nkind (D) = N_Object_Declaration
  1948.                    and then Nkind (Object_Definition (D)) =
  1949.                                        N_Constrained_Array_Definition)
  1950.             then
  1951.                --  For consistency, always set these flags on the underlying
  1952.                --  base type if E is an object. The test above verifies that
  1953.                --  it is safe to do this.
  1954.  
  1955.                if Nkind (D) = N_Object_Declaration then
  1956.                   E := Base_Type (Etype (E));
  1957.                end if;
  1958.  
  1959.                if Prag_Id = Pragma_Atomic_Components then
  1960.                   Set_Has_Atomic_Components (E);
  1961.                end if;
  1962.  
  1963.                Set_Has_Volatile_Components (E);
  1964.  
  1965.             else
  1966.                Error_Pragma_Arg ("inappropriate entity for pragma%", Arg1);
  1967.             end if;
  1968.          end Atomic_Components;
  1969.  
  1970.          --------------------
  1971.          -- Attach_Handler --
  1972.          --------------------
  1973.  
  1974.          --  pragma Attach_Handler (handler_NAME, EXPRESSION);
  1975.  
  1976.          when Pragma_Attach_Handler =>
  1977.             Check_Ada_83_Warning;
  1978.             Check_No_Identifiers;
  1979.             Check_Arg_Count (2);
  1980.             Pragma_Not_Implemented;
  1981.  
  1982.          ----------------
  1983.          -- Controlled --
  1984.          ----------------
  1985.  
  1986.          --  pragma Controlled (first_subtype_LOCAL_NAME);
  1987.  
  1988.          when Pragma_Controlled => Controlled : declare
  1989.             Arg : Node_Id;
  1990.          begin
  1991.             Check_No_Identifiers;
  1992.             Check_Arg_Count (1);
  1993.             Check_Arg_Is_Local_Name (Arg1);
  1994.             Arg := Expression (Arg1);
  1995.  
  1996.             if not Is_Entity_Name (Arg)
  1997.               or else not Is_Access_Type (Entity (Arg))
  1998.             then
  1999.                Error_Pragma_Arg ("pragma% requires access type", Arg1);
  2000.             else
  2001.                Set_Has_Pragma_Controlled (Entity (Arg));
  2002.             end if;
  2003.          end Controlled;
  2004.  
  2005.          ----------------
  2006.          -- Convention --
  2007.          ----------------
  2008.  
  2009.          --  pragma Convention ([Convention =>] convention_IDENTIFIER,
  2010.          --    [Entity =>] LOCAL_NAME);
  2011.  
  2012.          when Pragma_Convention => Convention : declare
  2013.             C : Convention_Id;
  2014.             E : Entity_Id;
  2015.  
  2016.          begin
  2017.             Note_Feature (New_Representation_Pragmas, Loc);
  2018.             Check_Ada_83_Warning;
  2019.             Check_Arg_Count (2);
  2020.             Process_Convention (C, E);
  2021.          end Convention;
  2022.  
  2023.          ---------------
  2024.          -- CPP_Class --
  2025.          ---------------
  2026.  
  2027.          --  pragma CPP_Class ([Entity =>] LOCAL_NAME)
  2028.  
  2029.          when Pragma_CPP_Class => CPP_Class : declare
  2030.             Arg         : Node_Id;
  2031.             Typ         : Entity_Id;
  2032.             Default_DTC : Entity_Id := Empty;
  2033.             VTP_Type    : constant Entity_Id  := RTE (RE_Vtable_Ptr);
  2034.             C           : Entity_Id;
  2035.             Tag_C       : Entity_Id;
  2036.  
  2037.          begin
  2038.             Check_Ada_83_Warning;
  2039.             Check_Arg_Count (1);
  2040.             Check_Optional_Identifier (Arg1, Name_Entity);
  2041.             Check_Arg_Is_Local_Name (Arg1);
  2042.  
  2043.             Arg := Expression (Arg1);
  2044.             Analyze (Arg);
  2045.  
  2046.             if Etype (Arg) = Any_Type then
  2047.                return;
  2048.             end if;
  2049.  
  2050.             if not Is_Entity_Name (Arg)
  2051.               or else not Is_Type (Entity (Arg))
  2052.             then
  2053.                Error_Pragma_Arg ("pragma% requires a type mark", Arg1);
  2054.             end if;
  2055.  
  2056.             Typ := Entity (Arg);
  2057.  
  2058.             if not Is_Record_Type (Typ) then
  2059.                Error_Pragma_Arg ("pragma% applicable to a record, "
  2060.                  & "tagged record or record extension", Arg1);
  2061.             end if;
  2062.  
  2063.             Default_DTC := First_Component (Typ);
  2064.             while Present (Default_DTC)
  2065.               and then Etype (Default_DTC) /= VTP_Type
  2066.             loop
  2067.                Default_DTC := Next_Component (Default_DTC);
  2068.             end loop;
  2069.  
  2070.             if not Is_Tagged_Type (Typ) and then Present (Default_DTC) then
  2071.                Error_Pragma_Arg
  2072.                  ("only tagged records can contain vtable pointers", Arg1);
  2073.  
  2074.             elsif Is_Tagged_Type (Typ)
  2075.               and then Typ = Root_Type (Typ)
  2076.               and then No (Default_DTC)
  2077.             then
  2078.                Error_Pragma_Arg
  2079.                  ("a cpp_class must contain a vtable pointer", Arg1);
  2080.             else
  2081.                Set_Is_CPP_Class (Typ);
  2082.                Set_Is_Limited_Record (Typ);
  2083.                Set_Is_Tag (Default_DTC);
  2084.                Set_DT_Entry_Count (Default_DTC, No_Uint);
  2085.  
  2086.                if Typ = Root_Type (Typ) then
  2087.  
  2088.                   --  Get rid of the _tag component which is only useful for
  2089.                   --  regular tagged types
  2090.  
  2091.                   Tag_C := Tag_Component (Typ);
  2092.                   C := First_Entity (Typ);
  2093.  
  2094.                   if C = Tag_C then
  2095.                      Set_First_Entity (Typ, Next_Entity (Tag_C));
  2096.  
  2097.                   else
  2098.                      while Next_Entity (C) /= Tag_C loop
  2099.                         C := Next_Entity (C);
  2100.                      end loop;
  2101.  
  2102.                      Set_Next_Entity (C, Next_Entity (Tag_C));
  2103.                   end if;
  2104.                end if;
  2105.             end if;
  2106.          end CPP_Class;
  2107.  
  2108.          ---------------------
  2109.          -- CPP_Constructor --
  2110.          ---------------------
  2111.  
  2112.          --  pragma CPP_Constructor ([Entity =>] LOCAL_NAME);
  2113.  
  2114.          when Pragma_CPP_Constructor => CPP_Constructor : declare
  2115.             Id     : Entity_Id;
  2116.             Def_Id : Entity_Id;
  2117.  
  2118.          begin
  2119.             Check_Ada_83_Warning;
  2120.             Check_Arg_Count (1);
  2121.             Check_Optional_Identifier (Arg1, Name_Entity);
  2122.             Check_Arg_Is_Local_Name (Arg1);
  2123.  
  2124.             Id := Expression (Arg1);
  2125.             Find_Program_Unit_Name (Id);
  2126.  
  2127.             --  If we did not find the name, we are done
  2128.  
  2129.             if Etype (Id) = Any_Type then
  2130.                return;
  2131.             end if;
  2132.  
  2133.             Def_Id := Entity (Id);
  2134.  
  2135.             if Ekind (Def_Id) = E_Function
  2136.               and then Is_Class_Wide_Type (Etype (Def_Id))
  2137.               and then Is_CPP_Class (Etype (Etype (Def_Id)))
  2138.             then
  2139.  
  2140.                if Arg_Count >= 2 then
  2141.                   Process_Interface_Name (Def_Id, Arg2, Arg3);
  2142.                end if;
  2143.  
  2144.                if No (Parameter_Specifications (Parent (Def_Id))) then
  2145.                   Set_Has_Completion (Def_Id);
  2146.                   Set_Is_Constructor (Def_Id);
  2147.                else
  2148.                   Unimplemented (Arg1, "non-default constructors");
  2149.                end if;
  2150.  
  2151.             else
  2152.                Error_Pragma_Arg
  2153.                  ("pragma% requires function returning a cpp_class type",
  2154.                    Arg1);
  2155.             end if;
  2156.          end CPP_Constructor;
  2157.  
  2158.          --------------------
  2159.          -- CPP_Destructor --
  2160.          --------------------
  2161.  
  2162.          --  pragma CPP_Destructor ([Entity =>] LOCAL_NAME);
  2163.  
  2164.          when Pragma_CPP_Destructor =>
  2165.             Check_Ada_83_Warning;
  2166.             Check_Arg_Count (1);
  2167.             Check_Optional_Identifier (Arg1, Name_Entity);
  2168.             Check_Arg_Is_Local_Name (Arg1);
  2169.             Pragma_Not_Implemented;
  2170.  
  2171.          -----------------
  2172.          -- CPP_Virtual --
  2173.          -----------------
  2174.  
  2175.          --  pragma CPP_Virtual
  2176.          --      [Entity =>]       LOCAL_NAME
  2177.          --    [ [Vtable_Ptr =>]   LOCAL_NAME,
  2178.          --      [Position =>]     static_integer_EXPRESSION]);
  2179.  
  2180.          when Pragma_CPP_Virtual => CPP_Virtual : declare
  2181.             Arg      : Node_Id;
  2182.             Typ      : Entity_Id;
  2183.             Subp     : Entity_Id;
  2184.             VTP_Type : constant Entity_Id  := RTE (RE_Vtable_Ptr);
  2185.             DTC      : Entity_Id;
  2186.             V        : Uint;
  2187.  
  2188.          begin
  2189.             Check_Ada_83_Warning;
  2190.  
  2191.             if Arg_Count = 3 then
  2192.                Check_Optional_Identifier (Arg2, Name_Vtable_Ptr);
  2193.                Check_Optional_Identifier (Arg3, Name_Entry_Count);
  2194.  
  2195.             else
  2196.                Check_Arg_Count (1);
  2197.             end if;
  2198.  
  2199.             Check_Optional_Identifier (Arg1, Name_Entity);
  2200.             Check_Arg_Is_Local_Name (Arg1);
  2201.  
  2202.             --  First argument must be a subprogram name
  2203.  
  2204.             Arg := Expression (Arg1);
  2205.             Find_Program_Unit_Name (Arg);
  2206.  
  2207.             if Etype (Arg) = Any_Type then
  2208.                return;
  2209.             else
  2210.                Subp := Entity (Arg);
  2211.             end if;
  2212.  
  2213.             if not (Is_Subprogram (Subp)
  2214.                      and then Is_Dispatching_Operation (Subp))
  2215.             then
  2216.                Error_Pragma_Arg
  2217.                  ("pragma% must reference a primitive operation", Arg1);
  2218.             end if;
  2219.  
  2220.             Typ := Find_Dispatching_Type (Subp);
  2221.  
  2222.             --  If only one Argument defaults are :
  2223.             --    . DTC_Entity is the default Vtable pointer
  2224.             --    . DT_Position will be set at the freezing point
  2225.  
  2226.             if Arg_Count = 1 then
  2227.                Set_DTC_Entity (Subp, Tag_Component (Typ));
  2228.                return;
  2229.             end if;
  2230.  
  2231.             --  Second argument is a component name of type Vtable_Ptr
  2232.  
  2233.             Arg := Expression (Arg2);
  2234.  
  2235.             if Nkind (Arg) /= N_Identifier then
  2236.                Error_Msg_NE ("must be a& component name", Arg, Typ);
  2237.                raise Pragma_Error;
  2238.             end if;
  2239.  
  2240.             DTC := First_Component (Typ);
  2241.             while Present (DTC) and then Chars (DTC) /= Chars (Arg) loop
  2242.                DTC := Next_Component (DTC);
  2243.             end loop;
  2244.  
  2245.             if No (DTC) then
  2246.                Error_Msg_NE ("must be a& component name", Arg, Typ);
  2247.                raise Pragma_Error;
  2248.  
  2249.             elsif Etype (DTC) /= VTP_Type then
  2250.                Wrong_Type (Arg, VTP_Type);
  2251.                return;
  2252.             end if;
  2253.  
  2254.             --  Third argument is an integer (DT_Position)
  2255.  
  2256.             Arg := Expression (Arg3);
  2257.             Analyze (Arg);
  2258.             Resolve (Arg, Any_Integer);
  2259.  
  2260.             if not Is_Static_Expression (Arg) then
  2261.                Error_Pragma_Arg
  2262.                  ("third argument of pragma% must be a static expression",
  2263.                   Arg3);
  2264.  
  2265.             else
  2266.                V := Expr_Value (Expression (Arg3));
  2267.  
  2268.                if V <= 0 then
  2269.                   Error_Pragma_Arg
  2270.                     ("third argument of pragma% must be positive",
  2271.                      Arg3);
  2272.  
  2273.                else
  2274.                   Set_DTC_Entity (Subp, DTC);
  2275.                   Set_DT_Position (Subp, V);
  2276.                end if;
  2277.             end if;
  2278.          end CPP_Virtual;
  2279.  
  2280.          ----------------
  2281.          -- CPP_Vtable --
  2282.          ----------------
  2283.  
  2284.          --  pragma CPP_Vtable (
  2285.          --    [Entity =>]       LOCAL_NAME
  2286.          --    [Vtable_Ptr =>]   LOCAL_NAME,
  2287.          --    [Entry_Count =>]  static_integer_EXPRESSION);
  2288.  
  2289.          when Pragma_CPP_Vtable => CPP_Vtable : declare
  2290.             Arg           : Node_Id;
  2291.             Typ           : Entity_Id;
  2292.             Already_a_Tag : Boolean := False;
  2293.             Comp          : Entity_Id := Empty;
  2294.             VTP_Type      : constant Entity_Id  := RTE (RE_Vtable_Ptr);
  2295.             DTC           : Entity_Id;
  2296.             V             : Uint;
  2297.             Elmt          : Elmt_Id;
  2298.  
  2299.          begin
  2300.             Check_Ada_83_Warning;
  2301.             Check_Arg_Count (3);
  2302.             Check_Optional_Identifier (Arg1, Name_Entity);
  2303.             Check_Optional_Identifier (Arg2, Name_Vtable_Ptr);
  2304.             Check_Optional_Identifier (Arg3, Name_Entry_Count);
  2305.             Check_Arg_Is_Local_Name (Arg1);
  2306.  
  2307.             --  First argument is a record type name
  2308.  
  2309.             Arg := Expression (Arg1);
  2310.             Analyze (Arg);
  2311.  
  2312.             if Etype (Arg) = Any_Type then
  2313.                return;
  2314.             else
  2315.                Typ := Entity (Arg);
  2316.             end if;
  2317.  
  2318.             if not (Is_Type (Typ) and then Is_CPP_Class (Typ)) then
  2319.                Error_Pragma_Arg ("cpp_class type expected", Arg1);
  2320.             end if;
  2321.  
  2322.             --  Second argument is a component name of type Vtable_Ptr
  2323.  
  2324.             Arg := Expression (Arg2);
  2325.  
  2326.             if Nkind (Arg) /= N_Identifier then
  2327.                Error_Msg_NE ("must be a& component name", Arg, Typ);
  2328.                raise Pragma_Error;
  2329.             end if;
  2330.  
  2331.             DTC := First_Component (Typ);
  2332.             while Present (DTC) and then Chars (DTC) /= Chars (Arg) loop
  2333.                DTC := Next_Component (DTC);
  2334.             end loop;
  2335.  
  2336.             if No (DTC) then
  2337.                Error_Msg_NE ("must be a& component name", Arg, Typ);
  2338.                raise Pragma_Error;
  2339.  
  2340.             elsif Etype (DTC) /= VTP_Type then
  2341.                Wrong_Type (DTC, VTP_Type);
  2342.                return;
  2343.  
  2344.             --  If it is the first pragma Vtable, This becomes the default tag
  2345.  
  2346.             elsif (not Is_Tag (DTC))
  2347.               and then DT_Entry_Count (Tag_Component (Typ)) = No_Uint
  2348.             then
  2349.                Set_Is_Tag (Tag_Component (Typ), False);
  2350.                Set_Is_Tag (DTC, True);
  2351.                Set_DT_Entry_Count (DTC, No_Uint);
  2352.             end if;
  2353.  
  2354.             --  Those pragmas must appear before any primitive operation
  2355.             --  definition (except inherited ones) otherwise the default
  2356.             --  may be wrong
  2357.  
  2358.             Elmt := First_Elmt (Primitive_Operations (Typ));
  2359.             while Present (Elmt) loop
  2360.                if No (Alias (Node (Elmt))) then
  2361.                   Error_Msg_Sloc := Sloc (Node (Elmt));
  2362.                   Error_Pragma
  2363.                     ("pragma% must appear before this primitive operation");
  2364.                end if;
  2365.  
  2366.                Elmt := Next_Elmt (Elmt);
  2367.             end loop;
  2368.  
  2369.             --  Third argument is an integer (DT_Entry_Count)
  2370.  
  2371.             Arg := Expression (Arg3);
  2372.             Analyze (Arg);
  2373.             Resolve (Arg, Any_Integer);
  2374.  
  2375.             if not Is_Static_Expression (Arg) then
  2376.                Error_Pragma_Arg
  2377.                  ("entry count for pragma% must be a static expression", Arg3);
  2378.  
  2379.             else
  2380.                V := Expr_Value (Expression (Arg3));
  2381.  
  2382.                if V <= 0 then
  2383.                   Error_Pragma_Arg
  2384.                     ("entry count for pragma% must be positive", Arg3);
  2385.                else
  2386.                   Set_DT_Entry_Count (DTC, V);
  2387.                end if;
  2388.             end if;
  2389.  
  2390.          end CPP_Vtable;
  2391.  
  2392.          -----------
  2393.          -- Debug --
  2394.          -----------
  2395.  
  2396.          when Pragma_Debug => Debug : begin
  2397.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  2398.  
  2399.             --  If we are not in debug mode then rewrite the pragma with
  2400.             --  a null statement and do not even analyze the pragma.
  2401.  
  2402.             if not Assertions_Enabled then
  2403.                Rewrite_Substitute_Tree (N, Make_Null_Statement (Loc));
  2404.  
  2405.             --  If we are in debug mode, then rewrite the pragma with its
  2406.             --  corresponding procedure call, and then analyze the call.
  2407.  
  2408.             else
  2409.                Rewrite_Substitute_Tree (N, New_Copy (Debug_Statement (N)));
  2410.                Analyze (N);
  2411.             end if;
  2412.          end Debug;
  2413.  
  2414.          -------------------
  2415.          -- Discard_Names --
  2416.          -------------------
  2417.  
  2418.          --  pragma Discard_Names [([On =>] LOCAL_NAME)];
  2419.  
  2420.          when Pragma_Discard_Names => Discard_Names : declare
  2421.             E_Id : Node_Id;
  2422.             E    : Entity_Id;
  2423.  
  2424.          begin
  2425.             Note_Feature (New_Representation_Pragmas, Loc);
  2426.             Check_Ada_83_Warning;
  2427.  
  2428.             --  Deal with configuration pragma case
  2429.             --  For now, ignored ???
  2430.  
  2431.             if Arg_Count = 0 and then Is_Configuration_Pragma then
  2432.                return;
  2433.  
  2434.             --  Otherwise, check correct appropriate context
  2435.  
  2436.             else
  2437.                Check_Is_In_Decl_Part_Or_Package_Spec;
  2438.  
  2439.                --  For now, ignore the case of no parameter present ???
  2440.  
  2441.                if Arg_Count = 0 then
  2442.                   return;
  2443.  
  2444.                else
  2445.                   Check_Arg_Count (1);
  2446.                   Check_Optional_Identifier (Arg1, Name_On);
  2447.                   Check_Arg_Is_Local_Name (Arg1);
  2448.                   E_Id := Expression (Arg1);
  2449.  
  2450.                   if Etype (E_Id) = Any_Type then
  2451.                      return;
  2452.                   else
  2453.                      E := Entity (E_Id);
  2454.                   end if;
  2455.  
  2456.                   if (Is_First_Subtype (E)
  2457.                        and then (Is_Enumeration_Type (E)
  2458.                                   or else Is_Tagged_Type (E)))
  2459.                     or else Ekind (E) = E_Exception
  2460.                   then
  2461.                      Set_Discard_Names (E);
  2462.                   else
  2463.                      Error_Pragma_Arg
  2464.                        ("inappropriate entity for pragma%", Arg1);
  2465.                   end if;
  2466.                end if;
  2467.             end if;
  2468.          end Discard_Names;
  2469.  
  2470.          ---------------
  2471.          -- Elaborate --
  2472.          ---------------
  2473.  
  2474.          --  pragma Elaborate (library_unit_NAME {, library_unit_NAME});
  2475.  
  2476.          when Pragma_Elaborate => Elaborate : declare
  2477.             Plist       : List_Id;
  2478.             Parent_Node : Node_Id;
  2479.             Arg         : Node_Id;
  2480.             Citem       : Node_Id;
  2481.  
  2482.          begin
  2483.             --  Pragma must be in context items list of a compilation unit
  2484.  
  2485.             if not Is_List_Member (N) then
  2486.                Pragma_Misplaced;
  2487.                return;
  2488.  
  2489.             else
  2490.                Plist := List_Containing (N);
  2491.                Parent_Node := Parent (Plist);
  2492.  
  2493.                if Parent_Node = Empty
  2494.                  or else Nkind (Parent_Node) /= N_Compilation_Unit
  2495.                  or else Context_Items (Parent_Node) /= Plist
  2496.                then
  2497.                   Pragma_Misplaced;
  2498.                   return;
  2499.                end if;
  2500.             end if;
  2501.  
  2502.             --  In Ada 83 mode, there can be no items following it in the
  2503.             --  context list except other pragmas and implicit with clauses
  2504.             --  (e.g. those added by use of Rtsfind). In Ada 95 mode, this
  2505.             --  placement rule does not apply.
  2506.  
  2507.             if Ada_83 and then Comes_From_Source (N) then
  2508.                Citem := Next (N);
  2509.  
  2510.                while Present (Citem) loop
  2511.                   if Nkind (Citem) = N_Pragma
  2512.                     or else (Nkind (Citem) = N_With_Clause
  2513.                               and then Implicit_With (Citem))
  2514.                   then
  2515.                      null;
  2516.                   else
  2517.                      Error_Pragma
  2518.                        ("(Ada 83) pragma% must be at end of context clause");
  2519.                   end if;
  2520.  
  2521.                   Citem := Next (Citem);
  2522.                end loop;
  2523.             end if;
  2524.  
  2525.             --  Finally, the arguments must all be units mentioned in a with
  2526.             --  clause in the same context clause. Note we already checked
  2527.             --  (in Par.Prag) that the arguments are either identifiers or
  2528.  
  2529.             Arg := Arg1;
  2530.             Outer : while Present (Arg) loop
  2531.                Citem := First (Plist);
  2532.  
  2533.                Inner : while Citem /= N loop
  2534.                   if Nkind (Citem) = N_With_Clause
  2535.                     and then Same_Name (Name (Citem), Expression (Arg))
  2536.                   then
  2537.                      Set_Elaborate_Present (Citem, True);
  2538.                      exit Inner;
  2539.                   end if;
  2540.  
  2541.                   Citem := Next (Citem);
  2542.                end loop Inner;
  2543.  
  2544.                if Citem = N then
  2545.                   Error_Pragma_Arg
  2546.                     ("Argument of pragma% is not with'ed unit", Arg);
  2547.                end if;
  2548.  
  2549.                Arg := Next (Arg);
  2550.             end loop Outer;
  2551.          end Elaborate;
  2552.  
  2553.          -------------------
  2554.          -- Elaborate_All --
  2555.          -------------------
  2556.  
  2557.          when Pragma_Elaborate_All => Elaborate_All : declare
  2558.             Plist       : List_Id;
  2559.             Parent_Node : Node_Id;
  2560.             Arg         : Node_Id;
  2561.             Citem       : Node_Id;
  2562.  
  2563.          begin
  2564.             --  Pragma must be in context items list of a compilation unit
  2565.  
  2566.             if not Is_List_Member (N) then
  2567.                Pragma_Misplaced;
  2568.                return;
  2569.  
  2570.             else
  2571.                Plist := List_Containing (N);
  2572.                Parent_Node := Parent (Plist);
  2573.  
  2574.                if Parent_Node = Empty
  2575.                  or else Nkind (Parent_Node) /= N_Compilation_Unit
  2576.                  or else Context_Items (Parent_Node) /= Plist
  2577.                then
  2578.                   Pragma_Misplaced;
  2579.                   return;
  2580.                end if;
  2581.             end if;
  2582.  
  2583.             --  Note: unlike pragma Elaborate, pragma Elaborate_All does not
  2584.             --  have to appear at the end of the context clause, but may
  2585.             --  appear mixed in with other items.
  2586.  
  2587.             --  Final check: the arguments must all be units mentioned in
  2588.             --  a with clause in the same context clause. Note that we
  2589.             --  already checked (in Par.Prag) that all the arguments are
  2590.             --  either identifiers or selected components.
  2591.  
  2592.             Arg := Arg1;
  2593.             Outr : while Present (Arg) loop
  2594.                Citem := First (Plist);
  2595.  
  2596.                Innr : while Citem /= N loop
  2597.                   if Nkind (Citem) = N_With_Clause
  2598.                     and then Same_Name (Name (Citem), Expression (Arg))
  2599.                   then
  2600.                      Set_Elaborate_All_Present (Citem, True);
  2601.                      exit Innr;
  2602.                   end if;
  2603.  
  2604.                   Citem := Next (Citem);
  2605.                end loop Innr;
  2606.  
  2607.                if Citem = N then
  2608.                   Error_Pragma_Arg
  2609.                     ("Argument of pragma% is not with'ed unit", Arg);
  2610.                end if;
  2611.  
  2612.                Arg := Next (Arg);
  2613.             end loop Outr;
  2614.          end Elaborate_All;
  2615.  
  2616.          --------------------
  2617.          -- Elaborate_Body --
  2618.          --------------------
  2619.  
  2620.          when Pragma_Elaborate_Body => Elaborate_Body : declare
  2621.             Plist      : List_Id;
  2622.             Cunit_Node : Node_Id;
  2623.  
  2624.          begin
  2625.             Check_Ada_83_Warning;
  2626.             Check_Valid_Library_Unit_Pragma;
  2627.             Plist := List_Containing (N);
  2628.             Cunit_Node := Parent (Plist);
  2629.  
  2630.             --  Case of pragma appearing in declarative part. Only
  2631.             --  legal if it is in a package specification.
  2632.  
  2633.             if Nkind (Cunit_Node) /= N_Compilation_Unit then
  2634.                if Nkind (Cunit_Node) = N_Package_Specification then
  2635.                   Cunit_Node := Parent (Parent (Cunit_Node));
  2636.                else
  2637.                   Pragma_Misplaced;
  2638.                   return;
  2639.                end if;
  2640.             end if;
  2641.  
  2642.             Set_Elaborate_Body_Present (Cunit_Node, True);
  2643.             Set_Body_Required (Cunit_Node, True);
  2644.          end Elaborate_Body;
  2645.  
  2646.          ----------------------
  2647.          -- Error_Monitoring --
  2648.          ----------------------
  2649.  
  2650.          when Pragma_Error_Monitoring => Error_Monitoring : declare
  2651.  
  2652.             procedure Monitoring_Off;
  2653.             --  Turn error monitoring mode off
  2654.  
  2655.             procedure Monitoring_Off is
  2656.             begin
  2657.                Error_Monitoring_On := False;
  2658.  
  2659.                if Monitored_Errors = 0 then
  2660.                   Error_Pragma ("no errors in monitored region");
  2661.  
  2662.                elsif Monitored_Message = Error_Name then
  2663.                   Error_Pragma ("incorrect error message issued");
  2664.                end if;
  2665.             end Monitoring_Off;
  2666.  
  2667.          begin
  2668.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  2669.  
  2670.             --  Error_Monitoring (ON)
  2671.  
  2672.             if Chars (Expression (Arg1)) = Name_On then
  2673.                if Error_Monitoring_On then
  2674.                   Monitoring_Off;
  2675.                end if;
  2676.  
  2677.                Error_Monitoring_On := True;
  2678.                Monitored_Errors := 0;
  2679.  
  2680.                if Arg_Count = 2 then
  2681.  
  2682.                   --  We need an entry in the names table for the given message
  2683.                   --  since that's how Errout stores error text for messages.
  2684.  
  2685.                   declare
  2686.                      Msg : constant String_Id :=
  2687.                              Expr_Value_S (Expression (Arg2));
  2688.  
  2689.                   begin
  2690.                      Name_Len := Natural (String_Length (Msg));
  2691.  
  2692.                      for J in 1 .. Name_Len loop
  2693.                         Name_Buffer (J) :=
  2694.                           Get_Character (Get_String_Char (Msg, Int (J)));
  2695.                      end loop;
  2696.  
  2697.                      Monitored_Message := Name_Find;
  2698.                   end;
  2699.  
  2700.                else
  2701.                   Monitored_Message := No_Name;
  2702.                end if;
  2703.  
  2704.             --  Error_Monitoring (OFF)
  2705.  
  2706.             else
  2707.                Monitoring_Off;
  2708.             end if;
  2709.  
  2710.          end Error_Monitoring;
  2711.  
  2712.          ------------
  2713.          -- Export --
  2714.          ------------
  2715.  
  2716.          when Pragma_Export => Export : declare
  2717.             C      : Convention_Id;
  2718.             Def_Id : Entity_Id;
  2719.  
  2720.          begin
  2721.             Note_Feature (New_Representation_Pragmas, Loc);
  2722.             Process_Convention (C, Def_Id);
  2723.  
  2724.             if Arg_Count >= 3 then
  2725.                Process_Interface_Name (Def_Id, Arg3, Arg4);
  2726.             end if;
  2727.  
  2728.             if not Is_Public (Def_Id) then
  2729.                Error_Pragma_Arg ("internal entity cannot be exported", Arg2);
  2730.             end if;
  2731.  
  2732.             --  Should there be error tests on kind of entity here ???
  2733.  
  2734.             Set_Is_Exported (Def_Id);
  2735.          end Export;
  2736.  
  2737.          ------------
  2738.          -- Import --
  2739.          ------------
  2740.  
  2741.          when Pragma_Import | Pragma_Interface => Import : declare
  2742.             C      : Convention_Id;
  2743.             Def_Id : Entity_Id;
  2744.  
  2745.          begin
  2746.             Note_Feature (New_Representation_Pragmas, Loc);
  2747.             Process_Convention (C, Def_Id);
  2748.  
  2749.             if Ekind (Def_Id) = E_Variable then
  2750.  
  2751.                --  Initialization is not allowed for imported variable
  2752.                --  The No_Location is used to mark the default initialization
  2753.                --  of access types
  2754.  
  2755.                --  Use of No_Location here is really ugly???
  2756.  
  2757.                if Present (Expression (Parent (Def_Id)))
  2758.                   and then Sloc (Expression (Parent (Def_Id))) /= No_Location
  2759.                then
  2760.                   Error_Msg_Sloc := Sloc (Def_Id);
  2761.                   Error_Pragma_Arg
  2762.                     ("no initialization allowed for declaration of& #", Arg2);
  2763.  
  2764.                else
  2765.                   Set_Is_Imported (Def_Id);
  2766.                   Set_Is_Public (Def_Id);
  2767.  
  2768.                   if Arg_Count >= 3 then
  2769.                      Process_Interface_Name (Def_Id, Arg3, Arg4);
  2770.                   end if;
  2771.                end if;
  2772.  
  2773.             elsif Is_Subprogram (Def_Id)
  2774.               or else Is_Generic_Subprogram (Def_Id)
  2775.             then
  2776.                --  If name is overloaded, pragma applies to all the
  2777.                --  denoted entities in the same declarative part.
  2778.  
  2779.                --  Ignore inherited subprograms, because the pragma will
  2780.                --  apply to the parent operation which is the one called.
  2781.  
  2782.                while Present (Def_Id) loop
  2783.                   if Is_Overloadable (Def_Id)
  2784.                     and then Present (Alias (Def_Id))
  2785.                   then
  2786.                      null;
  2787.  
  2788.                   --  What exactly is the following test for ???
  2789.  
  2790.                   elsif
  2791.                     Parent (Get_Declaration_Node (Def_Id)) /= Parent (N)
  2792.                   then
  2793.                      exit;
  2794.  
  2795.                   else
  2796.                      Set_Is_Imported (Def_Id);
  2797.  
  2798.                      --  If Import intrinsic, set intrinsic flag
  2799.                      --  and verify that it is known as such.
  2800.  
  2801.                      if C = Convention_Intrinsic then
  2802.                         Set_Is_Intrinsic_Subprogram (Def_Id);
  2803.                         Check_Intrinsic_Subprogram
  2804.                           (Def_Id, Expression (Arg2));
  2805.                      end if;
  2806.  
  2807.                      --  All interfaced procedures need an external
  2808.                      --  symbol created for them since they are
  2809.                      --  always referenced from another object file.
  2810.  
  2811.                      Set_Is_Public (Def_Id);
  2812.                      Set_Has_Completion (Def_Id);
  2813.  
  2814.                      if Arg_Count >= 3 then
  2815.                         Process_Interface_Name (Def_Id, Arg3, Arg4);
  2816.                      end if;
  2817.                   end if;
  2818.  
  2819.                   Def_Id := Homonym (Def_Id);
  2820.                end loop;
  2821.  
  2822.             else
  2823.                Error_Pragma_Arg
  2824.                  ("second argument of pragma% must be subprogram or variable",
  2825.                   Arg2);
  2826.             end if;
  2827.          end Import;
  2828.  
  2829.          ------------
  2830.          -- Inline --
  2831.          ------------
  2832.  
  2833.          when Pragma_Inline => Inline : declare
  2834.             Assoc    : Node_Id;
  2835.             Decl     : Node_Id;
  2836.             Subp_Id  : Node_Id;
  2837.             Subp     : Entity_Id;
  2838.  
  2839.             procedure Make_Inline (Subp : Entity_Id);
  2840.             --  Subp is the defining unit name of the subprogram
  2841.             --  declaration. Set the flag, as well as the flag in the
  2842.             --  corresponding boy, if there is one present.
  2843.  
  2844.             procedure Make_Inline (Subp : Entity_Id) is
  2845.                Kind : Entity_Kind := Ekind (Subp);
  2846.  
  2847.             begin
  2848.                if Etype (Subp) = Any_Type then
  2849.                   return;
  2850.  
  2851.                --  The referenced entity must either be the enclosing entity,
  2852.                --  or an entity declared within the current open scope.
  2853.  
  2854.                elsif Present (Scope (Subp))
  2855.                  and then Scope (Subp) /= Current_Scope
  2856.                  and then Subp /= Current_Scope
  2857.                then
  2858.                   Pragma_Misplaced;
  2859.                   return;
  2860.                end if;
  2861.  
  2862.                --  Processing for procedure, operator or function
  2863.  
  2864.                if Kind = E_Procedure
  2865.                  or else Kind = E_Function
  2866.                  or else Kind = E_Operator
  2867.                then
  2868.                   Set_Is_Inlined (Subp, True);
  2869.  
  2870.                   Decl := Parent (Parent (Subp));
  2871.  
  2872.                   if Nkind (Decl) = N_Subprogram_Declaration
  2873.                     and then Present (Corresponding_Body (Decl))
  2874.                   then
  2875.                      Set_Is_Inlined (Corresponding_Body (Decl), True);
  2876.                   end if;
  2877.  
  2878.                --  Don't do anything for a generic procedure or generic
  2879.                --  function. The instance will be marked inlined as
  2880.                --  required during the compilation of the instance.
  2881.  
  2882.                elsif Kind = E_Generic_Procedure
  2883.                  or else Kind = E_Generic_Function
  2884.                then
  2885.                   null;
  2886.  
  2887.                --  Literals are by definition inlined.
  2888.  
  2889.                elsif Kind = E_Enumeration_Literal then
  2890.                   null;
  2891.  
  2892.                --  Anything else is an error
  2893.  
  2894.                else
  2895.                   Error_Pragma_Arg
  2896.                     ("expect subprogram name for pragma%", Assoc);
  2897.                end if;
  2898.             end Make_Inline;
  2899.  
  2900.          begin
  2901.             Assoc := Arg1;
  2902.  
  2903.             while Present (Assoc) loop
  2904.                Subp_Id := Expression (Assoc);
  2905.                Analyze (Subp_Id);
  2906.                Subp := Entity (Subp_Id);
  2907.  
  2908.                if Subp = Any_Id then
  2909.                   null;
  2910.                else
  2911.                   Make_Inline (Subp);
  2912.  
  2913.                   while Present (Homonym (Subp))
  2914.                     and then Scope (Homonym (Subp)) = Current_Scope
  2915.                   loop
  2916.                      Make_Inline (Homonym (Subp));
  2917.                      Subp := Homonym (Subp);
  2918.                   end loop;
  2919.                end if;
  2920.  
  2921.                Assoc := Next (Assoc);
  2922.             end loop;
  2923.          end Inline;
  2924.  
  2925.          ----------------------
  2926.          -- Inspection_Point --
  2927.          ----------------------
  2928.  
  2929.          --  pragma Inspection_Point [(object_NAME {, object_NAME})];
  2930.  
  2931.          when Pragma_Inspection_Point => Inspection_Point : declare
  2932.             Arg : Node_Id;
  2933.             Exp : Node_Id;
  2934.  
  2935.          begin
  2936.             if Arg_Count < 2 then
  2937.                Check_Arg_Count (1);
  2938.             end if;
  2939.  
  2940.             Arg := Arg1;
  2941.  
  2942.             while Present (Arg) loop
  2943.                Exp := Expression (Arg);
  2944.                Analyze (Exp);
  2945.  
  2946.                if not Is_Entity_Name (Exp)
  2947.                  or else (Ekind (Entity (Exp)) /= E_Variable
  2948.                            and then Ekind (Entity (Exp)) /= E_Constant)
  2949.                then
  2950.                   Error_Pragma_Arg ("object name required", Arg);
  2951.                end if;
  2952.  
  2953.                Arg := Next (Arg);
  2954.             end loop;
  2955.          end Inspection_Point;
  2956.  
  2957.          ---------------
  2958.          -- Interface --
  2959.          ---------------
  2960.  
  2961.          --  Pragma Interface is processed by the same circuit as pragma
  2962.          --  Import (except that for Interface, the parser has verified
  2963.          --  that only two arguments are present, so the processing for
  2964.          --  the third and fourth arguments has no effect for Interface).
  2965.  
  2966.          --------------------
  2967.          -- Interface_Name --
  2968.          --------------------
  2969.  
  2970.          when Pragma_Interface_Name => Interface_Name : declare
  2971.             Id          : constant Node_Id := Expression (Arg1);
  2972.             Link_Name   : constant Node_Id := Expression (Arg2);
  2973.             Proc_Def_Id : Entity_Id;
  2974.  
  2975.          begin
  2976.             Note_Feature (Implementation_Dependent_Pragmas, Loc);
  2977.  
  2978.             Analyze (Id);
  2979.  
  2980.             --  Remaining processing is needed only if we found the name.
  2981.             --  Check that name represents a subprogram for which a pragma
  2982.             --  Interface has been given. Then process the interface name.
  2983.  
  2984.             if Etype (Id) /= Any_Type then
  2985.                Proc_Def_Id := Entity (Id);
  2986.  
  2987.                if not Is_Subprogram (Proc_Def_Id) then
  2988.                   Error_Pragma_Arg
  2989.                     ("argument of pragma% is not subprogram", Arg1);
  2990.  
  2991.                elsif not Is_Imported (Proc_Def_Id) then
  2992.                   Error_Pragma_Arg
  2993.                     ("argument of pragma% is not imported subprogram", Arg1);
  2994.                else
  2995.                   Process_Interface_Name (Proc_Def_Id, Arg2, Arg3);
  2996.                end if;
  2997.             end if;
  2998.          end Interface_Name;
  2999.  
  3000.          -----------------------
  3001.          -- Interrupt_Handler --
  3002.          -----------------------
  3003.  
  3004.          when Pragma_Interrupt_Handler =>
  3005.             Check_Ada_83_Warning;
  3006.             Check_Arg_Count (1);
  3007.             Check_No_Identifiers;
  3008.             Pragma_Not_Implemented;
  3009.  
  3010.          ------------------------
  3011.          -- Interrupt_Priority --
  3012.          ------------------------
  3013.  
  3014.          --  pragma Interrupt_Priority [(EXPRESSION)];
  3015.  
  3016.          when Pragma_Interrupt_Priority => Interrupt_Priority : declare
  3017.             P : constant Node_Id := Parent (N);
  3018.  
  3019.          begin
  3020.             Check_Ada_83_Warning;
  3021.  
  3022.             if Arg_Count /= 0 then
  3023.                Check_Arg_Count (1);
  3024.                Check_No_Identifiers;
  3025.  
  3026.                --  Set In_Default_Expression for per-object case???
  3027.  
  3028.                Analyze (Expression (Arg1));
  3029.                Resolve (Expression (Arg1), RTE (RE_Priority));
  3030.             end if;
  3031.  
  3032.             if Nkind (P) /= N_Task_Definition
  3033.               and then Nkind (P) /= N_Protected_Definition
  3034.             then
  3035.                Pragma_Misplaced;
  3036.                return;
  3037.  
  3038.             elsif Has_Priority_Pragma (P) then
  3039.                Error_Pragma ("duplicate pragma% not allowed");
  3040.  
  3041.             else
  3042.                Set_Has_Priority_Pragma (P, True);
  3043.             end if;
  3044.          end Interrupt_Priority;
  3045.  
  3046.          --------------------
  3047.          -- Linker_Options --
  3048.          --------------------
  3049.  
  3050.          --  pragma Linker_Options [string_EXPRESSION]
  3051.  
  3052.          when Pragma_Linker_Options =>
  3053.             Check_Ada_83_Warning;
  3054.             Check_Arg_Count (1);
  3055.             Check_No_Identifiers;
  3056.             Check_Static_String_Expr (Expression (Arg1));
  3057.             Store_Linker_Option_String (Expr_Value_S (Expression (Arg1)));
  3058.  
  3059.          ----------
  3060.          -- List --
  3061.          ----------
  3062.  
  3063.          --  There is nothing to do here, since we did all the processing
  3064.          --  for this pragma in Par.Prag (so that it works properly even in
  3065.          --  syntax only mode)
  3066.  
  3067.          when Pragma_List =>
  3068.             null;
  3069.  
  3070.          --------------------
  3071.          -- Locking_Policy --
  3072.          --------------------
  3073.  
  3074.          when Pragma_Locking_Policy =>
  3075.             Check_Ada_83_Warning;
  3076.             Check_Arg_Count (1);
  3077.             Check_No_Identifiers;
  3078.             Check_Arg_Is_Locking_Policy (Arg1);
  3079.  
  3080.          -----------------------
  3081.          -- Machine_Attribute --
  3082.          -----------------------
  3083.  
  3084.          --  pragma Machine_Attribute (
  3085.          --      [Attribute_Name =>] static_string_EXPRESSION
  3086.          --     ,[Entity =>]         LOCAL_NAME );
  3087.  
  3088.          when Pragma_Machine_Attribute => Machine_Attribute : declare
  3089.             Attr_Nam : Node_Id;
  3090.             Id       : Entity_Id;
  3091.             Def_Id   : Entity_Id;
  3092.  
  3093.          begin
  3094.             Note_Feature (New_Representation_Pragmas, Loc);
  3095.             Check_Ada_83_Warning;
  3096.             Check_Arg_Count (2);
  3097.             Check_Arg_Is_Local_Name (Arg2);
  3098.             Check_Optional_Identifier (Arg1, Name_Attribute_Name);
  3099.             Check_Optional_Identifier (Arg2, Name_Entity);
  3100.  
  3101.             Attr_Nam := Expression (Arg1);
  3102.             Check_Static_String_Expr (Attr_Nam);
  3103.  
  3104.             Id := Expression (Arg2);
  3105.             Analyze (Id);
  3106.             Def_Id := Entity (Id);
  3107.  
  3108.             if not Is_Subprogram (Def_Id) then
  3109.                Error_Pragma
  3110.                  ("pragma% not implemented for other than subprograms");
  3111.             end if;
  3112.  
  3113.             Set_Has_Machine_Attribute (Def_Id, True);
  3114.             Set_Machine_Attribute (Def_Id, N);
  3115.          end Machine_Attribute;
  3116.  
  3117.          -----------------
  3118.          -- Memory_Size --
  3119.          -----------------
  3120.  
  3121.          --  pragma Memory_Size (NUMERIC_LITERAL)
  3122.  
  3123.          when Pragma_Memory_Size =>
  3124.  
  3125.             --  Memory size is simply ignored
  3126.  
  3127.             Check_No_Identifiers;
  3128.             Check_Arg_Count (1);
  3129.             Check_Arg_Is_Integer_Literal (Arg1);
  3130.  
  3131.          -----------------------
  3132.          -- Normalize_Scalars --
  3133.          -----------------------
  3134.  
  3135.          --  pragma Normalize_Scalars;
  3136.  
  3137.          when Pragma_Normalize_Scalars =>
  3138.             Check_Ada_83_Warning;
  3139.             Check_Arg_Count (0);
  3140.             Pragma_Not_Implemented;
  3141.  
  3142.          --------------
  3143.          -- Optimize --
  3144.          --------------
  3145.  
  3146.          --  The actual check for optimize is done in Gigi. Note that this
  3147.          --  pragma does not actually change the optimization setting, it
  3148.          --  simply checks that it is consistent with the pragma.
  3149.  
  3150.          when Pragma_Optimize =>
  3151.             Check_No_Identifiers;
  3152.             Check_Arg_Count (1);
  3153.             Check_Arg_Is_One_Of (Arg1, Name_Time, Name_Space, Name_Off);
  3154.  
  3155.          ----------
  3156.          -- Pack --
  3157.          ----------
  3158.  
  3159.          --  pragma Pack (first_subtype_LOCAL_NAME);
  3160.  
  3161.          when Pragma_Pack => Pack : declare
  3162.             Assoc   : Node_Id := Arg1;
  3163.             Type_Id : Node_Id := Expression (Assoc);
  3164.             Typ     : Entity_Id;
  3165.             Ctyp    : Entity_Id;
  3166.  
  3167.          begin
  3168.             Check_No_Identifiers;
  3169.             Check_Arg_Count (1);
  3170.             Check_Arg_Is_Local_Name (Arg1);
  3171.  
  3172.             Find_Type (Type_Id);
  3173.             Typ := Entity (Type_Id);
  3174.  
  3175.             if Typ = Any_Type then
  3176.                return;
  3177.  
  3178.             elsif Scope (Typ) /= Current_Scope then
  3179.                Error_Pragma
  3180.                  ("pragma% does not specify type in same declarative part");
  3181.  
  3182.             --  Array type
  3183.  
  3184.             elsif Is_Array_Type (Typ) then
  3185.                Ctyp := Component_Type (Typ);
  3186.  
  3187.                --  Pragma only has an effect if component type is a scalar
  3188.                --  type with a size in the range 1..4. Also (temporary
  3189.                --  limitation) we do not implement pack for other than
  3190.                --  one dimensional arrays.
  3191.  
  3192.                if not Is_Scalar_Type (Ctyp)
  3193.                  or else Esize (Ctyp) = 0
  3194.                  or else Esize (Ctyp) > 4
  3195.                  or else Number_Dimensions (Typ) > 1
  3196.                then
  3197.                   Error_Pragma ("?pragma% has no effect");
  3198.  
  3199.                else
  3200.                   Set_Is_Packed (Typ);
  3201.                   Set_Is_Packed (Base_Type (Typ));
  3202.                   Set_Has_Non_Standard_Rep (Typ);
  3203.                end if;
  3204.  
  3205.             --  Record type
  3206.  
  3207.             elsif Is_Record_Type (Typ) then
  3208.                Set_Is_Packed (Typ);
  3209.                Set_Has_Non_Standard_Rep (Typ);
  3210.  
  3211.             --  Any other type is an error
  3212.  
  3213.             else
  3214.                Error_Pragma ("pragma% does not specify composite type");
  3215.             end if;
  3216.          end Pack;
  3217.  
  3218.          ----------
  3219.          -- Page --
  3220.          ----------
  3221.  
  3222.          --  There is nothing to do here, since we did all the processing
  3223.          --  for this pragma in Par.Prag (so that it works properly even in
  3224.          --  syntax only mode)
  3225.  
  3226.          when Pragma_Page =>
  3227.             null;
  3228.  
  3229.          ------------------
  3230.          -- Preelaborate --
  3231.          ------------------
  3232.  
  3233.          --  Set the flag Is_Preelaborated of program unit name entity
  3234.  
  3235.          when Pragma_Preelaborate => Preelaborate : declare
  3236.             Ent : Entity_Id;
  3237.             Pa : Node_Id   := Parent (N);
  3238.             Pk : Node_Kind := Nkind (Pa);
  3239.  
  3240.          begin
  3241.             Check_Ada_83_Warning;
  3242.             Check_Valid_Library_Unit_Pragma;
  3243.             Ent := Find_Lib_Unit_Name;
  3244.  
  3245.             --  This filters out pragmas inside generic parent then
  3246.             --  show up inside instantiation
  3247.  
  3248.             if Present (Ent)
  3249.               and then not (Pk = N_Package_Specification
  3250.                              and then Present (Generic_Parent (Pa)))
  3251.             then
  3252.                if not Debug_Flag_U then
  3253.                   Set_Is_Preelaborated (Ent);
  3254.                end if;
  3255.             end if;
  3256.          end Preelaborate;
  3257.  
  3258.          --------------
  3259.          -- Priority --
  3260.          --------------
  3261.  
  3262.          --  pragma Priority (EXPRESSION);
  3263.  
  3264.          when Pragma_Priority => Priority : declare
  3265.             P : constant Node_Id := Parent (N);
  3266.  
  3267.          begin
  3268.             Check_No_Identifiers;
  3269.             Check_Arg_Count (1);
  3270.  
  3271.             Analyze (Expression (Arg1));
  3272.  
  3273.             --  Subprogram case, must be static and in range System'Priority
  3274.  
  3275.             if Nkind (P) = N_Subprogram_Body then
  3276.                Resolve (Expression (Arg1), RTE (RE_Priority));
  3277.  
  3278.                if not Is_Static_Expression (Expression (Arg1)) then
  3279.                   Error_Pragma_Arg
  3280.                     ("main subprogram priority is not static", Arg1);
  3281.                end if;
  3282.  
  3283.                Set_Main_Priority
  3284.                  (Get_Sloc_Unit_Number (Loc),
  3285.                    UI_To_Int (Expr_Value (Expression (Arg1))));
  3286.  
  3287.             --  Task or Protected, must be of type Integer
  3288.  
  3289.             elsif Nkind (P) = N_Protected_Definition
  3290.               or else Nkind (P) = N_Task_Definition
  3291.             then
  3292.                Resolve (Expression (Arg1), Standard_Integer);
  3293.  
  3294.             --  Anything else is incorrect
  3295.  
  3296.             else
  3297.                Pragma_Misplaced;
  3298.             end if;
  3299.  
  3300.             if Has_Priority_Pragma (P) then
  3301.                Error_Pragma ("duplicate pragma% not allowed");
  3302.             else
  3303.                Set_Has_Priority_Pragma (P, True);
  3304.             end if;
  3305.  
  3306.          end Priority;
  3307.  
  3308.          ----------
  3309.          -- Pure --
  3310.          ----------
  3311.  
  3312.          --  Set the flag Is_Pure of program unit name entity
  3313.  
  3314.          when Pragma_Pure => Pure : declare
  3315.             Ey : Entity_Id;
  3316.             Pa : Node_Id   := Parent (N);
  3317.             Pk : Node_Kind := Nkind (Pa);
  3318.  
  3319.          begin
  3320.             Check_Ada_83_Warning;
  3321.             Check_Valid_Library_Unit_Pragma;
  3322.             Ey := Find_Lib_Unit_Name;
  3323.  
  3324.             --  This filters out pragmas inside generic parent then
  3325.             --  show up inside instantiation
  3326.  
  3327.             if Present (Ey)
  3328.               and then not (Pk = N_Package_Specification
  3329.                              and then Present (Generic_Parent (Pa)))
  3330.             then
  3331.                if not Debug_Flag_U then
  3332.                   Set_Is_Pure (Ey);
  3333.                end if;
  3334.             end if;
  3335.          end Pure;
  3336.  
  3337.          --------------------
  3338.          -- Queuing_Policy --
  3339.          --------------------
  3340.  
  3341.          when Pragma_Queuing_Policy =>
  3342.             Check_Ada_83_Warning;
  3343.             Check_Arg_Count (1);
  3344.             Check_No_Identifiers;
  3345.             Check_Arg_Is_Queuing_Policy (Arg1);
  3346.             Pragma_Not_Implemented;
  3347.  
  3348.          ---------------------------
  3349.          -- Remote_Call_Interface --
  3350.          ---------------------------
  3351.  
  3352.          --  Set the flag Is_Remote_Call_Interface of program unit name entity
  3353.  
  3354.          when Pragma_Remote_Call_Interface => Remote_Call_Interface : declare
  3355.             Ey : Entity_Id;
  3356.             Pa : Node_Id   := Parent (N);
  3357.             Pk : Node_Kind := Nkind (Pa);
  3358.  
  3359.          begin
  3360.             Check_Ada_83_Warning;
  3361.             Check_Valid_Library_Unit_Pragma;
  3362.             Ey := Find_Lib_Unit_Name;
  3363.  
  3364.             --  This filters out pragmas inside generic parent then
  3365.             --  show up inside instantiation
  3366.  
  3367.             if Present (Ey)
  3368.               and then not (Pk = N_Package_Specification
  3369.                              and then Present (Generic_Parent (Pa)))
  3370.             then
  3371.                if not Debug_Flag_U then
  3372.                   Set_Is_Remote_Call_Interface (Ey);
  3373.                end if;
  3374.             end if;
  3375.          end Remote_Call_Interface;
  3376.  
  3377.          ------------------
  3378.          -- Remote_Types --
  3379.          ------------------
  3380.  
  3381.          --  Set the flag Is_Remote_Types of program unit name entity
  3382.  
  3383.          when Pragma_Remote_Types => Remote_Types : declare
  3384.             Ey : Entity_Id;
  3385.             Pa : Node_Id   := Parent (N);
  3386.             Pk : Node_Kind := Nkind (Pa);
  3387.  
  3388.          begin
  3389.             Check_Ada_83_Warning;
  3390.             Check_Valid_Library_Unit_Pragma;
  3391.             Ey := Find_Lib_Unit_Name;
  3392.  
  3393.             --  This filters out pragmas inside generic parent then
  3394.             --  show up inside instantiation
  3395.  
  3396.             if Present (Ey)
  3397.               and then not (Pk = N_Package_Specification
  3398.                              and then Present (Generic_Parent (Pa)))
  3399.             then
  3400.                if not Debug_Flag_U then
  3401.                   Set_Is_Remote_Types (Ey);
  3402.                end if;
  3403.             end if;
  3404.          end Remote_Types;
  3405.  
  3406.          ------------------
  3407.          -- Restrictions --
  3408.          ------------------
  3409.  
  3410.          --  pragma Restrictions (RESTRICTION {, RESTRICTION});
  3411.  
  3412.          --  RESTRICTION ::=
  3413.          --    restriction_IDENTIFIER
  3414.          --  | restriction_parameter_IDENTIFIER => EXPRESSION
  3415.  
  3416.          when Pragma_Restrictions =>
  3417.             Check_Ada_83_Warning;
  3418.             Check_At_Least_One_Argument;
  3419.             Pragma_Not_Implemented;
  3420.  
  3421.          ----------------
  3422.          -- Reviewable --
  3423.          ----------------
  3424.  
  3425.          --  pragma Reviewable;
  3426.  
  3427.          when Pragma_Reviewable =>
  3428.             Check_Ada_83_Warning;
  3429.             Check_Arg_Count (0);
  3430.  
  3431.          ------------
  3432.          -- Shared --
  3433.          ------------
  3434.  
  3435.          --  pragma Shared (LOCAL_NAME);
  3436.  
  3437.          --  Processing is shared with pragma Atomic
  3438.  
  3439.          --------------------
  3440.          -- Shared_Passive --
  3441.          --------------------
  3442.  
  3443.          --  Set the flag Is_Shared_Passive of program unit name entity
  3444.  
  3445.          when Pragma_Shared_Passive => Shared_Passive : declare
  3446.             Ey : Entity_Id;
  3447.             Pa : Node_Id   := Parent (N);
  3448.             Pk : Node_Kind := Nkind (Pa);
  3449.  
  3450.          begin
  3451.             Check_Ada_83_Warning;
  3452.             Check_Valid_Library_Unit_Pragma;
  3453.             Ey := Find_Lib_Unit_Name;
  3454.  
  3455.             --  This filters out pragmas inside generic parent then
  3456.             --  show up inside instantiation
  3457.  
  3458.             if Present (Ey)
  3459.               and then not (Pk = N_Package_Specification
  3460.                              and then Present (Generic_Parent (Pa)))
  3461.             then
  3462.                if not Debug_Flag_U then
  3463.                   Set_Is_Shared_Passive (Ey);
  3464.                end if;
  3465.             end if;
  3466.          end Shared_Passive;
  3467.  
  3468.          ----------------------
  3469.          -- Source_Reference --
  3470.          ----------------------
  3471.  
  3472.          --  Nothing to do, all processing completed in Par.Prag, since we
  3473.          --  need the information for possible parser messages that are output
  3474.  
  3475.          when Pragma_Source_Reference =>
  3476.             null;
  3477.  
  3478.          ------------------
  3479.          -- Storage_Size --
  3480.          ------------------
  3481.  
  3482.          --  pragma Storage_Size (EXPRESSION);
  3483.  
  3484.          when Pragma_Storage_Size => Storage_Size : declare
  3485.             P : constant Node_Id := Parent (N);
  3486.  
  3487.          begin
  3488.             Check_No_Identifiers;
  3489.             Check_Arg_Count (1);
  3490.  
  3491.             --  Set In_Default_Expression for per-object case???
  3492.  
  3493.             Analyze (Expression (Arg1));
  3494.             Resolve (Expression (Arg1), Any_Integer);
  3495.  
  3496.             if Nkind (P) /= N_Task_Definition then
  3497.                Pragma_Misplaced;
  3498.                return;
  3499.  
  3500.             else
  3501.                if Has_Storage_Size_Pragma (P) then
  3502.                   Error_Pragma ("duplicate pragma% not allowed");
  3503.                else
  3504.                   Set_Has_Storage_Size_Pragma (P, True);
  3505.                end if;
  3506.             end if;
  3507.          end Storage_Size;
  3508.  
  3509.          ------------------
  3510.          -- Storage_Unit --
  3511.          ------------------
  3512.  
  3513.          --  pragma Storage_Unit (NUMERIC_LITERAL);
  3514.  
  3515.          --  Only permitted argument is System'Storage_Unit value
  3516.  
  3517.          when Pragma_Storage_Unit =>
  3518.             Check_No_Identifiers;
  3519.             Check_Arg_Count (1);
  3520.             Check_Arg_Is_Integer_Literal (Arg1);
  3521.  
  3522.             if Intval (Expression (Arg1)) /=
  3523.               UI_From_Int (Ttypes.System_Storage_Unit)
  3524.             then
  3525.                Error_Msg_Uint_1 := Intval (Expression (Arg1));
  3526.                Error_Pragma_Arg
  3527.                  ("the only allowed argument for pragma% is ^", Arg1);
  3528.             end if;
  3529.  
  3530.          --------------
  3531.          -- Suppress --
  3532.          --------------
  3533.  
  3534.          when Pragma_Suppress =>
  3535.             Process_Suppress_Unsuppress (True);
  3536.  
  3537.          -----------------
  3538.          -- System_Name --
  3539.          -----------------
  3540.  
  3541.          --  pragma System_Name (DIRECT_NAME);
  3542.  
  3543.          --  Syntax check: one argument, which must be the identifier GNAT
  3544.          --  or the identifier GCC, no other identifiers are acceptable.
  3545.  
  3546.          when Pragma_System_Name =>
  3547.             Check_No_Identifiers;
  3548.             Check_Arg_Count (1);
  3549.             Check_Arg_Is_One_Of (Arg1, Name_Gcc, Name_Gnat);
  3550.  
  3551.          -----------------------------
  3552.          -- Task_Dispatching_Policy --
  3553.          -----------------------------
  3554.  
  3555.          when Pragma_Task_Dispatching_Policy =>
  3556.             Check_Ada_83_Warning;
  3557.             Check_Arg_Count (1);
  3558.             Check_No_Identifiers;
  3559.             Check_Arg_Is_Task_Dispatching_Policy (Arg1);
  3560.  
  3561.          ------------------------
  3562.          -- Unimplemented_Unit --
  3563.          ------------------------
  3564.  
  3565.          --  pragma Unimplemented_Unit;
  3566.  
  3567.          --  Note: this only gives an error if we are generating code,
  3568.          --  or if we are in a generic library unit (where the pragma
  3569.          --  appears in the body, not in the spec).
  3570.  
  3571.          when Pragma_Unimplemented_Unit => Unimplemented_Unit : declare
  3572.             Cunitent : Entity_Id := Cunit_Entity (Get_Sloc_Unit_Number (Loc));
  3573.             Ent_Kind : Entity_Kind := Ekind (Cunitent);
  3574.  
  3575.          begin
  3576.             Check_Arg_Count (0);
  3577.  
  3578.             if Operating_Mode = Generate_Code
  3579.               or else Ent_Kind = E_Generic_Function
  3580.               or else Ent_Kind = E_Generic_Procedure
  3581.               or else Ent_Kind = E_Generic_Package
  3582.             then
  3583.                Error_Msg_N ("& is not implemented", Cunitent);
  3584.                raise Unrecoverable_Error;
  3585.             end if;
  3586.          end Unimplemented_Unit;
  3587.  
  3588.          ----------------
  3589.          -- Unsuppress --
  3590.          ----------------
  3591.  
  3592.          when Pragma_Unsuppress =>
  3593.             Process_Suppress_Unsuppress (False);
  3594.  
  3595.          --------------
  3596.          -- Volatile --
  3597.          --------------
  3598.  
  3599.          --  pragma Volatile (LOCAL_NAME);
  3600.  
  3601.          --  Volatile is handled by the same circuit as Atomic
  3602.  
  3603.          -------------------------
  3604.          -- Volatile_Components --
  3605.          -------------------------
  3606.  
  3607.          --  pragma Volatile_Components (array_LOCAL_NAME);
  3608.  
  3609.          --  Volatile is handled by the same circuit as Atomic_Components
  3610.  
  3611.       end case;
  3612.  
  3613.    exception
  3614.       when Pragma_Error => null;
  3615.  
  3616.    end Analyze_Pragma;
  3617.  
  3618.    ---------------------------
  3619.    -- Is_Generic_Subprogram --
  3620.    ---------------------------
  3621.  
  3622.    function Is_Generic_Subprogram (Id : Entity_Id) return Boolean is
  3623.    begin
  3624.       return  Ekind (Id) = E_Generic_Procedure
  3625.         or else Ekind (Id) = E_Generic_Function;
  3626.    end Is_Generic_Subprogram;
  3627.  
  3628.    ------------------------------
  3629.    -- Is_Pragma_String_Literal --
  3630.    ------------------------------
  3631.  
  3632.    --  This function returns true if the corresponding pragma argument is
  3633.    --  a static string expression. These are the only cases in which string
  3634.    --  literals can appear as pragma arguments. We also allow a string
  3635.    --  literal as the first argument to pragma Assert (although it will
  3636.    --  of course always generate a type error).
  3637.  
  3638.    function Is_Pragma_String_Literal (Par : Node_Id) return Boolean is
  3639.       Pragn : constant Node_Id := Parent (Par);
  3640.       Assoc : constant List_Id := Pragma_Argument_Associations (Pragn);
  3641.       Pname : constant Name_Id := Chars (Pragn);
  3642.       Argn  : Natural;
  3643.       N     : Node_Id;
  3644.  
  3645.    begin
  3646.       Argn := 1;
  3647.       N := First (Assoc);
  3648.       loop
  3649.          exit when N = Par;
  3650.          Argn := Argn + 1;
  3651.          N := Next (N);
  3652.       end loop;
  3653.  
  3654.       if Pname = Name_Assert then
  3655.          return True;
  3656.  
  3657.       elsif Pname = Name_Error_Monitoring then
  3658.          return Argn = 2;
  3659.  
  3660.       elsif Pname = Name_Export then
  3661.          return Argn > 2;
  3662.  
  3663.       elsif Pname = Name_Import then
  3664.          return Argn > 2;
  3665.  
  3666.       elsif Pname = Name_Interface_Name then
  3667.          return Argn > 1;
  3668.  
  3669.       elsif Pname = Name_Machine_Attribute then
  3670.          return Argn = 1;
  3671.  
  3672.       elsif Pname = Name_Source_Reference then
  3673.          return Argn = 2;
  3674.  
  3675.       else
  3676.          return False;
  3677.       end if;
  3678.  
  3679.    end Is_Pragma_String_Literal;
  3680.  
  3681. end Sem_Prag;
  3682.