1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                             S E M _ P R A G                              --
6--                                                                          --
7--                                 B o d y                                  --
8--                                                                          --
9--          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
10--                                                                          --
11-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17-- for  more details.  You should have  received  a copy of the GNU General --
18-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19-- http://www.gnu.org/licenses for a complete copy of the license.          --
20--                                                                          --
21-- GNAT was originally developed  by the GNAT team at  New York University. --
22-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23--                                                                          --
24------------------------------------------------------------------------------
25
26--  This unit contains the semantic processing for all pragmas, both language
27--  and implementation defined. For most pragmas, the parser only does the
28--  most basic job of checking the syntax, so Sem_Prag also contains the code
29--  to complete the syntax checks. Certain pragmas are handled partially or
30--  completely by the parser (see Par.Prag for further details).
31
32with Aspects;  use Aspects;
33with Atree;    use Atree;
34with Casing;   use Casing;
35with Checks;   use Checks;
36with Csets;    use Csets;
37with Debug;    use Debug;
38with Einfo;    use Einfo;
39with Elists;   use Elists;
40with Errout;   use Errout;
41with Exp_Dist; use Exp_Dist;
42with Exp_Util; use Exp_Util;
43with Freeze;   use Freeze;
44with Lib;      use Lib;
45with Lib.Writ; use Lib.Writ;
46with Lib.Xref; use Lib.Xref;
47with Namet.Sp; use Namet.Sp;
48with Nlists;   use Nlists;
49with Nmake;    use Nmake;
50with Output;   use Output;
51with Par_SCO;  use Par_SCO;
52with Restrict; use Restrict;
53with Rident;   use Rident;
54with Rtsfind;  use Rtsfind;
55with Sem;      use Sem;
56with Sem_Aux;  use Sem_Aux;
57with Sem_Ch3;  use Sem_Ch3;
58with Sem_Ch6;  use Sem_Ch6;
59with Sem_Ch8;  use Sem_Ch8;
60with Sem_Ch12; use Sem_Ch12;
61with Sem_Ch13; use Sem_Ch13;
62with Sem_Disp; use Sem_Disp;
63with Sem_Dist; use Sem_Dist;
64with Sem_Elim; use Sem_Elim;
65with Sem_Eval; use Sem_Eval;
66with Sem_Intr; use Sem_Intr;
67with Sem_Mech; use Sem_Mech;
68with Sem_Res;  use Sem_Res;
69with Sem_Type; use Sem_Type;
70with Sem_Util; use Sem_Util;
71with Sem_VFpt; use Sem_VFpt;
72with Sem_Warn; use Sem_Warn;
73with Stand;    use Stand;
74with Sinfo;    use Sinfo;
75with Sinfo.CN; use Sinfo.CN;
76with Sinput;   use Sinput;
77with Stringt;  use Stringt;
78with Stylesw;  use Stylesw;
79with Table;
80with Targparm; use Targparm;
81with Tbuild;   use Tbuild;
82with Ttypes;
83with Uintp;    use Uintp;
84with Uname;    use Uname;
85with Urealp;   use Urealp;
86with Validsw;  use Validsw;
87with Warnsw;   use Warnsw;
88
89package body Sem_Prag is
90
91   ----------------------------------------------
92   -- Common Handling of Import-Export Pragmas --
93   ----------------------------------------------
94
95   --  In the following section, a number of Import_xxx and Export_xxx pragmas
96   --  are defined by GNAT. These are compatible with the DEC pragmas of the
97   --  same name, and all have the following common form and processing:
98
99   --  pragma Export_xxx
100   --        [Internal                 =>] LOCAL_NAME
101   --     [, [External                 =>] EXTERNAL_SYMBOL]
102   --     [, other optional parameters   ]);
103
104   --  pragma Import_xxx
105   --        [Internal                 =>] LOCAL_NAME
106   --     [, [External                 =>] EXTERNAL_SYMBOL]
107   --     [, other optional parameters   ]);
108
109   --   EXTERNAL_SYMBOL ::=
110   --     IDENTIFIER
111   --   | static_string_EXPRESSION
112
113   --  The internal LOCAL_NAME designates the entity that is imported or
114   --  exported, and must refer to an entity in the current declarative
115   --  part (as required by the rules for LOCAL_NAME).
116
117   --  The external linker name is designated by the External parameter if
118   --  given, or the Internal parameter if not (if there is no External
119   --  parameter, the External parameter is a copy of the Internal name).
120
121   --  If the External parameter is given as a string, then this string is
122   --  treated as an external name (exactly as though it had been given as an
123   --  External_Name parameter for a normal Import pragma).
124
125   --  If the External parameter is given as an identifier (or there is no
126   --  External parameter, so that the Internal identifier is used), then
127   --  the external name is the characters of the identifier, translated
128   --  to all upper case letters for OpenVMS versions of GNAT, and to all
129   --  lower case letters for all other versions
130
131   --  Note: the external name specified or implied by any of these special
132   --  Import_xxx or Export_xxx pragmas override an external or link name
133   --  specified in a previous Import or Export pragma.
134
135   --  Note: these and all other DEC-compatible GNAT pragmas allow full use of
136   --  named notation, following the standard rules for subprogram calls, i.e.
137   --  parameters can be given in any order if named notation is used, and
138   --  positional and named notation can be mixed, subject to the rule that all
139   --  positional parameters must appear first.
140
141   --  Note: All these pragmas are implemented exactly following the DEC design
142   --  and implementation and are intended to be fully compatible with the use
143   --  of these pragmas in the DEC Ada compiler.
144
145   --------------------------------------------
146   -- Checking for Duplicated External Names --
147   --------------------------------------------
148
149   --  It is suspicious if two separate Export pragmas use the same external
150   --  name. The following table is used to diagnose this situation so that
151   --  an appropriate warning can be issued.
152
153   --  The Node_Id stored is for the N_String_Literal node created to hold
154   --  the value of the external name. The Sloc of this node is used to
155   --  cross-reference the location of the duplication.
156
157   package Externals is new Table.Table (
158     Table_Component_Type => Node_Id,
159     Table_Index_Type     => Int,
160     Table_Low_Bound      => 0,
161     Table_Initial        => 100,
162     Table_Increment      => 100,
163     Table_Name           => "Name_Externals");
164
165   -------------------------------------
166   -- Local Subprograms and Variables --
167   -------------------------------------
168
169   procedure Add_Item (Item : Entity_Id; To_List : in out Elist_Id);
170   --  Subsidiary routine to the analysis of pragmas Depends, Global and
171   --  Refined_State. Append an entity to a list. If the list is empty, create
172   --  a new list.
173
174   function Adjust_External_Name_Case (N : Node_Id) return Node_Id;
175   --  This routine is used for possible casing adjustment of an explicit
176   --  external name supplied as a string literal (the node N), according to
177   --  the casing requirement of Opt.External_Name_Casing. If this is set to
178   --  As_Is, then the string literal is returned unchanged, but if it is set
179   --  to Uppercase or Lowercase, then a new string literal with appropriate
180   --  casing is constructed.
181
182   function Appears_In (List : Elist_Id; Item_Id : Entity_Id) return Boolean;
183   --  Subsidiary to the analysis of pragma Global and pragma Depends. Query
184   --  whether a particular item appears in a mixed list of nodes and entities.
185   --  It is assumed that all nodes in the list have entities.
186
187   procedure Check_Dependence_List_Syntax (List : Node_Id);
188   --  Subsidiary to the analysis of pragmas Depends and Refined_Depends.
189   --  Verify the syntax of dependence relation List.
190
191   procedure Check_Global_List_Syntax (List : Node_Id);
192   --  Subsidiary to the analysis of pragmas Global and Refined_Global. Verify
193   --  the syntax of global list List.
194
195   procedure Check_Item_Syntax (Item : Node_Id);
196   --  Subsidiary to the analysis of pragmas Depends, Global, Initializes,
197   --  Part_Of, Refined_Depends, Refined_Depends and Refined_State. Verify the
198   --  syntax of a SPARK annotation item.
199
200   function Check_Kind (Nam : Name_Id) return Name_Id;
201   --  This function is used in connection with pragmas Assert, Check,
202   --  and assertion aspects and pragmas, to determine if Check pragmas
203   --  (or corresponding assertion aspects or pragmas) are currently active
204   --  as determined by the presence of -gnata on the command line (which
205   --  sets the default), and the appearance of pragmas Check_Policy and
206   --  Assertion_Policy as configuration pragmas either in a configuration
207   --  pragma file, or at the start of the current unit, or locally given
208   --  Check_Policy and Assertion_Policy pragmas that are currently active.
209   --
210   --  The value returned is one of the names Check, Ignore, Disable (On
211   --  returns Check, and Off returns Ignore).
212   --
213   --  Note: for assertion kinds Pre'Class, Post'Class, Invariant'Class,
214   --  and Type_Invariant'Class, the name passed is Name_uPre, Name_uPost,
215   --  Name_uInvariant, or Name_uType_Invariant, which corresponds to _Pre,
216   --  _Post, _Invariant, or _Type_Invariant, which are special names used
217   --  in identifiers to represent these attribute references.
218
219   procedure Check_SPARK_Aspect_For_ASIS (N : Node_Id);
220   --  In ASIS mode we need to analyze the original expression in the aspect
221   --  specification. For Initializes, Global, and related SPARK aspects, the
222   --  expression has a sui-generis syntax which may be a list, an expression,
223   --  or an aggregate.
224
225   procedure Check_State_And_Constituent_Use
226     (States   : Elist_Id;
227      Constits : Elist_Id;
228      Context  : Node_Id);
229   --  Subsidiary to the analysis of pragmas [Refined_]Depends, [Refined_]
230   --  Global and Initializes. Determine whether a state from list States and a
231   --  corresponding constituent from list Constits (if any) appear in the same
232   --  context denoted by Context. If this is the case, emit an error.
233
234   procedure Collect_Global_Items
235     (Prag               : Node_Id;
236      In_Items           : in out Elist_Id;
237      In_Out_Items       : in out Elist_Id;
238      Out_Items          : in out Elist_Id;
239      Proof_In_Items     : in out Elist_Id;
240      Has_In_State       : out Boolean;
241      Has_In_Out_State   : out Boolean;
242      Has_Out_State      : out Boolean;
243      Has_Proof_In_State : out Boolean;
244      Has_Null_State     : out Boolean);
245   --  Subsidiary to the analysis of pragma Refined_Depends/Refined_Global.
246   --  Prag denotes pragma [Refined_]Global. Gather all input, in out, output
247   --  and Proof_In items of Prag in lists In_Items, In_Out_Items, Out_Items
248   --  and Proof_In_Items. Flags Has_In_State, Has_In_Out_State, Has_Out_State
249   --  and Has_Proof_In_State are set when there is at least one abstract state
250   --  with visible refinement available in the corresponding mode. Flag
251   --  Has_Null_State is set when at least state has a null refinement.
252
253   procedure Collect_Subprogram_Inputs_Outputs
254     (Subp_Id      : Entity_Id;
255      Subp_Inputs  : in out Elist_Id;
256      Subp_Outputs : in out Elist_Id;
257      Global_Seen  : out Boolean);
258   --  Subsidiary to the analysis of pragma Depends, Global, Refined_Depends
259   --  and Refined_Global. Gather all inputs and outputs of subprogram Subp_Id
260   --  in lists Subp_Inputs and Subp_Outputs. If the case where the subprogram
261   --  has no inputs and/oroutputs, the returned list is No_Elist. Global_Seen
262   --  is set when the related subprogram has pragma [Refined_]Global.
263
264   function Find_Related_Subprogram_Or_Body
265     (Prag      : Node_Id;
266      Do_Checks : Boolean := False) return Node_Id;
267   --  Subsidiary to the analysis of pragmas Contract_Cases, Depends, Global,
268   --  Refined_Depends, Refined_Global and Refined_Post. Find the declaration
269   --  of the related subprogram [body or stub] subject to pragma Prag. If flag
270   --  Do_Checks is set, the routine reports duplicate pragmas and detects
271   --  improper use of refinement pragmas in stand alone expression functions.
272   --  The returned value depends on the related pragma as follows:
273   --    1) Pragmas Contract_Cases, Depends and Global yield the corresponding
274   --       N_Subprogram_Declaration node or if the pragma applies to a stand
275   --       alone body, the N_Subprogram_Body node or Empty if illegal.
276   --    2) Pragmas Refined_Depends, Refined_Global and Refined_Post yield
277   --       N_Subprogram_Body or N_Subprogram_Body_Stub nodes or Empty if
278   --       illegal.
279
280   function Get_Base_Subprogram (Def_Id : Entity_Id) return Entity_Id;
281   --  If Def_Id refers to a renamed subprogram, then the base subprogram (the
282   --  original one, following the renaming chain) is returned. Otherwise the
283   --  entity is returned unchanged. Should be in Einfo???
284
285   function Get_SPARK_Mode_Type (N : Name_Id) return SPARK_Mode_Type;
286   --  Subsidiary to the analysis of pragma SPARK_Mode as well as subprogram
287   --  Get_SPARK_Mode_Type. Convert a name into a corresponding value of type
288   --  SPARK_Mode_Type.
289
290   function Has_Extra_Parentheses (Clause : Node_Id) return Boolean;
291   --  Subsidiary to the analysis of pragmas Depends and Refined_Depends.
292   --  Determine whether dependency clause Clause is surrounded by extra
293   --  parentheses. If this is the case, issue an error message.
294
295   function Is_Unconstrained_Or_Tagged_Item (Item : Entity_Id) return Boolean;
296   --  Subsidiary to Collect_Subprogram_Inputs_Outputs and the analysis of
297   --  pragma Depends. Determine whether the type of dependency item Item is
298   --  tagged, unconstrained array, unconstrained record or a record with at
299   --  least one unconstrained component.
300
301   procedure Preanalyze_CTC_Args (N, Arg_Req, Arg_Ens : Node_Id);
302   --  Preanalyze the boolean expressions in the Requires and Ensures arguments
303   --  of a Test_Case pragma if present (possibly Empty). We treat these as
304   --  spec expressions (i.e. similar to a default expression).
305
306   procedure Record_Possible_Body_Reference
307     (State_Id : Entity_Id;
308      Ref      : Node_Id);
309   --  Subsidiary to the analysis of pragmas [Refined_]Depends and [Refined_]
310   --  Global. Given an abstract state denoted by State_Id and a reference Ref
311   --  to it, determine whether the reference appears in a package body that
312   --  will eventually refine the state. If this is the case, record the
313   --  reference for future checks (see Analyze_Refined_State_In_Decls).
314
315   procedure Resolve_State (N : Node_Id);
316   --  Handle the overloading of state names by functions. When N denotes a
317   --  function, this routine finds the corresponding state and sets the entity
318   --  of N to that of the state.
319
320   procedure Rewrite_Assertion_Kind (N : Node_Id);
321   --  If N is Pre'Class, Post'Class, Invariant'Class, or Type_Invariant'Class,
322   --  then it is rewritten as an identifier with the corresponding special
323   --  name _Pre, _Post, _Invariant, or _Type_Invariant. Used by pragmas
324   --  Check, Check_Policy.
325
326   procedure Set_Unit_Name (N : Node_Id; With_Item : Node_Id);
327   --  Place semantic information on the argument of an Elaborate/Elaborate_All
328   --  pragma. Entity name for unit and its parents is taken from item in
329   --  previous with_clause that mentions the unit.
330
331   procedure rv;
332   --  This is a dummy function called by the processing for pragma Reviewable.
333   --  It is there for assisting front end debugging. By placing a Reviewable
334   --  pragma in the source program, a breakpoint on rv catches this place in
335   --  the source, allowing convenient stepping to the point of interest.
336
337   --------------
338   -- Add_Item --
339   --------------
340
341   procedure Add_Item (Item : Entity_Id; To_List : in out Elist_Id) is
342   begin
343      if No (To_List) then
344         To_List := New_Elmt_List;
345      end if;
346
347      Append_Elmt (Item, To_List);
348   end Add_Item;
349
350   -------------------------------
351   -- Adjust_External_Name_Case --
352   -------------------------------
353
354   function Adjust_External_Name_Case (N : Node_Id) return Node_Id is
355      CC : Char_Code;
356
357   begin
358      --  Adjust case of literal if required
359
360      if Opt.External_Name_Exp_Casing = As_Is then
361         return N;
362
363      else
364         --  Copy existing string
365
366         Start_String;
367
368         --  Set proper casing
369
370         for J in 1 .. String_Length (Strval (N)) loop
371            CC := Get_String_Char (Strval (N), J);
372
373            if Opt.External_Name_Exp_Casing = Uppercase
374              and then CC >= Get_Char_Code ('a')
375              and then CC <= Get_Char_Code ('z')
376            then
377               Store_String_Char (CC - 32);
378
379            elsif Opt.External_Name_Exp_Casing = Lowercase
380              and then CC >= Get_Char_Code ('A')
381              and then CC <= Get_Char_Code ('Z')
382            then
383               Store_String_Char (CC + 32);
384
385            else
386               Store_String_Char (CC);
387            end if;
388         end loop;
389
390         return
391           Make_String_Literal (Sloc (N),
392             Strval => End_String);
393      end if;
394   end Adjust_External_Name_Case;
395
396   -----------------------------------------
397   -- Analyze_Contract_Cases_In_Decl_Part --
398   -----------------------------------------
399
400   procedure Analyze_Contract_Cases_In_Decl_Part (N : Node_Id) is
401      Others_Seen : Boolean := False;
402
403      procedure Analyze_Contract_Case (CCase : Node_Id);
404      --  Verify the legality of a single contract case
405
406      ---------------------------
407      -- Analyze_Contract_Case --
408      ---------------------------
409
410      procedure Analyze_Contract_Case (CCase : Node_Id) is
411         Case_Guard  : Node_Id;
412         Conseq      : Node_Id;
413         Extra_Guard : Node_Id;
414
415      begin
416         if Nkind (CCase) = N_Component_Association then
417            Case_Guard := First (Choices (CCase));
418            Conseq     := Expression (CCase);
419
420            --  Each contract case must have exactly one case guard
421
422            Extra_Guard := Next (Case_Guard);
423
424            if Present (Extra_Guard) then
425               Error_Msg_N
426                 ("contract case must have exactly one case guard",
427                  Extra_Guard);
428            end if;
429
430            --  Check placement of OTHERS if available (SPARK RM 6.1.3(1))
431
432            if Nkind (Case_Guard) = N_Others_Choice then
433               if Others_Seen then
434                  Error_Msg_N
435                    ("only one others choice allowed in contract cases",
436                     Case_Guard);
437               else
438                  Others_Seen := True;
439               end if;
440
441            elsif Others_Seen then
442               Error_Msg_N
443                 ("others must be the last choice in contract cases", N);
444            end if;
445
446            --  Preanalyze the case guard and consequence
447
448            if Nkind (Case_Guard) /= N_Others_Choice then
449               Preanalyze_Assert_Expression (Case_Guard, Standard_Boolean);
450            end if;
451
452            Preanalyze_Assert_Expression (Conseq, Standard_Boolean);
453
454         --  The contract case is malformed
455
456         else
457            Error_Msg_N ("wrong syntax in contract case", CCase);
458         end if;
459      end Analyze_Contract_Case;
460
461      --  Local variables
462
463      All_Cases : Node_Id;
464      CCase     : Node_Id;
465      Subp_Decl : Node_Id;
466      Subp_Id   : Entity_Id;
467
468      Restore_Scope : Boolean := False;
469      --  Gets set True if we do a Push_Scope needing a Pop_Scope on exit
470
471   --  Start of processing for Analyze_Contract_Cases_In_Decl_Part
472
473   begin
474      Set_Analyzed (N);
475
476      Subp_Decl := Find_Related_Subprogram_Or_Body (N);
477      Subp_Id   := Defining_Entity (Subp_Decl);
478      All_Cases := Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
479
480      --  Single and multiple contract cases must appear in aggregate form. If
481      --  this is not the case, then either the parser of the analysis of the
482      --  pragma failed to produce an aggregate.
483
484      pragma Assert (Nkind (All_Cases) = N_Aggregate);
485
486      if No (Component_Associations (All_Cases)) then
487         Error_Msg_N ("wrong syntax for constract cases", N);
488
489      --  Individual contract cases appear as component associations
490
491      else
492         --  Ensure that the formal parameters are visible when analyzing all
493         --  clauses. This falls out of the general rule of aspects pertaining
494         --  to subprogram declarations. Skip the installation for subprogram
495         --  bodies because the formals are already visible.
496
497         if not In_Open_Scopes (Subp_Id) then
498            Restore_Scope := True;
499            Push_Scope (Subp_Id);
500            Install_Formals (Subp_Id);
501         end if;
502
503         CCase := First (Component_Associations (All_Cases));
504         while Present (CCase) loop
505            Analyze_Contract_Case (CCase);
506            Next (CCase);
507         end loop;
508
509         if Restore_Scope then
510            End_Scope;
511         end if;
512      end if;
513   end Analyze_Contract_Cases_In_Decl_Part;
514
515   ----------------------------------
516   -- Analyze_Depends_In_Decl_Part --
517   ----------------------------------
518
519   procedure Analyze_Depends_In_Decl_Part (N : Node_Id) is
520      Loc : constant Source_Ptr := Sloc (N);
521
522      All_Inputs_Seen : Elist_Id := No_Elist;
523      --  A list containing the entities of all the inputs processed so far.
524      --  The list is populated with unique entities because the same input
525      --  may appear in multiple input lists.
526
527      All_Outputs_Seen : Elist_Id := No_Elist;
528      --  A list containing the entities of all the outputs processed so far.
529      --  The list is populated with unique entities because output items are
530      --  unique in a dependence relation.
531
532      Constits_Seen : Elist_Id := No_Elist;
533      --  A list containing the entities of all constituents processed so far.
534      --  It aids in detecting illegal usage of a state and a corresponding
535      --  constituent in pragma [Refinde_]Depends.
536
537      Global_Seen : Boolean := False;
538      --  A flag set when pragma Global has been processed
539
540      Null_Output_Seen : Boolean := False;
541      --  A flag used to track the legality of a null output
542
543      Result_Seen : Boolean := False;
544      --  A flag set when Subp_Id'Result is processed
545
546      Spec_Id : Entity_Id;
547      --  The entity of the subprogram subject to pragma [Refined_]Depends
548
549      States_Seen : Elist_Id := No_Elist;
550      --  A list containing the entities of all states processed so far. It
551      --  helps in detecting illegal usage of a state and a corresponding
552      --  constituent in pragma [Refined_]Depends.
553
554      Subp_Id : Entity_Id;
555      --  The entity of the subprogram [body or stub] subject to pragma
556      --  [Refined_]Depends.
557
558      Subp_Inputs  : Elist_Id := No_Elist;
559      Subp_Outputs : Elist_Id := No_Elist;
560      --  Two lists containing the full set of inputs and output of the related
561      --  subprograms. Note that these lists contain both nodes and entities.
562
563      procedure Add_Item_To_Name_Buffer (Item_Id : Entity_Id);
564      --  Subsidiary routine to Check_Role and Check_Usage. Add the item kind
565      --  to the name buffer. The individual kinds are as follows:
566      --    E_Abstract_State   - "state"
567      --    E_In_Parameter     - "parameter"
568      --    E_In_Out_Parameter - "parameter"
569      --    E_Out_Parameter    - "parameter"
570      --    E_Variable         - "global"
571
572      procedure Analyze_Dependency_Clause
573        (Clause  : Node_Id;
574         Is_Last : Boolean);
575      --  Verify the legality of a single dependency clause. Flag Is_Last
576      --  denotes whether Clause is the last clause in the relation.
577
578      procedure Check_Function_Return;
579      --  Verify that Funtion'Result appears as one of the outputs
580      --  (SPARK RM 6.1.5(10)).
581
582      procedure Check_Role
583        (Item     : Node_Id;
584         Item_Id  : Entity_Id;
585         Is_Input : Boolean;
586         Self_Ref : Boolean);
587      --  Ensure that an item fulfils its designated input and/or output role
588      --  as specified by pragma Global (if any) or the enclosing context. If
589      --  this is not the case, emit an error. Item and Item_Id denote the
590      --  attributes of an item. Flag Is_Input should be set when item comes
591      --  from an input list. Flag Self_Ref should be set when the item is an
592      --  output and the dependency clause has operator "+".
593
594      procedure Check_Usage
595        (Subp_Items : Elist_Id;
596         Used_Items : Elist_Id;
597         Is_Input   : Boolean);
598      --  Verify that all items from Subp_Items appear in Used_Items. Emit an
599      --  error if this is not the case.
600
601      procedure Normalize_Clause (Clause : Node_Id);
602      --  Remove a self-dependency "+" from the input list of a clause. Split
603      --  a clause with multiple outputs into multiple clauses with a single
604      --  output.
605
606      -----------------------------
607      -- Add_Item_To_Name_Buffer --
608      -----------------------------
609
610      procedure Add_Item_To_Name_Buffer (Item_Id : Entity_Id) is
611      begin
612         if Ekind (Item_Id) = E_Abstract_State then
613            Add_Str_To_Name_Buffer ("state");
614
615         elsif Is_Formal (Item_Id) then
616            Add_Str_To_Name_Buffer ("parameter");
617
618         elsif Ekind (Item_Id) = E_Variable then
619            Add_Str_To_Name_Buffer ("global");
620
621         --  The routine should not be called with non-SPARK items
622
623         else
624            raise Program_Error;
625         end if;
626      end Add_Item_To_Name_Buffer;
627
628      -------------------------------
629      -- Analyze_Dependency_Clause --
630      -------------------------------
631
632      procedure Analyze_Dependency_Clause
633        (Clause  : Node_Id;
634         Is_Last : Boolean)
635      is
636         procedure Analyze_Input_List (Inputs : Node_Id);
637         --  Verify the legality of a single input list
638
639         procedure Analyze_Input_Output
640           (Item          : Node_Id;
641            Is_Input      : Boolean;
642            Self_Ref      : Boolean;
643            Top_Level     : Boolean;
644            Seen          : in out Elist_Id;
645            Null_Seen     : in out Boolean;
646            Non_Null_Seen : in out Boolean);
647         --  Verify the legality of a single input or output item. Flag
648         --  Is_Input should be set whenever Item is an input, False when it
649         --  denotes an output. Flag Self_Ref should be set when the item is an
650         --  output and the dependency clause has a "+". Flag Top_Level should
651         --  be set whenever Item appears immediately within an input or output
652         --  list. Seen is a collection of all abstract states, variables and
653         --  formals processed so far. Flag Null_Seen denotes whether a null
654         --  input or output has been encountered. Flag Non_Null_Seen denotes
655         --  whether a non-null input or output has been encountered.
656
657         ------------------------
658         -- Analyze_Input_List --
659         ------------------------
660
661         procedure Analyze_Input_List (Inputs : Node_Id) is
662            Inputs_Seen : Elist_Id := No_Elist;
663            --  A list containing the entities of all inputs that appear in the
664            --  current input list.
665
666            Non_Null_Input_Seen : Boolean := False;
667            Null_Input_Seen     : Boolean := False;
668            --  Flags used to check the legality of an input list
669
670            Input : Node_Id;
671
672         begin
673            --  Multiple inputs appear as an aggregate
674
675            if Nkind (Inputs) = N_Aggregate then
676               if Present (Component_Associations (Inputs)) then
677                  Error_Msg_N
678                    ("nested dependency relations not allowed", Inputs);
679
680               elsif Present (Expressions (Inputs)) then
681                  Input := First (Expressions (Inputs));
682                  while Present (Input) loop
683                     Analyze_Input_Output
684                       (Item          => Input,
685                        Is_Input      => True,
686                        Self_Ref      => False,
687                        Top_Level     => False,
688                        Seen          => Inputs_Seen,
689                        Null_Seen     => Null_Input_Seen,
690                        Non_Null_Seen => Non_Null_Input_Seen);
691
692                     Next (Input);
693                  end loop;
694
695               else
696                  Error_Msg_N ("malformed input dependency list", Inputs);
697               end if;
698
699            --  Process a solitary input
700
701            else
702               Analyze_Input_Output
703                 (Item          => Inputs,
704                  Is_Input      => True,
705                  Self_Ref      => False,
706                  Top_Level     => False,
707                  Seen          => Inputs_Seen,
708                  Null_Seen     => Null_Input_Seen,
709                  Non_Null_Seen => Non_Null_Input_Seen);
710            end if;
711
712            --  Detect an illegal dependency clause of the form
713
714            --    (null =>[+] null)
715
716            if Null_Output_Seen and then Null_Input_Seen then
717               Error_Msg_N
718                 ("null dependency clause cannot have a null input list",
719                  Inputs);
720            end if;
721         end Analyze_Input_List;
722
723         --------------------------
724         -- Analyze_Input_Output --
725         --------------------------
726
727         procedure Analyze_Input_Output
728           (Item          : Node_Id;
729            Is_Input      : Boolean;
730            Self_Ref      : Boolean;
731            Top_Level     : Boolean;
732            Seen          : in out Elist_Id;
733            Null_Seen     : in out Boolean;
734            Non_Null_Seen : in out Boolean)
735         is
736            Is_Output : constant Boolean := not Is_Input;
737            Grouped   : Node_Id;
738            Item_Id   : Entity_Id;
739
740         begin
741            --  Multiple input or output items appear as an aggregate
742
743            if Nkind (Item) = N_Aggregate then
744               if not Top_Level then
745                  Error_Msg_N ("nested grouping of items not allowed", Item);
746
747               elsif Present (Component_Associations (Item)) then
748                  Error_Msg_N
749                    ("nested dependency relations not allowed", Item);
750
751               --  Recursively analyze the grouped items
752
753               elsif Present (Expressions (Item)) then
754                  Grouped := First (Expressions (Item));
755                  while Present (Grouped) loop
756                     Analyze_Input_Output
757                       (Item          => Grouped,
758                        Is_Input      => Is_Input,
759                        Self_Ref      => Self_Ref,
760                        Top_Level     => False,
761                        Seen          => Seen,
762                        Null_Seen     => Null_Seen,
763                        Non_Null_Seen => Non_Null_Seen);
764
765                     Next (Grouped);
766                  end loop;
767
768               else
769                  Error_Msg_N ("malformed dependency list", Item);
770               end if;
771
772            --  Process Function'Result in the context of a dependency clause
773
774            elsif Is_Attribute_Result (Item) then
775               Non_Null_Seen := True;
776
777               --  It is sufficent to analyze the prefix of 'Result in order to
778               --  establish legality of the attribute.
779
780               Analyze (Prefix (Item));
781
782               --  The prefix of 'Result must denote the function for which
783               --  pragma Depends applies (SPARK RM 6.1.5(11)).
784
785               if not Is_Entity_Name (Prefix (Item))
786                 or else Ekind (Spec_Id) /= E_Function
787                 or else Entity (Prefix (Item)) /= Spec_Id
788               then
789                  Error_Msg_Name_1 := Name_Result;
790                  Error_Msg_N
791                    ("prefix of attribute % must denote the enclosing "
792                     & "function", Item);
793
794               --  Function'Result is allowed to appear on the output side of a
795               --  dependency clause (SPARK RM 6.1.5(6)).
796
797               elsif Is_Input then
798                  Error_Msg_N ("function result cannot act as input", Item);
799
800               elsif Null_Seen then
801                  Error_Msg_N
802                    ("cannot mix null and non-null dependency items", Item);
803
804               else
805                  Result_Seen := True;
806               end if;
807
808            --  Detect multiple uses of null in a single dependency list or
809            --  throughout the whole relation. Verify the placement of a null
810            --  output list relative to the other clauses (SPARK RM 6.1.5(12)).
811
812            elsif Nkind (Item) = N_Null then
813               if Null_Seen then
814                  Error_Msg_N
815                    ("multiple null dependency relations not allowed", Item);
816
817               elsif Non_Null_Seen then
818                  Error_Msg_N
819                    ("cannot mix null and non-null dependency items", Item);
820
821               else
822                  Null_Seen := True;
823
824                  if Is_Output then
825                     if not Is_Last then
826                        Error_Msg_N
827                          ("null output list must be the last clause in a "
828                           & "dependency relation", Item);
829
830                     --  Catch a useless dependence of the form:
831                     --    null =>+ ...
832
833                     elsif Self_Ref then
834                        Error_Msg_N
835                          ("useless dependence, null depends on itself", Item);
836                     end if;
837                  end if;
838               end if;
839
840            --  Default case
841
842            else
843               Non_Null_Seen := True;
844
845               if Null_Seen then
846                  Error_Msg_N ("cannot mix null and non-null items", Item);
847               end if;
848
849               Analyze       (Item);
850               Resolve_State (Item);
851
852               --  Find the entity of the item. If this is a renaming, climb
853               --  the renaming chain to reach the root object. Renamings of
854               --  non-entire objects do not yield an entity (Empty).
855
856               Item_Id := Entity_Of (Item);
857
858               if Present (Item_Id) then
859                  if Ekind_In (Item_Id, E_Abstract_State,
860                                        E_In_Parameter,
861                                        E_In_Out_Parameter,
862                                        E_Out_Parameter,
863                                        E_Variable)
864                  then
865                     --  Ensure that the item fulfils its role as input and/or
866                     --  output as specified by pragma Global or the enclosing
867                     --  context.
868
869                     Check_Role (Item, Item_Id, Is_Input, Self_Ref);
870
871                     --  Detect multiple uses of the same state, variable or
872                     --  formal parameter. If this is not the case, add the
873                     --  item to the list of processed relations.
874
875                     if Contains (Seen, Item_Id) then
876                        Error_Msg_NE
877                          ("duplicate use of item &", Item, Item_Id);
878                     else
879                        Add_Item (Item_Id, Seen);
880                     end if;
881
882                     --  Detect illegal use of an input related to a null
883                     --  output. Such input items cannot appear in other
884                     --  input lists (SPARK RM 6.1.5(13)).
885
886                     if Is_Input
887                       and then Null_Output_Seen
888                       and then Contains (All_Inputs_Seen, Item_Id)
889                     then
890                        Error_Msg_N
891                          ("input of a null output list cannot appear in "
892                           & "multiple input lists", Item);
893                     end if;
894
895                     --  Add an input or a self-referential output to the list
896                     --  of all processed inputs.
897
898                     if Is_Input or else Self_Ref then
899                        Add_Item (Item_Id, All_Inputs_Seen);
900                     end if;
901
902                     --  State related checks (SPARK RM 6.1.5(3))
903
904                     if Ekind (Item_Id) = E_Abstract_State then
905                        if Has_Visible_Refinement (Item_Id) then
906                           Error_Msg_NE
907                             ("cannot mention state & in global refinement",
908                              Item, Item_Id);
909                           Error_Msg_N
910                             ("\use its constituents instead", Item);
911                           return;
912
913                        --  If the reference to the abstract state appears in
914                        --  an enclosing package body that will eventually
915                        --  refine the state, record the reference for future
916                        --  checks.
917
918                        else
919                           Record_Possible_Body_Reference
920                             (State_Id => Item_Id,
921                              Ref      => Item);
922                        end if;
923                     end if;
924
925                     --  When the item renames an entire object, replace the
926                     --  item with a reference to the object.
927
928                     if Present (Renamed_Object (Entity (Item))) then
929                        Rewrite (Item,
930                          New_Occurrence_Of (Item_Id, Sloc (Item)));
931                        Analyze (Item);
932                     end if;
933
934                     --  Add the entity of the current item to the list of
935                     --  processed items.
936
937                     if Ekind (Item_Id) = E_Abstract_State then
938                        Add_Item (Item_Id, States_Seen);
939                     end if;
940
941                     if Ekind_In (Item_Id, E_Abstract_State, E_Variable)
942                       and then Present (Encapsulating_State (Item_Id))
943                     then
944                        Add_Item (Item_Id, Constits_Seen);
945                     end if;
946
947                  --  All other input/output items are illegal
948                  --  (SPARK RM 6.1.5(1)).
949
950                  else
951                     Error_Msg_N
952                       ("item must denote parameter, variable, or state",
953                        Item);
954                  end if;
955
956               --  All other input/output items are illegal
957               --  (SPARK RM 6.1.5(1))
958
959               else
960                  Error_Msg_N
961                    ("item must denote parameter, variable, or state",
962                     Item);
963               end if;
964            end if;
965         end Analyze_Input_Output;
966
967         --  Local variables
968
969         Inputs   : Node_Id;
970         Output   : Node_Id;
971         Self_Ref : Boolean;
972
973         Non_Null_Output_Seen : Boolean := False;
974         --  Flag used to check the legality of an output list
975
976      --  Start of processing for Analyze_Dependency_Clause
977
978      begin
979         Inputs   := Expression (Clause);
980         Self_Ref := False;
981
982         --  An input list with a self-dependency appears as operator "+" where
983         --  the actuals inputs are the right operand.
984
985         if Nkind (Inputs) = N_Op_Plus then
986            Inputs   := Right_Opnd (Inputs);
987            Self_Ref := True;
988         end if;
989
990         --  Process the output_list of a dependency_clause
991
992         Output := First (Choices (Clause));
993         while Present (Output) loop
994            Analyze_Input_Output
995              (Item          => Output,
996               Is_Input      => False,
997               Self_Ref      => Self_Ref,
998               Top_Level     => True,
999               Seen          => All_Outputs_Seen,
1000               Null_Seen     => Null_Output_Seen,
1001               Non_Null_Seen => Non_Null_Output_Seen);
1002
1003            Next (Output);
1004         end loop;
1005
1006         --  Process the input_list of a dependency_clause
1007
1008         Analyze_Input_List (Inputs);
1009      end Analyze_Dependency_Clause;
1010
1011      ---------------------------
1012      -- Check_Function_Return --
1013      ---------------------------
1014
1015      procedure Check_Function_Return is
1016      begin
1017         if Ekind (Spec_Id) = E_Function and then not Result_Seen then
1018            Error_Msg_NE
1019              ("result of & must appear in exactly one output list",
1020               N, Spec_Id);
1021         end if;
1022      end Check_Function_Return;
1023
1024      ----------------
1025      -- Check_Role --
1026      ----------------
1027
1028      procedure Check_Role
1029        (Item     : Node_Id;
1030         Item_Id  : Entity_Id;
1031         Is_Input : Boolean;
1032         Self_Ref : Boolean)
1033      is
1034         procedure Find_Role
1035           (Item_Is_Input  : out Boolean;
1036            Item_Is_Output : out Boolean);
1037         --  Find the input/output role of Item_Id. Flags Item_Is_Input and
1038         --  Item_Is_Output are set depending on the role.
1039
1040         procedure Role_Error
1041           (Item_Is_Input  : Boolean;
1042            Item_Is_Output : Boolean);
1043         --  Emit an error message concerning the incorrect use of Item in
1044         --  pragma [Refined_]Depends. Flags Item_Is_Input and Item_Is_Output
1045         --  denote whether the item is an input and/or an output.
1046
1047         ---------------
1048         -- Find_Role --
1049         ---------------
1050
1051         procedure Find_Role
1052           (Item_Is_Input  : out Boolean;
1053            Item_Is_Output : out Boolean)
1054         is
1055         begin
1056            Item_Is_Input  := False;
1057            Item_Is_Output := False;
1058
1059            --  Abstract state cases
1060
1061            if Ekind (Item_Id) = E_Abstract_State then
1062
1063               --  When pragma Global is present, the mode of the state may be
1064               --  further constrained by setting a more restrictive mode.
1065
1066               if Global_Seen then
1067                  if Appears_In (Subp_Inputs, Item_Id) then
1068                     Item_Is_Input := True;
1069                  end if;
1070
1071                  if Appears_In (Subp_Outputs, Item_Id) then
1072                     Item_Is_Output := True;
1073                  end if;
1074
1075               --  Otherwise the state has a default IN OUT mode
1076
1077               else
1078                  Item_Is_Input  := True;
1079                  Item_Is_Output := True;
1080               end if;
1081
1082            --  Parameter cases
1083
1084            elsif Ekind (Item_Id) = E_In_Parameter then
1085               Item_Is_Input := True;
1086
1087            elsif Ekind (Item_Id) = E_In_Out_Parameter then
1088               Item_Is_Input  := True;
1089               Item_Is_Output := True;
1090
1091            elsif Ekind (Item_Id) = E_Out_Parameter then
1092               if Scope (Item_Id) = Spec_Id then
1093
1094                  --  An OUT parameter of the related subprogram has mode IN
1095                  --  if its type is unconstrained or tagged because array
1096                  --  bounds, discriminants or tags can be read.
1097
1098                  if Is_Unconstrained_Or_Tagged_Item (Item_Id) then
1099                     Item_Is_Input := True;
1100                  end if;
1101
1102                  Item_Is_Output := True;
1103
1104               --  An OUT parameter of an enclosing subprogram behaves as a
1105               --  read-write variable in which case the mode is IN OUT.
1106
1107               else
1108                  Item_Is_Input  := True;
1109                  Item_Is_Output := True;
1110               end if;
1111
1112            --  Variable cases
1113
1114            else pragma Assert (Ekind (Item_Id) = E_Variable);
1115
1116               --  When pragma Global is present, the mode of the variable may
1117               --  be further constrained by setting a more restrictive mode.
1118
1119               if Global_Seen then
1120
1121                  --  A variable has mode IN when its type is unconstrained or
1122                  --  tagged because array bounds, discriminants or tags can be
1123                  --  read.
1124
1125                  if Appears_In (Subp_Inputs, Item_Id)
1126                    or else Is_Unconstrained_Or_Tagged_Item (Item_Id)
1127                  then
1128                     Item_Is_Input := True;
1129                  end if;
1130
1131                  if Appears_In (Subp_Outputs, Item_Id) then
1132                     Item_Is_Output := True;
1133                  end if;
1134
1135               --  Otherwise the variable has a default IN OUT mode
1136
1137               else
1138                  Item_Is_Input  := True;
1139                  Item_Is_Output := True;
1140               end if;
1141            end if;
1142         end Find_Role;
1143
1144         ----------------
1145         -- Role_Error --
1146         ----------------
1147
1148         procedure Role_Error
1149           (Item_Is_Input  : Boolean;
1150            Item_Is_Output : Boolean)
1151         is
1152            Error_Msg : Name_Id;
1153
1154         begin
1155            Name_Len := 0;
1156
1157            --  When the item is not part of the input and the output set of
1158            --  the related subprogram, then it appears as extra in pragma
1159            --  [Refined_]Depends.
1160
1161            if not Item_Is_Input and then not Item_Is_Output then
1162               Add_Item_To_Name_Buffer (Item_Id);
1163               Add_Str_To_Name_Buffer
1164                 (" & cannot appear in dependence relation");
1165
1166               Error_Msg := Name_Find;
1167               Error_Msg_NE (Get_Name_String (Error_Msg), Item, Item_Id);
1168
1169               Error_Msg_Name_1 := Chars (Subp_Id);
1170               Error_Msg_NE
1171                 ("\& is not part of the input or output set of subprogram %",
1172                  Item, Item_Id);
1173
1174            --  The mode of the item and its role in pragma [Refined_]Depends
1175            --  are in conflict. Construct a detailed message explaining the
1176            --  illegality (SPARK RM 6.1.5(5-6)).
1177
1178            else
1179               if Item_Is_Input then
1180                  Add_Str_To_Name_Buffer ("read-only");
1181               else
1182                  Add_Str_To_Name_Buffer ("write-only");
1183               end if;
1184
1185               Add_Char_To_Name_Buffer (' ');
1186               Add_Item_To_Name_Buffer (Item_Id);
1187               Add_Str_To_Name_Buffer  (" & cannot appear as ");
1188
1189               if Item_Is_Input then
1190                  Add_Str_To_Name_Buffer ("output");
1191               else
1192                  Add_Str_To_Name_Buffer ("input");
1193               end if;
1194
1195               Add_Str_To_Name_Buffer (" in dependence relation");
1196               Error_Msg := Name_Find;
1197               Error_Msg_NE (Get_Name_String (Error_Msg), Item, Item_Id);
1198            end if;
1199         end Role_Error;
1200
1201         --  Local variables
1202
1203         Item_Is_Input  : Boolean;
1204         Item_Is_Output : Boolean;
1205
1206      --  Start of processing for Check_Role
1207
1208      begin
1209         Find_Role (Item_Is_Input, Item_Is_Output);
1210
1211         --  Input item
1212
1213         if Is_Input then
1214            if not Item_Is_Input then
1215               Role_Error (Item_Is_Input, Item_Is_Output);
1216            end if;
1217
1218         --  Self-referential item
1219
1220         elsif Self_Ref then
1221            if not Item_Is_Input or else not Item_Is_Output then
1222               Role_Error (Item_Is_Input, Item_Is_Output);
1223            end if;
1224
1225         --  Output item
1226
1227         elsif not Item_Is_Output then
1228            Role_Error (Item_Is_Input, Item_Is_Output);
1229         end if;
1230      end Check_Role;
1231
1232      -----------------
1233      -- Check_Usage --
1234      -----------------
1235
1236      procedure Check_Usage
1237        (Subp_Items : Elist_Id;
1238         Used_Items : Elist_Id;
1239         Is_Input   : Boolean)
1240      is
1241         procedure Usage_Error (Item : Node_Id; Item_Id : Entity_Id);
1242         --  Emit an error concerning the erroneous usage of an item
1243
1244         -----------------
1245         -- Usage_Error --
1246         -----------------
1247
1248         procedure Usage_Error (Item : Node_Id; Item_Id : Entity_Id) is
1249            Error_Msg : Name_Id;
1250
1251         begin
1252            --  Input case
1253
1254            if Is_Input then
1255
1256               --  Unconstrained and tagged items are not part of the explicit
1257               --  input set of the related subprogram, they do not have to be
1258               --  present in a dependence relation and should not be flagged
1259               --  (SPARK RM 6.1.5(8)).
1260
1261               if not Is_Unconstrained_Or_Tagged_Item (Item_Id) then
1262                  Name_Len := 0;
1263
1264                  Add_Item_To_Name_Buffer (Item_Id);
1265                  Add_Str_To_Name_Buffer
1266                    (" & must appear in at least one input dependence list");
1267
1268                  Error_Msg := Name_Find;
1269                  Error_Msg_NE (Get_Name_String (Error_Msg), Item, Item_Id);
1270               end if;
1271
1272            --  Output case (SPARK RM 6.1.5(10))
1273
1274            else
1275               Name_Len := 0;
1276
1277               Add_Item_To_Name_Buffer (Item_Id);
1278               Add_Str_To_Name_Buffer
1279                 (" & must appear in exactly one output dependence list");
1280
1281               Error_Msg := Name_Find;
1282               Error_Msg_NE (Get_Name_String (Error_Msg), Item, Item_Id);
1283            end if;
1284         end Usage_Error;
1285
1286         --  Local variables
1287
1288         Elmt    : Elmt_Id;
1289         Item    : Node_Id;
1290         Item_Id : Entity_Id;
1291
1292      --  Start of processing for Check_Usage
1293
1294      begin
1295         if No (Subp_Items) then
1296            return;
1297         end if;
1298
1299         --  Each input or output of the subprogram must appear in a dependency
1300         --  relation.
1301
1302         Elmt := First_Elmt (Subp_Items);
1303         while Present (Elmt) loop
1304            Item := Node (Elmt);
1305
1306            if Nkind (Item) = N_Defining_Identifier then
1307               Item_Id := Item;
1308            else
1309               Item_Id := Entity_Of (Item);
1310            end if;
1311
1312            --  The item does not appear in a dependency
1313
1314            if Present (Item_Id)
1315              and then not Contains (Used_Items, Item_Id)
1316            then
1317               if Is_Formal (Item_Id) then
1318                  Usage_Error (Item, Item_Id);
1319
1320               --  States and global variables are not used properly only when
1321               --  the subprogram is subject to pragma Global.
1322
1323               elsif Global_Seen then
1324                  Usage_Error (Item, Item_Id);
1325               end if;
1326            end if;
1327
1328            Next_Elmt (Elmt);
1329         end loop;
1330      end Check_Usage;
1331
1332      ----------------------
1333      -- Normalize_Clause --
1334      ----------------------
1335
1336      procedure Normalize_Clause (Clause : Node_Id) is
1337         procedure Create_Or_Modify_Clause
1338           (Output   : Node_Id;
1339            Outputs  : Node_Id;
1340            Inputs   : Node_Id;
1341            After    : Node_Id;
1342            In_Place : Boolean;
1343            Multiple : Boolean);
1344         --  Create a brand new clause to represent the self-reference or
1345         --  modify the input and/or output lists of an existing clause. Output
1346         --  denotes a self-referencial output. Outputs is the output list of a
1347         --  clause. Inputs is the input list of a clause. After denotes the
1348         --  clause after which the new clause is to be inserted. Flag In_Place
1349         --  should be set when normalizing the last output of an output list.
1350         --  Flag Multiple should be set when Output comes from a list with
1351         --  multiple items.
1352
1353         procedure Split_Multiple_Outputs;
1354         --  If Clause contains more than one output, split the clause into
1355         --  multiple clauses with a single output. All new clauses are added
1356         --  after Clause.
1357
1358         -----------------------------
1359         -- Create_Or_Modify_Clause --
1360         -----------------------------
1361
1362         procedure Create_Or_Modify_Clause
1363           (Output   : Node_Id;
1364            Outputs  : Node_Id;
1365            Inputs   : Node_Id;
1366            After    : Node_Id;
1367            In_Place : Boolean;
1368            Multiple : Boolean)
1369         is
1370            procedure Propagate_Output
1371              (Output : Node_Id;
1372               Inputs : Node_Id);
1373            --  Handle the various cases of output propagation to the input
1374            --  list. Output denotes a self-referencial output item. Inputs is
1375            --  the input list of a clause.
1376
1377            ----------------------
1378            -- Propagate_Output --
1379            ----------------------
1380
1381            procedure Propagate_Output
1382              (Output : Node_Id;
1383               Inputs : Node_Id)
1384            is
1385               function In_Input_List
1386                 (Item   : Entity_Id;
1387                  Inputs : List_Id) return Boolean;
1388               --  Determine whether a particulat item appears in the input
1389               --  list of a clause.
1390
1391               -------------------
1392               -- In_Input_List --
1393               -------------------
1394
1395               function In_Input_List
1396                 (Item   : Entity_Id;
1397                  Inputs : List_Id) return Boolean
1398               is
1399                  Elmt : Node_Id;
1400
1401               begin
1402                  Elmt := First (Inputs);
1403                  while Present (Elmt) loop
1404                     if Entity_Of (Elmt) = Item then
1405                        return True;
1406                     end if;
1407
1408                     Next (Elmt);
1409                  end loop;
1410
1411                  return False;
1412               end In_Input_List;
1413
1414               --  Local variables
1415
1416               Output_Id : constant Entity_Id := Entity_Of (Output);
1417               Grouped   : List_Id;
1418
1419            --  Start of processing for Propagate_Output
1420
1421            begin
1422               --  The clause is of the form:
1423
1424               --    (Output =>+ null)
1425
1426               --  Remove the null input and replace it with a copy of the
1427               --  output:
1428
1429               --    (Output => Output)
1430
1431               if Nkind (Inputs) = N_Null then
1432                  Rewrite (Inputs, New_Copy_Tree (Output));
1433
1434               --  The clause is of the form:
1435
1436               --    (Output =>+ (Input1, ..., InputN))
1437
1438               --  Determine whether the output is not already mentioned in the
1439               --  input list and if not, add it to the list of inputs:
1440
1441               --    (Output => (Output, Input1, ..., InputN))
1442
1443               elsif Nkind (Inputs) = N_Aggregate then
1444                  Grouped := Expressions (Inputs);
1445
1446                  if not In_Input_List
1447                           (Item   => Output_Id,
1448                            Inputs => Grouped)
1449                  then
1450                     Prepend_To (Grouped, New_Copy_Tree (Output));
1451                  end if;
1452
1453               --  The clause is of the form:
1454
1455               --    (Output =>+ Input)
1456
1457               --  If the input does not mention the output, group the two
1458               --  together:
1459
1460               --    (Output => (Output, Input))
1461
1462               elsif Entity_Of (Inputs) /= Output_Id then
1463                  Rewrite (Inputs,
1464                    Make_Aggregate (Loc,
1465                      Expressions => New_List (
1466                        New_Copy_Tree (Output),
1467                        New_Copy_Tree (Inputs))));
1468               end if;
1469            end Propagate_Output;
1470
1471            --  Local variables
1472
1473            Loc        : constant Source_Ptr := Sloc (Clause);
1474            New_Clause : Node_Id;
1475
1476         --  Start of processing for Create_Or_Modify_Clause
1477
1478         begin
1479            --  A null output depending on itself does not require any
1480            --  normalization.
1481
1482            if Nkind (Output) = N_Null then
1483               return;
1484
1485            --  A function result cannot depend on itself because it cannot
1486            --  appear in the input list of a relation (SPARK RM 6.1.5(10)).
1487
1488            elsif Is_Attribute_Result (Output) then
1489               Error_Msg_N ("function result cannot depend on itself", Output);
1490               return;
1491            end if;
1492
1493            --  When performing the transformation in place, simply add the
1494            --  output to the list of inputs (if not already there). This case
1495            --  arises when dealing with the last output of an output list -
1496            --  we perform the normalization in place to avoid generating a
1497            --  malformed tree.
1498
1499            if In_Place then
1500               Propagate_Output (Output, Inputs);
1501
1502               --  A list with multiple outputs is slowly trimmed until only
1503               --  one element remains. When this happens, replace the
1504               --  aggregate with the element itself.
1505
1506               if Multiple then
1507                  Remove  (Output);
1508                  Rewrite (Outputs, Output);
1509               end if;
1510
1511            --  Default case
1512
1513            else
1514               --  Unchain the output from its output list as it will appear in
1515               --  a new clause. Note that we cannot simply rewrite the output
1516               --  as null because this will violate the semantics of pragma
1517               --  Depends.
1518
1519               Remove (Output);
1520
1521               --  Generate a new clause of the form:
1522               --    (Output => Inputs)
1523
1524               New_Clause :=
1525                 Make_Component_Association (Loc,
1526                   Choices    => New_List (Output),
1527                   Expression => New_Copy_Tree (Inputs));
1528
1529               --  The new clause contains replicated content that has already
1530               --  been analyzed. There is not need to reanalyze it or
1531               --  renormalize it again.
1532
1533               Set_Analyzed (New_Clause);
1534
1535               Propagate_Output
1536                 (Output => First (Choices (New_Clause)),
1537                  Inputs => Expression (New_Clause));
1538
1539               Insert_After (After, New_Clause);
1540            end if;
1541         end Create_Or_Modify_Clause;
1542
1543         ----------------------------
1544         -- Split_Multiple_Outputs --
1545         ----------------------------
1546
1547         procedure Split_Multiple_Outputs is
1548            Inputs      : constant Node_Id    := Expression (Clause);
1549            Loc         : constant Source_Ptr := Sloc (Clause);
1550            Outputs     : constant Node_Id    := First (Choices (Clause));
1551            Last_Output : Node_Id;
1552            Next_Output : Node_Id;
1553            Output      : Node_Id;
1554            Split       : Node_Id;
1555
1556         --  Start of processing for Split_Multiple_Outputs
1557
1558         begin
1559            --  Multiple outputs appear as an aggregate. Nothing to do when
1560            --  the clause has exactly one output.
1561
1562            if Nkind (Outputs) = N_Aggregate then
1563               Last_Output := Last (Expressions (Outputs));
1564
1565               --  Create a clause for each output. Note that each time a new
1566               --  clause is created, the original output list slowly shrinks
1567               --  until there is one item left.
1568
1569               Output := First (Expressions (Outputs));
1570               while Present (Output) loop
1571                  Next_Output := Next (Output);
1572
1573                  --  Unhook the output from the original output list as it
1574                  --  will be relocated to a new clause.
1575
1576                  Remove (Output);
1577
1578                  --  Special processing for the last output. At this point
1579                  --  the original aggregate has been stripped down to one
1580                  --  element. Replace the aggregate by the element itself.
1581
1582                  if Output = Last_Output then
1583                     Rewrite (Outputs, Output);
1584
1585                  else
1586                     --  Generate a clause of the form:
1587                     --    (Output => Inputs)
1588
1589                     Split :=
1590                       Make_Component_Association (Loc,
1591                         Choices    => New_List (Output),
1592                         Expression => New_Copy_Tree (Inputs));
1593
1594                     --  The new clause contains replicated content that has
1595                     --  already been analyzed. There is not need to reanalyze
1596                     --  them.
1597
1598                     Set_Analyzed (Split);
1599                     Insert_After (Clause, Split);
1600                  end if;
1601
1602                  Output := Next_Output;
1603               end loop;
1604            end if;
1605         end Split_Multiple_Outputs;
1606
1607         --  Local variables
1608
1609         Outputs     : constant Node_Id := First (Choices (Clause));
1610         Inputs      : Node_Id;
1611         Last_Output : Node_Id;
1612         Next_Output : Node_Id;
1613         Output      : Node_Id;
1614
1615      --  Start of processing for Normalize_Clause
1616
1617      begin
1618         --  A self-dependency appears as operator "+". Remove the "+" from the
1619         --  tree by moving the real inputs to their proper place.
1620
1621         if Nkind (Expression (Clause)) = N_Op_Plus then
1622            Rewrite (Expression (Clause), Right_Opnd (Expression (Clause)));
1623            Inputs := Expression (Clause);
1624
1625            --  Multiple outputs appear as an aggregate
1626
1627            if Nkind (Outputs) = N_Aggregate then
1628               Last_Output := Last (Expressions (Outputs));
1629
1630               Output := First (Expressions (Outputs));
1631               while Present (Output) loop
1632
1633                  --  Normalization may remove an output from its list,
1634                  --  preserve the subsequent output now.
1635
1636                  Next_Output := Next (Output);
1637
1638                  Create_Or_Modify_Clause
1639                    (Output   => Output,
1640                     Outputs  => Outputs,
1641                     Inputs   => Inputs,
1642                     After    => Clause,
1643                     In_Place => Output = Last_Output,
1644                     Multiple => True);
1645
1646                  Output := Next_Output;
1647               end loop;
1648
1649            --  Solitary output
1650
1651            else
1652               Create_Or_Modify_Clause
1653                 (Output   => Outputs,
1654                  Outputs  => Empty,
1655                  Inputs   => Inputs,
1656                  After    => Empty,
1657                  In_Place => True,
1658                  Multiple => False);
1659            end if;
1660         end if;
1661
1662         --  Split a clause with multiple outputs into multiple clauses with a
1663         --  single output.
1664
1665         Split_Multiple_Outputs;
1666      end Normalize_Clause;
1667
1668      --  Local variables
1669
1670      Deps        : constant Node_Id :=
1671                      Get_Pragma_Arg
1672                        (First (Pragma_Argument_Associations (N)));
1673      Clause      : Node_Id;
1674      Errors      : Nat;
1675      Last_Clause : Node_Id;
1676      Subp_Decl   : Node_Id;
1677
1678      Restore_Scope : Boolean := False;
1679      --  Gets set True if we do a Push_Scope needing a Pop_Scope on exit
1680
1681   --  Start of processing for Analyze_Depends_In_Decl_Part
1682
1683   begin
1684      Set_Analyzed (N);
1685
1686      --  Verify the syntax of pragma Depends when SPARK checks are suppressed.
1687      --  Semantic analysis and normalization are disabled in this mode.
1688
1689      if SPARK_Mode = Off then
1690         Check_Dependence_List_Syntax (Deps);
1691         return;
1692      end if;
1693
1694      Subp_Decl := Find_Related_Subprogram_Or_Body (N);
1695      Subp_Id   := Defining_Entity (Subp_Decl);
1696
1697      --  The logic in this routine is used to analyze both pragma Depends and
1698      --  pragma Refined_Depends since they have the same syntax and base
1699      --  semantics. Find the entity of the corresponding spec when analyzing
1700      --  Refined_Depends.
1701
1702      if Nkind (Subp_Decl) = N_Subprogram_Body
1703        and then not Acts_As_Spec (Subp_Decl)
1704      then
1705         Spec_Id := Corresponding_Spec (Subp_Decl);
1706
1707      elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub then
1708         Spec_Id := Corresponding_Spec_Of_Stub (Subp_Decl);
1709
1710      else
1711         Spec_Id := Subp_Id;
1712      end if;
1713
1714      --  Empty dependency list
1715
1716      if Nkind (Deps) = N_Null then
1717
1718         --  Gather all states, variables and formal parameters that the
1719         --  subprogram may depend on. These items are obtained from the
1720         --  parameter profile or pragma [Refined_]Global (if available).
1721
1722         Collect_Subprogram_Inputs_Outputs
1723           (Subp_Id      => Subp_Id,
1724            Subp_Inputs  => Subp_Inputs,
1725            Subp_Outputs => Subp_Outputs,
1726            Global_Seen  => Global_Seen);
1727
1728         --  Verify that every input or output of the subprogram appear in a
1729         --  dependency.
1730
1731         Check_Usage (Subp_Inputs, All_Inputs_Seen, True);
1732         Check_Usage (Subp_Outputs, All_Outputs_Seen, False);
1733         Check_Function_Return;
1734
1735      --  Dependency clauses appear as component associations of an aggregate
1736
1737      elsif Nkind (Deps) = N_Aggregate then
1738
1739         --  Do not attempt to perform analysis of a syntactically illegal
1740         --  clause as this will lead to misleading errors.
1741
1742         if Has_Extra_Parentheses (Deps) then
1743            return;
1744         end if;
1745
1746         if Present (Component_Associations (Deps)) then
1747            Last_Clause := Last (Component_Associations (Deps));
1748
1749            --  Gather all states, variables and formal parameters that the
1750            --  subprogram may depend on. These items are obtained from the
1751            --  parameter profile or pragma [Refined_]Global (if available).
1752
1753            Collect_Subprogram_Inputs_Outputs
1754              (Subp_Id      => Subp_Id,
1755               Subp_Inputs  => Subp_Inputs,
1756               Subp_Outputs => Subp_Outputs,
1757               Global_Seen  => Global_Seen);
1758
1759            --  Ensure that the formal parameters are visible when analyzing
1760            --  all clauses. This falls out of the general rule of aspects
1761            --  pertaining to subprogram declarations. Skip the installation
1762            --  for subprogram bodies because the formals are already visible.
1763
1764            if not In_Open_Scopes (Spec_Id) then
1765               Restore_Scope := True;
1766               Push_Scope (Spec_Id);
1767               Install_Formals (Spec_Id);
1768            end if;
1769
1770            Clause := First (Component_Associations (Deps));
1771            while Present (Clause) loop
1772               Errors := Serious_Errors_Detected;
1773
1774               --  Normalization may create extra clauses that contain
1775               --  replicated input and output names. There is no need to
1776               --  reanalyze them.
1777
1778               if not Analyzed (Clause) then
1779                  Set_Analyzed (Clause);
1780
1781                  Analyze_Dependency_Clause
1782                    (Clause  => Clause,
1783                     Is_Last => Clause = Last_Clause);
1784               end if;
1785
1786               --  Do not normalize an erroneous clause because the inputs
1787               --  and/or outputs may denote illegal items. Normalization is
1788               --  disabled in ASIS mode as it alters the tree by introducing
1789               --  new nodes similar to expansion.
1790
1791               if Serious_Errors_Detected = Errors and then not ASIS_Mode then
1792                  Normalize_Clause (Clause);
1793               end if;
1794
1795               Next (Clause);
1796            end loop;
1797
1798            if Restore_Scope then
1799               End_Scope;
1800            end if;
1801
1802            --  Verify that every input or output of the subprogram appear in a
1803            --  dependency.
1804
1805            Check_Usage (Subp_Inputs, All_Inputs_Seen, True);
1806            Check_Usage (Subp_Outputs, All_Outputs_Seen, False);
1807            Check_Function_Return;
1808
1809         --  The dependency list is malformed
1810
1811         else
1812            Error_Msg_N ("malformed dependency relation", Deps);
1813            return;
1814         end if;
1815
1816      --  The top level dependency relation is malformed
1817
1818      else
1819         Error_Msg_N ("malformed dependency relation", Deps);
1820         return;
1821      end if;
1822
1823      --  Ensure that a state and a corresponding constituent do not appear
1824      --  together in pragma [Refined_]Depends.
1825
1826      Check_State_And_Constituent_Use
1827        (States   => States_Seen,
1828         Constits => Constits_Seen,
1829         Context  => N);
1830   end Analyze_Depends_In_Decl_Part;
1831
1832   --------------------------------------------
1833   -- Analyze_External_Property_In_Decl_Part --
1834   --------------------------------------------
1835
1836   procedure Analyze_External_Property_In_Decl_Part
1837     (N        : Node_Id;
1838      Expr_Val : out Boolean)
1839   is
1840      Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
1841      Obj  : constant Node_Id := Get_Pragma_Arg (Arg1);
1842      Expr : constant Node_Id := Get_Pragma_Arg (Next (Arg1));
1843
1844   begin
1845      Error_Msg_Name_1 := Pragma_Name (N);
1846
1847      --  The Async / Effective pragmas must apply to a volatile object other
1848      --  than a formal subprogram parameter (SPARK RM 7.1.3(2)).
1849
1850      if Is_SPARK_Volatile_Object (Obj) then
1851         if Is_Entity_Name (Obj)
1852           and then Present (Entity (Obj))
1853           and then Is_Formal (Entity (Obj))
1854         then
1855            Error_Msg_N ("external property % cannot apply to parameter", N);
1856         end if;
1857      else
1858         Error_Msg_N
1859           ("external property % must apply to a volatile object", N);
1860      end if;
1861
1862      --  Ensure that the expression (if present) is static Boolean. A missing
1863      --  argument defaults the value to True (SPARK RM 7.1.2(5)).
1864
1865      Expr_Val := True;
1866
1867      if Present (Expr) then
1868         Analyze_And_Resolve (Expr, Standard_Boolean);
1869
1870         if Is_Static_Expression (Expr) then
1871            Expr_Val := Is_True (Expr_Value (Expr));
1872         else
1873            Error_Msg_Name_1 := Pragma_Name (N);
1874            Error_Msg_N ("expression of % must be static", Expr);
1875         end if;
1876      end if;
1877   end Analyze_External_Property_In_Decl_Part;
1878
1879   ---------------------------------
1880   -- Analyze_Global_In_Decl_Part --
1881   ---------------------------------
1882
1883   procedure Analyze_Global_In_Decl_Part (N : Node_Id) is
1884      Constits_Seen : Elist_Id := No_Elist;
1885      --  A list containing the entities of all constituents processed so far.
1886      --  It aids in detecting illegal usage of a state and a corresponding
1887      --  constituent in pragma [Refinde_]Global.
1888
1889      Seen : Elist_Id := No_Elist;
1890      --  A list containing the entities of all the items processed so far. It
1891      --  plays a role in detecting distinct entities.
1892
1893      Spec_Id : Entity_Id;
1894      --  The entity of the subprogram subject to pragma [Refined_]Global
1895
1896      States_Seen : Elist_Id := No_Elist;
1897      --  A list containing the entities of all states processed so far. It
1898      --  helps in detecting illegal usage of a state and a corresponding
1899      --  constituent in pragma [Refined_]Global.
1900
1901      Subp_Id : Entity_Id;
1902      --  The entity of the subprogram [body or stub] subject to pragma
1903      --  [Refined_]Global.
1904
1905      In_Out_Seen : Boolean := False;
1906      Input_Seen  : Boolean := False;
1907      Output_Seen : Boolean := False;
1908      Proof_Seen  : Boolean := False;
1909      --  Flags used to verify the consistency of modes
1910
1911      procedure Analyze_Global_List
1912        (List        : Node_Id;
1913         Global_Mode : Name_Id := Name_Input);
1914      --  Verify the legality of a single global list declaration. Global_Mode
1915      --  denotes the current mode in effect.
1916
1917      -------------------------
1918      -- Analyze_Global_List --
1919      -------------------------
1920
1921      procedure Analyze_Global_List
1922        (List        : Node_Id;
1923         Global_Mode : Name_Id := Name_Input)
1924      is
1925         procedure Analyze_Global_Item
1926           (Item        : Node_Id;
1927            Global_Mode : Name_Id);
1928         --  Verify the legality of a single global item declaration.
1929         --  Global_Mode denotes the current mode in effect.
1930
1931         procedure Check_Duplicate_Mode
1932           (Mode   : Node_Id;
1933            Status : in out Boolean);
1934         --  Flag Status denotes whether a particular mode has been seen while
1935         --  processing a global list. This routine verifies that Mode is not a
1936         --  duplicate mode and sets the flag Status (SPARK RM 6.1.4(9)).
1937
1938         procedure Check_Mode_Restriction_In_Enclosing_Context
1939           (Item    : Node_Id;
1940            Item_Id : Entity_Id);
1941         --  Verify that an item of mode In_Out or Output does not appear as an
1942         --  input in the Global aspect of an enclosing subprogram. If this is
1943         --  the case, emit an error. Item and Item_Id are respectively the
1944         --  item and its entity.
1945
1946         procedure Check_Mode_Restriction_In_Function (Mode : Node_Id);
1947         --  Mode denotes either In_Out or Output. Depending on the kind of the
1948         --  related subprogram, emit an error if those two modes apply to a
1949         --  function (SPARK RM 6.1.4(10)).
1950
1951         -------------------------
1952         -- Analyze_Global_Item --
1953         -------------------------
1954
1955         procedure Analyze_Global_Item
1956           (Item        : Node_Id;
1957            Global_Mode : Name_Id)
1958         is
1959            Item_Id : Entity_Id;
1960
1961         begin
1962            --  Detect one of the following cases
1963
1964            --    with Global => (null, Name)
1965            --    with Global => (Name_1, null, Name_2)
1966            --    with Global => (Name, null)
1967
1968            if Nkind (Item) = N_Null then
1969               Error_Msg_N ("cannot mix null and non-null global items", Item);
1970               return;
1971            end if;
1972
1973            Analyze       (Item);
1974            Resolve_State (Item);
1975
1976            --  Find the entity of the item. If this is a renaming, climb the
1977            --  renaming chain to reach the root object. Renamings of non-
1978            --  entire objects do not yield an entity (Empty).
1979
1980            Item_Id := Entity_Of (Item);
1981
1982            if Present (Item_Id) then
1983
1984               --  A global item may denote a formal parameter of an enclosing
1985               --  subprogram (SPARK RM 6.1.4(6)). Do this check first to
1986               --  provide a better error diagnostic.
1987
1988               if Is_Formal (Item_Id) then
1989                  if Scope (Item_Id) = Spec_Id then
1990                     Error_Msg_NE
1991                       ("global item cannot reference parameter of subprogram",
1992                        Item, Spec_Id);
1993                     return;
1994                  end if;
1995
1996               --  A constant cannot act as a global item (SPARK RM 6.1.4(7)).
1997               --  Do this check first to provide a better error diagnostic.
1998
1999               elsif Ekind (Item_Id) = E_Constant then
2000                  Error_Msg_N ("global item cannot denote a constant", Item);
2001
2002               --  The only legal references are those to abstract states and
2003               --  variables (SPARK RM 6.1.4(4)).
2004
2005               elsif not Ekind_In (Item_Id, E_Abstract_State, E_Variable) then
2006                  Error_Msg_N
2007                    ("global item must denote variable or state", Item);
2008                  return;
2009               end if;
2010
2011               --  State related checks
2012
2013               if Ekind (Item_Id) = E_Abstract_State then
2014
2015                  --  An abstract state with visible refinement cannot appear
2016                  --  in pragma [Refined_]Global as its place must be taken by
2017                  --  some of its constituents (SPARK RM 6.1.4(8)).
2018
2019                  if Has_Visible_Refinement (Item_Id) then
2020                     Error_Msg_NE
2021                       ("cannot mention state & in global refinement",
2022                        Item, Item_Id);
2023                     Error_Msg_N ("\use its constituents instead", Item);
2024                     return;
2025
2026                  --  If the reference to the abstract state appears in an
2027                  --  enclosing package body that will eventually refine the
2028                  --  state, record the reference for future checks.
2029
2030                  else
2031                     Record_Possible_Body_Reference
2032                       (State_Id => Item_Id,
2033                        Ref      => Item);
2034                  end if;
2035
2036               --  Variable related checks. These are only relevant when
2037               --  SPARK_Mode is on as they are not standard Ada legality
2038               --  rules.
2039
2040               elsif SPARK_Mode = On
2041                 and then Is_SPARK_Volatile_Object (Item_Id)
2042               then
2043                  --  A volatile object cannot appear as a global item of a
2044                  --  function (SPARK RM 7.1.3(9)).
2045
2046                  if Ekind_In (Spec_Id, E_Function, E_Generic_Function) then
2047                     Error_Msg_NE
2048                       ("volatile object & cannot act as global item of a "
2049                        & "function", Item, Item_Id);
2050                     return;
2051
2052                  --  A volatile object with property Effective_Reads set to
2053                  --  True must have mode Output or In_Out.
2054
2055                  elsif Effective_Reads_Enabled (Item_Id)
2056                    and then Global_Mode = Name_Input
2057                  then
2058                     Error_Msg_NE
2059                       ("volatile object & with property Effective_Reads must "
2060                        & "have mode In_Out or Output (SPARK RM 7.1.3(11))",
2061                        Item, Item_Id);
2062                     return;
2063                  end if;
2064               end if;
2065
2066               --  When the item renames an entire object, replace the item
2067               --  with a reference to the object.
2068
2069               if Present (Renamed_Object (Entity (Item))) then
2070                  Rewrite (Item, New_Occurrence_Of (Item_Id, Sloc (Item)));
2071                  Analyze (Item);
2072               end if;
2073
2074            --  Some form of illegal construct masquerading as a name
2075            --  (SPARK RM 6.1.4(4)).
2076
2077            else
2078               Error_Msg_N ("global item must denote variable or state", Item);
2079               return;
2080            end if;
2081
2082            --  Verify that an output does not appear as an input in an
2083            --  enclosing subprogram.
2084
2085            if Nam_In (Global_Mode, Name_In_Out, Name_Output) then
2086               Check_Mode_Restriction_In_Enclosing_Context (Item, Item_Id);
2087            end if;
2088
2089            --  The same entity might be referenced through various way.
2090            --  Check the entity of the item rather than the item itself
2091            --  (SPARK RM 6.1.4(11)).
2092
2093            if Contains (Seen, Item_Id) then
2094               Error_Msg_N ("duplicate global item", Item);
2095
2096            --  Add the entity of the current item to the list of processed
2097            --  items.
2098
2099            else
2100               Add_Item (Item_Id, Seen);
2101
2102               if Ekind (Item_Id) = E_Abstract_State then
2103                  Add_Item (Item_Id, States_Seen);
2104               end if;
2105
2106               if Ekind_In (Item_Id, E_Abstract_State, E_Variable)
2107                 and then Present (Encapsulating_State (Item_Id))
2108               then
2109                  Add_Item (Item_Id, Constits_Seen);
2110               end if;
2111            end if;
2112         end Analyze_Global_Item;
2113
2114         --------------------------
2115         -- Check_Duplicate_Mode --
2116         --------------------------
2117
2118         procedure Check_Duplicate_Mode
2119           (Mode   : Node_Id;
2120            Status : in out Boolean)
2121         is
2122         begin
2123            if Status then
2124               Error_Msg_N ("duplicate global mode", Mode);
2125            end if;
2126
2127            Status := True;
2128         end Check_Duplicate_Mode;
2129
2130         -------------------------------------------------
2131         -- Check_Mode_Restriction_In_Enclosing_Context --
2132         -------------------------------------------------
2133
2134         procedure Check_Mode_Restriction_In_Enclosing_Context
2135           (Item    : Node_Id;
2136            Item_Id : Entity_Id)
2137         is
2138            Context : Entity_Id;
2139            Dummy   : Boolean;
2140            Inputs  : Elist_Id := No_Elist;
2141            Outputs : Elist_Id := No_Elist;
2142
2143         begin
2144            --  Traverse the scope stack looking for enclosing subprograms
2145            --  subject to pragma [Refined_]Global.
2146
2147            Context := Scope (Subp_Id);
2148            while Present (Context) and then Context /= Standard_Standard loop
2149               if Is_Subprogram (Context)
2150                 and then
2151                   (Present (Get_Pragma (Context, Pragma_Global))
2152                      or else
2153                    Present (Get_Pragma (Context, Pragma_Refined_Global)))
2154               then
2155                  Collect_Subprogram_Inputs_Outputs
2156                    (Subp_Id      => Context,
2157                     Subp_Inputs  => Inputs,
2158                     Subp_Outputs => Outputs,
2159                     Global_Seen  => Dummy);
2160
2161                  --  The item is classified as In_Out or Output but appears as
2162                  --  an Input in an enclosing subprogram (SPARK RM 6.1.4(12)).
2163
2164                  if Appears_In (Inputs, Item_Id)
2165                    and then not Appears_In (Outputs, Item_Id)
2166                  then
2167                     Error_Msg_NE
2168                       ("global item & cannot have mode In_Out or Output",
2169                        Item, Item_Id);
2170                     Error_Msg_NE
2171                       ("\item already appears as input of subprogram &",
2172                        Item, Context);
2173
2174                     --  Stop the traversal once an error has been detected
2175
2176                     exit;
2177                  end if;
2178               end if;
2179
2180               Context := Scope (Context);
2181            end loop;
2182         end Check_Mode_Restriction_In_Enclosing_Context;
2183
2184         ----------------------------------------
2185         -- Check_Mode_Restriction_In_Function --
2186         ----------------------------------------
2187
2188         procedure Check_Mode_Restriction_In_Function (Mode : Node_Id) is
2189         begin
2190            if Ekind (Spec_Id) = E_Function then
2191               Error_Msg_N
2192                 ("global mode & is not applicable to functions", Mode);
2193            end if;
2194         end Check_Mode_Restriction_In_Function;
2195
2196         --  Local variables
2197
2198         Assoc : Node_Id;
2199         Item  : Node_Id;
2200         Mode  : Node_Id;
2201
2202      --  Start of processing for Analyze_Global_List
2203
2204      begin
2205         if Nkind (List) = N_Null then
2206            Set_Analyzed (List);
2207
2208         --  Single global item declaration
2209
2210         elsif Nkind_In (List, N_Expanded_Name,
2211                               N_Identifier,
2212                               N_Selected_Component)
2213         then
2214            Analyze_Global_Item (List, Global_Mode);
2215
2216         --  Simple global list or moded global list declaration
2217
2218         elsif Nkind (List) = N_Aggregate then
2219            Set_Analyzed (List);
2220
2221            --  The declaration of a simple global list appear as a collection
2222            --  of expressions.
2223
2224            if Present (Expressions (List)) then
2225               if Present (Component_Associations (List)) then
2226                  Error_Msg_N
2227                    ("cannot mix moded and non-moded global lists", List);
2228               end if;
2229
2230               Item := First (Expressions (List));
2231               while Present (Item) loop
2232                  Analyze_Global_Item (Item, Global_Mode);
2233
2234                  Next (Item);
2235               end loop;
2236
2237            --  The declaration of a moded global list appears as a collection
2238            --  of component associations where individual choices denote
2239            --  modes.
2240
2241            elsif Present (Component_Associations (List)) then
2242               if Present (Expressions (List)) then
2243                  Error_Msg_N
2244                    ("cannot mix moded and non-moded global lists", List);
2245               end if;
2246
2247               Assoc := First (Component_Associations (List));
2248               while Present (Assoc) loop
2249                  Mode := First (Choices (Assoc));
2250
2251                  if Nkind (Mode) = N_Identifier then
2252                     if Chars (Mode) = Name_In_Out then
2253                        Check_Duplicate_Mode (Mode, In_Out_Seen);
2254                        Check_Mode_Restriction_In_Function (Mode);
2255
2256                     elsif Chars (Mode) = Name_Input then
2257                        Check_Duplicate_Mode (Mode, Input_Seen);
2258
2259                     elsif Chars (Mode) = Name_Output then
2260                        Check_Duplicate_Mode (Mode, Output_Seen);
2261                        Check_Mode_Restriction_In_Function (Mode);
2262
2263                     elsif Chars (Mode) = Name_Proof_In then
2264                        Check_Duplicate_Mode (Mode, Proof_Seen);
2265
2266                     else
2267                        Error_Msg_N ("invalid mode selector", Mode);
2268                     end if;
2269
2270                  else
2271                     Error_Msg_N ("invalid mode selector", Mode);
2272                  end if;
2273
2274                  --  Items in a moded list appear as a collection of
2275                  --  expressions. Reuse the existing machinery to analyze
2276                  --  them.
2277
2278                  Analyze_Global_List
2279                    (List        => Expression (Assoc),
2280                     Global_Mode => Chars (Mode));
2281
2282                  Next (Assoc);
2283               end loop;
2284
2285            --  Invalid tree
2286
2287            else
2288               raise Program_Error;
2289            end if;
2290
2291         --  Any other attempt to declare a global item is erroneous
2292
2293         else
2294            Error_Msg_N ("malformed global list", List);
2295         end if;
2296      end Analyze_Global_List;
2297
2298      --  Local variables
2299
2300      Items     : constant Node_Id :=
2301                    Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
2302      Subp_Decl : Node_Id;
2303
2304      Restore_Scope : Boolean := False;
2305      --  Set True if we do a Push_Scope requiring a Pop_Scope on exit
2306
2307   --  Start of processing for Analyze_Global_In_Decl_List
2308
2309   begin
2310      Set_Analyzed (N);
2311      Check_SPARK_Aspect_For_ASIS (N);
2312
2313      --  Verify the syntax of pragma Global when SPARK checks are suppressed.
2314      --  Semantic analysis is disabled in this mode.
2315
2316      if SPARK_Mode = Off then
2317         Check_Global_List_Syntax (Items);
2318         return;
2319      end if;
2320
2321      Subp_Decl := Find_Related_Subprogram_Or_Body (N);
2322      Subp_Id   := Defining_Entity (Subp_Decl);
2323
2324      --  The logic in this routine is used to analyze both pragma Global and
2325      --  pragma Refined_Global since they have the same syntax and base
2326      --  semantics. Find the entity of the corresponding spec when analyzing
2327      --  Refined_Global.
2328
2329      if Nkind (Subp_Decl) = N_Subprogram_Body
2330        and then not Acts_As_Spec (Subp_Decl)
2331      then
2332         Spec_Id := Corresponding_Spec (Subp_Decl);
2333
2334      elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub then
2335         Spec_Id := Corresponding_Spec_Of_Stub (Subp_Decl);
2336
2337      else
2338         Spec_Id := Subp_Id;
2339      end if;
2340
2341      --  There is nothing to be done for a null global list
2342
2343      if Nkind (Items) = N_Null then
2344         Set_Analyzed (Items);
2345
2346      --  Analyze the various forms of global lists and items. Note that some
2347      --  of these may be malformed in which case the analysis emits error
2348      --  messages.
2349
2350      else
2351         --  Ensure that the formal parameters are visible when processing an
2352         --  item. This falls out of the general rule of aspects pertaining to
2353         --  subprogram declarations.
2354
2355         if not In_Open_Scopes (Spec_Id) then
2356            Restore_Scope := True;
2357            Push_Scope (Spec_Id);
2358            Install_Formals (Spec_Id);
2359         end if;
2360
2361         Analyze_Global_List (Items);
2362
2363         if Restore_Scope then
2364            End_Scope;
2365         end if;
2366      end if;
2367
2368      --  Ensure that a state and a corresponding constituent do not appear
2369      --  together in pragma [Refined_]Global.
2370
2371      Check_State_And_Constituent_Use
2372        (States   => States_Seen,
2373         Constits => Constits_Seen,
2374         Context  => N);
2375   end Analyze_Global_In_Decl_Part;
2376
2377   --------------------------------------------
2378   -- Analyze_Initial_Condition_In_Decl_Part --
2379   --------------------------------------------
2380
2381   procedure Analyze_Initial_Condition_In_Decl_Part (N : Node_Id) is
2382      Expr : constant Node_Id :=
2383               Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
2384
2385   begin
2386      Set_Analyzed (N);
2387
2388      --  The expression is preanalyzed because it has not been moved to its
2389      --  final place yet. A direct analysis may generate side effects and this
2390      --  is not desired at this point.
2391
2392      Preanalyze_And_Resolve (Expr, Standard_Boolean);
2393   end Analyze_Initial_Condition_In_Decl_Part;
2394
2395   --------------------------------------
2396   -- Analyze_Initializes_In_Decl_Part --
2397   --------------------------------------
2398
2399   procedure Analyze_Initializes_In_Decl_Part (N : Node_Id) is
2400      Pack_Spec : constant Node_Id   := Parent (N);
2401      Pack_Id   : constant Entity_Id := Defining_Entity (Parent (Pack_Spec));
2402
2403      Constits_Seen : Elist_Id := No_Elist;
2404      --  A list containing the entities of all constituents processed so far.
2405      --  It aids in detecting illegal usage of a state and a corresponding
2406      --  constituent in pragma Initializes.
2407
2408      Items_Seen : Elist_Id := No_Elist;
2409      --  A list of all initialization items processed so far. This list is
2410      --  used to detect duplicate items.
2411
2412      Non_Null_Seen : Boolean := False;
2413      Null_Seen     : Boolean := False;
2414      --  Flags used to check the legality of a null initialization list
2415
2416      States_And_Vars : Elist_Id := No_Elist;
2417      --  A list of all abstract states and variables declared in the visible
2418      --  declarations of the related package. This list is used to detect the
2419      --  legality of initialization items.
2420
2421      States_Seen : Elist_Id := No_Elist;
2422      --  A list containing the entities of all states processed so far. It
2423      --  helps in detecting illegal usage of a state and a corresponding
2424      --  constituent in pragma Initializes.
2425
2426      procedure Analyze_Initialization_Item (Item : Node_Id);
2427      --  Verify the legality of a single initialization item
2428
2429      procedure Analyze_Initialization_Item_With_Inputs (Item : Node_Id);
2430      --  Verify the legality of a single initialization item followed by a
2431      --  list of input items.
2432
2433      procedure Check_Initialization_List_Syntax (List : Node_Id);
2434      --  Verify the syntax of initialization list List
2435
2436      procedure Collect_States_And_Variables;
2437      --  Inspect the visible declarations of the related package and gather
2438      --  the entities of all abstract states and variables in States_And_Vars.
2439
2440      ---------------------------------
2441      -- Analyze_Initialization_Item --
2442      ---------------------------------
2443
2444      procedure Analyze_Initialization_Item (Item : Node_Id) is
2445         Item_Id : Entity_Id;
2446
2447      begin
2448         --  Null initialization list
2449
2450         if Nkind (Item) = N_Null then
2451            if Null_Seen then
2452               Error_Msg_N ("multiple null initializations not allowed", Item);
2453
2454            elsif Non_Null_Seen then
2455               Error_Msg_N
2456                 ("cannot mix null and non-null initialization items", Item);
2457            else
2458               Null_Seen := True;
2459            end if;
2460
2461         --  Initialization item
2462
2463         else
2464            Non_Null_Seen := True;
2465
2466            if Null_Seen then
2467               Error_Msg_N
2468                 ("cannot mix null and non-null initialization items", Item);
2469            end if;
2470
2471            Analyze       (Item);
2472            Resolve_State (Item);
2473
2474            if Is_Entity_Name (Item) then
2475               Item_Id := Entity_Of (Item);
2476
2477               if Ekind_In (Item_Id, E_Abstract_State, E_Variable) then
2478
2479                  --  The state or variable must be declared in the visible
2480                  --  declarations of the package (SPARK RM 7.1.5(7)).
2481
2482                  if not Contains (States_And_Vars, Item_Id) then
2483                     Error_Msg_Name_1 := Chars (Pack_Id);
2484                     Error_Msg_NE
2485                       ("initialization item & must appear in the visible "
2486                        & "declarations of package %", Item, Item_Id);
2487
2488                  --  Detect a duplicate use of the same initialization item
2489                  --  (SPARK RM 7.1.5(5)).
2490
2491                  elsif Contains (Items_Seen, Item_Id) then
2492                     Error_Msg_N ("duplicate initialization item", Item);
2493
2494                  --  The item is legal, add it to the list of processed states
2495                  --  and variables.
2496
2497                  else
2498                     Add_Item (Item_Id, Items_Seen);
2499
2500                     if Ekind (Item_Id) = E_Abstract_State then
2501                        Add_Item (Item_Id, States_Seen);
2502                     end if;
2503
2504                     if Present (Encapsulating_State (Item_Id)) then
2505                        Add_Item (Item_Id, Constits_Seen);
2506                     end if;
2507                  end if;
2508
2509               --  The item references something that is not a state or a
2510               --  variable (SPARK RM 7.1.5(3)).
2511
2512               else
2513                  Error_Msg_N
2514                    ("initialization item must denote variable or state",
2515                     Item);
2516               end if;
2517
2518            --  Some form of illegal construct masquerading as a name
2519            --  (SPARK RM 7.1.5(3)).
2520
2521            else
2522               Error_Msg_N
2523                 ("initialization item must denote variable or state", Item);
2524            end if;
2525         end if;
2526      end Analyze_Initialization_Item;
2527
2528      ---------------------------------------------
2529      -- Analyze_Initialization_Item_With_Inputs --
2530      ---------------------------------------------
2531
2532      procedure Analyze_Initialization_Item_With_Inputs (Item : Node_Id) is
2533         Inputs_Seen : Elist_Id := No_Elist;
2534         --  A list of all inputs processed so far. This list is used to detect
2535         --  duplicate uses of an input.
2536
2537         Non_Null_Seen : Boolean := False;
2538         Null_Seen     : Boolean := False;
2539         --  Flags used to check the legality of an input list
2540
2541         procedure Analyze_Input_Item (Input : Node_Id);
2542         --  Verify the legality of a single input item
2543
2544         ------------------------
2545         -- Analyze_Input_Item --
2546         ------------------------
2547
2548         procedure Analyze_Input_Item (Input : Node_Id) is
2549            Input_Id : Entity_Id;
2550
2551         begin
2552            --  Null input list
2553
2554            if Nkind (Input) = N_Null then
2555               if Null_Seen then
2556                  Error_Msg_N
2557                    ("multiple null initializations not allowed", Item);
2558
2559               elsif Non_Null_Seen then
2560                  Error_Msg_N
2561                    ("cannot mix null and non-null initialization item", Item);
2562               else
2563                  Null_Seen := True;
2564               end if;
2565
2566            --  Input item
2567
2568            else
2569               Non_Null_Seen := True;
2570
2571               if Null_Seen then
2572                  Error_Msg_N
2573                    ("cannot mix null and non-null initialization item", Item);
2574               end if;
2575
2576               Analyze       (Input);
2577               Resolve_State (Input);
2578
2579               if Is_Entity_Name (Input) then
2580                  Input_Id := Entity_Of (Input);
2581
2582                  if Ekind_In (Input_Id, E_Abstract_State, E_Variable) then
2583
2584                     --  The input cannot denote states or variables declared
2585                     --  within the related package.
2586
2587                     if Within_Scope (Input_Id, Current_Scope) then
2588                        Error_Msg_Name_1 := Chars (Pack_Id);
2589                        Error_Msg_NE
2590                          ("input item & cannot denote a visible variable or "
2591                           & "state of package % (SPARK RM 7.1.5(4))",
2592                           Input, Input_Id);
2593
2594                     --  Detect a duplicate use of the same input item
2595                     --  (SPARK RM 7.1.5(5)).
2596
2597                     elsif Contains (Inputs_Seen, Input_Id) then
2598                        Error_Msg_N ("duplicate input item", Input);
2599
2600                     --  Input is legal, add it to the list of processed inputs
2601
2602                     else
2603                        Add_Item (Input_Id, Inputs_Seen);
2604
2605                        if Ekind (Input_Id) = E_Abstract_State then
2606                           Add_Item (Input_Id, States_Seen);
2607                        end if;
2608
2609                        if Present (Encapsulating_State (Input_Id)) then
2610                           Add_Item (Input_Id, Constits_Seen);
2611                        end if;
2612                     end if;
2613
2614                  --  The input references something that is not a state or a
2615                  --  variable.
2616
2617                  else
2618                     Error_Msg_N
2619                       ("input item must denote variable or state", Input);
2620                  end if;
2621
2622               --  Some form of illegal construct masquerading as a name
2623
2624               else
2625                  Error_Msg_N
2626                    ("input item must denote variable or state", Input);
2627               end if;
2628            end if;
2629         end Analyze_Input_Item;
2630
2631         --  Local variables
2632
2633         Inputs : constant Node_Id := Expression (Item);
2634         Elmt   : Node_Id;
2635         Input  : Node_Id;
2636
2637         Name_Seen : Boolean := False;
2638         --  A flag used to detect multiple item names
2639
2640      --  Start of processing for Analyze_Initialization_Item_With_Inputs
2641
2642      begin
2643         --  Inspect the name of an item with inputs
2644
2645         Elmt := First (Choices (Item));
2646         while Present (Elmt) loop
2647            if Name_Seen then
2648               Error_Msg_N ("only one item allowed in initialization", Elmt);
2649            else
2650               Name_Seen := True;
2651               Analyze_Initialization_Item (Elmt);
2652            end if;
2653
2654            Next (Elmt);
2655         end loop;
2656
2657         --  Multiple input items appear as an aggregate
2658
2659         if Nkind (Inputs) = N_Aggregate then
2660            if Present (Expressions (Inputs)) then
2661               Input := First (Expressions (Inputs));
2662               while Present (Input) loop
2663                  Analyze_Input_Item (Input);
2664                  Next (Input);
2665               end loop;
2666            end if;
2667
2668            if Present (Component_Associations (Inputs)) then
2669               Error_Msg_N
2670                 ("inputs must appear in named association form", Inputs);
2671            end if;
2672
2673         --  Single input item
2674
2675         else
2676            Analyze_Input_Item (Inputs);
2677         end if;
2678      end Analyze_Initialization_Item_With_Inputs;
2679
2680      --------------------------------------
2681      -- Check_Initialization_List_Syntax --
2682      --------------------------------------
2683
2684      procedure Check_Initialization_List_Syntax (List : Node_Id) is
2685         Init  : Node_Id;
2686         Input : Node_Id;
2687
2688      begin
2689         --  Null initialization list
2690
2691         if Nkind (List) = N_Null then
2692            null;
2693
2694         elsif Nkind (List) = N_Aggregate then
2695
2696            --  Simple initialization items
2697
2698            if Present (Expressions (List)) then
2699               Init := First (Expressions (List));
2700               while Present (Init) loop
2701                  Check_Item_Syntax (Init);
2702                  Next (Init);
2703               end loop;
2704            end if;
2705
2706            --  Initialization items with a input lists
2707
2708            if Present (Component_Associations (List)) then
2709               Init := First (Component_Associations (List));
2710               while Present (Init) loop
2711                  Check_Item_Syntax (First (Choices (Init)));
2712
2713                  if Nkind (Expression (Init)) = N_Aggregate
2714                    and then Present (Expressions (Expression (Init)))
2715                  then
2716                     Input := First (Expressions (Expression (Init)));
2717                     while Present (Input) loop
2718                        Check_Item_Syntax (Input);
2719                        Next (Input);
2720                     end loop;
2721
2722                  else
2723                     Error_Msg_N ("malformed initialization item", Init);
2724                  end if;
2725
2726                  Next (Init);
2727               end loop;
2728            end if;
2729
2730         else
2731            Error_Msg_N ("malformed initialization list", List);
2732         end if;
2733      end Check_Initialization_List_Syntax;
2734
2735      ----------------------------------
2736      -- Collect_States_And_Variables --
2737      ----------------------------------
2738
2739      procedure Collect_States_And_Variables is
2740         Decl : Node_Id;
2741
2742      begin
2743         --  Collect the abstract states defined in the package (if any)
2744
2745         if Present (Abstract_States (Pack_Id)) then
2746            States_And_Vars := New_Copy_Elist (Abstract_States (Pack_Id));
2747         end if;
2748
2749         --  Collect all variables the appear in the visible declarations of
2750         --  the related package.
2751
2752         if Present (Visible_Declarations (Pack_Spec)) then
2753            Decl := First (Visible_Declarations (Pack_Spec));
2754            while Present (Decl) loop
2755               if Nkind (Decl) = N_Object_Declaration
2756                 and then Ekind (Defining_Entity (Decl)) = E_Variable
2757                 and then Comes_From_Source (Decl)
2758               then
2759                  Add_Item (Defining_Entity (Decl), States_And_Vars);
2760               end if;
2761
2762               Next (Decl);
2763            end loop;
2764         end if;
2765      end Collect_States_And_Variables;
2766
2767      --  Local variables
2768
2769      Inits : constant Node_Id :=
2770                Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
2771      Init  : Node_Id;
2772
2773   --  Start of processing for Analyze_Initializes_In_Decl_Part
2774
2775   begin
2776      Set_Analyzed (N);
2777
2778      Check_SPARK_Aspect_For_ASIS (N);
2779
2780      --  Nothing to do when the initialization list is empty
2781
2782      if Nkind (Inits) = N_Null then
2783         return;
2784
2785      --  Verify the syntax of pragma Initializes when SPARK checks are
2786      --  suppressed. Semantic analysis is disabled in this mode.
2787
2788      elsif SPARK_Mode = Off then
2789         Check_Initialization_List_Syntax (Inits);
2790         return;
2791      end if;
2792
2793      --  Single and multiple initialization clauses appear as an aggregate. If
2794      --  this is not the case, then either the parser or the analysis of the
2795      --  pragma failed to produce an aggregate.
2796
2797      pragma Assert (Nkind (Inits) = N_Aggregate);
2798
2799      --  Initialize the various lists used during analysis
2800
2801      Collect_States_And_Variables;
2802
2803      if Present (Expressions (Inits)) then
2804         Init := First (Expressions (Inits));
2805         while Present (Init) loop
2806            Analyze_Initialization_Item (Init);
2807            Next (Init);
2808         end loop;
2809      end if;
2810
2811      if Present (Component_Associations (Inits)) then
2812         Init := First (Component_Associations (Inits));
2813         while Present (Init) loop
2814            Analyze_Initialization_Item_With_Inputs (Init);
2815            Next (Init);
2816         end loop;
2817      end if;
2818
2819      --  Ensure that a state and a corresponding constituent do not appear
2820      --  together in pragma Initializes.
2821
2822      Check_State_And_Constituent_Use
2823        (States   => States_Seen,
2824         Constits => Constits_Seen,
2825         Context  => N);
2826   end Analyze_Initializes_In_Decl_Part;
2827
2828   --------------------
2829   -- Analyze_Pragma --
2830   --------------------
2831
2832   --------------------
2833   -- Analyze_Pragma --
2834   --------------------
2835
2836   procedure Analyze_Pragma (N : Node_Id) is
2837      Loc     : constant Source_Ptr := Sloc (N);
2838      Prag_Id : Pragma_Id;
2839
2840      Pname : Name_Id;
2841      --  Name of the source pragma, or name of the corresponding aspect for
2842      --  pragmas which originate in a source aspect. In the latter case, the
2843      --  name may be different from the pragma name.
2844
2845      Pragma_Exit : exception;
2846      --  This exception is used to exit pragma processing completely. It
2847      --  is used when an error is detected, and no further processing is
2848      --  required. It is also used if an earlier error has left the tree in
2849      --  a state where the pragma should not be processed.
2850
2851      Arg_Count : Nat;
2852      --  Number of pragma argument associations
2853
2854      Arg1 : Node_Id;
2855      Arg2 : Node_Id;
2856      Arg3 : Node_Id;
2857      Arg4 : Node_Id;
2858      --  First four pragma arguments (pragma argument association nodes, or
2859      --  Empty if the corresponding argument does not exist).
2860
2861      type Name_List is array (Natural range <>) of Name_Id;
2862      type Args_List is array (Natural range <>) of Node_Id;
2863      --  Types used for arguments to Check_Arg_Order and Gather_Associations
2864
2865      procedure Ada_2005_Pragma;
2866      --  Called for pragmas defined in Ada 2005, that are not in Ada 95. In
2867      --  Ada 95 mode, these are implementation defined pragmas, so should be
2868      --  caught by the No_Implementation_Pragmas restriction.
2869
2870      procedure Ada_2012_Pragma;
2871      --  Called for pragmas defined in Ada 2012, that are not in Ada 95 or 05.
2872      --  In Ada 95 or 05 mode, these are implementation defined pragmas, so
2873      --  should be caught by the No_Implementation_Pragmas restriction.
2874
2875      procedure Analyze_Part_Of
2876        (Item_Id : Entity_Id;
2877         State   : Node_Id;
2878         Indic   : Node_Id;
2879         Legal   : out Boolean);
2880      --  Subsidiary to the analysis of pragmas Abstract_State and Part_Of.
2881      --  Perform full analysis of indicator Part_Of. Item_Id is the entity of
2882      --  an abstract state, variable or package instantiation. State is the
2883      --  encapsulating state. Indic is the Part_Of indicator. Flag Legal is
2884      --  set when the indicator is legal.
2885
2886      procedure Analyze_Refined_Pragma
2887        (Spec_Id : out Entity_Id;
2888         Body_Id : out Entity_Id;
2889         Legal   : out Boolean);
2890      --  Subsidiary routine to the analysis of body pragmas Refined_Depends,
2891      --  Refined_Global and Refined_Post. Check the placement and related
2892      --  context of the pragma. Spec_Id is the entity of the related
2893      --  subprogram. Body_Id is the entity of the subprogram body. Flag
2894      --  Legal is set when the pragma is properly placed.
2895
2896      procedure Check_Ada_83_Warning;
2897      --  Issues a warning message for the current pragma if operating in Ada
2898      --  83 mode (used for language pragmas that are not a standard part of
2899      --  Ada 83). This procedure does not raise Error_Pragma. Also notes use
2900      --  of 95 pragma.
2901
2902      procedure Check_Arg_Count (Required : Nat);
2903      --  Check argument count for pragma is equal to given parameter. If not,
2904      --  then issue an error message and raise Pragma_Exit.
2905
2906      --  Note: all routines whose name is Check_Arg_Is_xxx take an argument
2907      --  Arg which can either be a pragma argument association, in which case
2908      --  the check is applied to the expression of the association or an
2909      --  expression directly.
2910
2911      procedure Check_Arg_Is_External_Name (Arg : Node_Id);
2912      --  Check that an argument has the right form for an EXTERNAL_NAME
2913      --  parameter of an extended import/export pragma. The rule is that the
2914      --  name must be an identifier or string literal (in Ada 83 mode) or a
2915      --  static string expression (in Ada 95 mode).
2916
2917      procedure Check_Arg_Is_Identifier (Arg : Node_Id);
2918      --  Check the specified argument Arg to make sure that it is an
2919      --  identifier. If not give error and raise Pragma_Exit.
2920
2921      procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id);
2922      --  Check the specified argument Arg to make sure that it is an integer
2923      --  literal. If not give error and raise Pragma_Exit.
2924
2925      procedure Check_Arg_Is_Library_Level_Local_Name (Arg : Node_Id);
2926      --  Check the specified argument Arg to make sure that it has the proper
2927      --  syntactic form for a local name and meets the semantic requirements
2928      --  for a local name. The local name is analyzed as part of the
2929      --  processing for this call. In addition, the local name is required
2930      --  to represent an entity at the library level.
2931
2932      procedure Check_Arg_Is_Local_Name (Arg : Node_Id);
2933      --  Check the specified argument Arg to make sure that it has the proper
2934      --  syntactic form for a local name and meets the semantic requirements
2935      --  for a local name. The local name is analyzed as part of the
2936      --  processing for this call.
2937
2938      procedure Check_Arg_Is_Locking_Policy (Arg : Node_Id);
2939      --  Check the specified argument Arg to make sure that it is a valid
2940      --  locking policy name. If not give error and raise Pragma_Exit.
2941
2942      procedure Check_Arg_Is_Partition_Elaboration_Policy (Arg : Node_Id);
2943      --  Check the specified argument Arg to make sure that it is a valid
2944      --  elaboration policy name. If not give error and raise Pragma_Exit.
2945
2946      procedure Check_Arg_Is_One_Of
2947        (Arg                : Node_Id;
2948         N1, N2             : Name_Id);
2949      procedure Check_Arg_Is_One_Of
2950        (Arg                : Node_Id;
2951         N1, N2, N3         : Name_Id);
2952      procedure Check_Arg_Is_One_Of
2953        (Arg                : Node_Id;
2954         N1, N2, N3, N4     : Name_Id);
2955      procedure Check_Arg_Is_One_Of
2956        (Arg                : Node_Id;
2957         N1, N2, N3, N4, N5 : Name_Id);
2958      --  Check the specified argument Arg to make sure that it is an
2959      --  identifier whose name matches either N1 or N2 (or N3, N4, N5 if
2960      --  present). If not then give error and raise Pragma_Exit.
2961
2962      procedure Check_Arg_Is_Queuing_Policy (Arg : Node_Id);
2963      --  Check the specified argument Arg to make sure that it is a valid
2964      --  queuing policy name. If not give error and raise Pragma_Exit.
2965
2966      procedure Check_Arg_Is_Static_Expression
2967        (Arg : Node_Id;
2968         Typ : Entity_Id := Empty);
2969      --  Check the specified argument Arg to make sure that it is a static
2970      --  expression of the given type (i.e. it will be analyzed and resolved
2971      --  using this type, which can be any valid argument to Resolve, e.g.
2972      --  Any_Integer is OK). If not, given error and raise Pragma_Exit. If
2973      --  Typ is left Empty, then any static expression is allowed.
2974
2975      procedure Check_Arg_Is_Task_Dispatching_Policy (Arg : Node_Id);
2976      --  Check the specified argument Arg to make sure that it is a valid task
2977      --  dispatching policy name. If not give error and raise Pragma_Exit.
2978
2979      procedure Check_Arg_Order (Names : Name_List);
2980      --  Checks for an instance of two arguments with identifiers for the
2981      --  current pragma which are not in the sequence indicated by Names,
2982      --  and if so, generates a fatal message about bad order of arguments.
2983
2984      procedure Check_At_Least_N_Arguments (N : Nat);
2985      --  Check there are at least N arguments present
2986
2987      procedure Check_At_Most_N_Arguments (N : Nat);
2988      --  Check there are no more than N arguments present
2989
2990      procedure Check_Component
2991        (Comp            : Node_Id;
2992         UU_Typ          : Entity_Id;
2993         In_Variant_Part : Boolean := False);
2994      --  Examine an Unchecked_Union component for correct use of per-object
2995      --  constrained subtypes, and for restrictions on finalizable components.
2996      --  UU_Typ is the related Unchecked_Union type. Flag In_Variant_Part
2997      --  should be set when Comp comes from a record variant.
2998
2999      procedure Check_Declaration_Order (First : Node_Id; Second : Node_Id);
3000      --  Subsidiary routine to the analysis of pragmas Abstract_State,
3001      --  Initial_Condition and Initializes. Determine whether pragma First
3002      --  appears before pragma Second. If this is not the case, emit an error.
3003
3004      procedure Check_Duplicate_Pragma (E : Entity_Id);
3005      --  Check if a rep item of the same name as the current pragma is already
3006      --  chained as a rep pragma to the given entity. If so give a message
3007      --  about the duplicate, and then raise Pragma_Exit so does not return.
3008      --  Note that if E is a type, then this routine avoids flagging a pragma
3009      --  which applies to a parent type from which E is derived.
3010
3011      procedure Check_Duplicated_Export_Name (Nam : Node_Id);
3012      --  Nam is an N_String_Literal node containing the external name set by
3013      --  an Import or Export pragma (or extended Import or Export pragma).
3014      --  This procedure checks for possible duplications if this is the export
3015      --  case, and if found, issues an appropriate error message.
3016
3017      procedure Check_Expr_Is_Static_Expression
3018        (Expr : Node_Id;
3019         Typ  : Entity_Id := Empty);
3020      --  Check the specified expression Expr to make sure that it is a static
3021      --  expression of the given type (i.e. it will be analyzed and resolved
3022      --  using this type, which can be any valid argument to Resolve, e.g.
3023      --  Any_Integer is OK). If not, given error and raise Pragma_Exit. If
3024      --  Typ is left Empty, then any static expression is allowed.
3025
3026      procedure Check_First_Subtype (Arg : Node_Id);
3027      --  Checks that Arg, whose expression is an entity name, references a
3028      --  first subtype.
3029
3030      procedure Check_Identifier (Arg : Node_Id; Id : Name_Id);
3031      --  Checks that the given argument has an identifier, and if so, requires
3032      --  it to match the given identifier name. If there is no identifier, or
3033      --  a non-matching identifier, then an error message is given and
3034      --  Pragma_Exit is raised.
3035
3036      procedure Check_Identifier_Is_One_Of (Arg : Node_Id; N1, N2 : Name_Id);
3037      --  Checks that the given argument has an identifier, and if so, requires
3038      --  it to match one of the given identifier names. If there is no
3039      --  identifier, or a non-matching identifier, then an error message is
3040      --  given and Pragma_Exit is raised.
3041
3042      procedure Check_In_Main_Program;
3043      --  Common checks for pragmas that appear within a main program
3044      --  (Priority, Main_Storage, Time_Slice, Relative_Deadline, CPU).
3045
3046      procedure Check_Interrupt_Or_Attach_Handler;
3047      --  Common processing for first argument of pragma Interrupt_Handler or
3048      --  pragma Attach_Handler.
3049
3050      procedure Check_Loop_Pragma_Placement;
3051      --  Verify whether pragmas Loop_Invariant, Loop_Optimize and Loop_Variant
3052      --  appear immediately within a construct restricted to loops, and that
3053      --  pragmas Loop_Invariant and Loop_Variant are grouped together.
3054
3055      procedure Check_Is_In_Decl_Part_Or_Package_Spec;
3056      --  Check that pragma appears in a declarative part, or in a package
3057      --  specification, i.e. that it does not occur in a statement sequence
3058      --  in a body.
3059
3060      procedure Check_No_Identifier (Arg : Node_Id);
3061      --  Checks that the given argument does not have an identifier. If
3062      --  an identifier is present, then an error message is issued, and
3063      --  Pragma_Exit is raised.
3064
3065      procedure Check_No_Identifiers;
3066      --  Checks that none of the arguments to the pragma has an identifier.
3067      --  If any argument has an identifier, then an error message is issued,
3068      --  and Pragma_Exit is raised.
3069
3070      procedure Check_No_Link_Name;
3071      --  Checks that no link name is specified
3072
3073      procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id);
3074      --  Checks if the given argument has an identifier, and if so, requires
3075      --  it to match the given identifier name. If there is a non-matching
3076      --  identifier, then an error message is given and Pragma_Exit is raised.
3077
3078      procedure Check_Optional_Identifier (Arg : Node_Id; Id : String);
3079      --  Checks if the given argument has an identifier, and if so, requires
3080      --  it to match the given identifier name. If there is a non-matching
3081      --  identifier, then an error message is given and Pragma_Exit is raised.
3082      --  In this version of the procedure, the identifier name is given as
3083      --  a string with lower case letters.
3084
3085      procedure Check_Pre_Post;
3086      --  Called to perform checks for Pre, Pre_Class, Post, Post_Class
3087      --  pragmas. These are processed by transformation to equivalent
3088      --  Precondition and Postcondition pragmas, but Pre and Post need an
3089      --  additional check that they are not used in a subprogram body when
3090      --  there is a separate spec present.
3091
3092      procedure Check_Precondition_Postcondition (In_Body : out Boolean);
3093      --  Called to process a precondition or postcondition pragma. There are
3094      --  three cases:
3095      --
3096      --    The pragma appears after a subprogram spec
3097      --
3098      --      If the corresponding check is not enabled, the pragma is analyzed
3099      --      but otherwise ignored and control returns with In_Body set False.
3100      --
3101      --      If the check is enabled, then the first step is to analyze the
3102      --      pragma, but this is skipped if the subprogram spec appears within
3103      --      a package specification (because this is the case where we delay
3104      --      analysis till the end of the spec). Then (whether or not it was
3105      --      analyzed), the pragma is chained to the subprogram in question
3106      --      (using Pre_Post_Conditions and Next_Pragma) and control returns
3107      --      to the caller with In_Body set False.
3108      --
3109      --    The pragma appears at the start of subprogram body declarations
3110      --
3111      --      In this case an immediate return to the caller is made with
3112      --      In_Body set True, and the pragma is NOT analyzed.
3113      --
3114      --    In all other cases, an error message for bad placement is given
3115
3116      procedure Check_Static_Constraint (Constr : Node_Id);
3117      --  Constr is a constraint from an N_Subtype_Indication node from a
3118      --  component constraint in an Unchecked_Union type. This routine checks
3119      --  that the constraint is static as required by the restrictions for
3120      --  Unchecked_Union.
3121
3122      procedure Check_Test_Case;
3123      --  Called to process a test-case pragma. It starts with checking pragma
3124      --  arguments, and the rest of the treatment is similar to the one for
3125      --  pre- and postcondition in Check_Precondition_Postcondition, except
3126      --  the placement rules for the test-case pragma are stricter. These
3127      --  pragmas may only occur after a subprogram spec declared directly
3128      --  in a package spec unit. In this case, the pragma is chained to the
3129      --  subprogram in question (using Contract_Test_Cases and Next_Pragma)
3130      --  and analysis of the pragma is delayed till the end of the spec. In
3131      --  all other cases, an error message for bad placement is given.
3132
3133      procedure Check_Valid_Configuration_Pragma;
3134      --  Legality checks for placement of a configuration pragma
3135
3136      procedure Check_Valid_Library_Unit_Pragma;
3137      --  Legality checks for library unit pragmas. A special case arises for
3138      --  pragmas in generic instances that come from copies of the original
3139      --  library unit pragmas in the generic templates. In the case of other
3140      --  than library level instantiations these can appear in contexts which
3141      --  would normally be invalid (they only apply to the original template
3142      --  and to library level instantiations), and they are simply ignored,
3143      --  which is implemented by rewriting them as null statements.
3144
3145      procedure Check_Variant (Variant : Node_Id; UU_Typ : Entity_Id);
3146      --  Check an Unchecked_Union variant for lack of nested variants and
3147      --  presence of at least one component. UU_Typ is the related Unchecked_
3148      --  Union type.
3149
3150      procedure Ensure_Aggregate_Form (Arg : Node_Id);
3151      --  Subsidiary routine to the processing of pragmas Abstract_State,
3152      --  Contract_Cases, Depends, Global, Initializes, Refined_Depends,
3153      --  Refined_Global and Refined_State. Transform argument Arg into an
3154      --  aggregate if not one already. N_Null is never transformed.
3155
3156      procedure Error_Pragma (Msg : String);
3157      pragma No_Return (Error_Pragma);
3158      --  Outputs error message for current pragma. The message contains a %
3159      --  that will be replaced with the pragma name, and the flag is placed
3160      --  on the pragma itself. Pragma_Exit is then raised. Note: this routine
3161      --  calls Fix_Error (see spec of that procedure for details).
3162
3163      procedure Error_Pragma_Arg (Msg : String; Arg : Node_Id);
3164      pragma No_Return (Error_Pragma_Arg);
3165      --  Outputs error message for current pragma. The message may contain
3166      --  a % that will be replaced with the pragma name. The parameter Arg
3167      --  may either be a pragma argument association, in which case the flag
3168      --  is placed on the expression of this association, or an expression,
3169      --  in which case the flag is placed directly on the expression. The
3170      --  message is placed using Error_Msg_N, so the message may also contain
3171      --  an & insertion character which will reference the given Arg value.
3172      --  After placing the message, Pragma_Exit is raised. Note: this routine
3173      --  calls Fix_Error (see spec of that procedure for details).
3174
3175      procedure Error_Pragma_Arg (Msg1, Msg2 : String; Arg : Node_Id);
3176      pragma No_Return (Error_Pragma_Arg);
3177      --  Similar to above form of Error_Pragma_Arg except that two messages
3178      --  are provided, the second is a continuation comment starting with \.
3179
3180      procedure Error_Pragma_Arg_Ident (Msg : String; Arg : Node_Id);
3181      pragma No_Return (Error_Pragma_Arg_Ident);
3182      --  Outputs error message for current pragma. The message may contain a %
3183      --  that will be replaced with the pragma name. The parameter Arg must be
3184      --  a pragma argument association with a non-empty identifier (i.e. its
3185      --  Chars field must be set), and the error message is placed on the
3186      --  identifier. The message is placed using Error_Msg_N so the message
3187      --  may also contain an & insertion character which will reference
3188      --  the identifier. After placing the message, Pragma_Exit is raised.
3189      --  Note: this routine calls Fix_Error (see spec of that procedure for
3190      --  details).
3191
3192      procedure Error_Pragma_Ref (Msg : String; Ref : Entity_Id);
3193      pragma No_Return (Error_Pragma_Ref);
3194      --  Outputs error message for current pragma. The message may contain
3195      --  a % that will be replaced with the pragma name. The parameter Ref
3196      --  must be an entity whose name can be referenced by & and sloc by #.
3197      --  After placing the message, Pragma_Exit is raised. Note: this routine
3198      --  calls Fix_Error (see spec of that procedure for details).
3199
3200      function Find_Lib_Unit_Name return Entity_Id;
3201      --  Used for a library unit pragma to find the entity to which the
3202      --  library unit pragma applies, returns the entity found.
3203
3204      procedure Find_Program_Unit_Name (Id : Node_Id);
3205      --  If the pragma is a compilation unit pragma, the id must denote the
3206      --  compilation unit in the same compilation, and the pragma must appear
3207      --  in the list of preceding or trailing pragmas. If it is a program
3208      --  unit pragma that is not a compilation unit pragma, then the
3209      --  identifier must be visible.
3210
3211      function Find_Unique_Parameterless_Procedure
3212        (Name : Entity_Id;
3213         Arg  : Node_Id) return Entity_Id;
3214      --  Used for a procedure pragma to find the unique parameterless
3215      --  procedure identified by Name, returns it if it exists, otherwise
3216      --  errors out and uses Arg as the pragma argument for the message.
3217
3218      procedure Fix_Error (Msg : in out String);
3219      --  This is called prior to issuing an error message. Msg is a string
3220      --  that typically contains the substring "pragma". If the pragma comes
3221      --  from an aspect, each such "pragma" substring is replaced with the
3222      --  characters "aspect", and Error_Msg_Name_1 is set to the name of the
3223      --  aspect (which may be different from the pragma name). If the current
3224      --  pragma results from rewriting another pragma, then Error_Msg_Name_1
3225      --  is set to the original pragma name.
3226
3227      procedure Gather_Associations
3228        (Names : Name_List;
3229         Args  : out Args_List);
3230      --  This procedure is used to gather the arguments for a pragma that
3231      --  permits arbitrary ordering of parameters using the normal rules
3232      --  for named and positional parameters. The Names argument is a list
3233      --  of Name_Id values that corresponds to the allowed pragma argument
3234      --  association identifiers in order. The result returned in Args is
3235      --  a list of corresponding expressions that are the pragma arguments.
3236      --  Note that this is a list of expressions, not of pragma argument
3237      --  associations (Gather_Associations has completely checked all the
3238      --  optional identifiers when it returns). An entry in Args is Empty
3239      --  on return if the corresponding argument is not present.
3240
3241      procedure GNAT_Pragma;
3242      --  Called for all GNAT defined pragmas to check the relevant restriction
3243      --  (No_Implementation_Pragmas).
3244
3245      function Is_Before_First_Decl
3246        (Pragma_Node : Node_Id;
3247         Decls       : List_Id) return Boolean;
3248      --  Return True if Pragma_Node is before the first declarative item in
3249      --  Decls where Decls is the list of declarative items.
3250
3251      function Is_Configuration_Pragma return Boolean;
3252      --  Determines if the placement of the current pragma is appropriate
3253      --  for a configuration pragma.
3254
3255      function Is_In_Context_Clause return Boolean;
3256      --  Returns True if pragma appears within the context clause of a unit,
3257      --  and False for any other placement (does not generate any messages).
3258
3259      function Is_Static_String_Expression (Arg : Node_Id) return Boolean;
3260      --  Analyzes the argument, and determines if it is a static string
3261      --  expression, returns True if so, False if non-static or not String.
3262
3263      procedure Pragma_Misplaced;
3264      pragma No_Return (Pragma_Misplaced);
3265      --  Issue fatal error message for misplaced pragma
3266
3267      procedure Process_Atomic_Shared_Volatile;
3268      --  Common processing for pragmas Atomic, Shared, Volatile. Note that
3269      --  Shared is an obsolete Ada 83 pragma, treated as being identical
3270      --  in effect to pragma Atomic.
3271
3272      procedure Process_Compile_Time_Warning_Or_Error;
3273      --  Common processing for Compile_Time_Error and Compile_Time_Warning
3274
3275      procedure Process_Convention
3276        (C   : out Convention_Id;
3277         Ent : out Entity_Id);
3278      --  Common processing for Convention, Interface, Import and Export.
3279      --  Checks first two arguments of pragma, and sets the appropriate
3280      --  convention value in the specified entity or entities. On return
3281      --  C is the convention, Ent is the referenced entity.
3282
3283      procedure Process_Disable_Enable_Atomic_Sync (Nam : Name_Id);
3284      --  Common processing for Disable/Enable_Atomic_Synchronization. Nam is
3285      --  Name_Suppress for Disable and Name_Unsuppress for Enable.
3286
3287      procedure Process_Extended_Import_Export_Exception_Pragma
3288        (Arg_Internal : Node_Id;
3289         Arg_External : Node_Id;
3290         Arg_Form     : Node_Id;
3291         Arg_Code     : Node_Id);
3292      --  Common processing for the pragmas Import/Export_Exception. The three
3293      --  arguments correspond to the three named parameters of the pragma. An
3294      --  argument is empty if the corresponding parameter is not present in
3295      --  the pragma.
3296
3297      procedure Process_Extended_Import_Export_Object_Pragma
3298        (Arg_Internal : Node_Id;
3299         Arg_External : Node_Id;
3300         Arg_Size     : Node_Id);
3301      --  Common processing for the pragmas Import/Export_Object. The three
3302      --  arguments correspond to the three named parameters of the pragmas. An
3303      --  argument is empty if the corresponding parameter is not present in
3304      --  the pragma.
3305
3306      procedure Process_Extended_Import_Export_Internal_Arg
3307        (Arg_Internal : Node_Id := Empty);
3308      --  Common processing for all extended Import and Export pragmas. The
3309      --  argument is the pragma parameter for the Internal argument. If
3310      --  Arg_Internal is empty or inappropriate, an error message is posted.
3311      --  Otherwise, on normal return, the Entity_Field of Arg_Internal is
3312      --  set to identify the referenced entity.
3313
3314      procedure Process_Extended_Import_Export_Subprogram_Pragma
3315        (Arg_Internal                 : Node_Id;
3316         Arg_External                 : Node_Id;
3317         Arg_Parameter_Types          : Node_Id;
3318         Arg_Result_Type              : Node_Id := Empty;
3319         Arg_Mechanism                : Node_Id;
3320         Arg_Result_Mechanism         : Node_Id := Empty;
3321         Arg_First_Optional_Parameter : Node_Id := Empty);
3322      --  Common processing for all extended Import and Export pragmas applying
3323      --  to subprograms. The caller omits any arguments that do not apply to
3324      --  the pragma in question (for example, Arg_Result_Type can be non-Empty
3325      --  only in the Import_Function and Export_Function cases). The argument
3326      --  names correspond to the allowed pragma association identifiers.
3327
3328      procedure Process_Generic_List;
3329      --  Common processing for Share_Generic and Inline_Generic
3330
3331      procedure Process_Import_Or_Interface;
3332      --  Common processing for Import of Interface
3333
3334      procedure Process_Import_Predefined_Type;
3335      --  Processing for completing a type with pragma Import. This is used
3336      --  to declare types that match predefined C types, especially for cases
3337      --  without corresponding Ada predefined type.
3338
3339      type Inline_Status is (Suppressed, Disabled, Enabled);
3340      --  Inline status of a subprogram, indicated as follows:
3341      --    Suppressed: inlining is suppressed for the subprogram
3342      --    Disabled:   no inlining is requested for the subprogram
3343      --    Enabled:    inlining is requested/required for the subprogram
3344
3345      procedure Process_Inline (Status : Inline_Status);
3346      --  Common processing for Inline, Inline_Always and No_Inline. Parameter
3347      --  indicates the inline status specified by the pragma.
3348
3349      procedure Process_Interface_Name
3350        (Subprogram_Def : Entity_Id;
3351         Ext_Arg        : Node_Id;
3352         Link_Arg       : Node_Id);
3353      --  Given the last two arguments of pragma Import, pragma Export, or
3354      --  pragma Interface_Name, performs validity checks and sets the
3355      --  Interface_Name field of the given subprogram entity to the
3356      --  appropriate external or link name, depending on the arguments given.
3357      --  Ext_Arg is always present, but Link_Arg may be missing. Note that
3358      --  Ext_Arg may represent the Link_Name if Link_Arg is missing, and
3359      --  appropriate named notation is used for Ext_Arg. If neither Ext_Arg
3360      --  nor Link_Arg is present, the interface name is set to the default
3361      --  from the subprogram name.
3362
3363      procedure Process_Interrupt_Or_Attach_Handler;
3364      --  Common processing for Interrupt and Attach_Handler pragmas
3365
3366      procedure Process_Restrictions_Or_Restriction_Warnings (Warn : Boolean);
3367      --  Common processing for Restrictions and Restriction_Warnings pragmas.
3368      --  Warn is True for Restriction_Warnings, or for Restrictions if the
3369      --  flag Treat_Restrictions_As_Warnings is set, and False if this flag
3370      --  is not set in the Restrictions case.
3371
3372      procedure Process_Suppress_Unsuppress (Suppress_Case : Boolean);
3373      --  Common processing for Suppress and Unsuppress. The boolean parameter
3374      --  Suppress_Case is True for the Suppress case, and False for the
3375      --  Unsuppress case.
3376
3377      procedure Set_Exported (E : Entity_Id; Arg : Node_Id);
3378      --  This procedure sets the Is_Exported flag for the given entity,
3379      --  checking that the entity was not previously imported. Arg is
3380      --  the argument that specified the entity. A check is also made
3381      --  for exporting inappropriate entities.
3382
3383      procedure Set_Extended_Import_Export_External_Name
3384        (Internal_Ent : Entity_Id;
3385         Arg_External : Node_Id);
3386      --  Common processing for all extended import export pragmas. The first
3387      --  argument, Internal_Ent, is the internal entity, which has already
3388      --  been checked for validity by the caller. Arg_External is from the
3389      --  Import or Export pragma, and may be null if no External parameter
3390      --  was present. If Arg_External is present and is a non-null string
3391      --  (a null string is treated as the default), then the Interface_Name
3392      --  field of Internal_Ent is set appropriately.
3393
3394      procedure Set_Imported (E : Entity_Id);
3395      --  This procedure sets the Is_Imported flag for the given entity,
3396      --  checking that it is not previously exported or imported.
3397
3398      procedure Set_Mechanism_Value (Ent : Entity_Id; Mech_Name : Node_Id);
3399      --  Mech is a parameter passing mechanism (see Import_Function syntax
3400      --  for MECHANISM_NAME). This routine checks that the mechanism argument
3401      --  has the right form, and if not issues an error message. If the
3402      --  argument has the right form then the Mechanism field of Ent is
3403      --  set appropriately.
3404
3405      procedure Set_Rational_Profile;
3406      --  Activate the set of configuration pragmas and permissions that make
3407      --  up the Rational profile.
3408
3409      procedure Set_Ravenscar_Profile (N : Node_Id);
3410      --  Activate the set of configuration pragmas and restrictions that make
3411      --  up the Ravenscar Profile. N is the corresponding pragma node, which
3412      --  is used for error messages on any constructs that violate the
3413      --  profile.
3414
3415      ---------------------
3416      -- Ada_2005_Pragma --
3417      ---------------------
3418
3419      procedure Ada_2005_Pragma is
3420      begin
3421         if Ada_Version <= Ada_95 then
3422            Check_Restriction (No_Implementation_Pragmas, N);
3423         end if;
3424      end Ada_2005_Pragma;
3425
3426      ---------------------
3427      -- Ada_2012_Pragma --
3428      ---------------------
3429
3430      procedure Ada_2012_Pragma is
3431      begin
3432         if Ada_Version <= Ada_2005 then
3433            Check_Restriction (No_Implementation_Pragmas, N);
3434         end if;
3435      end Ada_2012_Pragma;
3436
3437      ---------------------
3438      -- Analyze_Part_Of --
3439      ---------------------
3440
3441      procedure Analyze_Part_Of
3442        (Item_Id : Entity_Id;
3443         State   : Node_Id;
3444         Indic   : Node_Id;
3445         Legal   : out Boolean)
3446      is
3447         Pack_Id   : Entity_Id;
3448         Placement : State_Space_Kind;
3449         State_Id  : Entity_Id;
3450
3451      begin
3452         --  Assume that the pragma/option is illegal
3453
3454         Legal := False;
3455
3456         --  Verify the syntax of the encapsulating state when SPARK check are
3457         --  suppressed. Semantic analysis is disabled in this mode.
3458
3459         if SPARK_Mode = Off then
3460            Check_Item_Syntax (State);
3461            return;
3462         end if;
3463
3464         Analyze       (State);
3465         Resolve_State (State);
3466
3467         if Is_Entity_Name (State)
3468           and then Ekind (Entity (State)) = E_Abstract_State
3469         then
3470            State_Id := Entity (State);
3471
3472         else
3473            Error_Msg_N
3474              ("indicator Part_Of must denote an abstract state", State);
3475            return;
3476         end if;
3477
3478         --  Determine where the state, variable or the package instantiation
3479         --  lives with respect to the enclosing packages or package bodies (if
3480         --  any). This placement dictates the legality of the encapsulating
3481         --  state.
3482
3483         Find_Placement_In_State_Space
3484           (Item_Id   => Item_Id,
3485            Placement => Placement,
3486            Pack_Id   => Pack_Id);
3487
3488         --  The item appears in a non-package construct with a declarative
3489         --  part (subprogram, block, etc). As such, the item is not allowed
3490         --  to be a part of an encapsulating state because the item is not
3491         --  visible.
3492
3493         if Placement = Not_In_Package then
3494            Error_Msg_N
3495              ("indicator Part_Of cannot appear in this context "
3496               & "(SPARK RM 7.2.6(5))", Indic);
3497            Error_Msg_Name_1 := Chars (Scope (State_Id));
3498            Error_Msg_NE
3499              ("\& is not part of the hidden state of package %",
3500               Indic, Item_Id);
3501
3502         --  The item appears in the visible state space of some package. In
3503         --  general this scenario does not warrant Part_Of except when the
3504         --  package is a private child unit and the encapsulating state is
3505         --  declared in a parent unit or a public descendant of that parent
3506         --  unit.
3507
3508         elsif Placement = Visible_State_Space then
3509            if Is_Child_Unit (Pack_Id)
3510              and then Is_Private_Descendant (Pack_Id)
3511            then
3512               if not Is_Child_Or_Sibling (Pack_Id, Scope (State_Id)) then
3513                  Error_Msg_N
3514                    ("indicator Part_Of must denote an abstract state of "
3515                     & "parent unit or descendant (SPARK RM 7.2.6(3))", Indic);
3516
3517               --  If the unit is a public child of a private unit it cannot
3518               --  refine the state of a private parent, only that of a
3519               --  public ancestor or descendant thereof.
3520
3521               elsif not Private_Present
3522                           (Parent (Unit_Declaration_Node (Pack_Id)))
3523                 and then Is_Private_Descendant (Scope (State_Id))
3524               then
3525                  Error_Msg_N
3526                    ("indicator Part_Of must denote the abstract state of "
3527                     & "a public ancestor", State);
3528               end if;
3529
3530            --  Indicator Part_Of is not needed when the related package is not
3531            --  a private child unit or a public descendant thereof.
3532
3533            else
3534               Error_Msg_N
3535                 ("indicator Part_Of cannot appear in this context (SPARK "
3536                  & "RM 7.2.6(5))", Indic);
3537               Error_Msg_Name_1 := Chars (Pack_Id);
3538               Error_Msg_NE
3539                 ("\& is declared in the visible part of package %",
3540                  Indic, Item_Id);
3541            end if;
3542
3543         --  When the item appears in the private state space of a package, the
3544         --  encapsulating state must be declared in the same package.
3545
3546         elsif Placement = Private_State_Space then
3547            if Scope (State_Id) /= Pack_Id then
3548               Error_Msg_NE
3549                 ("indicator Part_Of must designate an abstract state of "
3550                  & "package & (SPARK RM 7.2.6(2))", Indic, Pack_Id);
3551               Error_Msg_Name_1 := Chars (Pack_Id);
3552               Error_Msg_NE
3553                 ("\& is declared in the private part of package %",
3554                  Indic, Item_Id);
3555            end if;
3556
3557         --  Items declared in the body state space of a package do not need
3558         --  Part_Of indicators as the refinement has already been seen.
3559
3560         else
3561            Error_Msg_N
3562              ("indicator Part_Of cannot appear in this context "
3563               & "(SPARK RM 7.2.6(5))", Indic);
3564
3565            if Scope (State_Id) = Pack_Id then
3566               Error_Msg_Name_1 := Chars (Pack_Id);
3567               Error_Msg_NE
3568                 ("\& is declared in the body of package %", Indic, Item_Id);
3569            end if;
3570         end if;
3571
3572         Legal := True;
3573      end Analyze_Part_Of;
3574
3575      ----------------------------
3576      -- Analyze_Refined_Pragma --
3577      ----------------------------
3578
3579      procedure Analyze_Refined_Pragma
3580        (Spec_Id : out Entity_Id;
3581         Body_Id : out Entity_Id;
3582         Legal   : out Boolean)
3583      is
3584         Body_Decl : Node_Id;
3585         Spec_Decl : Node_Id;
3586
3587      begin
3588         --  Assume that the pragma is illegal
3589
3590         Spec_Id := Empty;
3591         Body_Id := Empty;
3592         Legal   := False;
3593
3594         GNAT_Pragma;
3595         Check_Arg_Count (1);
3596         Check_No_Identifiers;
3597
3598         if Nam_In (Pname, Name_Refined_Depends,
3599                           Name_Refined_Global,
3600                           Name_Refined_State)
3601         then
3602            Ensure_Aggregate_Form (Arg1);
3603         end if;
3604
3605         --  Verify the placement of the pragma and check for duplicates. The
3606         --  pragma must apply to a subprogram body [stub].
3607
3608         Body_Decl := Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
3609
3610         --  Extract the entities of the spec and body
3611
3612         if Nkind (Body_Decl) = N_Subprogram_Body then
3613            Body_Id := Defining_Entity (Body_Decl);
3614            Spec_Id := Corresponding_Spec (Body_Decl);
3615
3616         elsif Nkind (Body_Decl) = N_Subprogram_Body_Stub then
3617            Body_Id := Defining_Entity (Body_Decl);
3618            Spec_Id := Corresponding_Spec_Of_Stub (Body_Decl);
3619
3620         else
3621            Pragma_Misplaced;
3622            return;
3623         end if;
3624
3625         --  The pragma must apply to the second declaration of a subprogram.
3626         --  In other words, the body [stub] cannot acts as a spec.
3627
3628         if No (Spec_Id) then
3629            Error_Pragma ("pragma % cannot apply to a stand alone body");
3630            return;
3631
3632         --  Catch the case where the subprogram body is a subunit and acts as
3633         --  the third declaration of the subprogram.
3634
3635         elsif Nkind (Parent (Body_Decl)) = N_Subunit then
3636            Error_Pragma ("pragma % cannot apply to a subunit");
3637            return;
3638         end if;
3639
3640         --  The pragma can only apply to the body [stub] of a subprogram
3641         --  declared in the visible part of a package. Retrieve the context of
3642         --  the subprogram declaration.
3643
3644         Spec_Decl := Parent (Parent (Spec_Id));
3645
3646         if Nkind (Parent (Spec_Decl)) /= N_Package_Specification then
3647            Error_Pragma
3648              ("pragma % must apply to the body of a subprogram declared in a "
3649               & "package specification");
3650            return;
3651         end if;
3652
3653         --  If we get here, then the pragma is legal
3654
3655         Legal := True;
3656      end Analyze_Refined_Pragma;
3657
3658      --------------------------
3659      -- Check_Ada_83_Warning --
3660      --------------------------
3661
3662      procedure Check_Ada_83_Warning is
3663      begin
3664         if Ada_Version = Ada_83 and then Comes_From_Source (N) then
3665            Error_Msg_N ("(Ada 83) pragma& is non-standard??", N);
3666         end if;
3667      end Check_Ada_83_Warning;
3668
3669      ---------------------
3670      -- Check_Arg_Count --
3671      ---------------------
3672
3673      procedure Check_Arg_Count (Required : Nat) is
3674      begin
3675         if Arg_Count /= Required then
3676            Error_Pragma ("wrong number of arguments for pragma%");
3677         end if;
3678      end Check_Arg_Count;
3679
3680      --------------------------------
3681      -- Check_Arg_Is_External_Name --
3682      --------------------------------
3683
3684      procedure Check_Arg_Is_External_Name (Arg : Node_Id) is
3685         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3686
3687      begin
3688         if Nkind (Argx) = N_Identifier then
3689            return;
3690
3691         else
3692            Analyze_And_Resolve (Argx, Standard_String);
3693
3694            if Is_OK_Static_Expression (Argx) then
3695               return;
3696
3697            elsif Etype (Argx) = Any_Type then
3698               raise Pragma_Exit;
3699
3700            --  An interesting special case, if we have a string literal and
3701            --  we are in Ada 83 mode, then we allow it even though it will
3702            --  not be flagged as static. This allows expected Ada 83 mode
3703            --  use of external names which are string literals, even though
3704            --  technically these are not static in Ada 83.
3705
3706            elsif Ada_Version = Ada_83
3707              and then Nkind (Argx) = N_String_Literal
3708            then
3709               return;
3710
3711            --  Static expression that raises Constraint_Error. This has
3712            --  already been flagged, so just exit from pragma processing.
3713
3714            elsif Is_Static_Expression (Argx) then
3715               raise Pragma_Exit;
3716
3717            --  Here we have a real error (non-static expression)
3718
3719            else
3720               Error_Msg_Name_1 := Pname;
3721
3722               declare
3723                  Msg : String :=
3724                          "argument for pragma% must be a identifier or "
3725                          & "static string expression!";
3726               begin
3727                  Fix_Error (Msg);
3728                  Flag_Non_Static_Expr (Msg, Argx);
3729                  raise Pragma_Exit;
3730               end;
3731            end if;
3732         end if;
3733      end Check_Arg_Is_External_Name;
3734
3735      -----------------------------
3736      -- Check_Arg_Is_Identifier --
3737      -----------------------------
3738
3739      procedure Check_Arg_Is_Identifier (Arg : Node_Id) is
3740         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3741      begin
3742         if Nkind (Argx) /= N_Identifier then
3743            Error_Pragma_Arg
3744              ("argument for pragma% must be identifier", Argx);
3745         end if;
3746      end Check_Arg_Is_Identifier;
3747
3748      ----------------------------------
3749      -- Check_Arg_Is_Integer_Literal --
3750      ----------------------------------
3751
3752      procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id) is
3753         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3754      begin
3755         if Nkind (Argx) /= N_Integer_Literal then
3756            Error_Pragma_Arg
3757              ("argument for pragma% must be integer literal", Argx);
3758         end if;
3759      end Check_Arg_Is_Integer_Literal;
3760
3761      -------------------------------------------
3762      -- Check_Arg_Is_Library_Level_Local_Name --
3763      -------------------------------------------
3764
3765      --  LOCAL_NAME ::=
3766      --    DIRECT_NAME
3767      --  | DIRECT_NAME'ATTRIBUTE_DESIGNATOR
3768      --  | library_unit_NAME
3769
3770      procedure Check_Arg_Is_Library_Level_Local_Name (Arg : Node_Id) is
3771      begin
3772         Check_Arg_Is_Local_Name (Arg);
3773
3774         if not Is_Library_Level_Entity (Entity (Get_Pragma_Arg (Arg)))
3775           and then Comes_From_Source (N)
3776         then
3777            Error_Pragma_Arg
3778              ("argument for pragma% must be library level entity", Arg);
3779         end if;
3780      end Check_Arg_Is_Library_Level_Local_Name;
3781
3782      -----------------------------
3783      -- Check_Arg_Is_Local_Name --
3784      -----------------------------
3785
3786      --  LOCAL_NAME ::=
3787      --    DIRECT_NAME
3788      --  | DIRECT_NAME'ATTRIBUTE_DESIGNATOR
3789      --  | library_unit_NAME
3790
3791      procedure Check_Arg_Is_Local_Name (Arg : Node_Id) is
3792         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3793
3794      begin
3795         Analyze (Argx);
3796
3797         if Nkind (Argx) not in N_Direct_Name
3798           and then (Nkind (Argx) /= N_Attribute_Reference
3799                      or else Present (Expressions (Argx))
3800                      or else Nkind (Prefix (Argx)) /= N_Identifier)
3801           and then (not Is_Entity_Name (Argx)
3802                      or else not Is_Compilation_Unit (Entity (Argx)))
3803         then
3804            Error_Pragma_Arg ("argument for pragma% must be local name", Argx);
3805         end if;
3806
3807         --  No further check required if not an entity name
3808
3809         if not Is_Entity_Name (Argx) then
3810            null;
3811
3812         else
3813            declare
3814               OK   : Boolean;
3815               Ent  : constant Entity_Id := Entity (Argx);
3816               Scop : constant Entity_Id := Scope (Ent);
3817
3818            begin
3819               --  Case of a pragma applied to a compilation unit: pragma must
3820               --  occur immediately after the program unit in the compilation.
3821
3822               if Is_Compilation_Unit (Ent) then
3823                  declare
3824                     Decl : constant Node_Id := Unit_Declaration_Node (Ent);
3825
3826                  begin
3827                     --  Case of pragma placed immediately after spec
3828
3829                     if Parent (N) = Aux_Decls_Node (Parent (Decl)) then
3830                        OK := True;
3831
3832                     --  Case of pragma placed immediately after body
3833
3834                     elsif Nkind (Decl) = N_Subprogram_Declaration
3835                             and then Present (Corresponding_Body (Decl))
3836                     then
3837                        OK := Parent (N) =
3838                                Aux_Decls_Node
3839                                  (Parent (Unit_Declaration_Node
3840                                             (Corresponding_Body (Decl))));
3841
3842                     --  All other cases are illegal
3843
3844                     else
3845                        OK := False;
3846                     end if;
3847                  end;
3848
3849               --  Special restricted placement rule from 10.2.1(11.8/2)
3850
3851               elsif Is_Generic_Formal (Ent)
3852                       and then Prag_Id = Pragma_Preelaborable_Initialization
3853               then
3854                  OK := List_Containing (N) =
3855                          Generic_Formal_Declarations
3856                            (Unit_Declaration_Node (Scop));
3857
3858               --  If this is an aspect applied to a subprogram body, the
3859               --  pragma is inserted in its declarative part.
3860
3861               elsif From_Aspect_Specification (N)
3862                 and then
3863                   Nkind (Unit_Declaration_Node (Ent)) = N_Subprogram_Body
3864                 and then  Ent = Current_Scope
3865               then
3866                  OK := True;
3867
3868               --  If the aspect is a predicate (possibly others ???)  and the
3869               --  context is a record type, this is a discriminant expression
3870               --  within a type declaration, that freezes the predicated
3871               --  subtype.
3872
3873               elsif From_Aspect_Specification (N)
3874                 and then Prag_Id = Pragma_Predicate
3875                 and then Ekind (Current_Scope) = E_Record_Type
3876                 and then Scop = Scope (Current_Scope)
3877               then
3878                  OK := True;
3879
3880               --  Default case, just check that the pragma occurs in the scope
3881               --  of the entity denoted by the name.
3882
3883               else
3884                  OK := Current_Scope = Scop;
3885               end if;
3886
3887               if not OK then
3888                  Error_Pragma_Arg
3889                    ("pragma% argument must be in same declarative part", Arg);
3890               end if;
3891            end;
3892         end if;
3893      end Check_Arg_Is_Local_Name;
3894
3895      ---------------------------------
3896      -- Check_Arg_Is_Locking_Policy --
3897      ---------------------------------
3898
3899      procedure Check_Arg_Is_Locking_Policy (Arg : Node_Id) is
3900         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3901
3902      begin
3903         Check_Arg_Is_Identifier (Argx);
3904
3905         if not Is_Locking_Policy_Name (Chars (Argx)) then
3906            Error_Pragma_Arg ("& is not a valid locking policy name", Argx);
3907         end if;
3908      end Check_Arg_Is_Locking_Policy;
3909
3910      -----------------------------------------------
3911      -- Check_Arg_Is_Partition_Elaboration_Policy --
3912      -----------------------------------------------
3913
3914      procedure Check_Arg_Is_Partition_Elaboration_Policy (Arg : Node_Id) is
3915         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3916
3917      begin
3918         Check_Arg_Is_Identifier (Argx);
3919
3920         if not Is_Partition_Elaboration_Policy_Name (Chars (Argx)) then
3921            Error_Pragma_Arg
3922              ("& is not a valid partition elaboration policy name", Argx);
3923         end if;
3924      end Check_Arg_Is_Partition_Elaboration_Policy;
3925
3926      -------------------------
3927      -- Check_Arg_Is_One_Of --
3928      -------------------------
3929
3930      procedure Check_Arg_Is_One_Of (Arg : Node_Id; N1, N2 : Name_Id) is
3931         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3932
3933      begin
3934         Check_Arg_Is_Identifier (Argx);
3935
3936         if not Nam_In (Chars (Argx), N1, N2) then
3937            Error_Msg_Name_2 := N1;
3938            Error_Msg_Name_3 := N2;
3939            Error_Pragma_Arg ("argument for pragma% must be% or%", Argx);
3940         end if;
3941      end Check_Arg_Is_One_Of;
3942
3943      procedure Check_Arg_Is_One_Of
3944        (Arg        : Node_Id;
3945         N1, N2, N3 : Name_Id)
3946      is
3947         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3948
3949      begin
3950         Check_Arg_Is_Identifier (Argx);
3951
3952         if not Nam_In (Chars (Argx), N1, N2, N3) then
3953            Error_Pragma_Arg ("invalid argument for pragma%", Argx);
3954         end if;
3955      end Check_Arg_Is_One_Of;
3956
3957      procedure Check_Arg_Is_One_Of
3958        (Arg                : Node_Id;
3959         N1, N2, N3, N4     : Name_Id)
3960      is
3961         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3962
3963      begin
3964         Check_Arg_Is_Identifier (Argx);
3965
3966         if not Nam_In (Chars (Argx), N1, N2, N3, N4) then
3967            Error_Pragma_Arg ("invalid argument for pragma%", Argx);
3968         end if;
3969      end Check_Arg_Is_One_Of;
3970
3971      procedure Check_Arg_Is_One_Of
3972        (Arg                : Node_Id;
3973         N1, N2, N3, N4, N5 : Name_Id)
3974      is
3975         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3976
3977      begin
3978         Check_Arg_Is_Identifier (Argx);
3979
3980         if not Nam_In (Chars (Argx), N1, N2, N3, N4, N5) then
3981            Error_Pragma_Arg ("invalid argument for pragma%", Argx);
3982         end if;
3983      end Check_Arg_Is_One_Of;
3984
3985      ---------------------------------
3986      -- Check_Arg_Is_Queuing_Policy --
3987      ---------------------------------
3988
3989      procedure Check_Arg_Is_Queuing_Policy (Arg : Node_Id) is
3990         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
3991
3992      begin
3993         Check_Arg_Is_Identifier (Argx);
3994
3995         if not Is_Queuing_Policy_Name (Chars (Argx)) then
3996            Error_Pragma_Arg ("& is not a valid queuing policy name", Argx);
3997         end if;
3998      end Check_Arg_Is_Queuing_Policy;
3999
4000      ------------------------------------
4001      -- Check_Arg_Is_Static_Expression --
4002      ------------------------------------
4003
4004      procedure Check_Arg_Is_Static_Expression
4005        (Arg : Node_Id;
4006         Typ : Entity_Id := Empty)
4007      is
4008      begin
4009         Check_Expr_Is_Static_Expression (Get_Pragma_Arg (Arg), Typ);
4010      end Check_Arg_Is_Static_Expression;
4011
4012      ------------------------------------------
4013      -- Check_Arg_Is_Task_Dispatching_Policy --
4014      ------------------------------------------
4015
4016      procedure Check_Arg_Is_Task_Dispatching_Policy (Arg : Node_Id) is
4017         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
4018
4019      begin
4020         Check_Arg_Is_Identifier (Argx);
4021
4022         if not Is_Task_Dispatching_Policy_Name (Chars (Argx)) then
4023            Error_Pragma_Arg
4024              ("& is not a valid task dispatching policy name", Argx);
4025         end if;
4026      end Check_Arg_Is_Task_Dispatching_Policy;
4027
4028      ---------------------
4029      -- Check_Arg_Order --
4030      ---------------------
4031
4032      procedure Check_Arg_Order (Names : Name_List) is
4033         Arg : Node_Id;
4034
4035         Highest_So_Far : Natural := 0;
4036         --  Highest index in Names seen do far
4037
4038      begin
4039         Arg := Arg1;
4040         for J in 1 .. Arg_Count loop
4041            if Chars (Arg) /= No_Name then
4042               for K in Names'Range loop
4043                  if Chars (Arg) = Names (K) then
4044                     if K < Highest_So_Far then
4045                        Error_Msg_Name_1 := Pname;
4046                        Error_Msg_N
4047                          ("parameters out of order for pragma%", Arg);
4048                        Error_Msg_Name_1 := Names (K);
4049                        Error_Msg_Name_2 := Names (Highest_So_Far);
4050                        Error_Msg_N ("\% must appear before %", Arg);
4051                        raise Pragma_Exit;
4052
4053                     else
4054                        Highest_So_Far := K;
4055                     end if;
4056                  end if;
4057               end loop;
4058            end if;
4059
4060            Arg := Next (Arg);
4061         end loop;
4062      end Check_Arg_Order;
4063
4064      --------------------------------
4065      -- Check_At_Least_N_Arguments --
4066      --------------------------------
4067
4068      procedure Check_At_Least_N_Arguments (N : Nat) is
4069      begin
4070         if Arg_Count < N then
4071            Error_Pragma ("too few arguments for pragma%");
4072         end if;
4073      end Check_At_Least_N_Arguments;
4074
4075      -------------------------------
4076      -- Check_At_Most_N_Arguments --
4077      -------------------------------
4078
4079      procedure Check_At_Most_N_Arguments (N : Nat) is
4080         Arg : Node_Id;
4081      begin
4082         if Arg_Count > N then
4083            Arg := Arg1;
4084            for J in 1 .. N loop
4085               Next (Arg);
4086               Error_Pragma_Arg ("too many arguments for pragma%", Arg);
4087            end loop;
4088         end if;
4089      end Check_At_Most_N_Arguments;
4090
4091      ---------------------
4092      -- Check_Component --
4093      ---------------------
4094
4095      procedure Check_Component
4096        (Comp            : Node_Id;
4097         UU_Typ          : Entity_Id;
4098         In_Variant_Part : Boolean := False)
4099      is
4100         Comp_Id : constant Entity_Id := Defining_Identifier (Comp);
4101         Sindic  : constant Node_Id :=
4102                     Subtype_Indication (Component_Definition (Comp));
4103         Typ     : constant Entity_Id := Etype (Comp_Id);
4104
4105      begin
4106         --  Ada 2005 (AI-216): If a component subtype is subject to a per-
4107         --  object constraint, then the component type shall be an Unchecked_
4108         --  Union.
4109
4110         if Nkind (Sindic) = N_Subtype_Indication
4111           and then Has_Per_Object_Constraint (Comp_Id)
4112           and then not Is_Unchecked_Union (Etype (Subtype_Mark (Sindic)))
4113         then
4114            Error_Msg_N
4115              ("component subtype subject to per-object constraint "
4116               & "must be an Unchecked_Union", Comp);
4117
4118         --  Ada 2012 (AI05-0026): For an unchecked union type declared within
4119         --  the body of a generic unit, or within the body of any of its
4120         --  descendant library units, no part of the type of a component
4121         --  declared in a variant_part of the unchecked union type shall be of
4122         --  a formal private type or formal private extension declared within
4123         --  the formal part of the generic unit.
4124
4125         elsif Ada_Version >= Ada_2012
4126           and then In_Generic_Body (UU_Typ)
4127           and then In_Variant_Part
4128           and then Is_Private_Type (Typ)
4129           and then Is_Generic_Type (Typ)
4130         then
4131            Error_Msg_N
4132              ("component of unchecked union cannot be of generic type", Comp);
4133
4134         elsif Needs_Finalization (Typ) then
4135            Error_Msg_N
4136              ("component of unchecked union cannot be controlled", Comp);
4137
4138         elsif Has_Task (Typ) then
4139            Error_Msg_N
4140              ("component of unchecked union cannot have tasks", Comp);
4141         end if;
4142      end Check_Component;
4143
4144      -----------------------------
4145      -- Check_Declaration_Order --
4146      -----------------------------
4147
4148      procedure Check_Declaration_Order (First : Node_Id; Second : Node_Id) is
4149         procedure Check_Aspect_Specification_Order;
4150         --  Inspect the aspect specifications of the context to determine the
4151         --  proper order.
4152
4153         --------------------------------------
4154         -- Check_Aspect_Specification_Order --
4155         --------------------------------------
4156
4157         procedure Check_Aspect_Specification_Order is
4158            Asp_First  : constant Node_Id := Corresponding_Aspect (First);
4159            Asp_Second : constant Node_Id := Corresponding_Aspect (Second);
4160            Asp        : Node_Id;
4161
4162         begin
4163            --  Both aspects must be part of the same aspect specification list
4164
4165            pragma Assert
4166              (List_Containing (Asp_First) = List_Containing (Asp_Second));
4167
4168            --  Try to reach Second starting from First in a left to right
4169            --  traversal of the aspect specifications.
4170
4171            Asp := Next (Asp_First);
4172            while Present (Asp) loop
4173
4174               --  The order is ok, First is followed by Second
4175
4176               if Asp = Asp_Second then
4177                  return;
4178               end if;
4179
4180               Next (Asp);
4181            end loop;
4182
4183            --  If we get here, then the aspects are out of order
4184
4185            Error_Msg_N ("aspect % cannot come after aspect %", First);
4186         end Check_Aspect_Specification_Order;
4187
4188         --  Local variables
4189
4190         Stmt : Node_Id;
4191
4192      --  Start of processing for Check_Declaration_Order
4193
4194      begin
4195         --  Cannot check the order if one of the pragmas is missing
4196
4197         if No (First) or else No (Second) then
4198            return;
4199         end if;
4200
4201         --  Set up the error names in case the order is incorrect
4202
4203         Error_Msg_Name_1 := Pragma_Name (First);
4204         Error_Msg_Name_2 := Pragma_Name (Second);
4205
4206         if From_Aspect_Specification (First) then
4207
4208            --  Both pragmas are actually aspects, check their declaration
4209            --  order in the associated aspect specification list. Otherwise
4210            --  First is an aspect and Second a source pragma.
4211
4212            if From_Aspect_Specification (Second) then
4213               Check_Aspect_Specification_Order;
4214            end if;
4215
4216         --  Abstract_States is a source pragma
4217
4218         else
4219            if From_Aspect_Specification (Second) then
4220               Error_Msg_N ("pragma % cannot come after aspect %", First);
4221
4222            --  Both pragmas are source constructs. Try to reach First from
4223            --  Second by traversing the declarations backwards.
4224
4225            else
4226               Stmt := Prev (Second);
4227               while Present (Stmt) loop
4228
4229                  --  The order is ok, First is followed by Second
4230
4231                  if Stmt = First then
4232                     return;
4233                  end if;
4234
4235                  Prev (Stmt);
4236               end loop;
4237
4238               --  If we get here, then the pragmas are out of order
4239
4240               Error_Msg_N ("pragma % cannot come after pragma %", First);
4241            end if;
4242         end if;
4243      end Check_Declaration_Order;
4244
4245      ----------------------------
4246      -- Check_Duplicate_Pragma --
4247      ----------------------------
4248
4249      procedure Check_Duplicate_Pragma (E : Entity_Id) is
4250         Id : Entity_Id := E;
4251         P  : Node_Id;
4252
4253      begin
4254         --  Nothing to do if this pragma comes from an aspect specification,
4255         --  since we could not be duplicating a pragma, and we dealt with the
4256         --  case of duplicated aspects in Analyze_Aspect_Specifications.
4257
4258         if From_Aspect_Specification (N) then
4259            return;
4260         end if;
4261
4262         --  Otherwise current pragma may duplicate previous pragma or a
4263         --  previously given aspect specification or attribute definition
4264         --  clause for the same pragma.
4265
4266         P := Get_Rep_Item (E, Pragma_Name (N), Check_Parents => False);
4267
4268         if Present (P) then
4269
4270            --  If the entity is a type, then we have to make sure that the
4271            --  ostensible duplicate is not for a parent type from which this
4272            --  type is derived.
4273
4274            if Is_Type (E) then
4275               if Nkind (P) = N_Pragma then
4276                  declare
4277                     Args : constant List_Id :=
4278                              Pragma_Argument_Associations (P);
4279                  begin
4280                     if Present (Args)
4281                       and then Is_Entity_Name (Expression (First (Args)))
4282                       and then Is_Type (Entity (Expression (First (Args))))
4283                       and then Entity (Expression (First (Args))) /= E
4284                     then
4285                        return;
4286                     end if;
4287                  end;
4288
4289               elsif Nkind (P) = N_Aspect_Specification
4290                 and then Is_Type (Entity (P))
4291                 and then Entity (P) /= E
4292               then
4293                  return;
4294               end if;
4295            end if;
4296
4297            --  Here we have a definite duplicate
4298
4299            Error_Msg_Name_1 := Pragma_Name (N);
4300            Error_Msg_Sloc := Sloc (P);
4301
4302            --  For a single protected or a single task object, the error is
4303            --  issued on the original entity.
4304
4305            if Ekind_In (Id, E_Task_Type, E_Protected_Type) then
4306               Id := Defining_Identifier (Original_Node (Parent (Id)));
4307            end if;
4308
4309            if Nkind (P) = N_Aspect_Specification
4310              or else From_Aspect_Specification (P)
4311            then
4312               Error_Msg_NE ("aspect% for & previously given#", N, Id);
4313            else
4314               Error_Msg_NE ("pragma% for & duplicates pragma#", N, Id);
4315            end if;
4316
4317            raise Pragma_Exit;
4318         end if;
4319      end Check_Duplicate_Pragma;
4320
4321      ----------------------------------
4322      -- Check_Duplicated_Export_Name --
4323      ----------------------------------
4324
4325      procedure Check_Duplicated_Export_Name (Nam : Node_Id) is
4326         String_Val : constant String_Id := Strval (Nam);
4327
4328      begin
4329         --  We are only interested in the export case, and in the case of
4330         --  generics, it is the instance, not the template, that is the
4331         --  problem (the template will generate a warning in any case).
4332
4333         if not Inside_A_Generic
4334           and then (Prag_Id = Pragma_Export
4335                       or else
4336                     Prag_Id = Pragma_Export_Procedure
4337                       or else
4338                     Prag_Id = Pragma_Export_Valued_Procedure
4339                       or else
4340                     Prag_Id = Pragma_Export_Function)
4341         then
4342            for J in Externals.First .. Externals.Last loop
4343               if String_Equal (String_Val, Strval (Externals.Table (J))) then
4344                  Error_Msg_Sloc := Sloc (Externals.Table (J));
4345                  Error_Msg_N ("external name duplicates name given#", Nam);
4346                  exit;
4347               end if;
4348            end loop;
4349
4350            Externals.Append (Nam);
4351         end if;
4352      end Check_Duplicated_Export_Name;
4353
4354      -------------------------------------
4355      -- Check_Expr_Is_Static_Expression --
4356      -------------------------------------
4357
4358      procedure Check_Expr_Is_Static_Expression
4359        (Expr : Node_Id;
4360         Typ  : Entity_Id := Empty)
4361      is
4362      begin
4363         if Present (Typ) then
4364            Analyze_And_Resolve (Expr, Typ);
4365         else
4366            Analyze_And_Resolve (Expr);
4367         end if;
4368
4369         if Is_OK_Static_Expression (Expr) then
4370            return;
4371
4372         elsif Etype (Expr) = Any_Type then
4373            raise Pragma_Exit;
4374
4375         --  An interesting special case, if we have a string literal and we
4376         --  are in Ada 83 mode, then we allow it even though it will not be
4377         --  flagged as static. This allows the use of Ada 95 pragmas like
4378         --  Import in Ada 83 mode. They will of course be flagged with
4379         --  warnings as usual, but will not cause errors.
4380
4381         elsif Ada_Version = Ada_83
4382           and then Nkind (Expr) = N_String_Literal
4383         then
4384            return;
4385
4386         --  Static expression that raises Constraint_Error. This has already
4387         --  been flagged, so just exit from pragma processing.
4388
4389         elsif Is_Static_Expression (Expr) then
4390            raise Pragma_Exit;
4391
4392         --  Finally, we have a real error
4393
4394         else
4395            Error_Msg_Name_1 := Pname;
4396
4397            declare
4398               Msg : String :=
4399                       "argument for pragma% must be a static expression!";
4400            begin
4401               Fix_Error (Msg);
4402               Flag_Non_Static_Expr (Msg, Expr);
4403            end;
4404
4405            raise Pragma_Exit;
4406         end if;
4407      end Check_Expr_Is_Static_Expression;
4408
4409      -------------------------
4410      -- Check_First_Subtype --
4411      -------------------------
4412
4413      procedure Check_First_Subtype (Arg : Node_Id) is
4414         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
4415         Ent  : constant Entity_Id := Entity (Argx);
4416
4417      begin
4418         if Is_First_Subtype (Ent) then
4419            null;
4420
4421         elsif Is_Type (Ent) then
4422            Error_Pragma_Arg
4423              ("pragma% cannot apply to subtype", Argx);
4424
4425         elsif Is_Object (Ent) then
4426            Error_Pragma_Arg
4427              ("pragma% cannot apply to object, requires a type", Argx);
4428
4429         else
4430            Error_Pragma_Arg
4431              ("pragma% cannot apply to&, requires a type", Argx);
4432         end if;
4433      end Check_First_Subtype;
4434
4435      ----------------------
4436      -- Check_Identifier --
4437      ----------------------
4438
4439      procedure Check_Identifier (Arg : Node_Id; Id : Name_Id) is
4440      begin
4441         if Present (Arg)
4442           and then Nkind (Arg) = N_Pragma_Argument_Association
4443         then
4444            if Chars (Arg) = No_Name or else Chars (Arg) /= Id then
4445               Error_Msg_Name_1 := Pname;
4446               Error_Msg_Name_2 := Id;
4447               Error_Msg_N ("pragma% argument expects identifier%", Arg);
4448               raise Pragma_Exit;
4449            end if;
4450         end if;
4451      end Check_Identifier;
4452
4453      --------------------------------
4454      -- Check_Identifier_Is_One_Of --
4455      --------------------------------
4456
4457      procedure Check_Identifier_Is_One_Of (Arg : Node_Id; N1, N2 : Name_Id) is
4458      begin
4459         if Present (Arg)
4460           and then Nkind (Arg) = N_Pragma_Argument_Association
4461         then
4462            if Chars (Arg) = No_Name then
4463               Error_Msg_Name_1 := Pname;
4464               Error_Msg_N ("pragma% argument expects an identifier", Arg);
4465               raise Pragma_Exit;
4466
4467            elsif Chars (Arg) /= N1
4468              and then Chars (Arg) /= N2
4469            then
4470               Error_Msg_Name_1 := Pname;
4471               Error_Msg_N ("invalid identifier for pragma% argument", Arg);
4472               raise Pragma_Exit;
4473            end if;
4474         end if;
4475      end Check_Identifier_Is_One_Of;
4476
4477      ---------------------------
4478      -- Check_In_Main_Program --
4479      ---------------------------
4480
4481      procedure Check_In_Main_Program is
4482         P : constant Node_Id := Parent (N);
4483
4484      begin
4485         --  Must be at in subprogram body
4486
4487         if Nkind (P) /= N_Subprogram_Body then
4488            Error_Pragma ("% pragma allowed only in subprogram");
4489
4490         --  Otherwise warn if obviously not main program
4491
4492         elsif Present (Parameter_Specifications (Specification (P)))
4493           or else not Is_Compilation_Unit (Defining_Entity (P))
4494         then
4495            Error_Msg_Name_1 := Pname;
4496            Error_Msg_N
4497              ("??pragma% is only effective in main program", N);
4498         end if;
4499      end Check_In_Main_Program;
4500
4501      ---------------------------------------
4502      -- Check_Interrupt_Or_Attach_Handler --
4503      ---------------------------------------
4504
4505      procedure Check_Interrupt_Or_Attach_Handler is
4506         Arg1_X : constant Node_Id := Get_Pragma_Arg (Arg1);
4507         Handler_Proc, Proc_Scope : Entity_Id;
4508
4509      begin
4510         Analyze (Arg1_X);
4511
4512         if Prag_Id = Pragma_Interrupt_Handler then
4513            Check_Restriction (No_Dynamic_Attachment, N);
4514         end if;
4515
4516         Handler_Proc := Find_Unique_Parameterless_Procedure (Arg1_X, Arg1);
4517         Proc_Scope := Scope (Handler_Proc);
4518
4519         --  On AAMP only, a pragma Interrupt_Handler is supported for
4520         --  nonprotected parameterless procedures.
4521
4522         if not AAMP_On_Target
4523           or else Prag_Id = Pragma_Attach_Handler
4524         then
4525            if Ekind (Proc_Scope) /= E_Protected_Type then
4526               Error_Pragma_Arg
4527                 ("argument of pragma% must be protected procedure", Arg1);
4528            end if;
4529
4530            --  For pragma case (as opposed to access case), check placement.
4531            --  We don't need to do that for aspects, because we have the
4532            --  check that they are apply an appropriate procedure.
4533
4534            if not From_Aspect_Specification (N)
4535              and then Parent (N) /= Protected_Definition (Parent (Proc_Scope))
4536            then
4537               Error_Pragma ("pragma% must be in protected definition");
4538            end if;
4539         end if;
4540
4541         if not Is_Library_Level_Entity (Proc_Scope)
4542           or else (AAMP_On_Target
4543                     and then not Is_Library_Level_Entity (Handler_Proc))
4544         then
4545            Error_Pragma_Arg
4546              ("argument for pragma% must be library level entity", Arg1);
4547         end if;
4548
4549         --  AI05-0033: A pragma cannot appear within a generic body, because
4550         --  instance can be in a nested scope. The check that protected type
4551         --  is itself a library-level declaration is done elsewhere.
4552
4553         --  Note: we omit this check in Relaxed_RM_Semantics mode to properly
4554         --  handle code prior to AI-0033. Analysis tools typically are not
4555         --  interested in this pragma in any case, so no need to worry too
4556         --  much about its placement.
4557
4558         if Inside_A_Generic then
4559            if Ekind (Scope (Current_Scope)) = E_Generic_Package
4560              and then In_Package_Body (Scope (Current_Scope))
4561              and then not Relaxed_RM_Semantics
4562            then
4563               Error_Pragma ("pragma% cannot be used inside a generic");
4564            end if;
4565         end if;
4566      end Check_Interrupt_Or_Attach_Handler;
4567
4568      ---------------------------------
4569      -- Check_Loop_Pragma_Placement --
4570      ---------------------------------
4571
4572      procedure Check_Loop_Pragma_Placement is
4573         procedure Check_Loop_Pragma_Grouping (Loop_Stmt : Node_Id);
4574         --  Verify whether the current pragma is properly grouped with other
4575         --  pragma Loop_Invariant and/or Loop_Variant. Node Loop_Stmt is the
4576         --  related loop where the pragma appears.
4577
4578         function Is_Loop_Pragma (Stmt : Node_Id) return Boolean;
4579         --  Determine whether an arbitrary statement Stmt denotes pragma
4580         --  Loop_Invariant or Loop_Variant.
4581
4582         procedure Placement_Error (Constr : Node_Id);
4583         pragma No_Return (Placement_Error);
4584         --  Node Constr denotes the last loop restricted construct before we
4585         --  encountered an illegal relation between enclosing constructs. Emit
4586         --  an error depending on what Constr was.
4587
4588         --------------------------------
4589         -- Check_Loop_Pragma_Grouping --
4590         --------------------------------
4591
4592         procedure Check_Loop_Pragma_Grouping (Loop_Stmt : Node_Id) is
4593            Stop_Search : exception;
4594            --  This exception is used to terminate the recursive descent of
4595            --  routine Check_Grouping.
4596
4597            procedure Check_Grouping (L : List_Id);
4598            --  Find the first group of pragmas in list L and if successful,
4599            --  ensure that the current pragma is part of that group. The
4600            --  routine raises Stop_Search once such a check is performed to
4601            --  halt the recursive descent.
4602
4603            procedure Grouping_Error (Prag : Node_Id);
4604            pragma No_Return (Grouping_Error);
4605            --  Emit an error concerning the current pragma indicating that it
4606            --  should be placed after pragma Prag.
4607
4608            --------------------
4609            -- Check_Grouping --
4610            --------------------
4611
4612            procedure Check_Grouping (L : List_Id) is
4613               HSS  : Node_Id;
4614               Prag : Node_Id;
4615               Stmt : Node_Id;
4616
4617            begin
4618               --  Inspect the list of declarations or statements looking for
4619               --  the first grouping of pragmas:
4620
4621               --    loop
4622               --       pragma Loop_Invariant ...;
4623               --       pragma Loop_Variant ...;
4624               --       . . .                     -- (1)
4625               --       pragma Loop_Variant ...;  --  current pragma
4626
4627               --  If the current pragma is not in the grouping, then it must
4628               --  either appear in a different declarative or statement list
4629               --  or the construct at (1) is separating the pragma from the
4630               --  grouping.
4631
4632               Stmt := First (L);
4633               while Present (Stmt) loop
4634
4635                  --  Pragmas Loop_Invariant and Loop_Variant may only appear
4636                  --  inside a loop or a block housed inside a loop. Inspect
4637                  --  the declarations and statements of the block as they may
4638                  --  contain the first grouping.
4639
4640                  if Nkind (Stmt) = N_Block_Statement then
4641                     HSS := Handled_Statement_Sequence (Stmt);
4642
4643                     Check_Grouping (Declarations (Stmt));
4644
4645                     if Present (HSS) then
4646                        Check_Grouping (Statements (HSS));
4647                     end if;
4648
4649                  --  First pragma of the first topmost grouping has been found
4650
4651                  elsif Is_Loop_Pragma (Stmt) then
4652
4653                     --  The group and the current pragma are not in the same
4654                     --  declarative or statement list.
4655
4656                     if List_Containing (Stmt) /= List_Containing (N) then
4657                        Grouping_Error (Stmt);
4658
4659                     --  Try to reach the current pragma from the first pragma
4660                     --  of the grouping while skipping other members:
4661
4662                     --    pragma Loop_Invariant ...;  --  first pragma
4663                     --    pragma Loop_Variant ...;    --  member
4664                     --    . . .
4665                     --    pragma Loop_Variant ...;    --  current pragma
4666
4667                     else
4668                        while Present (Stmt) loop
4669
4670                           --  The current pragma is either the first pragma
4671                           --  of the group or is a member of the group. Stop
4672                           --  the search as the placement is legal.
4673
4674                           if Stmt = N then
4675                              raise Stop_Search;
4676
4677                           --  Skip group members, but keep track of the last
4678                           --  pragma in the group.
4679
4680                           elsif Is_Loop_Pragma (Stmt) then
4681                              Prag := Stmt;
4682
4683                           --  A non-pragma is separating the group from the
4684                           --  current pragma, the placement is erroneous.
4685
4686                           else
4687                              Grouping_Error (Prag);
4688                           end if;
4689
4690                           Next (Stmt);
4691                        end loop;
4692
4693                        --  If the traversal did not reach the current pragma,
4694                        --  then the list must be malformed.
4695
4696                        raise Program_Error;
4697                     end if;
4698                  end if;
4699
4700                  Next (Stmt);
4701               end loop;
4702            end Check_Grouping;
4703
4704            --------------------
4705            -- Grouping_Error --
4706            --------------------
4707
4708            procedure Grouping_Error (Prag : Node_Id) is
4709            begin
4710               Error_Msg_Sloc := Sloc (Prag);
4711               Error_Pragma ("pragma% must appear next to pragma#");
4712            end Grouping_Error;
4713
4714         --  Start of processing for Check_Loop_Pragma_Grouping
4715
4716         begin
4717            --  Inspect the statements of the loop or nested blocks housed
4718            --  within to determine whether the current pragma is part of the
4719            --  first topmost grouping of Loop_Invariant and Loop_Variant.
4720
4721            Check_Grouping (Statements (Loop_Stmt));
4722
4723         exception
4724            when Stop_Search => null;
4725         end Check_Loop_Pragma_Grouping;
4726
4727         --------------------
4728         -- Is_Loop_Pragma --
4729         --------------------
4730
4731         function Is_Loop_Pragma (Stmt : Node_Id) return Boolean is
4732         begin
4733            --  Inspect the original node as Loop_Invariant and Loop_Variant
4734            --  pragmas are rewritten to null when assertions are disabled.
4735
4736            if Nkind (Original_Node (Stmt)) = N_Pragma then
4737               return
4738                 Nam_In (Pragma_Name (Original_Node (Stmt)),
4739                         Name_Loop_Invariant,
4740                         Name_Loop_Variant);
4741            else
4742               return False;
4743            end if;
4744         end Is_Loop_Pragma;
4745
4746         ---------------------
4747         -- Placement_Error --
4748         ---------------------
4749
4750         procedure Placement_Error (Constr : Node_Id) is
4751            LA : constant String := " with Loop_Entry";
4752
4753         begin
4754            if Prag_Id = Pragma_Assert then
4755               Error_Msg_String (1 .. LA'Length) := LA;
4756               Error_Msg_Strlen := LA'Length;
4757            else
4758               Error_Msg_Strlen := 0;
4759            end if;
4760
4761            if Nkind (Constr) = N_Pragma then
4762               Error_Pragma
4763                 ("pragma %~ must appear immediately within the statements "
4764                  & "of a loop");
4765            else
4766               Error_Pragma_Arg
4767                 ("block containing pragma %~ must appear immediately within "
4768                  & "the statements of a loop", Constr);
4769            end if;
4770         end Placement_Error;
4771
4772         --  Local declarations
4773
4774         Prev : Node_Id;
4775         Stmt : Node_Id;
4776
4777      --  Start of processing for Check_Loop_Pragma_Placement
4778
4779      begin
4780         --  Check that pragma appears immediately within a loop statement,
4781         --  ignoring intervening block statements.
4782
4783         Prev := N;
4784         Stmt := Parent (N);
4785         while Present (Stmt) loop
4786
4787            --  The pragma or previous block must appear immediately within the
4788            --  current block's declarative or statement part.
4789
4790            if Nkind (Stmt) = N_Block_Statement then
4791               if (No (Declarations (Stmt))
4792                    or else List_Containing (Prev) /= Declarations (Stmt))
4793                 and then
4794                   List_Containing (Prev) /=
4795                     Statements (Handled_Statement_Sequence (Stmt))
4796               then
4797                  Placement_Error (Prev);
4798                  return;
4799
4800               --  Keep inspecting the parents because we are now within a
4801               --  chain of nested blocks.
4802
4803               else
4804                  Prev := Stmt;
4805                  Stmt := Parent (Stmt);
4806               end if;
4807
4808            --  The pragma or previous block must appear immediately within the
4809            --  statements of the loop.
4810
4811            elsif Nkind (Stmt) = N_Loop_Statement then
4812               if List_Containing (Prev) /= Statements (Stmt) then
4813                  Placement_Error (Prev);
4814               end if;
4815
4816               --  Stop the traversal because we reached the innermost loop
4817               --  regardless of whether we encountered an error or not.
4818
4819               exit;
4820
4821            --  Ignore a handled statement sequence. Note that this node may
4822            --  be related to a subprogram body in which case we will emit an
4823            --  error on the next iteration of the search.
4824
4825            elsif Nkind (Stmt) = N_Handled_Sequence_Of_Statements then
4826               Stmt := Parent (Stmt);
4827
4828            --  Any other statement breaks the chain from the pragma to the
4829            --  loop.
4830
4831            else
4832               Placement_Error (Prev);
4833               return;
4834            end if;
4835         end loop;
4836
4837         --  Check that the current pragma Loop_Invariant or Loop_Variant is
4838         --  grouped together with other such pragmas.
4839
4840         if Is_Loop_Pragma (N) then
4841
4842            --  The previous check should have located the related loop
4843
4844            pragma Assert (Nkind (Stmt) = N_Loop_Statement);
4845            Check_Loop_Pragma_Grouping (Stmt);
4846         end if;
4847      end Check_Loop_Pragma_Placement;
4848
4849      -------------------------------------------
4850      -- Check_Is_In_Decl_Part_Or_Package_Spec --
4851      -------------------------------------------
4852
4853      procedure Check_Is_In_Decl_Part_Or_Package_Spec is
4854         P : Node_Id;
4855
4856      begin
4857         P := Parent (N);
4858         loop
4859            if No (P) then
4860               exit;
4861
4862            elsif Nkind (P) = N_Handled_Sequence_Of_Statements then
4863               exit;
4864
4865            elsif Nkind_In (P, N_Package_Specification,
4866                               N_Block_Statement)
4867            then
4868               return;
4869
4870            --  Note: the following tests seem a little peculiar, because
4871            --  they test for bodies, but if we were in the statement part
4872            --  of the body, we would already have hit the handled statement
4873            --  sequence, so the only way we get here is by being in the
4874            --  declarative part of the body.
4875
4876            elsif Nkind_In (P, N_Subprogram_Body,
4877                               N_Package_Body,
4878                               N_Task_Body,
4879                               N_Entry_Body)
4880            then
4881               return;
4882            end if;
4883
4884            P := Parent (P);
4885         end loop;
4886
4887         Error_Pragma ("pragma% is not in declarative part or package spec");
4888      end Check_Is_In_Decl_Part_Or_Package_Spec;
4889
4890      -------------------------
4891      -- Check_No_Identifier --
4892      -------------------------
4893
4894      procedure Check_No_Identifier (Arg : Node_Id) is
4895      begin
4896         if Nkind (Arg) = N_Pragma_Argument_Association
4897           and then Chars (Arg) /= No_Name
4898         then
4899            Error_Pragma_Arg_Ident
4900              ("pragma% does not permit identifier& here", Arg);
4901         end if;
4902      end Check_No_Identifier;
4903
4904      --------------------------
4905      -- Check_No_Identifiers --
4906      --------------------------
4907
4908      procedure Check_No_Identifiers is
4909         Arg_Node : Node_Id;
4910      begin
4911         Arg_Node := Arg1;
4912         for J in 1 .. Arg_Count loop
4913            Check_No_Identifier (Arg_Node);
4914            Next (Arg_Node);
4915         end loop;
4916      end Check_No_Identifiers;
4917
4918      ------------------------
4919      -- Check_No_Link_Name --
4920      ------------------------
4921
4922      procedure Check_No_Link_Name is
4923      begin
4924         if Present (Arg3) and then Chars (Arg3) = Name_Link_Name then
4925            Arg4 := Arg3;
4926         end if;
4927
4928         if Present (Arg4) then
4929            Error_Pragma_Arg
4930              ("Link_Name argument not allowed for Import Intrinsic", Arg4);
4931         end if;
4932      end Check_No_Link_Name;
4933
4934      -------------------------------
4935      -- Check_Optional_Identifier --
4936      -------------------------------
4937
4938      procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id) is
4939      begin
4940         if Present (Arg)
4941           and then Nkind (Arg) = N_Pragma_Argument_Association
4942           and then Chars (Arg) /= No_Name
4943         then
4944            if Chars (Arg) /= Id then
4945               Error_Msg_Name_1 := Pname;
4946               Error_Msg_Name_2 := Id;
4947               Error_Msg_N ("pragma% argument expects identifier%", Arg);
4948               raise Pragma_Exit;
4949            end if;
4950         end if;
4951      end Check_Optional_Identifier;
4952
4953      procedure Check_Optional_Identifier (Arg : Node_Id; Id : String) is
4954      begin
4955         Name_Buffer (1 .. Id'Length) := Id;
4956         Name_Len := Id'Length;
4957         Check_Optional_Identifier (Arg, Name_Find);
4958      end Check_Optional_Identifier;
4959
4960      --------------------
4961      -- Check_Pre_Post --
4962      --------------------
4963
4964      procedure Check_Pre_Post is
4965         P  : Node_Id;
4966         PO : Node_Id;
4967
4968      begin
4969         if not Is_List_Member (N) then
4970            Pragma_Misplaced;
4971         end if;
4972
4973         --  If we are within an inlined body, the legality of the pragma
4974         --  has been checked already.
4975
4976         if In_Inlined_Body then
4977            return;
4978         end if;
4979
4980         --  Search prior declarations
4981
4982         P := N;
4983         while Present (Prev (P)) loop
4984            P := Prev (P);
4985
4986            --  If the previous node is a generic subprogram, do not go to to
4987            --  the original node, which is the unanalyzed tree: we need to
4988            --  attach the pre/postconditions to the analyzed version at this
4989            --  point. They get propagated to the original tree when analyzing
4990            --  the corresponding body.
4991
4992            if Nkind (P) not in N_Generic_Declaration then
4993               PO := Original_Node (P);
4994            else
4995               PO := P;
4996            end if;
4997
4998            --  Skip past prior pragma
4999
5000            if Nkind (PO) = N_Pragma then
5001               null;
5002
5003            --  Skip stuff not coming from source
5004
5005            elsif not Comes_From_Source (PO) then
5006
5007               --  The condition may apply to a subprogram instantiation
5008
5009               if Nkind (PO) = N_Subprogram_Declaration
5010                 and then Present (Generic_Parent (Specification (PO)))
5011               then
5012                  return;
5013
5014               elsif Nkind (PO) = N_Subprogram_Declaration
5015                 and then In_Instance
5016               then
5017                  return;
5018
5019               --  For all other cases of non source code, do nothing
5020
5021               else
5022                  null;
5023               end if;
5024
5025            --  Only remaining possibility is subprogram declaration
5026
5027            else
5028               return;
5029            end if;
5030         end loop;
5031
5032         --  If we fall through loop, pragma is at start of list, so see if it
5033         --  is at the start of declarations of a subprogram body.
5034
5035         PO := Parent (N);
5036
5037         if Nkind (PO) = N_Subprogram_Body
5038           and then List_Containing (N) = Declarations (PO)
5039         then
5040            --  This is only allowed if there is no separate specification
5041
5042            if Present (Corresponding_Spec (PO)) then
5043               Error_Pragma
5044                 ("pragma% must apply to subprogram specification");
5045            end if;
5046
5047            return;
5048         end if;
5049      end Check_Pre_Post;
5050
5051      --------------------------------------
5052      -- Check_Precondition_Postcondition --
5053      --------------------------------------
5054
5055      procedure Check_Precondition_Postcondition (In_Body : out Boolean) is
5056         P  : Node_Id;
5057         PO : Node_Id;
5058
5059         procedure Chain_PPC (PO : Node_Id);
5060         --  If PO is an entry or a [generic] subprogram declaration node, then
5061         --  the precondition/postcondition applies to this subprogram and the
5062         --  processing for the pragma is completed. Otherwise the pragma is
5063         --  misplaced.
5064
5065         ---------------
5066         -- Chain_PPC --
5067         ---------------
5068
5069         procedure Chain_PPC (PO : Node_Id) is
5070            S : Entity_Id;
5071
5072         begin
5073            if Nkind (PO) = N_Abstract_Subprogram_Declaration then
5074               if not From_Aspect_Specification (N) then
5075                  Error_Pragma
5076                    ("pragma% cannot be applied to abstract subprogram");
5077
5078               elsif Class_Present (N) then
5079                  null;
5080
5081               else
5082                  Error_Pragma
5083                    ("aspect % requires ''Class for abstract subprogram");
5084               end if;
5085
5086            --  AI05-0230: The same restriction applies to null procedures. For
5087            --  compatibility with earlier uses of the Ada pragma, apply this
5088            --  rule only to aspect specifications.
5089
5090            --  The above discrepency needs documentation. Robert is dubious
5091            --  about whether it is a good idea ???
5092
5093            elsif Nkind (PO) = N_Subprogram_Declaration
5094              and then Nkind (Specification (PO)) = N_Procedure_Specification
5095              and then Null_Present (Specification (PO))
5096              and then From_Aspect_Specification (N)
5097              and then not Class_Present (N)
5098            then
5099               Error_Pragma
5100                 ("aspect % requires ''Class for null procedure");
5101
5102            --  Pre/postconditions are legal on a subprogram body if it is not
5103            --  a completion of a declaration. They are also legal on a stub
5104            --  with no previous declarations (this is checked when processing
5105            --  the corresponding aspects).
5106
5107            elsif Nkind (PO) = N_Subprogram_Body
5108              and then Acts_As_Spec (PO)
5109            then
5110               null;
5111
5112            elsif Nkind (PO) = N_Subprogram_Body_Stub then
5113               null;
5114
5115            elsif not Nkind_In (PO, N_Subprogram_Declaration,
5116                                    N_Expression_Function,
5117                                    N_Generic_Subprogram_Declaration,
5118                                    N_Entry_Declaration)
5119            then
5120               Pragma_Misplaced;
5121            end if;
5122
5123            --  Here if we have [generic] subprogram or entry declaration
5124
5125            if Nkind (PO) = N_Entry_Declaration then
5126               S := Defining_Entity (PO);
5127            else
5128               S := Defining_Unit_Name (Specification (PO));
5129
5130               if Nkind (S) = N_Defining_Program_Unit_Name then
5131                  S := Defining_Identifier (S);
5132               end if;
5133            end if;
5134
5135            --  Note: we do not analyze the pragma at this point. Instead we
5136            --  delay this analysis until the end of the declarative part in
5137            --  which the pragma appears. This implements the required delay
5138            --  in this analysis, allowing forward references. The analysis
5139            --  happens at the end of Analyze_Declarations.
5140
5141            --  Chain spec PPC pragma to list for subprogram
5142
5143            Add_Contract_Item (N, S);
5144
5145            --  Return indicating spec case
5146
5147            In_Body := False;
5148            return;
5149         end Chain_PPC;
5150
5151      --  Start of processing for Check_Precondition_Postcondition
5152
5153      begin
5154         if not Is_List_Member (N) then
5155            Pragma_Misplaced;
5156         end if;
5157
5158         --  Preanalyze message argument if present. Visibility in this
5159         --  argument is established at the point of pragma occurrence.
5160
5161         if Arg_Count = 2 then
5162            Check_Optional_Identifier (Arg2, Name_Message);
5163            Preanalyze_Spec_Expression
5164              (Get_Pragma_Arg (Arg2), Standard_String);
5165         end if;
5166
5167         --  For a pragma PPC in the extended main source unit, record enabled
5168         --  status in SCO.
5169
5170         if Is_Checked (N) and then not Split_PPC (N) then
5171            Set_SCO_Pragma_Enabled (Loc);
5172         end if;
5173
5174         --  If we are within an inlined body, the legality of the pragma
5175         --  has been checked already.
5176
5177         if In_Inlined_Body then
5178            In_Body := True;
5179            return;
5180         end if;
5181
5182         --  Search prior declarations
5183
5184         P := N;
5185         while Present (Prev (P)) loop
5186            P := Prev (P);
5187
5188            --  If the previous node is a generic subprogram, do not go to to
5189            --  the original node, which is the unanalyzed tree: we need to
5190            --  attach the pre/postconditions to the analyzed version at this
5191            --  point. They get propagated to the original tree when analyzing
5192            --  the corresponding body.
5193
5194            if Nkind (P) not in N_Generic_Declaration then
5195               PO := Original_Node (P);
5196            else
5197               PO := P;
5198            end if;
5199
5200            --  Skip past prior pragma
5201
5202            if Nkind (PO) = N_Pragma then
5203               null;
5204
5205            --  Skip stuff not coming from source
5206
5207            elsif not Comes_From_Source (PO) then
5208
5209               --  The condition may apply to a subprogram instantiation
5210
5211               if Nkind (PO) = N_Subprogram_Declaration
5212                 and then Present (Generic_Parent (Specification (PO)))
5213               then
5214                  Chain_PPC (PO);
5215                  return;
5216
5217               elsif Nkind (PO) = N_Subprogram_Declaration
5218                 and then In_Instance
5219               then
5220                  Chain_PPC (PO);
5221                  return;
5222
5223               --  For all other cases of non source code, do nothing
5224
5225               else
5226                  null;
5227               end if;
5228
5229            --  Only remaining possibility is subprogram declaration
5230
5231            else
5232               Chain_PPC (PO);
5233               return;
5234            end if;
5235         end loop;
5236
5237         --  If we fall through loop, pragma is at start of list, so see if it
5238         --  is at the start of declarations of a subprogram body.
5239
5240         PO := Parent (N);
5241
5242         if Nkind (PO) = N_Subprogram_Body
5243           and then List_Containing (N) = Declarations (PO)
5244         then
5245            if Operating_Mode /= Generate_Code or else Inside_A_Generic then
5246
5247               --  Analyze pragma expression for correctness and for ASIS use
5248
5249               Preanalyze_Assert_Expression
5250                 (Get_Pragma_Arg (Arg1), Standard_Boolean);
5251
5252               --  In ASIS mode, for a pragma generated from a source aspect,
5253               --  also analyze the original aspect expression.
5254
5255               if ASIS_Mode and then Present (Corresponding_Aspect (N)) then
5256                  Preanalyze_Assert_Expression
5257                    (Expression (Corresponding_Aspect (N)), Standard_Boolean);
5258               end if;
5259            end if;
5260
5261            --  Retain copy of the pre/postcondition pragma in GNATprove mode.
5262            --  The copy is needed because the pragma is expanded into other
5263            --  constructs which are not acceptable in the N_Contract node.
5264
5265            if Acts_As_Spec (PO)
5266              and then GNATprove_Mode
5267            then
5268               declare
5269                  Prag : constant Node_Id := New_Copy_Tree (N);
5270
5271               begin
5272                  --  Preanalyze the pragma
5273
5274                  Preanalyze_Assert_Expression
5275                    (Get_Pragma_Arg
5276                      (First (Pragma_Argument_Associations (Prag))),
5277                     Standard_Boolean);
5278
5279                  --  Preanalyze the corresponding aspect (if any)
5280
5281                  if Present (Corresponding_Aspect (Prag)) then
5282                     Preanalyze_Assert_Expression
5283                       (Expression (Corresponding_Aspect (Prag)),
5284                     Standard_Boolean);
5285                  end if;
5286
5287                  --  Chain the copy on the contract of the body
5288
5289                  Add_Contract_Item
5290                    (Prag, Defining_Unit_Name (Specification (PO)));
5291               end;
5292            end if;
5293
5294            In_Body := True;
5295            return;
5296
5297         --  See if it is in the pragmas after a library level subprogram
5298
5299         elsif Nkind (PO) = N_Compilation_Unit_Aux then
5300
5301            --  In GNATprove mode, analyze pragma expression for correctness,
5302            --  as it is not expanded later. Ditto in ASIS_Mode where there is
5303            --  no later point at which the aspect will be analyzed.
5304
5305            if GNATprove_Mode or ASIS_Mode then
5306               Analyze_Pre_Post_Condition_In_Decl_Part
5307                 (N, Defining_Entity (Unit (Parent (PO))));
5308            end if;
5309
5310            Chain_PPC (Unit (Parent (PO)));
5311            return;
5312         end if;
5313
5314         --  If we fall through, pragma was misplaced
5315
5316         Pragma_Misplaced;
5317      end Check_Precondition_Postcondition;
5318
5319      -----------------------------
5320      -- Check_Static_Constraint --
5321      -----------------------------
5322
5323      --  Note: for convenience in writing this procedure, in addition to
5324      --  the officially (i.e. by spec) allowed argument which is always a
5325      --  constraint, it also allows ranges and discriminant associations.
5326      --  Above is not clear ???
5327
5328      procedure Check_Static_Constraint (Constr : Node_Id) is
5329
5330         procedure Require_Static (E : Node_Id);
5331         --  Require given expression to be static expression
5332
5333         --------------------
5334         -- Require_Static --
5335         --------------------
5336
5337         procedure Require_Static (E : Node_Id) is
5338         begin
5339            if not Is_OK_Static_Expression (E) then
5340               Flag_Non_Static_Expr
5341                 ("non-static constraint not allowed in Unchecked_Union!", E);
5342               raise Pragma_Exit;
5343            end if;
5344         end Require_Static;
5345
5346      --  Start of processing for Check_Static_Constraint
5347
5348      begin
5349         case Nkind (Constr) is
5350            when N_Discriminant_Association =>
5351               Require_Static (Expression (Constr));
5352
5353            when N_Range =>
5354               Require_Static (Low_Bound (Constr));
5355               Require_Static (High_Bound (Constr));
5356
5357            when N_Attribute_Reference =>
5358               Require_Static (Type_Low_Bound  (Etype (Prefix (Constr))));
5359               Require_Static (Type_High_Bound (Etype (Prefix (Constr))));
5360
5361            when N_Range_Constraint =>
5362               Check_Static_Constraint (Range_Expression (Constr));
5363
5364            when N_Index_Or_Discriminant_Constraint =>
5365               declare
5366                  IDC : Entity_Id;
5367               begin
5368                  IDC := First (Constraints (Constr));
5369                  while Present (IDC) loop
5370                     Check_Static_Constraint (IDC);
5371                     Next (IDC);
5372                  end loop;
5373               end;
5374
5375            when others =>
5376               null;
5377         end case;
5378      end Check_Static_Constraint;
5379
5380      ---------------------
5381      -- Check_Test_Case --
5382      ---------------------
5383
5384      procedure Check_Test_Case is
5385         P  : Node_Id;
5386         PO : Node_Id;
5387
5388         procedure Chain_CTC (PO : Node_Id);
5389         --  If PO is a [generic] subprogram declaration node, then the
5390         --  test-case applies to this subprogram and the processing for
5391         --  the pragma is completed. Otherwise the pragma is misplaced.
5392
5393         ---------------
5394         -- Chain_CTC --
5395         ---------------
5396
5397         procedure Chain_CTC (PO : Node_Id) is
5398            S   : Entity_Id;
5399
5400         begin
5401            if Nkind (PO) = N_Abstract_Subprogram_Declaration then
5402               Error_Pragma
5403                 ("pragma% cannot be applied to abstract subprogram");
5404
5405            elsif Nkind (PO) = N_Entry_Declaration then
5406               Error_Pragma ("pragma% cannot be applied to entry");
5407
5408            elsif not Nkind_In (PO, N_Subprogram_Declaration,
5409                                    N_Generic_Subprogram_Declaration)
5410            then
5411               Pragma_Misplaced;
5412            end if;
5413
5414            --  Here if we have [generic] subprogram declaration
5415
5416            S := Defining_Unit_Name (Specification (PO));
5417
5418            --  Note: we do not analyze the pragma at this point. Instead we
5419            --  delay this analysis until the end of the declarative part in
5420            --  which the pragma appears. This implements the required delay
5421            --  in this analysis, allowing forward references. The analysis
5422            --  happens at the end of Analyze_Declarations.
5423
5424            --  There should not be another test-case with the same name
5425            --  associated to this subprogram.
5426
5427            declare
5428               Name : constant String_Id := Get_Name_From_CTC_Pragma (N);
5429               CTC  : Node_Id;
5430
5431            begin
5432               CTC := Contract_Test_Cases (Contract (S));
5433               while Present (CTC) loop
5434
5435                  --  Omit pragma Contract_Cases because it does not introduce
5436                  --  a unique case name and it does not follow the syntax of
5437                  --  Test_Case.
5438
5439                  if Pragma_Name (CTC) = Name_Contract_Cases then
5440                     null;
5441
5442                  elsif String_Equal
5443                          (Name, Get_Name_From_CTC_Pragma (CTC))
5444                  then
5445                     Error_Msg_Sloc := Sloc (CTC);
5446                     Error_Pragma ("name for pragma% is already used#");
5447                  end if;
5448
5449                  CTC := Next_Pragma (CTC);
5450               end loop;
5451            end;
5452
5453            --  Chain spec CTC pragma to list for subprogram
5454
5455            Add_Contract_Item (N, S);
5456         end Chain_CTC;
5457
5458      --  Start of processing for Check_Test_Case
5459
5460      begin
5461         --  First check pragma arguments
5462
5463         Check_At_Least_N_Arguments (2);
5464         Check_At_Most_N_Arguments (4);
5465         Check_Arg_Order
5466           ((Name_Name, Name_Mode, Name_Requires, Name_Ensures));
5467
5468         Check_Optional_Identifier (Arg1, Name_Name);
5469         Check_Arg_Is_Static_Expression (Arg1, Standard_String);
5470
5471         --  In ASIS mode, for a pragma generated from a source aspect, also
5472         --  analyze the original aspect expression.
5473
5474         if ASIS_Mode and then Present (Corresponding_Aspect (N)) then
5475            Check_Expr_Is_Static_Expression
5476              (Original_Node (Get_Pragma_Arg (Arg1)), Standard_String);
5477         end if;
5478
5479         Check_Optional_Identifier (Arg2, Name_Mode);
5480         Check_Arg_Is_One_Of (Arg2, Name_Nominal, Name_Robustness);
5481
5482         if Arg_Count = 4 then
5483            Check_Identifier (Arg3, Name_Requires);
5484            Check_Identifier (Arg4, Name_Ensures);
5485
5486         elsif Arg_Count = 3 then
5487            Check_Identifier_Is_One_Of (Arg3, Name_Requires, Name_Ensures);
5488         end if;
5489
5490         --  Check pragma placement
5491
5492         if not Is_List_Member (N) then
5493            Pragma_Misplaced;
5494         end if;
5495
5496         --  Test-case should only appear in package spec unit
5497
5498         if Get_Source_Unit (N) = No_Unit
5499           or else not Nkind_In (Sinfo.Unit (Cunit (Get_Source_Unit (N))),
5500                                 N_Package_Declaration,
5501                                 N_Generic_Package_Declaration)
5502         then
5503            Pragma_Misplaced;
5504         end if;
5505
5506         --  Search prior declarations
5507
5508         P := N;
5509         while Present (Prev (P)) loop
5510            P := Prev (P);
5511
5512            --  If the previous node is a generic subprogram, do not go to to
5513            --  the original node, which is the unanalyzed tree: we need to
5514            --  attach the test-case to the analyzed version at this point.
5515            --  They get propagated to the original tree when analyzing the
5516            --  corresponding body.
5517
5518            if Nkind (P) not in N_Generic_Declaration then
5519               PO := Original_Node (P);
5520            else
5521               PO := P;
5522            end if;
5523
5524            --  Skip past prior pragma
5525
5526            if Nkind (PO) = N_Pragma then
5527               null;
5528
5529            --  Skip stuff not coming from source
5530
5531            elsif not Comes_From_Source (PO) then
5532               null;
5533
5534            --  Only remaining possibility is subprogram declaration. First
5535            --  check that it is declared directly in a package declaration.
5536            --  This may be either the package declaration for the current unit
5537            --  being defined or a local package declaration.
5538
5539            elsif not Present (Parent (Parent (PO)))
5540              or else not Present (Parent (Parent (Parent (PO))))
5541              or else not Nkind_In (Parent (Parent (PO)),
5542                                    N_Package_Declaration,
5543                                    N_Generic_Package_Declaration)
5544            then
5545               Pragma_Misplaced;
5546
5547            else
5548               Chain_CTC (PO);
5549               return;
5550            end if;
5551         end loop;
5552
5553         --  If we fall through, pragma was misplaced
5554
5555         Pragma_Misplaced;
5556      end Check_Test_Case;
5557
5558      --------------------------------------
5559      -- Check_Valid_Configuration_Pragma --
5560      --------------------------------------
5561
5562      --  A configuration pragma must appear in the context clause of a
5563      --  compilation unit, and only other pragmas may precede it. Note that
5564      --  the test also allows use in a configuration pragma file.
5565
5566      procedure Check_Valid_Configuration_Pragma is
5567      begin
5568         if not Is_Configuration_Pragma then
5569            Error_Pragma ("incorrect placement for configuration pragma%");
5570         end if;
5571      end Check_Valid_Configuration_Pragma;
5572
5573      -------------------------------------
5574      -- Check_Valid_Library_Unit_Pragma --
5575      -------------------------------------
5576
5577      procedure Check_Valid_Library_Unit_Pragma is
5578         Plist       : List_Id;
5579         Parent_Node : Node_Id;
5580         Unit_Name   : Entity_Id;
5581         Unit_Kind   : Node_Kind;
5582         Unit_Node   : Node_Id;
5583         Sindex      : Source_File_Index;
5584
5585      begin
5586         if not Is_List_Member (N) then
5587            Pragma_Misplaced;
5588
5589         else
5590            Plist := List_Containing (N);
5591            Parent_Node := Parent (Plist);
5592
5593            if Parent_Node = Empty then
5594               Pragma_Misplaced;
5595
5596            --  Case of pragma appearing after a compilation unit. In this case
5597            --  it must have an argument with the corresponding name and must
5598            --  be part of the following pragmas of its parent.
5599
5600            elsif Nkind (Parent_Node) = N_Compilation_Unit_Aux then
5601               if Plist /= Pragmas_After (Parent_Node) then
5602                  Pragma_Misplaced;
5603
5604               elsif Arg_Count = 0 then
5605                  Error_Pragma
5606                    ("argument required if outside compilation unit");
5607
5608               else
5609                  Check_No_Identifiers;
5610                  Check_Arg_Count (1);
5611                  Unit_Node := Unit (Parent (Parent_Node));
5612                  Unit_Kind := Nkind (Unit_Node);
5613
5614                  Analyze (Get_Pragma_Arg (Arg1));
5615
5616                  if Unit_Kind = N_Generic_Subprogram_Declaration
5617                    or else Unit_Kind = N_Subprogram_Declaration
5618                  then
5619                     Unit_Name := Defining_Entity (Unit_Node);
5620
5621                  elsif Unit_Kind in N_Generic_Instantiation then
5622                     Unit_Name := Defining_Entity (Unit_Node);
5623
5624                  else
5625                     Unit_Name := Cunit_Entity (Current_Sem_Unit);
5626                  end if;
5627
5628                  if Chars (Unit_Name) /=
5629                     Chars (Entity (Get_Pragma_Arg (Arg1)))
5630                  then
5631                     Error_Pragma_Arg
5632                       ("pragma% argument is not current unit name", Arg1);
5633                  end if;
5634
5635                  if Ekind (Unit_Name) = E_Package
5636                    and then Present (Renamed_Entity (Unit_Name))
5637                  then
5638                     Error_Pragma ("pragma% not allowed for renamed package");
5639                  end if;
5640               end if;
5641
5642            --  Pragma appears other than after a compilation unit
5643
5644            else
5645               --  Here we check for the generic instantiation case and also
5646               --  for the case of processing a generic formal package. We
5647               --  detect these cases by noting that the Sloc on the node
5648               --  does not belong to the current compilation unit.
5649
5650               Sindex := Source_Index (Current_Sem_Unit);
5651
5652               if Loc not in Source_First (Sindex) .. Source_Last (Sindex) then
5653                  Rewrite (N, Make_Null_Statement (Loc));
5654                  return;
5655
5656               --  If before first declaration, the pragma applies to the
5657               --  enclosing unit, and the name if present must be this name.
5658
5659               elsif Is_Before_First_Decl (N, Plist) then
5660                  Unit_Node := Unit_Declaration_Node (Current_Scope);
5661                  Unit_Kind := Nkind (Unit_Node);
5662
5663                  if Nkind (Parent (Unit_Node)) /= N_Compilation_Unit then
5664                     Pragma_Misplaced;
5665
5666                  elsif Unit_Kind = N_Subprogram_Body
5667                    and then not Acts_As_Spec (Unit_Node)
5668                  then
5669                     Pragma_Misplaced;
5670
5671                  elsif Nkind (Parent_Node) = N_Package_Body then
5672                     Pragma_Misplaced;
5673
5674                  elsif Nkind (Parent_Node) = N_Package_Specification
5675                    and then Plist = Private_Declarations (Parent_Node)
5676                  then
5677                     Pragma_Misplaced;
5678
5679                  elsif (Nkind (Parent_Node) = N_Generic_Package_Declaration
5680                          or else Nkind (Parent_Node) =
5681                                             N_Generic_Subprogram_Declaration)
5682                    and then Plist = Generic_Formal_Declarations (Parent_Node)
5683                  then
5684                     Pragma_Misplaced;
5685
5686                  elsif Arg_Count > 0 then
5687                     Analyze (Get_Pragma_Arg (Arg1));
5688
5689                     if Entity (Get_Pragma_Arg (Arg1)) /= Current_Scope then
5690                        Error_Pragma_Arg
5691                          ("name in pragma% must be enclosing unit", Arg1);
5692                     end if;
5693
5694                  --  It is legal to have no argument in this context
5695
5696                  else
5697                     return;
5698                  end if;
5699
5700               --  Error if not before first declaration. This is because a
5701               --  library unit pragma argument must be the name of a library
5702               --  unit (RM 10.1.5(7)), but the only names permitted in this
5703               --  context are (RM 10.1.5(6)) names of subprogram declarations,
5704               --  generic subprogram declarations or generic instantiations.
5705
5706               else
5707                  Error_Pragma
5708                    ("pragma% misplaced, must be before first declaration");
5709               end if;
5710            end if;
5711         end if;
5712      end Check_Valid_Library_Unit_Pragma;
5713
5714      -------------------
5715      -- Check_Variant --
5716      -------------------
5717
5718      procedure Check_Variant (Variant : Node_Id; UU_Typ : Entity_Id) is
5719         Clist : constant Node_Id := Component_List (Variant);
5720         Comp  : Node_Id;
5721
5722      begin
5723         Comp := First (Component_Items (Clist));
5724         while Present (Comp) loop
5725            Check_Component (Comp, UU_Typ, In_Variant_Part => True);
5726            Next (Comp);
5727         end loop;
5728      end Check_Variant;
5729
5730      ---------------------------
5731      -- Ensure_Aggregate_Form --
5732      ---------------------------
5733
5734      procedure Ensure_Aggregate_Form (Arg : Node_Id) is
5735         Expr  : constant Node_Id    := Get_Pragma_Arg (Arg);
5736         Loc   : constant Source_Ptr := Sloc (Arg);
5737         Nam   : constant Name_Id    := Chars (Arg);
5738         Comps : List_Id := No_List;
5739         Exprs : List_Id := No_List;
5740
5741      begin
5742         --  The argument is already in aggregate form, but the presence of a
5743         --  name causes this to be interpreted as a named association which in
5744         --  turn must be converted into an aggregate.
5745
5746         --    pragma Global (In_Out => (A, B, C))
5747         --                   ^         ^
5748         --                   name      aggregate
5749
5750         --    pragma Global ((In_Out => (A, B, C)))
5751         --                   ^          ^
5752         --                   aggregate  aggregate
5753
5754         if Nkind (Expr) = N_Aggregate then
5755            if Nam = No_Name then
5756               return;
5757            end if;
5758
5759         --  Do not transform a null argument into an aggregate as N_Null has
5760         --  special meaning in formal verification pragmas.
5761
5762         elsif Nkind (Expr) = N_Null then
5763            return;
5764         end if;
5765
5766         --  Positional argument is transformed into an aggregate with an
5767         --  Expressions list.
5768
5769         if Nam = No_Name then
5770            Exprs := New_List (Relocate_Node (Expr));
5771
5772         --  An associative argument is transformed into an aggregate with
5773         --  Component_Associations.
5774
5775         else
5776            Comps := New_List (
5777              Make_Component_Association (Loc,
5778                Choices    => New_List (Make_Identifier (Loc, Chars (Arg))),
5779                Expression => Relocate_Node (Expr)));
5780
5781         end if;
5782
5783         --  Remove the pragma argument name as this information has been
5784         --  captured in the aggregate.
5785
5786         Set_Chars (Arg, No_Name);
5787
5788         Set_Expression (Arg,
5789           Make_Aggregate (Loc,
5790             Component_Associations => Comps,
5791             Expressions            => Exprs));
5792      end Ensure_Aggregate_Form;
5793
5794      ------------------
5795      -- Error_Pragma --
5796      ------------------
5797
5798      procedure Error_Pragma (Msg : String) is
5799         MsgF : String := Msg;
5800      begin
5801         Error_Msg_Name_1 := Pname;
5802         Fix_Error (MsgF);
5803         Error_Msg_N (MsgF, N);
5804         raise Pragma_Exit;
5805      end Error_Pragma;
5806
5807      ----------------------
5808      -- Error_Pragma_Arg --
5809      ----------------------
5810
5811      procedure Error_Pragma_Arg (Msg : String; Arg : Node_Id) is
5812         MsgF : String := Msg;
5813      begin
5814         Error_Msg_Name_1 := Pname;
5815         Fix_Error (MsgF);
5816         Error_Msg_N (MsgF, Get_Pragma_Arg (Arg));
5817         raise Pragma_Exit;
5818      end Error_Pragma_Arg;
5819
5820      procedure Error_Pragma_Arg (Msg1, Msg2 : String; Arg : Node_Id) is
5821         MsgF : String := Msg1;
5822      begin
5823         Error_Msg_Name_1 := Pname;
5824         Fix_Error (MsgF);
5825         Error_Msg_N (MsgF, Get_Pragma_Arg (Arg));
5826         Error_Pragma_Arg (Msg2, Arg);
5827      end Error_Pragma_Arg;
5828
5829      ----------------------------
5830      -- Error_Pragma_Arg_Ident --
5831      ----------------------------
5832
5833      procedure Error_Pragma_Arg_Ident (Msg : String; Arg : Node_Id) is
5834         MsgF : String := Msg;
5835      begin
5836         Error_Msg_Name_1 := Pname;
5837         Fix_Error (MsgF);
5838         Error_Msg_N (MsgF, Arg);
5839         raise Pragma_Exit;
5840      end Error_Pragma_Arg_Ident;
5841
5842      ----------------------
5843      -- Error_Pragma_Ref --
5844      ----------------------
5845
5846      procedure Error_Pragma_Ref (Msg : String; Ref : Entity_Id) is
5847         MsgF : String := Msg;
5848      begin
5849         Error_Msg_Name_1 := Pname;
5850         Fix_Error (MsgF);
5851         Error_Msg_Sloc   := Sloc (Ref);
5852         Error_Msg_NE (MsgF, N, Ref);
5853         raise Pragma_Exit;
5854      end Error_Pragma_Ref;
5855
5856      ------------------------
5857      -- Find_Lib_Unit_Name --
5858      ------------------------
5859
5860      function Find_Lib_Unit_Name return Entity_Id is
5861      begin
5862         --  Return inner compilation unit entity, for case of nested
5863         --  categorization pragmas. This happens in generic unit.
5864
5865         if Nkind (Parent (N)) = N_Package_Specification
5866           and then Defining_Entity (Parent (N)) /= Current_Scope
5867         then
5868            return Defining_Entity (Parent (N));
5869         else
5870            return Current_Scope;
5871         end if;
5872      end Find_Lib_Unit_Name;
5873
5874      ----------------------------
5875      -- Find_Program_Unit_Name --
5876      ----------------------------
5877
5878      procedure Find_Program_Unit_Name (Id : Node_Id) is
5879         Unit_Name : Entity_Id;
5880         Unit_Kind : Node_Kind;
5881         P         : constant Node_Id := Parent (N);
5882
5883      begin
5884         if Nkind (P) = N_Compilation_Unit then
5885            Unit_Kind := Nkind (Unit (P));
5886
5887            if Unit_Kind = N_Subprogram_Declaration
5888              or else Unit_Kind = N_Package_Declaration
5889              or else Unit_Kind in N_Generic_Declaration
5890            then
5891               Unit_Name := Defining_Entity (Unit (P));
5892
5893               if Chars (Id) = Chars (Unit_Name) then
5894                  Set_Entity (Id, Unit_Name);
5895                  Set_Etype (Id, Etype (Unit_Name));
5896               else
5897                  Set_Etype (Id, Any_Type);
5898                  Error_Pragma
5899                    ("cannot find program unit referenced by pragma%");
5900               end if;
5901
5902            else
5903               Set_Etype (Id, Any_Type);
5904               Error_Pragma ("pragma% inapplicable to this unit");
5905            end if;
5906
5907         else
5908            Analyze (Id);
5909         end if;
5910      end Find_Program_Unit_Name;
5911
5912      -----------------------------------------
5913      -- Find_Unique_Parameterless_Procedure --
5914      -----------------------------------------
5915
5916      function Find_Unique_Parameterless_Procedure
5917        (Name : Entity_Id;
5918         Arg  : Node_Id) return Entity_Id
5919      is
5920         Proc : Entity_Id := Empty;
5921
5922      begin
5923         --  The body of this procedure needs some comments ???
5924
5925         if not Is_Entity_Name (Name) then
5926            Error_Pragma_Arg
5927              ("argument of pragma% must be entity name", Arg);
5928
5929         elsif not Is_Overloaded (Name) then
5930            Proc := Entity (Name);
5931
5932            if Ekind (Proc) /= E_Procedure
5933              or else Present (First_Formal (Proc))
5934            then
5935               Error_Pragma_Arg
5936                 ("argument of pragma% must be parameterless procedure", Arg);
5937            end if;
5938
5939         else
5940            declare
5941               Found : Boolean := False;
5942               It    : Interp;
5943               Index : Interp_Index;
5944
5945            begin
5946               Get_First_Interp (Name, Index, It);
5947               while Present (It.Nam) loop
5948                  Proc := It.Nam;
5949
5950                  if Ekind (Proc) = E_Procedure
5951                    and then No (First_Formal (Proc))
5952                  then
5953                     if not Found then
5954                        Found := True;
5955                        Set_Entity (Name, Proc);
5956                        Set_Is_Overloaded (Name, False);
5957                     else
5958                        Error_Pragma_Arg
5959                          ("ambiguous handler name for pragma% ", Arg);
5960                     end if;
5961                  end if;
5962
5963                  Get_Next_Interp (Index, It);
5964               end loop;
5965
5966               if not Found then
5967                  Error_Pragma_Arg
5968                    ("argument of pragma% must be parameterless procedure",
5969                     Arg);
5970               else
5971                  Proc := Entity (Name);
5972               end if;
5973            end;
5974         end if;
5975
5976         return Proc;
5977      end Find_Unique_Parameterless_Procedure;
5978
5979      ---------------
5980      -- Fix_Error --
5981      ---------------
5982
5983      procedure Fix_Error (Msg : in out String) is
5984      begin
5985         --  If we have a rewriting of another pragma, go to that pragma
5986
5987         if Is_Rewrite_Substitution (N)
5988           and then Nkind (Original_Node (N)) = N_Pragma
5989         then
5990            Error_Msg_Name_1 := Pragma_Name (Original_Node (N));
5991         end if;
5992
5993         --  Case where pragma comes from an aspect specification
5994
5995         if From_Aspect_Specification (N) then
5996
5997            --  Change appearence of "pragma" in message to "aspect"
5998
5999            for J in Msg'First .. Msg'Last - 5 loop
6000               if Msg (J .. J + 5) = "pragma" then
6001                  Msg (J .. J + 5) := "aspect";
6002               end if;
6003            end loop;
6004
6005            --  Get name from corresponding aspect
6006
6007            Error_Msg_Name_1 := Original_Aspect_Name (N);
6008         end if;
6009      end Fix_Error;
6010
6011      -------------------------
6012      -- Gather_Associations --
6013      -------------------------
6014
6015      procedure Gather_Associations
6016        (Names : Name_List;
6017         Args  : out Args_List)
6018      is
6019         Arg : Node_Id;
6020
6021      begin
6022         --  Initialize all parameters to Empty
6023
6024         for J in Args'Range loop
6025            Args (J) := Empty;
6026         end loop;
6027
6028         --  That's all we have to do if there are no argument associations
6029
6030         if No (Pragma_Argument_Associations (N)) then
6031            return;
6032         end if;
6033
6034         --  Otherwise first deal with any positional parameters present
6035
6036         Arg := First (Pragma_Argument_Associations (N));
6037         for Index in Args'Range loop
6038            exit when No (Arg) or else Chars (Arg) /= No_Name;
6039            Args (Index) := Get_Pragma_Arg (Arg);
6040            Next (Arg);
6041         end loop;
6042
6043         --  Positional parameters all processed, if any left, then we
6044         --  have too many positional parameters.
6045
6046         if Present (Arg) and then Chars (Arg) = No_Name then
6047            Error_Pragma_Arg
6048              ("too many positional associations for pragma%", Arg);
6049         end if;
6050
6051         --  Process named parameters if any are present
6052
6053         while Present (Arg) loop
6054            if Chars (Arg) = No_Name then
6055               Error_Pragma_Arg
6056                 ("positional association cannot follow named association",
6057                  Arg);
6058
6059            else
6060               for Index in Names'Range loop
6061                  if Names (Index) = Chars (Arg) then
6062                     if Present (Args (Index)) then
6063                        Error_Pragma_Arg
6064                          ("duplicate argument association for pragma%", Arg);
6065                     else
6066                        Args (Index) := Get_Pragma_Arg (Arg);
6067                        exit;
6068                     end if;
6069                  end if;
6070
6071                  if Index = Names'Last then
6072                     Error_Msg_Name_1 := Pname;
6073                     Error_Msg_N ("pragma% does not allow & argument", Arg);
6074
6075                     --  Check for possible misspelling
6076
6077                     for Index1 in Names'Range loop
6078                        if Is_Bad_Spelling_Of
6079                             (Chars (Arg), Names (Index1))
6080                        then
6081                           Error_Msg_Name_1 := Names (Index1);
6082                           Error_Msg_N -- CODEFIX
6083                             ("\possible misspelling of%", Arg);
6084                           exit;
6085                        end if;
6086                     end loop;
6087
6088                     raise Pragma_Exit;
6089                  end if;
6090               end loop;
6091            end if;
6092
6093            Next (Arg);
6094         end loop;
6095      end Gather_Associations;
6096
6097      -----------------
6098      -- GNAT_Pragma --
6099      -----------------
6100
6101      procedure GNAT_Pragma is
6102      begin
6103         --  We need to check the No_Implementation_Pragmas restriction for
6104         --  the case of a pragma from source. Note that the case of aspects
6105         --  generating corresponding pragmas marks these pragmas as not being
6106         --  from source, so this test also catches that case.
6107
6108         if Comes_From_Source (N) then
6109            Check_Restriction (No_Implementation_Pragmas, N);
6110         end if;
6111      end GNAT_Pragma;
6112
6113      --------------------------
6114      -- Is_Before_First_Decl --
6115      --------------------------
6116
6117      function Is_Before_First_Decl
6118        (Pragma_Node : Node_Id;
6119         Decls       : List_Id) return Boolean
6120      is
6121         Item : Node_Id := First (Decls);
6122
6123      begin
6124         --  Only other pragmas can come before this pragma
6125
6126         loop
6127            if No (Item) or else Nkind (Item) /= N_Pragma then
6128               return False;
6129
6130            elsif Item = Pragma_Node then
6131               return True;
6132            end if;
6133
6134            Next (Item);
6135         end loop;
6136      end Is_Before_First_Decl;
6137
6138      -----------------------------
6139      -- Is_Configuration_Pragma --
6140      -----------------------------
6141
6142      --  A configuration pragma must appear in the context clause of a
6143      --  compilation unit, and only other pragmas may precede it. Note that
6144      --  the test below also permits use in a configuration pragma file.
6145
6146      function Is_Configuration_Pragma return Boolean is
6147         Lis : constant List_Id := List_Containing (N);
6148         Par : constant Node_Id := Parent (N);
6149         Prg : Node_Id;
6150
6151      begin
6152         --  If no parent, then we are in the configuration pragma file,
6153         --  so the placement is definitely appropriate.
6154
6155         if No (Par) then
6156            return True;
6157
6158         --  Otherwise we must be in the context clause of a compilation unit
6159         --  and the only thing allowed before us in the context list is more
6160         --  configuration pragmas.
6161
6162         elsif Nkind (Par) = N_Compilation_Unit
6163           and then Context_Items (Par) = Lis
6164         then
6165            Prg := First (Lis);
6166
6167            loop
6168               if Prg = N then
6169                  return True;
6170               elsif Nkind (Prg) /= N_Pragma then
6171                  return False;
6172               end if;
6173
6174               Next (Prg);
6175            end loop;
6176
6177         else
6178            return False;
6179         end if;
6180      end Is_Configuration_Pragma;
6181
6182      --------------------------
6183      -- Is_In_Context_Clause --
6184      --------------------------
6185
6186      function Is_In_Context_Clause return Boolean is
6187         Plist       : List_Id;
6188         Parent_Node : Node_Id;
6189
6190      begin
6191         if not Is_List_Member (N) then
6192            return False;
6193
6194         else
6195            Plist := List_Containing (N);
6196            Parent_Node := Parent (Plist);
6197
6198            if Parent_Node = Empty
6199              or else Nkind (Parent_Node) /= N_Compilation_Unit
6200              or else Context_Items (Parent_Node) /= Plist
6201            then
6202               return False;
6203            end if;
6204         end if;
6205
6206         return True;
6207      end Is_In_Context_Clause;
6208
6209      ---------------------------------
6210      -- Is_Static_String_Expression --
6211      ---------------------------------
6212
6213      function Is_Static_String_Expression (Arg : Node_Id) return Boolean is
6214         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
6215
6216      begin
6217         Analyze_And_Resolve (Argx);
6218         return Is_OK_Static_Expression (Argx)
6219           and then Nkind (Argx) = N_String_Literal;
6220      end Is_Static_String_Expression;
6221
6222      ----------------------
6223      -- Pragma_Misplaced --
6224      ----------------------
6225
6226      procedure Pragma_Misplaced is
6227      begin
6228         Error_Pragma ("incorrect placement of pragma%");
6229      end Pragma_Misplaced;
6230
6231      ------------------------------------
6232      -- Process_Atomic_Shared_Volatile --
6233      ------------------------------------
6234
6235      procedure Process_Atomic_Shared_Volatile is
6236         E_Id : Node_Id;
6237         E    : Entity_Id;
6238         D    : Node_Id;
6239         K    : Node_Kind;
6240         Utyp : Entity_Id;
6241
6242         procedure Set_Atomic (E : Entity_Id);
6243         --  Set given type as atomic, and if no explicit alignment was given,
6244         --  set alignment to unknown, since back end knows what the alignment
6245         --  requirements are for atomic arrays. Note: this step is necessary
6246         --  for derived types.
6247
6248         ----------------
6249         -- Set_Atomic --
6250         ----------------
6251
6252         procedure Set_Atomic (E : Entity_Id) is
6253         begin
6254            Set_Is_Atomic (E);
6255
6256            if not Has_Alignment_Clause (E) then
6257               Set_Alignment (E, Uint_0);
6258            end if;
6259         end Set_Atomic;
6260
6261      --  Start of processing for Process_Atomic_Shared_Volatile
6262
6263      begin
6264         Check_Ada_83_Warning;
6265         Check_No_Identifiers;
6266         Check_Arg_Count (1);
6267         Check_Arg_Is_Local_Name (Arg1);
6268         E_Id := Get_Pragma_Arg (Arg1);
6269
6270         if Etype (E_Id) = Any_Type then
6271            return;
6272         end if;
6273
6274         E := Entity (E_Id);
6275         D := Declaration_Node (E);
6276         K := Nkind (D);
6277
6278         --  Check duplicate before we chain ourselves
6279
6280         Check_Duplicate_Pragma (E);
6281
6282         --  Now check appropriateness of the entity
6283
6284         if Is_Type (E) then
6285            if Rep_Item_Too_Early (E, N)
6286                 or else
6287               Rep_Item_Too_Late (E, N)
6288            then
6289               return;
6290            else
6291               Check_First_Subtype (Arg1);
6292            end if;
6293
6294            if Prag_Id /= Pragma_Volatile then
6295               Set_Atomic (E);
6296               Set_Atomic (Underlying_Type (E));
6297               Set_Atomic (Base_Type (E));
6298            end if;
6299
6300            --  Attribute belongs on the base type. If the view of the type is
6301            --  currently private, it also belongs on the underlying type.
6302
6303            Set_Is_Volatile (Base_Type (E));
6304            Set_Is_Volatile (Underlying_Type (E));
6305
6306            Set_Treat_As_Volatile (E);
6307            Set_Treat_As_Volatile (Underlying_Type (E));
6308
6309         elsif K = N_Object_Declaration
6310           or else (K = N_Component_Declaration
6311                     and then Original_Record_Component (E) = E)
6312         then
6313            if Rep_Item_Too_Late (E, N) then
6314               return;
6315            end if;
6316
6317            if Prag_Id /= Pragma_Volatile then
6318               Set_Is_Atomic (E);
6319
6320               --  If the object declaration has an explicit initialization, a
6321               --  temporary may have to be created to hold the expression, to
6322               --  ensure that access to the object remain atomic.
6323
6324               if Nkind (Parent (E)) = N_Object_Declaration
6325                 and then Present (Expression (Parent (E)))
6326               then
6327                  Set_Has_Delayed_Freeze (E);
6328               end if;
6329
6330               --  An interesting improvement here. If an object of composite
6331               --  type X is declared atomic, and the type X isn't, that's a
6332               --  pity, since it may not have appropriate alignment etc. We
6333               --  can rescue this in the special case where the object and
6334               --  type are in the same unit by just setting the type as
6335               --  atomic, so that the back end will process it as atomic.
6336
6337               --  Note: we used to do this for elementary types as well,
6338               --  but that turns out to be a bad idea and can have unwanted
6339               --  effects, most notably if the type is elementary, the object
6340               --  a simple component within a record, and both are in a spec:
6341               --  every object of this type in the entire program will be
6342               --  treated as atomic, thus incurring a potentially costly
6343               --  synchronization operation for every access.
6344
6345               --  Of course it would be best if the back end could just adjust
6346               --  the alignment etc for the specific object, but that's not
6347               --  something we are capable of doing at this point.
6348
6349               Utyp := Underlying_Type (Etype (E));
6350
6351               if Present (Utyp)
6352                 and then Is_Composite_Type (Utyp)
6353                 and then Sloc (E) > No_Location
6354                 and then Sloc (Utyp) > No_Location
6355                 and then
6356                   Get_Source_File_Index (Sloc (E)) =
6357                   Get_Source_File_Index (Sloc (Underlying_Type (Etype (E))))
6358               then
6359                  Set_Is_Atomic (Underlying_Type (Etype (E)));
6360               end if;
6361            end if;
6362
6363            Set_Is_Volatile (E);
6364            Set_Treat_As_Volatile (E);
6365
6366         else
6367            Error_Pragma_Arg
6368              ("inappropriate entity for pragma%", Arg1);
6369         end if;
6370      end Process_Atomic_Shared_Volatile;
6371
6372      -------------------------------------------
6373      -- Process_Compile_Time_Warning_Or_Error --
6374      -------------------------------------------
6375
6376      procedure Process_Compile_Time_Warning_Or_Error is
6377         Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1);
6378
6379      begin
6380         Check_Arg_Count (2);
6381         Check_No_Identifiers;
6382         Check_Arg_Is_Static_Expression (Arg2, Standard_String);
6383         Analyze_And_Resolve (Arg1x, Standard_Boolean);
6384
6385         if Compile_Time_Known_Value (Arg1x) then
6386            if Is_True (Expr_Value (Get_Pragma_Arg (Arg1))) then
6387               declare
6388                  Str   : constant String_Id :=
6389                            Strval (Get_Pragma_Arg (Arg2));
6390                  Len   : constant Int := String_Length (Str);
6391                  Cont  : Boolean;
6392                  Ptr   : Nat;
6393                  CC    : Char_Code;
6394                  C     : Character;
6395                  Cent  : constant Entity_Id :=
6396                            Cunit_Entity (Current_Sem_Unit);
6397
6398                  Force : constant Boolean :=
6399                            Prag_Id = Pragma_Compile_Time_Warning
6400                              and then
6401                                Is_Spec_Name (Unit_Name (Current_Sem_Unit))
6402                              and then (Ekind (Cent) /= E_Package
6403                                         or else not In_Private_Part (Cent));
6404                  --  Set True if this is the warning case, and we are in the
6405                  --  visible part of a package spec, or in a subprogram spec,
6406                  --  in which case we want to force the client to see the
6407                  --  warning, even though it is not in the main unit.
6408
6409               begin
6410                  --  Loop through segments of message separated by line feeds.
6411                  --  We output these segments as separate messages with
6412                  --  continuation marks for all but the first.
6413
6414                  Cont := False;
6415                  Ptr := 1;
6416                  loop
6417                     Error_Msg_Strlen := 0;
6418
6419                     --  Loop to copy characters from argument to error message
6420                     --  string buffer.
6421
6422                     loop
6423                        exit when Ptr > Len;
6424                        CC := Get_String_Char (Str, Ptr);
6425                        Ptr := Ptr + 1;
6426
6427                        --  Ignore wide chars ??? else store character
6428
6429                        if In_Character_Range (CC) then
6430                           C := Get_Character (CC);
6431                           exit when C = ASCII.LF;
6432                           Error_Msg_Strlen := Error_Msg_Strlen + 1;
6433                           Error_Msg_String (Error_Msg_Strlen) := C;
6434                        end if;
6435                     end loop;
6436
6437                     --  Here with one line ready to go
6438
6439                     Error_Msg_Warn := Prag_Id = Pragma_Compile_Time_Warning;
6440
6441                     --  If this is a warning in a spec, then we want clients
6442                     --  to see the warning, so mark the message with the
6443                     --  special sequence !! to force the warning. In the case
6444                     --  of a package spec, we do not force this if we are in
6445                     --  the private part of the spec.
6446
6447                     if Force then
6448                        if Cont = False then
6449                           Error_Msg_N ("<~!!", Arg1);
6450                           Cont := True;
6451                        else
6452                           Error_Msg_N ("\<~!!", Arg1);
6453                        end if;
6454
6455                     --  Error, rather than warning, or in a body, so we do not
6456                     --  need to force visibility for client (error will be
6457                     --  output in any case, and this is the situation in which
6458                     --  we do not want a client to get a warning, since the
6459                     --  warning is in the body or the spec private part).
6460
6461                     else
6462                        if Cont = False then
6463                           Error_Msg_N ("<~", Arg1);
6464                           Cont := True;
6465                        else
6466                           Error_Msg_N ("\<~", Arg1);
6467                        end if;
6468                     end if;
6469
6470                     exit when Ptr > Len;
6471                  end loop;
6472               end;
6473            end if;
6474         end if;
6475      end Process_Compile_Time_Warning_Or_Error;
6476
6477      ------------------------
6478      -- Process_Convention --
6479      ------------------------
6480
6481      procedure Process_Convention
6482        (C   : out Convention_Id;
6483         Ent : out Entity_Id)
6484      is
6485         Id        : Node_Id;
6486         E         : Entity_Id;
6487         E1        : Entity_Id;
6488         Cname     : Name_Id;
6489         Comp_Unit : Unit_Number_Type;
6490
6491         procedure Diagnose_Multiple_Pragmas (S : Entity_Id);
6492         --  Called if we have more than one Export/Import/Convention pragma.
6493         --  This is generally illegal, but we have a special case of allowing
6494         --  Import and Interface to coexist if they specify the convention in
6495         --  a consistent manner. We are allowed to do this, since Interface is
6496         --  an implementation defined pragma, and we choose to do it since we
6497         --  know Rational allows this combination. S is the entity id of the
6498         --  subprogram in question. This procedure also sets the special flag
6499         --  Import_Interface_Present in both pragmas in the case where we do
6500         --  have matching Import and Interface pragmas.
6501
6502         procedure Set_Convention_From_Pragma (E : Entity_Id);
6503         --  Set convention in entity E, and also flag that the entity has a
6504         --  convention pragma. If entity is for a private or incomplete type,
6505         --  also set convention and flag on underlying type. This procedure
6506         --  also deals with the special case of C_Pass_By_Copy convention,
6507         --  and error checks for inappropriate convention specification.
6508
6509         -------------------------------
6510         -- Diagnose_Multiple_Pragmas --
6511         -------------------------------
6512
6513         procedure Diagnose_Multiple_Pragmas (S : Entity_Id) is
6514            Pdec : constant Node_Id := Declaration_Node (S);
6515            Decl : Node_Id;
6516            Err  : Boolean;
6517
6518            function Same_Convention (Decl : Node_Id) return Boolean;
6519            --  Decl is a pragma node. This function returns True if this
6520            --  pragma has a first argument that is an identifier with a
6521            --  Chars field corresponding to the Convention_Id C.
6522
6523            function Same_Name (Decl : Node_Id) return Boolean;
6524            --  Decl is a pragma node. This function returns True if this
6525            --  pragma has a second argument that is an identifier with a
6526            --  Chars field that matches the Chars of the current subprogram.
6527
6528            ---------------------
6529            -- Same_Convention --
6530            ---------------------
6531
6532            function Same_Convention (Decl : Node_Id) return Boolean is
6533               Arg1 : constant Node_Id :=
6534                        First (Pragma_Argument_Associations (Decl));
6535
6536            begin
6537               if Present (Arg1) then
6538                  declare
6539                     Arg : constant Node_Id := Get_Pragma_Arg (Arg1);
6540                  begin
6541                     if Nkind (Arg) = N_Identifier
6542                       and then Is_Convention_Name (Chars (Arg))
6543                       and then Get_Convention_Id (Chars (Arg)) = C
6544                     then
6545                        return True;
6546                     end if;
6547                  end;
6548               end if;
6549
6550               return False;
6551            end Same_Convention;
6552
6553            ---------------
6554            -- Same_Name --
6555            ---------------
6556
6557            function Same_Name (Decl : Node_Id) return Boolean is
6558               Arg1 : constant Node_Id :=
6559                        First (Pragma_Argument_Associations (Decl));
6560               Arg2 : Node_Id;
6561
6562            begin
6563               if No (Arg1) then
6564                  return False;
6565               end if;
6566
6567               Arg2 := Next (Arg1);
6568
6569               if No (Arg2) then
6570                  return False;
6571               end if;
6572
6573               declare
6574                  Arg : constant Node_Id := Get_Pragma_Arg (Arg2);
6575               begin
6576                  if Nkind (Arg) = N_Identifier
6577                    and then Chars (Arg) = Chars (S)
6578                  then
6579                     return True;
6580                  end if;
6581               end;
6582
6583               return False;
6584            end Same_Name;
6585
6586         --  Start of processing for Diagnose_Multiple_Pragmas
6587
6588         begin
6589            Err := True;
6590
6591            --  Definitely give message if we have Convention/Export here
6592
6593            if Prag_Id = Pragma_Convention or else Prag_Id = Pragma_Export then
6594               null;
6595
6596               --  If we have an Import or Export, scan back from pragma to
6597               --  find any previous pragma applying to the same procedure.
6598               --  The scan will be terminated by the start of the list, or
6599               --  hitting the subprogram declaration. This won't allow one
6600               --  pragma to appear in the public part and one in the private
6601               --  part, but that seems very unlikely in practice.
6602
6603            else
6604               Decl := Prev (N);
6605               while Present (Decl) and then Decl /= Pdec loop
6606
6607                  --  Look for pragma with same name as us
6608
6609                  if Nkind (Decl) = N_Pragma
6610                    and then Same_Name (Decl)
6611                  then
6612                     --  Give error if same as our pragma or Export/Convention
6613
6614                     if Nam_In (Pragma_Name (Decl), Name_Export,
6615                                                    Name_Convention,
6616                                                    Pragma_Name (N))
6617                     then
6618                        exit;
6619
6620                     --  Case of Import/Interface or the other way round
6621
6622                     elsif Nam_In (Pragma_Name (Decl), Name_Interface,
6623                                                       Name_Import)
6624                     then
6625                        --  Here we know that we have Import and Interface. It
6626                        --  doesn't matter which way round they are. See if
6627                        --  they specify the same convention. If so, all OK,
6628                        --  and set special flags to stop other messages
6629
6630                        if Same_Convention (Decl) then
6631                           Set_Import_Interface_Present (N);
6632                           Set_Import_Interface_Present (Decl);
6633                           Err := False;
6634
6635                        --  If different conventions, special message
6636
6637                        else
6638                           Error_Msg_Sloc := Sloc (Decl);
6639                           Error_Pragma_Arg
6640                             ("convention differs from that given#", Arg1);
6641                           return;
6642                        end if;
6643                     end if;
6644                  end if;
6645
6646                  Next (Decl);
6647               end loop;
6648            end if;
6649
6650            --  Give message if needed if we fall through those tests
6651            --  except on Relaxed_RM_Semantics where we let go: either this
6652            --  is a case accepted/ignored by other Ada compilers (e.g.
6653            --  a mix of Convention and Import), or another error will be
6654            --  generated later (e.g. using both Import and Export).
6655
6656            if Err and not Relaxed_RM_Semantics then
6657               Error_Pragma_Arg
6658                 ("at most one Convention/Export/Import pragma is allowed",
6659                  Arg2);
6660            end if;
6661         end Diagnose_Multiple_Pragmas;
6662
6663         --------------------------------
6664         -- Set_Convention_From_Pragma --
6665         --------------------------------
6666
6667         procedure Set_Convention_From_Pragma (E : Entity_Id) is
6668         begin
6669            --  Ghost convention is allowed only for functions
6670
6671            if Ekind (E) /= E_Function and then C = Convention_Ghost then
6672               Error_Msg_N
6673                 ("& may not have Ghost convention", E);
6674               Error_Msg_N
6675                 ("\only functions are permitted to have Ghost convention",
6676                  E);
6677               return;
6678            end if;
6679
6680            --  Ada 2005 (AI-430): Check invalid attempt to change convention
6681            --  for an overridden dispatching operation. Technically this is
6682            --  an amendment and should only be done in Ada 2005 mode. However,
6683            --  this is clearly a mistake, since the problem that is addressed
6684            --  by this AI is that there is a clear gap in the RM.
6685
6686            if Is_Dispatching_Operation (E)
6687              and then Present (Overridden_Operation (E))
6688              and then C /= Convention (Overridden_Operation (E))
6689            then
6690               --  An attempt to override a function with a ghost function
6691               --  appears as a mismatch in conventions.
6692
6693               if C = Convention_Ghost then
6694                  Error_Msg_N ("ghost function & cannot be overriding", E);
6695               else
6696                  Error_Pragma_Arg
6697                    ("cannot change convention for overridden dispatching "
6698                     & "operation", Arg1);
6699               end if;
6700            end if;
6701
6702            --  Special checks for Convention_Stdcall
6703
6704            if C = Convention_Stdcall then
6705
6706               --  A dispatching call is not allowed. A dispatching subprogram
6707               --  cannot be used to interface to the Win32 API, so in fact
6708               --  this check does not impose any effective restriction.
6709
6710               if Is_Dispatching_Operation (E) then
6711                  Error_Msg_Sloc := Sloc (E);
6712
6713                  --  Note: make this unconditional so that if there is more
6714                  --  than one call to which the pragma applies, we get a
6715                  --  message for each call. Also don't use Error_Pragma,
6716                  --  so that we get multiple messages.
6717
6718                  Error_Msg_N
6719                    ("dispatching subprogram# cannot use Stdcall convention!",
6720                     Arg1);
6721
6722               --  Subprogram is allowed, but not a generic subprogram
6723
6724               elsif not Is_Subprogram (E)
6725                 and then not Is_Generic_Subprogram (E)
6726
6727                 --  A variable is OK
6728
6729                 and then Ekind (E) /= E_Variable
6730
6731                 --  An access to subprogram is also allowed
6732
6733                 and then not
6734                   (Is_Access_Type (E)
6735                     and then Ekind (Designated_Type (E)) = E_Subprogram_Type)
6736
6737                 --  Allow internal call to set convention of subprogram type
6738
6739                 and then not (Ekind (E) = E_Subprogram_Type)
6740               then
6741                  Error_Pragma_Arg
6742                    ("second argument of pragma% must be subprogram (type)",
6743                     Arg2);
6744               end if;
6745            end if;
6746
6747            --  Set the convention
6748
6749            Set_Convention (E, C);
6750            Set_Has_Convention_Pragma (E);
6751
6752            --  For the case of a record base type, also set the convention of
6753            --  any anonymous access types declared in the record which do not
6754            --  currently have a specified convention.
6755
6756            if Is_Record_Type (E) and then Is_Base_Type (E) then
6757               declare
6758                  Comp : Node_Id;
6759
6760               begin
6761                  Comp := First_Component (E);
6762                  while Present (Comp) loop
6763                     if Present (Etype (Comp))
6764                       and then Ekind_In (Etype (Comp),
6765                                          E_Anonymous_Access_Type,
6766                                          E_Anonymous_Access_Subprogram_Type)
6767                       and then not Has_Convention_Pragma (Comp)
6768                     then
6769                        Set_Convention (Comp, C);
6770                     end if;
6771
6772                     Next_Component (Comp);
6773                  end loop;
6774               end;
6775            end if;
6776
6777            --  Deal with incomplete/private type case, where underlying type
6778            --  is available, so set convention of that underlying type.
6779
6780            if Is_Incomplete_Or_Private_Type (E)
6781              and then Present (Underlying_Type (E))
6782            then
6783               Set_Convention            (Underlying_Type (E), C);
6784               Set_Has_Convention_Pragma (Underlying_Type (E), True);
6785            end if;
6786
6787            --  A class-wide type should inherit the convention of the specific
6788            --  root type (although this isn't specified clearly by the RM).
6789
6790            if Is_Type (E) and then Present (Class_Wide_Type (E)) then
6791               Set_Convention (Class_Wide_Type (E), C);
6792            end if;
6793
6794            --  If the entity is a record type, then check for special case of
6795            --  C_Pass_By_Copy, which is treated the same as C except that the
6796            --  special record flag is set. This convention is only permitted
6797            --  on record types (see AI95-00131).
6798
6799            if Cname = Name_C_Pass_By_Copy then
6800               if Is_Record_Type (E) then
6801                  Set_C_Pass_By_Copy (Base_Type (E));
6802               elsif Is_Incomplete_Or_Private_Type (E)
6803                 and then Is_Record_Type (Underlying_Type (E))
6804               then
6805                  Set_C_Pass_By_Copy (Base_Type (Underlying_Type (E)));
6806               else
6807                  Error_Pragma_Arg
6808                    ("C_Pass_By_Copy convention allowed only for record type",
6809                     Arg2);
6810               end if;
6811            end if;
6812
6813            --  If the entity is a derived boolean type, check for the special
6814            --  case of convention C, C++, or Fortran, where we consider any
6815            --  nonzero value to represent true.
6816
6817            if Is_Discrete_Type (E)
6818              and then Root_Type (Etype (E)) = Standard_Boolean
6819              and then
6820                (C = Convention_C
6821                   or else
6822                 C = Convention_CPP
6823                   or else
6824                 C = Convention_Fortran)
6825            then
6826               Set_Nonzero_Is_True (Base_Type (E));
6827            end if;
6828         end Set_Convention_From_Pragma;
6829
6830      --  Start of processing for Process_Convention
6831
6832      begin
6833         Check_At_Least_N_Arguments (2);
6834         Check_Optional_Identifier (Arg1, Name_Convention);
6835         Check_Arg_Is_Identifier (Arg1);
6836         Cname := Chars (Get_Pragma_Arg (Arg1));
6837
6838         --  C_Pass_By_Copy is treated as a synonym for convention C (this is
6839         --  tested again below to set the critical flag).
6840
6841         if Cname = Name_C_Pass_By_Copy then
6842            C := Convention_C;
6843
6844         --  Otherwise we must have something in the standard convention list
6845
6846         elsif Is_Convention_Name (Cname) then
6847            C := Get_Convention_Id (Chars (Get_Pragma_Arg (Arg1)));
6848
6849         --  In DEC VMS, it seems that there is an undocumented feature that
6850         --  any unrecognized convention is treated as the default, which for
6851         --  us is convention C. It does not seem so terrible to do this
6852         --  unconditionally, silently in the VMS case, and with a warning
6853         --  in the non-VMS case.
6854
6855         else
6856            if Warn_On_Export_Import and not OpenVMS_On_Target then
6857               Error_Msg_N
6858                 ("??unrecognized convention name, C assumed",
6859                  Get_Pragma_Arg (Arg1));
6860            end if;
6861
6862            C := Convention_C;
6863         end if;
6864
6865         Check_Optional_Identifier (Arg2, Name_Entity);
6866         Check_Arg_Is_Local_Name (Arg2);
6867
6868         Id := Get_Pragma_Arg (Arg2);
6869         Analyze (Id);
6870
6871         if not Is_Entity_Name (Id) then
6872            Error_Pragma_Arg ("entity name required", Arg2);
6873         end if;
6874
6875         E := Entity (Id);
6876
6877         --  Set entity to return
6878
6879         Ent := E;
6880
6881         --  Ada_Pass_By_Copy special checking
6882
6883         if C = Convention_Ada_Pass_By_Copy then
6884            if not Is_First_Subtype (E) then
6885               Error_Pragma_Arg
6886                 ("convention `Ada_Pass_By_Copy` only allowed for types",
6887                  Arg2);
6888            end if;
6889
6890            if Is_By_Reference_Type (E) then
6891               Error_Pragma_Arg
6892                 ("convention `Ada_Pass_By_Copy` not allowed for by-reference "
6893                  & "type", Arg1);
6894            end if;
6895         end if;
6896
6897         --  Ada_Pass_By_Reference special checking
6898
6899         if C = Convention_Ada_Pass_By_Reference then
6900            if not Is_First_Subtype (E) then
6901               Error_Pragma_Arg
6902                 ("convention `Ada_Pass_By_Reference` only allowed for types",
6903                  Arg2);
6904            end if;
6905
6906            if Is_By_Copy_Type (E) then
6907               Error_Pragma_Arg
6908                 ("convention `Ada_Pass_By_Reference` not allowed for by-copy "
6909                  & "type", Arg1);
6910            end if;
6911         end if;
6912
6913         --  Ghost special checking
6914
6915         if Is_Ghost_Subprogram (E)
6916           and then Present (Overridden_Operation (E))
6917         then
6918            Error_Msg_N ("ghost function & cannot be overriding", E);
6919         end if;
6920
6921         --  Go to renamed subprogram if present, since convention applies to
6922         --  the actual renamed entity, not to the renaming entity. If the
6923         --  subprogram is inherited, go to parent subprogram.
6924
6925         if Is_Subprogram (E)
6926           and then Present (Alias (E))
6927         then
6928            if Nkind (Parent (Declaration_Node (E))) =
6929                                       N_Subprogram_Renaming_Declaration
6930            then
6931               if Scope (E) /= Scope (Alias (E)) then
6932                  Error_Pragma_Ref
6933                    ("cannot apply pragma% to non-local entity&#", E);
6934               end if;
6935
6936               E := Alias (E);
6937
6938            elsif Nkind_In (Parent (E), N_Full_Type_Declaration,
6939                                        N_Private_Extension_Declaration)
6940              and then Scope (E) = Scope (Alias (E))
6941            then
6942               E := Alias (E);
6943
6944               --  Return the parent subprogram the entity was inherited from
6945
6946               Ent := E;
6947            end if;
6948         end if;
6949
6950         --  Check that we are not applying this to a specless body
6951         --  Relax this check if Relaxed_RM_Semantics to accomodate other Ada
6952         --  compilers.
6953
6954         if Is_Subprogram (E)
6955           and then Nkind (Parent (Declaration_Node (E))) = N_Subprogram_Body
6956           and then not Relaxed_RM_Semantics
6957         then
6958            Error_Pragma
6959              ("pragma% requires separate spec and must come before body");
6960         end if;
6961
6962         --  Check that we are not applying this to a named constant
6963
6964         if Ekind_In (E, E_Named_Integer, E_Named_Real) then
6965            Error_Msg_Name_1 := Pname;
6966            Error_Msg_N
6967              ("cannot apply pragma% to named constant!",
6968               Get_Pragma_Arg (Arg2));
6969            Error_Pragma_Arg
6970              ("\supply appropriate type for&!", Arg2);
6971         end if;
6972
6973         if Ekind (E) = E_Enumeration_Literal then
6974            Error_Pragma ("enumeration literal not allowed for pragma%");
6975         end if;
6976
6977         --  Check for rep item appearing too early or too late
6978
6979         if Etype (E) = Any_Type
6980           or else Rep_Item_Too_Early (E, N)
6981         then
6982            raise Pragma_Exit;
6983
6984         elsif Present (Underlying_Type (E)) then
6985            E := Underlying_Type (E);
6986         end if;
6987
6988         if Rep_Item_Too_Late (E, N) then
6989            raise Pragma_Exit;
6990         end if;
6991
6992         if Has_Convention_Pragma (E) then
6993            Diagnose_Multiple_Pragmas (E);
6994
6995         elsif Convention (E) = Convention_Protected
6996           or else Ekind (Scope (E)) = E_Protected_Type
6997         then
6998            Error_Pragma_Arg
6999              ("a protected operation cannot be given a different convention",
7000                Arg2);
7001         end if;
7002
7003         --  For Intrinsic, a subprogram is required
7004
7005         if C = Convention_Intrinsic
7006           and then not Is_Subprogram (E)
7007           and then not Is_Generic_Subprogram (E)
7008         then
7009            Error_Pragma_Arg
7010              ("second argument of pragma% must be a subprogram", Arg2);
7011         end if;
7012
7013         --  Deal with non-subprogram cases
7014
7015         if not Is_Subprogram (E)
7016           and then not Is_Generic_Subprogram (E)
7017         then
7018            Set_Convention_From_Pragma (E);
7019
7020            if Is_Type (E) then
7021               Check_First_Subtype (Arg2);
7022               Set_Convention_From_Pragma (Base_Type (E));
7023
7024               --  For access subprograms, we must set the convention on the
7025               --  internally generated directly designated type as well.
7026
7027               if Ekind (E) = E_Access_Subprogram_Type then
7028                  Set_Convention_From_Pragma (Directly_Designated_Type (E));
7029               end if;
7030            end if;
7031
7032         --  For the subprogram case, set proper convention for all homonyms
7033         --  in same scope and the same declarative part, i.e. the same
7034         --  compilation unit.
7035
7036         else
7037            Comp_Unit := Get_Source_Unit (E);
7038            Set_Convention_From_Pragma (E);
7039
7040            --  Treat a pragma Import as an implicit body, and pragma import
7041            --  as implicit reference (for navigation in GPS).
7042
7043            if Prag_Id = Pragma_Import then
7044               Generate_Reference (E, Id, 'b');
7045
7046            --  For exported entities we restrict the generation of references
7047            --  to entities exported to foreign languages since entities
7048            --  exported to Ada do not provide further information to GPS and
7049            --  add undesired references to the output of the gnatxref tool.
7050
7051            elsif Prag_Id = Pragma_Export
7052              and then Convention (E) /= Convention_Ada
7053            then
7054               Generate_Reference (E, Id, 'i');
7055            end if;
7056
7057            --  If the pragma comes from from an aspect, it only applies to the
7058            --  given entity, not its homonyms.
7059
7060            if From_Aspect_Specification (N) then
7061               return;
7062            end if;
7063
7064            --  Otherwise Loop through the homonyms of the pragma argument's
7065            --  entity, an apply convention to those in the current scope.
7066
7067            E1 := Ent;
7068
7069            loop
7070               E1 := Homonym (E1);
7071               exit when No (E1) or else Scope (E1) /= Current_Scope;
7072
7073               --  Ignore entry for which convention is already set
7074
7075               if Has_Convention_Pragma (E1) then
7076                  goto Continue;
7077               end if;
7078
7079               --  Do not set the pragma on inherited operations or on formal
7080               --  subprograms.
7081
7082               if Comes_From_Source (E1)
7083                 and then Comp_Unit = Get_Source_Unit (E1)
7084                 and then not Is_Formal_Subprogram (E1)
7085                 and then Nkind (Original_Node (Parent (E1))) /=
7086                                                    N_Full_Type_Declaration
7087               then
7088                  if Present (Alias (E1))
7089                    and then Scope (E1) /= Scope (Alias (E1))
7090                  then
7091                     Error_Pragma_Ref
7092                       ("cannot apply pragma% to non-local entity& declared#",
7093                        E1);
7094                  end if;
7095
7096                  Set_Convention_From_Pragma (E1);
7097
7098                  if Prag_Id = Pragma_Import then
7099                     Generate_Reference (E1, Id, 'b');
7100                  end if;
7101               end if;
7102
7103            <<Continue>>
7104               null;
7105            end loop;
7106         end if;
7107      end Process_Convention;
7108
7109      ----------------------------------------
7110      -- Process_Disable_Enable_Atomic_Sync --
7111      ----------------------------------------
7112
7113      procedure Process_Disable_Enable_Atomic_Sync (Nam : Name_Id) is
7114      begin
7115         Check_No_Identifiers;
7116         Check_At_Most_N_Arguments (1);
7117
7118         --  Modeled internally as
7119         --    pragma Suppress/Unsuppress (Atomic_Synchronization [,Entity])
7120
7121         Rewrite (N,
7122           Make_Pragma (Loc,
7123             Pragma_Identifier            =>
7124               Make_Identifier (Loc, Nam),
7125             Pragma_Argument_Associations => New_List (
7126               Make_Pragma_Argument_Association (Loc,
7127                 Expression =>
7128                   Make_Identifier (Loc, Name_Atomic_Synchronization)))));
7129
7130         if Present (Arg1) then
7131            Append_To (Pragma_Argument_Associations (N), New_Copy (Arg1));
7132         end if;
7133
7134         Analyze (N);
7135      end Process_Disable_Enable_Atomic_Sync;
7136
7137      -----------------------------------------------------
7138      -- Process_Extended_Import_Export_Exception_Pragma --
7139      -----------------------------------------------------
7140
7141      procedure Process_Extended_Import_Export_Exception_Pragma
7142        (Arg_Internal : Node_Id;
7143         Arg_External : Node_Id;
7144         Arg_Form     : Node_Id;
7145         Arg_Code     : Node_Id)
7146      is
7147         Def_Id   : Entity_Id;
7148         Code_Val : Uint;
7149
7150      begin
7151         if not OpenVMS_On_Target then
7152            Error_Pragma
7153              ("??pragma% ignored (applies only to Open'V'M'S)");
7154         end if;
7155
7156         Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
7157         Def_Id := Entity (Arg_Internal);
7158
7159         if Ekind (Def_Id) /= E_Exception then
7160            Error_Pragma_Arg
7161              ("pragma% must refer to declared exception", Arg_Internal);
7162         end if;
7163
7164         Set_Extended_Import_Export_External_Name (Def_Id, Arg_External);
7165
7166         if Present (Arg_Form) then
7167            Check_Arg_Is_One_Of (Arg_Form, Name_Ada, Name_VMS);
7168         end if;
7169
7170         if Present (Arg_Form)
7171           and then Chars (Arg_Form) = Name_Ada
7172         then
7173            null;
7174         else
7175            Set_Is_VMS_Exception (Def_Id);
7176            Set_Exception_Code (Def_Id, No_Uint);
7177         end if;
7178
7179         if Present (Arg_Code) then
7180            if not Is_VMS_Exception (Def_Id) then
7181               Error_Pragma_Arg
7182                 ("Code option for pragma% not allowed for Ada case",
7183                  Arg_Code);
7184            end if;
7185
7186            Check_Arg_Is_Static_Expression (Arg_Code, Any_Integer);
7187            Code_Val := Expr_Value (Arg_Code);
7188
7189            if not UI_Is_In_Int_Range (Code_Val) then
7190               Error_Pragma_Arg
7191                 ("Code option for pragma% must be in 32-bit range",
7192                  Arg_Code);
7193
7194            else
7195               Set_Exception_Code (Def_Id, Code_Val);
7196            end if;
7197         end if;
7198      end Process_Extended_Import_Export_Exception_Pragma;
7199
7200      -------------------------------------------------
7201      -- Process_Extended_Import_Export_Internal_Arg --
7202      -------------------------------------------------
7203
7204      procedure Process_Extended_Import_Export_Internal_Arg
7205        (Arg_Internal : Node_Id := Empty)
7206      is
7207      begin
7208         if No (Arg_Internal) then
7209            Error_Pragma ("Internal parameter required for pragma%");
7210         end if;
7211
7212         if Nkind (Arg_Internal) = N_Identifier then
7213            null;
7214
7215         elsif Nkind (Arg_Internal) = N_Operator_Symbol
7216           and then (Prag_Id = Pragma_Import_Function
7217                       or else
7218                     Prag_Id = Pragma_Export_Function)
7219         then
7220            null;
7221
7222         else
7223            Error_Pragma_Arg
7224              ("wrong form for Internal parameter for pragma%", Arg_Internal);
7225         end if;
7226
7227         Check_Arg_Is_Local_Name (Arg_Internal);
7228      end Process_Extended_Import_Export_Internal_Arg;
7229
7230      --------------------------------------------------
7231      -- Process_Extended_Import_Export_Object_Pragma --
7232      --------------------------------------------------
7233
7234      procedure Process_Extended_Import_Export_Object_Pragma
7235        (Arg_Internal : Node_Id;
7236         Arg_External : Node_Id;
7237         Arg_Size     : Node_Id)
7238      is
7239         Def_Id : Entity_Id;
7240
7241      begin
7242         Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
7243         Def_Id := Entity (Arg_Internal);
7244
7245         if not Ekind_In (Def_Id, E_Constant, E_Variable) then
7246            Error_Pragma_Arg
7247              ("pragma% must designate an object", Arg_Internal);
7248         end if;
7249
7250         if Has_Rep_Pragma (Def_Id, Name_Common_Object)
7251              or else
7252            Has_Rep_Pragma (Def_Id, Name_Psect_Object)
7253         then
7254            Error_Pragma_Arg
7255              ("previous Common/Psect_Object applies, pragma % not permitted",
7256               Arg_Internal);
7257         end if;
7258
7259         if Rep_Item_Too_Late (Def_Id, N) then
7260            raise Pragma_Exit;
7261         end if;
7262
7263         Set_Extended_Import_Export_External_Name (Def_Id, Arg_External);
7264
7265         if Present (Arg_Size) then
7266            Check_Arg_Is_External_Name (Arg_Size);
7267         end if;
7268
7269         --  Export_Object case
7270
7271         if Prag_Id = Pragma_Export_Object then
7272            if not Is_Library_Level_Entity (Def_Id) then
7273               Error_Pragma_Arg
7274                 ("argument for pragma% must be library level entity",
7275                  Arg_Internal);
7276            end if;
7277
7278            if Ekind (Current_Scope) = E_Generic_Package then
7279               Error_Pragma ("pragma& cannot appear in a generic unit");
7280            end if;
7281
7282            if not Size_Known_At_Compile_Time (Etype (Def_Id)) then
7283               Error_Pragma_Arg
7284                 ("exported object must have compile time known size",
7285                  Arg_Internal);
7286            end if;
7287
7288            if Warn_On_Export_Import and then Is_Exported (Def_Id) then
7289               Error_Msg_N ("??duplicate Export_Object pragma", N);
7290            else
7291               Set_Exported (Def_Id, Arg_Internal);
7292            end if;
7293
7294         --  Import_Object case
7295
7296         else
7297            if Is_Concurrent_Type (Etype (Def_Id)) then
7298               Error_Pragma_Arg
7299                 ("cannot use pragma% for task/protected object",
7300                  Arg_Internal);
7301            end if;
7302
7303            if Ekind (Def_Id) = E_Constant then
7304               Error_Pragma_Arg
7305                 ("cannot import a constant", Arg_Internal);
7306            end if;
7307
7308            if Warn_On_Export_Import
7309              and then Has_Discriminants (Etype (Def_Id))
7310            then
7311               Error_Msg_N
7312                 ("imported value must be initialized??", Arg_Internal);
7313            end if;
7314
7315            if Warn_On_Export_Import
7316              and then Is_Access_Type (Etype (Def_Id))
7317            then
7318               Error_Pragma_Arg
7319                 ("cannot import object of an access type??", Arg_Internal);
7320            end if;
7321
7322            if Warn_On_Export_Import
7323              and then Is_Imported (Def_Id)
7324            then
7325               Error_Msg_N ("??duplicate Import_Object pragma", N);
7326
7327            --  Check for explicit initialization present. Note that an
7328            --  initialization generated by the code generator, e.g. for an
7329            --  access type, does not count here.
7330
7331            elsif Present (Expression (Parent (Def_Id)))
7332               and then
7333                 Comes_From_Source
7334                   (Original_Node (Expression (Parent (Def_Id))))
7335            then
7336               Error_Msg_Sloc := Sloc (Def_Id);
7337               Error_Pragma_Arg
7338                 ("imported entities cannot be initialized (RM B.1(24))",
7339                  "\no initialization allowed for & declared#", Arg1);
7340            else
7341               Set_Imported (Def_Id);
7342               Note_Possible_Modification (Arg_Internal, Sure => False);
7343            end if;
7344         end if;
7345      end Process_Extended_Import_Export_Object_Pragma;
7346
7347      ------------------------------------------------------
7348      -- Process_Extended_Import_Export_Subprogram_Pragma --
7349      ------------------------------------------------------
7350
7351      procedure Process_Extended_Import_Export_Subprogram_Pragma
7352        (Arg_Internal                 : Node_Id;
7353         Arg_External                 : Node_Id;
7354         Arg_Parameter_Types          : Node_Id;
7355         Arg_Result_Type              : Node_Id := Empty;
7356         Arg_Mechanism                : Node_Id;
7357         Arg_Result_Mechanism         : Node_Id := Empty;
7358         Arg_First_Optional_Parameter : Node_Id := Empty)
7359      is
7360         Ent       : Entity_Id;
7361         Def_Id    : Entity_Id;
7362         Hom_Id    : Entity_Id;
7363         Formal    : Entity_Id;
7364         Ambiguous : Boolean;
7365         Match     : Boolean;
7366         Dval      : Node_Id;
7367
7368         function Same_Base_Type
7369          (Ptype  : Node_Id;
7370           Formal : Entity_Id) return Boolean;
7371         --  Determines if Ptype references the type of Formal. Note that only
7372         --  the base types need to match according to the spec. Ptype here is
7373         --  the argument from the pragma, which is either a type name, or an
7374         --  access attribute.
7375
7376         --------------------
7377         -- Same_Base_Type --
7378         --------------------
7379
7380         function Same_Base_Type
7381           (Ptype  : Node_Id;
7382            Formal : Entity_Id) return Boolean
7383         is
7384            Ftyp : constant Entity_Id := Base_Type (Etype (Formal));
7385            Pref : Node_Id;
7386
7387         begin
7388            --  Case where pragma argument is typ'Access
7389
7390            if Nkind (Ptype) = N_Attribute_Reference
7391              and then Attribute_Name (Ptype) = Name_Access
7392            then
7393               Pref := Prefix (Ptype);
7394               Find_Type (Pref);
7395
7396               if not Is_Entity_Name (Pref)
7397                 or else Entity (Pref) = Any_Type
7398               then
7399                  raise Pragma_Exit;
7400               end if;
7401
7402               --  We have a match if the corresponding argument is of an
7403               --  anonymous access type, and its designated type matches the
7404               --  type of the prefix of the access attribute
7405
7406               return Ekind (Ftyp) = E_Anonymous_Access_Type
7407                 and then Base_Type (Entity (Pref)) =
7408                            Base_Type (Etype (Designated_Type (Ftyp)));
7409
7410            --  Case where pragma argument is a type name
7411
7412            else
7413               Find_Type (Ptype);
7414
7415               if not Is_Entity_Name (Ptype)
7416                 or else Entity (Ptype) = Any_Type
7417               then
7418                  raise Pragma_Exit;
7419               end if;
7420
7421               --  We have a match if the corresponding argument is of the type
7422               --  given in the pragma (comparing base types)
7423
7424               return Base_Type (Entity (Ptype)) = Ftyp;
7425            end if;
7426         end Same_Base_Type;
7427
7428      --  Start of processing for
7429      --  Process_Extended_Import_Export_Subprogram_Pragma
7430
7431      begin
7432         Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
7433         Ent := Empty;
7434         Ambiguous := False;
7435
7436         --  Loop through homonyms (overloadings) of the entity
7437
7438         Hom_Id := Entity (Arg_Internal);
7439         while Present (Hom_Id) loop
7440            Def_Id := Get_Base_Subprogram (Hom_Id);
7441
7442            --  We need a subprogram in the current scope
7443
7444            if not Is_Subprogram (Def_Id)
7445              or else Scope (Def_Id) /= Current_Scope
7446            then
7447               null;
7448
7449            else
7450               Match := True;
7451
7452               --  Pragma cannot apply to subprogram body
7453
7454               if Is_Subprogram (Def_Id)
7455                 and then Nkind (Parent (Declaration_Node (Def_Id))) =
7456                                                             N_Subprogram_Body
7457               then
7458                  Error_Pragma
7459                    ("pragma% requires separate spec"
7460                      & " and must come before body");
7461               end if;
7462
7463               --  Test result type if given, note that the result type
7464               --  parameter can only be present for the function cases.
7465
7466               if Present (Arg_Result_Type)
7467                 and then not Same_Base_Type (Arg_Result_Type, Def_Id)
7468               then
7469                  Match := False;
7470
7471               elsif Etype (Def_Id) /= Standard_Void_Type
7472                 and then
7473                   Nam_In (Pname, Name_Export_Procedure, Name_Import_Procedure)
7474               then
7475                  Match := False;
7476
7477               --  Test parameter types if given. Note that this parameter
7478               --  has not been analyzed (and must not be, since it is
7479               --  semantic nonsense), so we get it as the parser left it.
7480
7481               elsif Present (Arg_Parameter_Types) then
7482                  Check_Matching_Types : declare
7483                     Formal : Entity_Id;
7484                     Ptype  : Node_Id;
7485
7486                  begin
7487                     Formal := First_Formal (Def_Id);
7488
7489                     if Nkind (Arg_Parameter_Types) = N_Null then
7490                        if Present (Formal) then
7491                           Match := False;
7492                        end if;
7493
7494                     --  A list of one type, e.g. (List) is parsed as
7495                     --  a parenthesized expression.
7496
7497                     elsif Nkind (Arg_Parameter_Types) /= N_Aggregate
7498                       and then Paren_Count (Arg_Parameter_Types) = 1
7499                     then
7500                        if No (Formal)
7501                          or else Present (Next_Formal (Formal))
7502                        then
7503                           Match := False;
7504                        else
7505                           Match :=
7506                             Same_Base_Type (Arg_Parameter_Types, Formal);
7507                        end if;
7508
7509                     --  A list of more than one type is parsed as a aggregate
7510
7511                     elsif Nkind (Arg_Parameter_Types) = N_Aggregate
7512                       and then Paren_Count (Arg_Parameter_Types) = 0
7513                     then
7514                        Ptype := First (Expressions (Arg_Parameter_Types));
7515                        while Present (Ptype) or else Present (Formal) loop
7516                           if No (Ptype)
7517                             or else No (Formal)
7518                             or else not Same_Base_Type (Ptype, Formal)
7519                           then
7520                              Match := False;
7521                              exit;
7522                           else
7523                              Next_Formal (Formal);
7524                              Next (Ptype);
7525                           end if;
7526                        end loop;
7527
7528                     --  Anything else is of the wrong form
7529
7530                     else
7531                        Error_Pragma_Arg
7532                          ("wrong form for Parameter_Types parameter",
7533                           Arg_Parameter_Types);
7534                     end if;
7535                  end Check_Matching_Types;
7536               end if;
7537
7538               --  Match is now False if the entry we found did not match
7539               --  either a supplied Parameter_Types or Result_Types argument
7540
7541               if Match then
7542                  if No (Ent) then
7543                     Ent := Def_Id;
7544
7545                  --  Ambiguous case, the flag Ambiguous shows if we already
7546                  --  detected this and output the initial messages.
7547
7548                  else
7549                     if not Ambiguous then
7550                        Ambiguous := True;
7551                        Error_Msg_Name_1 := Pname;
7552                        Error_Msg_N
7553                          ("pragma% does not uniquely identify subprogram!",
7554                           N);
7555                        Error_Msg_Sloc := Sloc (Ent);
7556                        Error_Msg_N ("matching subprogram #!", N);
7557                        Ent := Empty;
7558                     end if;
7559
7560                     Error_Msg_Sloc := Sloc (Def_Id);
7561                     Error_Msg_N ("matching subprogram #!", N);
7562                  end if;
7563               end if;
7564            end if;
7565
7566            Hom_Id := Homonym (Hom_Id);
7567         end loop;
7568
7569         --  See if we found an entry
7570
7571         if No (Ent) then
7572            if not Ambiguous then
7573               if Is_Generic_Subprogram (Entity (Arg_Internal)) then
7574                  Error_Pragma
7575                    ("pragma% cannot be given for generic subprogram");
7576               else
7577                  Error_Pragma
7578                    ("pragma% does not identify local subprogram");
7579               end if;
7580            end if;
7581
7582            return;
7583         end if;
7584
7585         --  Import pragmas must be for imported entities
7586
7587         if Prag_Id = Pragma_Import_Function
7588              or else
7589            Prag_Id = Pragma_Import_Procedure
7590              or else
7591            Prag_Id = Pragma_Import_Valued_Procedure
7592         then
7593            if not Is_Imported (Ent) then
7594               Error_Pragma
7595                 ("pragma Import or Interface must precede pragma%");
7596            end if;
7597
7598         --  Here we have the Export case which can set the entity as exported
7599
7600         --  But does not do so if the specified external name is null, since
7601         --  that is taken as a signal in DEC Ada 83 (with which we want to be
7602         --  compatible) to request no external name.
7603
7604         elsif Nkind (Arg_External) = N_String_Literal
7605           and then String_Length (Strval (Arg_External)) = 0
7606         then
7607            null;
7608
7609         --  In all other cases, set entity as exported
7610
7611         else
7612            Set_Exported (Ent, Arg_Internal);
7613         end if;
7614
7615         --  Special processing for Valued_Procedure cases
7616
7617         if Prag_Id = Pragma_Import_Valued_Procedure
7618           or else
7619            Prag_Id = Pragma_Export_Valued_Procedure
7620         then
7621            Formal := First_Formal (Ent);
7622
7623            if No (Formal) then
7624               Error_Pragma ("at least one parameter required for pragma%");
7625
7626            elsif Ekind (Formal) /= E_Out_Parameter then
7627               Error_Pragma ("first parameter must have mode out for pragma%");
7628
7629            else
7630               Set_Is_Valued_Procedure (Ent);
7631            end if;
7632         end if;
7633
7634         Set_Extended_Import_Export_External_Name (Ent, Arg_External);
7635
7636         --  Process Result_Mechanism argument if present. We have already
7637         --  checked that this is only allowed for the function case.
7638
7639         if Present (Arg_Result_Mechanism) then
7640            Set_Mechanism_Value (Ent, Arg_Result_Mechanism);
7641         end if;
7642
7643         --  Process Mechanism parameter if present. Note that this parameter
7644         --  is not analyzed, and must not be analyzed since it is semantic
7645         --  nonsense, so we get it in exactly as the parser left it.
7646
7647         if Present (Arg_Mechanism) then
7648            declare
7649               Formal : Entity_Id;
7650               Massoc : Node_Id;
7651               Mname  : Node_Id;
7652               Choice : Node_Id;
7653
7654            begin
7655               --  A single mechanism association without a formal parameter
7656               --  name is parsed as a parenthesized expression. All other
7657               --  cases are parsed as aggregates, so we rewrite the single
7658               --  parameter case as an aggregate for consistency.
7659
7660               if Nkind (Arg_Mechanism) /= N_Aggregate
7661                 and then Paren_Count (Arg_Mechanism) = 1
7662               then
7663                  Rewrite (Arg_Mechanism,
7664                    Make_Aggregate (Sloc (Arg_Mechanism),
7665                      Expressions => New_List (
7666                        Relocate_Node (Arg_Mechanism))));
7667               end if;
7668
7669               --  Case of only mechanism name given, applies to all formals
7670
7671               if Nkind (Arg_Mechanism) /= N_Aggregate then
7672                  Formal := First_Formal (Ent);
7673                  while Present (Formal) loop
7674                     Set_Mechanism_Value (Formal, Arg_Mechanism);
7675                     Next_Formal (Formal);
7676                  end loop;
7677
7678               --  Case of list of mechanism associations given
7679
7680               else
7681                  if Null_Record_Present (Arg_Mechanism) then
7682                     Error_Pragma_Arg
7683                       ("inappropriate form for Mechanism parameter",
7684                        Arg_Mechanism);
7685                  end if;
7686
7687                  --  Deal with positional ones first
7688
7689                  Formal := First_Formal (Ent);
7690
7691                  if Present (Expressions (Arg_Mechanism)) then
7692                     Mname := First (Expressions (Arg_Mechanism));
7693                     while Present (Mname) loop
7694                        if No (Formal) then
7695                           Error_Pragma_Arg
7696                             ("too many mechanism associations", Mname);
7697                        end if;
7698
7699                        Set_Mechanism_Value (Formal, Mname);
7700                        Next_Formal (Formal);
7701                        Next (Mname);
7702                     end loop;
7703                  end if;
7704
7705                  --  Deal with named entries
7706
7707                  if Present (Component_Associations (Arg_Mechanism)) then
7708                     Massoc := First (Component_Associations (Arg_Mechanism));
7709                     while Present (Massoc) loop
7710                        Choice := First (Choices (Massoc));
7711
7712                        if Nkind (Choice) /= N_Identifier
7713                          or else Present (Next (Choice))
7714                        then
7715                           Error_Pragma_Arg
7716                             ("incorrect form for mechanism association",
7717                              Massoc);
7718                        end if;
7719
7720                        Formal := First_Formal (Ent);
7721                        loop
7722                           if No (Formal) then
7723                              Error_Pragma_Arg
7724                                ("parameter name & not present", Choice);
7725                           end if;
7726
7727                           if Chars (Choice) = Chars (Formal) then
7728                              Set_Mechanism_Value
7729                                (Formal, Expression (Massoc));
7730
7731                              --  Set entity on identifier (needed by ASIS)
7732
7733                              Set_Entity (Choice, Formal);
7734
7735                              exit;
7736                           end if;
7737
7738                           Next_Formal (Formal);
7739                        end loop;
7740
7741                        Next (Massoc);
7742                     end loop;
7743                  end if;
7744               end if;
7745            end;
7746         end if;
7747
7748         --  Process First_Optional_Parameter argument if present. We have
7749         --  already checked that this is only allowed for the Import case.
7750
7751         if Present (Arg_First_Optional_Parameter) then
7752            if Nkind (Arg_First_Optional_Parameter) /= N_Identifier then
7753               Error_Pragma_Arg
7754                 ("first optional parameter must be formal parameter name",
7755                  Arg_First_Optional_Parameter);
7756            end if;
7757
7758            Formal := First_Formal (Ent);
7759            loop
7760               if No (Formal) then
7761                  Error_Pragma_Arg
7762                    ("specified formal parameter& not found",
7763                     Arg_First_Optional_Parameter);
7764               end if;
7765
7766               exit when Chars (Formal) =
7767                         Chars (Arg_First_Optional_Parameter);
7768
7769               Next_Formal (Formal);
7770            end loop;
7771
7772            Set_First_Optional_Parameter (Ent, Formal);
7773
7774            --  Check specified and all remaining formals have right form
7775
7776            while Present (Formal) loop
7777               if Ekind (Formal) /= E_In_Parameter then
7778                  Error_Msg_NE
7779                    ("optional formal& is not of mode in!",
7780                     Arg_First_Optional_Parameter, Formal);
7781
7782               else
7783                  Dval := Default_Value (Formal);
7784
7785                  if No (Dval) then
7786                     Error_Msg_NE
7787                       ("optional formal& does not have default value!",
7788                        Arg_First_Optional_Parameter, Formal);
7789
7790                  elsif Compile_Time_Known_Value_Or_Aggr (Dval) then
7791                     null;
7792
7793                  else
7794                     Error_Msg_FE
7795                       ("default value for optional formal& is non-static!",
7796                        Arg_First_Optional_Parameter, Formal);
7797                  end if;
7798               end if;
7799
7800               Set_Is_Optional_Parameter (Formal);
7801               Next_Formal (Formal);
7802            end loop;
7803         end if;
7804      end Process_Extended_Import_Export_Subprogram_Pragma;
7805
7806      --------------------------
7807      -- Process_Generic_List --
7808      --------------------------
7809
7810      procedure Process_Generic_List is
7811         Arg : Node_Id;
7812         Exp : Node_Id;
7813
7814      begin
7815         Check_No_Identifiers;
7816         Check_At_Least_N_Arguments (1);
7817
7818         --  Check all arguments are names of generic units or instances
7819
7820         Arg := Arg1;
7821         while Present (Arg) loop
7822            Exp := Get_Pragma_Arg (Arg);
7823            Analyze (Exp);
7824
7825            if not Is_Entity_Name (Exp)
7826              or else
7827                (not Is_Generic_Instance (Entity (Exp))
7828                  and then
7829                 not Is_Generic_Unit (Entity (Exp)))
7830            then
7831               Error_Pragma_Arg
7832                 ("pragma% argument must be name of generic unit/instance",
7833                  Arg);
7834            end if;
7835
7836            Next (Arg);
7837         end loop;
7838      end Process_Generic_List;
7839
7840      ------------------------------------
7841      -- Process_Import_Predefined_Type --
7842      ------------------------------------
7843
7844      procedure Process_Import_Predefined_Type is
7845         Loc  : constant Source_Ptr := Sloc (N);
7846         Elmt : Elmt_Id;
7847         Ftyp : Node_Id := Empty;
7848         Decl : Node_Id;
7849         Def  : Node_Id;
7850         Nam  : Name_Id;
7851
7852      begin
7853         String_To_Name_Buffer (Strval (Expression (Arg3)));
7854         Nam := Name_Find;
7855
7856         Elmt := First_Elmt (Predefined_Float_Types);
7857         while Present (Elmt) and then Chars (Node (Elmt)) /= Nam loop
7858            Next_Elmt (Elmt);
7859         end loop;
7860
7861         Ftyp := Node (Elmt);
7862
7863         if Present (Ftyp) then
7864
7865            --  Don't build a derived type declaration, because predefined C
7866            --  types have no declaration anywhere, so cannot really be named.
7867            --  Instead build a full type declaration, starting with an
7868            --  appropriate type definition is built
7869
7870            if Is_Floating_Point_Type (Ftyp) then
7871               Def := Make_Floating_Point_Definition (Loc,
7872                 Make_Integer_Literal (Loc, Digits_Value (Ftyp)),
7873                 Make_Real_Range_Specification (Loc,
7874                   Make_Real_Literal (Loc, Realval (Type_Low_Bound (Ftyp))),
7875                   Make_Real_Literal (Loc, Realval (Type_High_Bound (Ftyp)))));
7876
7877            --  Should never have a predefined type we cannot handle
7878
7879            else
7880               raise Program_Error;
7881            end if;
7882
7883            --  Build and insert a Full_Type_Declaration, which will be
7884            --  analyzed as soon as this list entry has been analyzed.
7885
7886            Decl := Make_Full_Type_Declaration (Loc,
7887              Make_Defining_Identifier (Loc, Chars (Expression (Arg2))),
7888              Type_Definition => Def);
7889
7890            Insert_After (N, Decl);
7891            Mark_Rewrite_Insertion (Decl);
7892
7893         else
7894            Error_Pragma_Arg ("no matching type found for pragma%",
7895            Arg2);
7896         end if;
7897      end Process_Import_Predefined_Type;
7898
7899      ---------------------------------
7900      -- Process_Import_Or_Interface --
7901      ---------------------------------
7902
7903      procedure Process_Import_Or_Interface is
7904         C      : Convention_Id;
7905         Def_Id : Entity_Id;
7906         Hom_Id : Entity_Id;
7907
7908      begin
7909         --  In Relaxed_RM_Semantics, support old Ada 83 style:
7910         --  pragma Import (Entity, "external name");
7911
7912         if Relaxed_RM_Semantics
7913           and then Arg_Count = 2
7914           and then Prag_Id = Pragma_Import
7915           and then Nkind (Expression (Arg2)) = N_String_Literal
7916         then
7917            C := Convention_C;
7918            Def_Id := Get_Pragma_Arg (Arg1);
7919            Analyze (Def_Id);
7920
7921            if not Is_Entity_Name (Def_Id) then
7922               Error_Pragma_Arg ("entity name required", Arg1);
7923            end if;
7924
7925            Def_Id := Entity (Def_Id);
7926            Kill_Size_Check_Code (Def_Id);
7927            Note_Possible_Modification (Get_Pragma_Arg (Arg1), Sure => False);
7928
7929         else
7930            Process_Convention (C, Def_Id);
7931            Kill_Size_Check_Code (Def_Id);
7932            Note_Possible_Modification (Get_Pragma_Arg (Arg2), Sure => False);
7933         end if;
7934
7935         if Ekind_In (Def_Id, E_Variable, E_Constant) then
7936
7937            --  We do not permit Import to apply to a renaming declaration
7938
7939            if Present (Renamed_Object (Def_Id)) then
7940               Error_Pragma_Arg
7941                 ("pragma% not allowed for object renaming", Arg2);
7942
7943            --  User initialization is not allowed for imported object, but
7944            --  the object declaration may contain a default initialization,
7945            --  that will be discarded. Note that an explicit initialization
7946            --  only counts if it comes from source, otherwise it is simply
7947            --  the code generator making an implicit initialization explicit.
7948
7949            elsif Present (Expression (Parent (Def_Id)))
7950              and then Comes_From_Source (Expression (Parent (Def_Id)))
7951            then
7952               Error_Msg_Sloc := Sloc (Def_Id);
7953               Error_Pragma_Arg
7954                 ("no initialization allowed for declaration of& #",
7955                  "\imported entities cannot be initialized (RM B.1(24))",
7956                  Arg2);
7957
7958            else
7959               Set_Imported (Def_Id);
7960               Process_Interface_Name (Def_Id, Arg3, Arg4);
7961
7962               --  Note that we do not set Is_Public here. That's because we
7963               --  only want to set it if there is no address clause, and we
7964               --  don't know that yet, so we delay that processing till
7965               --  freeze time.
7966
7967               --  pragma Import completes deferred constants
7968
7969               if Ekind (Def_Id) = E_Constant then
7970                  Set_Has_Completion (Def_Id);
7971               end if;
7972
7973               --  It is not possible to import a constant of an unconstrained
7974               --  array type (e.g. string) because there is no simple way to
7975               --  write a meaningful subtype for it.
7976
7977               if Is_Array_Type (Etype (Def_Id))
7978                 and then not Is_Constrained (Etype (Def_Id))
7979               then
7980                  Error_Msg_NE
7981                    ("imported constant& must have a constrained subtype",
7982                      N, Def_Id);
7983               end if;
7984            end if;
7985
7986         elsif Is_Subprogram (Def_Id)
7987           or else Is_Generic_Subprogram (Def_Id)
7988         then
7989            --  If the name is overloaded, pragma applies to all of the denoted
7990            --  entities in the same declarative part, unless the pragma comes
7991            --  from an aspect specification.
7992
7993            Hom_Id := Def_Id;
7994            while Present (Hom_Id) loop
7995
7996               Def_Id := Get_Base_Subprogram (Hom_Id);
7997
7998               --  Ignore inherited subprograms because the pragma will apply
7999               --  to the parent operation, which is the one called.
8000
8001               if Is_Overloadable (Def_Id)
8002                 and then Present (Alias (Def_Id))
8003               then
8004                  null;
8005
8006               --  If it is not a subprogram, it must be in an outer scope and
8007               --  pragma does not apply.
8008
8009               elsif not Is_Subprogram (Def_Id)
8010                 and then not Is_Generic_Subprogram (Def_Id)
8011               then
8012                  null;
8013
8014               --  The pragma does not apply to primitives of interfaces
8015
8016               elsif Is_Dispatching_Operation (Def_Id)
8017                 and then Present (Find_Dispatching_Type (Def_Id))
8018                 and then Is_Interface (Find_Dispatching_Type (Def_Id))
8019               then
8020                  null;
8021
8022               --  Verify that the homonym is in the same declarative part (not
8023               --  just the same scope). If the pragma comes from an aspect
8024               --  specification we know that it is part of the declaration.
8025
8026               elsif Parent (Unit_Declaration_Node (Def_Id)) /= Parent (N)
8027                 and then Nkind (Parent (N)) /= N_Compilation_Unit_Aux
8028                 and then not From_Aspect_Specification (N)
8029               then
8030                  exit;
8031
8032               else
8033                  Set_Imported (Def_Id);
8034
8035                  --  Reject an Import applied to an abstract subprogram
8036
8037                  if Is_Subprogram (Def_Id)
8038                    and then Is_Abstract_Subprogram (Def_Id)
8039                  then
8040                     Error_Msg_Sloc := Sloc (Def_Id);
8041                     Error_Msg_NE
8042                       ("cannot import abstract subprogram& declared#",
8043                        Arg2, Def_Id);
8044                  end if;
8045
8046                  --  Special processing for Convention_Intrinsic
8047
8048                  if C = Convention_Intrinsic then
8049
8050                     --  Link_Name argument not allowed for intrinsic
8051
8052                     Check_No_Link_Name;
8053
8054                     Set_Is_Intrinsic_Subprogram (Def_Id);
8055
8056                     --  If no external name is present, then check that this
8057                     --  is a valid intrinsic subprogram. If an external name
8058                     --  is present, then this is handled by the back end.
8059
8060                     if No (Arg3) then
8061                        Check_Intrinsic_Subprogram
8062                          (Def_Id, Get_Pragma_Arg (Arg2));
8063                     end if;
8064                  end if;
8065
8066                  --  Verify that the subprogram does not have a completion
8067                  --  through a renaming declaration. For other completions the
8068                  --  pragma appears as a too late representation.
8069
8070                  declare
8071                     Decl : constant Node_Id := Unit_Declaration_Node (Def_Id);
8072
8073                  begin
8074                     if Present (Decl)
8075                       and then Nkind (Decl) = N_Subprogram_Declaration
8076                       and then Present (Corresponding_Body (Decl))
8077                       and then Nkind (Unit_Declaration_Node
8078                                        (Corresponding_Body (Decl))) =
8079                                             N_Subprogram_Renaming_Declaration
8080                     then
8081                        Error_Msg_Sloc := Sloc (Def_Id);
8082                        Error_Msg_NE
8083                          ("cannot import&, renaming already provided for "
8084                           & "declaration #", N, Def_Id);
8085                     end if;
8086                  end;
8087
8088                  Set_Has_Completion (Def_Id);
8089                  Process_Interface_Name (Def_Id, Arg3, Arg4);
8090               end if;
8091
8092               if Is_Compilation_Unit (Hom_Id) then
8093
8094                  --  Its possible homonyms are not affected by the pragma.
8095                  --  Such homonyms might be present in the context of other
8096                  --  units being compiled.
8097
8098                  exit;
8099
8100               elsif From_Aspect_Specification (N) then
8101                  exit;
8102
8103               else
8104                  Hom_Id := Homonym (Hom_Id);
8105               end if;
8106            end loop;
8107
8108         --  When the convention is Java or CIL, we also allow Import to
8109         --  be given for packages, generic packages, exceptions, record
8110         --  components, and access to subprograms.
8111
8112         elsif (C = Convention_Java or else C = Convention_CIL)
8113           and then
8114             (Is_Package_Or_Generic_Package (Def_Id)
8115               or else Ekind (Def_Id) = E_Exception
8116               or else Ekind (Def_Id) = E_Access_Subprogram_Type
8117               or else Nkind (Parent (Def_Id)) = N_Component_Declaration)
8118         then
8119            Set_Imported (Def_Id);
8120            Set_Is_Public (Def_Id);
8121            Process_Interface_Name (Def_Id, Arg3, Arg4);
8122
8123         --  Import a CPP class
8124
8125         elsif C = Convention_CPP
8126           and then (Is_Record_Type (Def_Id)
8127                      or else Ekind (Def_Id) = E_Incomplete_Type)
8128         then
8129            if Ekind (Def_Id) = E_Incomplete_Type then
8130               if Present (Full_View (Def_Id)) then
8131                  Def_Id := Full_View (Def_Id);
8132
8133               else
8134                  Error_Msg_N
8135                    ("cannot import 'C'P'P type before full declaration seen",
8136                     Get_Pragma_Arg (Arg2));
8137
8138                  --  Although we have reported the error we decorate it as
8139                  --  CPP_Class to avoid reporting spurious errors
8140
8141                  Set_Is_CPP_Class (Def_Id);
8142                  return;
8143               end if;
8144            end if;
8145
8146            --  Types treated as CPP classes must be declared limited (note:
8147            --  this used to be a warning but there is no real benefit to it
8148            --  since we did effectively intend to treat the type as limited
8149            --  anyway).
8150
8151            if not Is_Limited_Type (Def_Id) then
8152               Error_Msg_N
8153                 ("imported 'C'P'P type must be limited",
8154                  Get_Pragma_Arg (Arg2));
8155            end if;
8156
8157            if Etype (Def_Id) /= Def_Id
8158              and then not Is_CPP_Class (Root_Type (Def_Id))
8159            then
8160               Error_Msg_N ("root type must be a 'C'P'P type", Arg1);
8161            end if;
8162
8163            Set_Is_CPP_Class (Def_Id);
8164
8165            --  Imported CPP types must not have discriminants (because C++
8166            --  classes do not have discriminants).
8167
8168            if Has_Discriminants (Def_Id) then
8169               Error_Msg_N
8170                 ("imported 'C'P'P type cannot have discriminants",
8171                  First (Discriminant_Specifications
8172                          (Declaration_Node (Def_Id))));
8173            end if;
8174
8175            --  Check that components of imported CPP types do not have default
8176            --  expressions. For private types this check is performed when the
8177            --  full view is analyzed (see Process_Full_View).
8178
8179            if not Is_Private_Type (Def_Id) then
8180               Check_CPP_Type_Has_No_Defaults (Def_Id);
8181            end if;
8182
8183         --  Import a CPP exception
8184
8185         elsif C = Convention_CPP
8186           and then Ekind (Def_Id) = E_Exception
8187         then
8188            if No (Arg3) then
8189               Error_Pragma_Arg
8190                 ("'External_'Name arguments is required for 'Cpp exception",
8191                  Arg3);
8192            else
8193               --  As only a string is allowed, Check_Arg_Is_External_Name
8194               --  isn't called.
8195               Check_Arg_Is_Static_Expression (Arg3, Standard_String);
8196            end if;
8197
8198            if Present (Arg4) then
8199               Error_Pragma_Arg
8200                 ("Link_Name argument not allowed for imported Cpp exception",
8201                  Arg4);
8202            end if;
8203
8204            --  Do not call Set_Interface_Name as the name of the exception
8205            --  shouldn't be modified (and in particular it shouldn't be
8206            --  the External_Name). For exceptions, the External_Name is the
8207            --  name of the RTTI structure.
8208
8209            --  ??? Emit an error if pragma Import/Export_Exception is present
8210
8211         elsif Nkind (Parent (Def_Id)) = N_Incomplete_Type_Declaration then
8212            Check_No_Link_Name;
8213            Check_Arg_Count (3);
8214            Check_Arg_Is_Static_Expression (Arg3, Standard_String);
8215
8216            Process_Import_Predefined_Type;
8217
8218         else
8219            Error_Pragma_Arg
8220              ("second argument of pragma% must be object, subprogram "
8221               & "or incomplete type",
8222               Arg2);
8223         end if;
8224
8225         --  If this pragma applies to a compilation unit, then the unit, which
8226         --  is a subprogram, does not require (or allow) a body. We also do
8227         --  not need to elaborate imported procedures.
8228
8229         if Nkind (Parent (N)) = N_Compilation_Unit_Aux then
8230            declare
8231               Cunit : constant Node_Id := Parent (Parent (N));
8232            begin
8233               Set_Body_Required (Cunit, False);
8234            end;
8235         end if;
8236      end Process_Import_Or_Interface;
8237
8238      --------------------
8239      -- Process_Inline --
8240      --------------------
8241
8242      procedure Process_Inline (Status : Inline_Status) is
8243         Assoc     : Node_Id;
8244         Decl      : Node_Id;
8245         Subp_Id   : Node_Id;
8246         Subp      : Entity_Id;
8247         Applies   : Boolean;
8248
8249         Effective : Boolean := False;
8250         --  Set True if inline has some effect, i.e. if there is at least one
8251         --  subprogram set as inlined as a result of the use of the pragma.
8252
8253         procedure Make_Inline (Subp : Entity_Id);
8254         --  Subp is the defining unit name of the subprogram declaration. Set
8255         --  the flag, as well as the flag in the corresponding body, if there
8256         --  is one present.
8257
8258         procedure Set_Inline_Flags (Subp : Entity_Id);
8259         --  Sets Is_Inlined and Has_Pragma_Inline flags for Subp and also
8260         --  Has_Pragma_Inline_Always for the Inline_Always case.
8261
8262         function Inlining_Not_Possible (Subp : Entity_Id) return Boolean;
8263         --  Returns True if it can be determined at this stage that inlining
8264         --  is not possible, for example if the body is available and contains
8265         --  exception handlers, we prevent inlining, since otherwise we can
8266         --  get undefined symbols at link time. This function also emits a
8267         --  warning if front-end inlining is enabled and the pragma appears
8268         --  too late.
8269         --
8270         --  ??? is business with link symbols still valid, or does it relate
8271         --  to front end ZCX which is being phased out ???
8272
8273         ---------------------------
8274         -- Inlining_Not_Possible --
8275         ---------------------------
8276
8277         function Inlining_Not_Possible (Subp : Entity_Id) return Boolean is
8278            Decl  : constant Node_Id := Unit_Declaration_Node (Subp);
8279            Stats : Node_Id;
8280
8281         begin
8282            if Nkind (Decl) = N_Subprogram_Body then
8283               Stats := Handled_Statement_Sequence (Decl);
8284               return Present (Exception_Handlers (Stats))
8285                 or else Present (At_End_Proc (Stats));
8286
8287            elsif Nkind (Decl) = N_Subprogram_Declaration
8288              and then Present (Corresponding_Body (Decl))
8289            then
8290               if Front_End_Inlining
8291                 and then Analyzed (Corresponding_Body (Decl))
8292               then
8293                  Error_Msg_N ("pragma appears too late, ignored??", N);
8294                  return True;
8295
8296               --  If the subprogram is a renaming as body, the body is just a
8297               --  call to the renamed subprogram, and inlining is trivially
8298               --  possible.
8299
8300               elsif
8301                 Nkind (Unit_Declaration_Node (Corresponding_Body (Decl))) =
8302                                             N_Subprogram_Renaming_Declaration
8303               then
8304                  return False;
8305
8306               else
8307                  Stats :=
8308                    Handled_Statement_Sequence
8309                        (Unit_Declaration_Node (Corresponding_Body (Decl)));
8310
8311                  return
8312                    Present (Exception_Handlers (Stats))
8313                      or else Present (At_End_Proc (Stats));
8314               end if;
8315
8316            else
8317               --  If body is not available, assume the best, the check is
8318               --  performed again when compiling enclosing package bodies.
8319
8320               return False;
8321            end if;
8322         end Inlining_Not_Possible;
8323
8324         -----------------
8325         -- Make_Inline --
8326         -----------------
8327
8328         procedure Make_Inline (Subp : Entity_Id) is
8329            Kind       : constant Entity_Kind := Ekind (Subp);
8330            Inner_Subp : Entity_Id   := Subp;
8331
8332         begin
8333            --  Ignore if bad type, avoid cascaded error
8334
8335            if Etype (Subp) = Any_Type then
8336               Applies := True;
8337               return;
8338
8339            --  Ignore if all inlining is suppressed
8340
8341            elsif Suppress_All_Inlining then
8342               Applies := True;
8343               return;
8344
8345            --  If inlining is not possible, for now do not treat as an error
8346
8347            elsif Status /= Suppressed
8348              and then Inlining_Not_Possible (Subp)
8349            then
8350               Applies := True;
8351               return;
8352
8353            --  Here we have a candidate for inlining, but we must exclude
8354            --  derived operations. Otherwise we would end up trying to inline
8355            --  a phantom declaration, and the result would be to drag in a
8356            --  body which has no direct inlining associated with it. That
8357            --  would not only be inefficient but would also result in the
8358            --  backend doing cross-unit inlining in cases where it was
8359            --  definitely inappropriate to do so.
8360
8361            --  However, a simple Comes_From_Source test is insufficient, since
8362            --  we do want to allow inlining of generic instances which also do
8363            --  not come from source. We also need to recognize specs generated
8364            --  by the front-end for bodies that carry the pragma. Finally,
8365            --  predefined operators do not come from source but are not
8366            --  inlineable either.
8367
8368            elsif Is_Generic_Instance (Subp)
8369              or else Nkind (Parent (Parent (Subp))) = N_Subprogram_Declaration
8370            then
8371               null;
8372
8373            elsif not Comes_From_Source (Subp)
8374              and then Scope (Subp) /= Standard_Standard
8375            then
8376               Applies := True;
8377               return;
8378            end if;
8379
8380            --  The referenced entity must either be the enclosing entity, or
8381            --  an entity declared within the current open scope.
8382
8383            if Present (Scope (Subp))
8384              and then Scope (Subp) /= Current_Scope
8385              and then Subp /= Current_Scope
8386            then
8387               Error_Pragma_Arg
8388                 ("argument of% must be entity in current scope", Assoc);
8389               return;
8390            end if;
8391
8392            --  Processing for procedure, operator or function. If subprogram
8393            --  is aliased (as for an instance) indicate that the renamed
8394            --  entity (if declared in the same unit) is inlined.
8395
8396            if Is_Subprogram (Subp) then
8397               Inner_Subp := Ultimate_Alias (Inner_Subp);
8398
8399               if In_Same_Source_Unit (Subp, Inner_Subp) then
8400                  Set_Inline_Flags (Inner_Subp);
8401
8402                  Decl := Parent (Parent (Inner_Subp));
8403
8404                  if Nkind (Decl) = N_Subprogram_Declaration
8405                    and then Present (Corresponding_Body (Decl))
8406                  then
8407                     Set_Inline_Flags (Corresponding_Body (Decl));
8408
8409                  elsif Is_Generic_Instance (Subp) then
8410
8411                     --  Indicate that the body needs to be created for
8412                     --  inlining subsequent calls. The instantiation node
8413                     --  follows the declaration of the wrapper package
8414                     --  created for it.
8415
8416                     if Scope (Subp) /= Standard_Standard
8417                       and then
8418                         Need_Subprogram_Instance_Body
8419                          (Next (Unit_Declaration_Node (Scope (Alias (Subp)))),
8420                              Subp)
8421                     then
8422                        null;
8423                     end if;
8424
8425                  --  Inline is a program unit pragma (RM 10.1.5) and cannot
8426                  --  appear in a formal part to apply to a formal subprogram.
8427                  --  Do not apply check within an instance or a formal package
8428                  --  the test will have been applied to the original generic.
8429
8430                  elsif Nkind (Decl) in N_Formal_Subprogram_Declaration
8431                    and then List_Containing (Decl) = List_Containing (N)
8432                    and then not In_Instance
8433                  then
8434                     Error_Msg_N
8435                       ("Inline cannot apply to a formal subprogram", N);
8436
8437                  --  If Subp is a renaming, it is the renamed entity that
8438                  --  will appear in any call, and be inlined. However, for
8439                  --  ASIS uses it is convenient to indicate that the renaming
8440                  --  itself is an inlined subprogram, so that some gnatcheck
8441                  --  rules can be applied in the absence of expansion.
8442
8443                  elsif Nkind (Decl) = N_Subprogram_Renaming_Declaration then
8444                     Set_Inline_Flags (Subp);
8445                  end if;
8446               end if;
8447
8448               Applies := True;
8449
8450            --  For a generic subprogram set flag as well, for use at the point
8451            --  of instantiation, to determine whether the body should be
8452            --  generated.
8453
8454            elsif Is_Generic_Subprogram (Subp) then
8455               Set_Inline_Flags (Subp);
8456               Applies := True;
8457
8458            --  Literals are by definition inlined
8459
8460            elsif Kind = E_Enumeration_Literal then
8461               null;
8462
8463            --  Anything else is an error
8464
8465            else
8466               Error_Pragma_Arg
8467                 ("expect subprogram name for pragma%", Assoc);
8468            end if;
8469         end Make_Inline;
8470
8471         ----------------------
8472         -- Set_Inline_Flags --
8473         ----------------------
8474
8475         procedure Set_Inline_Flags (Subp : Entity_Id) is
8476         begin
8477            --  First set the Has_Pragma_XXX flags and issue the appropriate
8478            --  errors and warnings for suspicious combinations.
8479
8480            if Prag_Id = Pragma_No_Inline then
8481               if Has_Pragma_Inline_Always (Subp) then
8482                  Error_Msg_N
8483                    ("Inline_Always and No_Inline are mutually exclusive", N);
8484               elsif Has_Pragma_Inline (Subp) then
8485                  Error_Msg_NE
8486                    ("Inline and No_Inline both specified for& ??",
8487                     N, Entity (Subp_Id));
8488               end if;
8489
8490               Set_Has_Pragma_No_Inline (Subp);
8491            else
8492               if Prag_Id = Pragma_Inline_Always then
8493                  if Has_Pragma_No_Inline (Subp) then
8494                     Error_Msg_N
8495                       ("Inline_Always and No_Inline are mutually exclusive",
8496                        N);
8497                  end if;
8498
8499                  Set_Has_Pragma_Inline_Always (Subp);
8500               else
8501                  if Has_Pragma_No_Inline (Subp) then
8502                     Error_Msg_NE
8503                       ("Inline and No_Inline both specified for& ??",
8504                        N, Entity (Subp_Id));
8505                  end if;
8506               end if;
8507
8508               if not Has_Pragma_Inline (Subp) then
8509                  Set_Has_Pragma_Inline (Subp);
8510                  Effective := True;
8511               end if;
8512            end if;
8513
8514            --  Then adjust the Is_Inlined flag. It can never be set if the
8515            --  subprogram is subject to pragma No_Inline.
8516
8517            case Status is
8518               when Suppressed =>
8519                  Set_Is_Inlined (Subp, False);
8520               when Disabled =>
8521                  null;
8522               when Enabled =>
8523                  if not Has_Pragma_No_Inline (Subp) then
8524                     Set_Is_Inlined (Subp, True);
8525                  end if;
8526            end case;
8527         end Set_Inline_Flags;
8528
8529      --  Start of processing for Process_Inline
8530
8531      begin
8532         Check_No_Identifiers;
8533         Check_At_Least_N_Arguments (1);
8534
8535         if Status = Enabled then
8536            Inline_Processing_Required := True;
8537         end if;
8538
8539         Assoc := Arg1;
8540         while Present (Assoc) loop
8541            Subp_Id := Get_Pragma_Arg (Assoc);
8542            Analyze (Subp_Id);
8543            Applies := False;
8544
8545            if Is_Entity_Name (Subp_Id) then
8546               Subp := Entity (Subp_Id);
8547
8548               if Subp = Any_Id then
8549
8550                  --  If previous error, avoid cascaded errors
8551
8552                  Check_Error_Detected;
8553                  Applies   := True;
8554                  Effective := True;
8555
8556               else
8557                  Make_Inline (Subp);
8558
8559                  --  For the pragma case, climb homonym chain. This is
8560                  --  what implements allowing the pragma in the renaming
8561                  --  case, with the result applying to the ancestors, and
8562                  --  also allows Inline to apply to all previous homonyms.
8563
8564                  if not From_Aspect_Specification (N) then
8565                     while Present (Homonym (Subp))
8566                       and then Scope (Homonym (Subp)) = Current_Scope
8567                     loop
8568                        Make_Inline (Homonym (Subp));
8569                        Subp := Homonym (Subp);
8570                     end loop;
8571                  end if;
8572               end if;
8573            end if;
8574
8575            if not Applies then
8576               Error_Pragma_Arg
8577                 ("inappropriate argument for pragma%", Assoc);
8578
8579            elsif not Effective
8580              and then Warn_On_Redundant_Constructs
8581              and then not (Status = Suppressed or else Suppress_All_Inlining)
8582            then
8583               if Inlining_Not_Possible (Subp) then
8584                  Error_Msg_NE
8585                    ("pragma Inline for& is ignored?r?",
8586                     N, Entity (Subp_Id));
8587               else
8588                  Error_Msg_NE
8589                    ("pragma Inline for& is redundant?r?",
8590                     N, Entity (Subp_Id));
8591               end if;
8592            end if;
8593
8594            Next (Assoc);
8595         end loop;
8596      end Process_Inline;
8597
8598      ----------------------------
8599      -- Process_Interface_Name --
8600      ----------------------------
8601
8602      procedure Process_Interface_Name
8603        (Subprogram_Def : Entity_Id;
8604         Ext_Arg        : Node_Id;
8605         Link_Arg       : Node_Id)
8606      is
8607         Ext_Nam    : Node_Id;
8608         Link_Nam   : Node_Id;
8609         String_Val : String_Id;
8610
8611         procedure Check_Form_Of_Interface_Name
8612           (SN            : Node_Id;
8613            Ext_Name_Case : Boolean);
8614         --  SN is a string literal node for an interface name. This routine
8615         --  performs some minimal checks that the name is reasonable. In
8616         --  particular that no spaces or other obviously incorrect characters
8617         --  appear. This is only a warning, since any characters are allowed.
8618         --  Ext_Name_Case is True for an External_Name, False for a Link_Name.
8619
8620         ----------------------------------
8621         -- Check_Form_Of_Interface_Name --
8622         ----------------------------------
8623
8624         procedure Check_Form_Of_Interface_Name
8625           (SN            : Node_Id;
8626            Ext_Name_Case : Boolean)
8627         is
8628            S  : constant String_Id := Strval (Expr_Value_S (SN));
8629            SL : constant Nat       := String_Length (S);
8630            C  : Char_Code;
8631
8632         begin
8633            if SL = 0 then
8634               Error_Msg_N ("interface name cannot be null string", SN);
8635            end if;
8636
8637            for J in 1 .. SL loop
8638               C := Get_String_Char (S, J);
8639
8640               --  Look for dubious character and issue unconditional warning.
8641               --  Definitely dubious if not in character range.
8642
8643               if not In_Character_Range (C)
8644
8645                  --  For all cases except CLI target,
8646                  --  commas, spaces and slashes are dubious (in CLI, we use
8647                  --  commas and backslashes in external names to specify
8648                  --  assembly version and public key, while slashes and spaces
8649                  --  can be used in names to mark nested classes and
8650                  --  valuetypes).
8651
8652                  or else ((not Ext_Name_Case or else VM_Target /= CLI_Target)
8653                             and then (Get_Character (C) = ','
8654                                         or else
8655                                       Get_Character (C) = '\'))
8656                 or else (VM_Target /= CLI_Target
8657                            and then (Get_Character (C) = ' '
8658                                        or else
8659                                      Get_Character (C) = '/'))
8660               then
8661                  Error_Msg
8662                    ("??interface name contains illegal character",
8663                     Sloc (SN) + Source_Ptr (J));
8664               end if;
8665            end loop;
8666         end Check_Form_Of_Interface_Name;
8667
8668      --  Start of processing for Process_Interface_Name
8669
8670      begin
8671         if No (Link_Arg) then
8672            if No (Ext_Arg) then
8673               if VM_Target = CLI_Target
8674                 and then Ekind (Subprogram_Def) = E_Package
8675                 and then Nkind (Parent (Subprogram_Def)) =
8676                                                 N_Package_Specification
8677                 and then Present (Generic_Parent (Parent (Subprogram_Def)))
8678               then
8679                  Set_Interface_Name
8680                     (Subprogram_Def,
8681                      Interface_Name
8682                        (Generic_Parent (Parent (Subprogram_Def))));
8683               end if;
8684
8685               return;
8686
8687            elsif Chars (Ext_Arg) = Name_Link_Name then
8688               Ext_Nam  := Empty;
8689               Link_Nam := Expression (Ext_Arg);
8690
8691            else
8692               Check_Optional_Identifier (Ext_Arg, Name_External_Name);
8693               Ext_Nam  := Expression (Ext_Arg);
8694               Link_Nam := Empty;
8695            end if;
8696
8697         else
8698            Check_Optional_Identifier (Ext_Arg,  Name_External_Name);
8699            Check_Optional_Identifier (Link_Arg, Name_Link_Name);
8700            Ext_Nam  := Expression (Ext_Arg);
8701            Link_Nam := Expression (Link_Arg);
8702         end if;
8703
8704         --  Check expressions for external name and link name are static
8705
8706         if Present (Ext_Nam) then
8707            Check_Arg_Is_Static_Expression (Ext_Nam, Standard_String);
8708            Check_Form_Of_Interface_Name (Ext_Nam, Ext_Name_Case => True);
8709
8710            --  Verify that external name is not the name of a local entity,
8711            --  which would hide the imported one and could lead to run-time
8712            --  surprises. The problem can only arise for entities declared in
8713            --  a package body (otherwise the external name is fully qualified
8714            --  and will not conflict).
8715
8716            declare
8717               Nam : Name_Id;
8718               E   : Entity_Id;
8719               Par : Node_Id;
8720
8721            begin
8722               if Prag_Id = Pragma_Import then
8723                  String_To_Name_Buffer (Strval (Expr_Value_S (Ext_Nam)));
8724                  Nam := Name_Find;
8725                  E   := Entity_Id (Get_Name_Table_Info (Nam));
8726
8727                  if Nam /= Chars (Subprogram_Def)
8728                    and then Present (E)
8729                    and then not Is_Overloadable (E)
8730                    and then Is_Immediately_Visible (E)
8731                    and then not Is_Imported (E)
8732                    and then Ekind (Scope (E)) = E_Package
8733                  then
8734                     Par := Parent (E);
8735                     while Present (Par) loop
8736                        if Nkind (Par) = N_Package_Body then
8737                           Error_Msg_Sloc := Sloc (E);
8738                           Error_Msg_NE
8739                             ("imported entity is hidden by & declared#",
8740                              Ext_Arg, E);
8741                           exit;
8742                        end if;
8743
8744                        Par := Parent (Par);
8745                     end loop;
8746                  end if;
8747               end if;
8748            end;
8749         end if;
8750
8751         if Present (Link_Nam) then
8752            Check_Arg_Is_Static_Expression (Link_Nam, Standard_String);
8753            Check_Form_Of_Interface_Name (Link_Nam, Ext_Name_Case => False);
8754         end if;
8755
8756         --  If there is no link name, just set the external name
8757
8758         if No (Link_Nam) then
8759            Link_Nam := Adjust_External_Name_Case (Expr_Value_S (Ext_Nam));
8760
8761         --  For the Link_Name case, the given literal is preceded by an
8762         --  asterisk, which indicates to GCC that the given name should be
8763         --  taken literally, and in particular that no prepending of
8764         --  underlines should occur, even in systems where this is the
8765         --  normal default.
8766
8767         else
8768            Start_String;
8769
8770            if VM_Target = No_VM then
8771               Store_String_Char (Get_Char_Code ('*'));
8772            end if;
8773
8774            String_Val := Strval (Expr_Value_S (Link_Nam));
8775            Store_String_Chars (String_Val);
8776            Link_Nam :=
8777              Make_String_Literal (Sloc (Link_Nam),
8778                Strval => End_String);
8779         end if;
8780
8781         --  Set the interface name. If the entity is a generic instance, use
8782         --  its alias, which is the callable entity.
8783
8784         if Is_Generic_Instance (Subprogram_Def) then
8785            Set_Encoded_Interface_Name
8786              (Alias (Get_Base_Subprogram (Subprogram_Def)), Link_Nam);
8787         else
8788            Set_Encoded_Interface_Name
8789              (Get_Base_Subprogram (Subprogram_Def), Link_Nam);
8790         end if;
8791
8792         --  We allow duplicated export names in CIL/Java, as they are always
8793         --  enclosed in a namespace that differentiates them, and overloaded
8794         --  entities are supported by the VM.
8795
8796         if Convention (Subprogram_Def) /= Convention_CIL
8797              and then
8798            Convention (Subprogram_Def) /= Convention_Java
8799         then
8800            Check_Duplicated_Export_Name (Link_Nam);
8801         end if;
8802      end Process_Interface_Name;
8803
8804      -----------------------------------------
8805      -- Process_Interrupt_Or_Attach_Handler --
8806      -----------------------------------------
8807
8808      procedure Process_Interrupt_Or_Attach_Handler is
8809         Arg1_X       : constant Node_Id   := Get_Pragma_Arg (Arg1);
8810         Handler_Proc : constant Entity_Id := Entity (Arg1_X);
8811         Proc_Scope   : constant Entity_Id := Scope (Handler_Proc);
8812
8813      begin
8814         Set_Is_Interrupt_Handler (Handler_Proc);
8815
8816         --  If the pragma is not associated with a handler procedure within a
8817         --  protected type, then it must be for a nonprotected procedure for
8818         --  the AAMP target, in which case we don't associate a representation
8819         --  item with the procedure's scope.
8820
8821         if Ekind (Proc_Scope) = E_Protected_Type then
8822            if Prag_Id = Pragma_Interrupt_Handler
8823                 or else
8824               Prag_Id = Pragma_Attach_Handler
8825            then
8826               Record_Rep_Item (Proc_Scope, N);
8827            end if;
8828         end if;
8829      end Process_Interrupt_Or_Attach_Handler;
8830
8831      --------------------------------------------------
8832      -- Process_Restrictions_Or_Restriction_Warnings --
8833      --------------------------------------------------
8834
8835      --  Note: some of the simple identifier cases were handled in par-prag,
8836      --  but it is harmless (and more straightforward) to simply handle all
8837      --  cases here, even if it means we repeat a bit of work in some cases.
8838
8839      procedure Process_Restrictions_Or_Restriction_Warnings
8840        (Warn : Boolean)
8841      is
8842         Arg   : Node_Id;
8843         R_Id  : Restriction_Id;
8844         Id    : Name_Id;
8845         Expr  : Node_Id;
8846         Val   : Uint;
8847
8848      begin
8849         --  Ignore all Restrictions pragmas in CodePeer mode
8850
8851         if CodePeer_Mode then
8852            return;
8853         end if;
8854
8855         Check_Ada_83_Warning;
8856         Check_At_Least_N_Arguments (1);
8857         Check_Valid_Configuration_Pragma;
8858
8859         Arg := Arg1;
8860         while Present (Arg) loop
8861            Id := Chars (Arg);
8862            Expr := Get_Pragma_Arg (Arg);
8863
8864            --  Case of no restriction identifier present
8865
8866            if Id = No_Name then
8867               if Nkind (Expr) /= N_Identifier then
8868                  Error_Pragma_Arg
8869                    ("invalid form for restriction", Arg);
8870               end if;
8871
8872               R_Id :=
8873                 Get_Restriction_Id
8874                   (Process_Restriction_Synonyms (Expr));
8875
8876               if R_Id not in All_Boolean_Restrictions then
8877                  Error_Msg_Name_1 := Pname;
8878                  Error_Msg_N
8879                    ("invalid restriction identifier&", Get_Pragma_Arg (Arg));
8880
8881                  --  Check for possible misspelling
8882
8883                  for J in Restriction_Id loop
8884                     declare
8885                        Rnm : constant String := Restriction_Id'Image (J);
8886
8887                     begin
8888                        Name_Buffer (1 .. Rnm'Length) := Rnm;
8889                        Name_Len := Rnm'Length;
8890                        Set_Casing (All_Lower_Case);
8891
8892                        if Is_Bad_Spelling_Of (Chars (Expr), Name_Enter) then
8893                           Set_Casing
8894                             (Identifier_Casing (Current_Source_File));
8895                           Error_Msg_String (1 .. Rnm'Length) :=
8896                             Name_Buffer (1 .. Name_Len);
8897                           Error_Msg_Strlen := Rnm'Length;
8898                           Error_Msg_N -- CODEFIX
8899                             ("\possible misspelling of ""~""",
8900                              Get_Pragma_Arg (Arg));
8901                           exit;
8902                        end if;
8903                     end;
8904                  end loop;
8905
8906                  raise Pragma_Exit;
8907               end if;
8908
8909               if Implementation_Restriction (R_Id) then
8910                  Check_Restriction (No_Implementation_Restrictions, Arg);
8911               end if;
8912
8913               --  Special processing for No_Elaboration_Code restriction
8914
8915               if R_Id = No_Elaboration_Code then
8916
8917                  --  Restriction is only recognized within a configuration
8918                  --  pragma file, or within a unit of the main extended
8919                  --  program. Note: the test for Main_Unit is needed to
8920                  --  properly include the case of configuration pragma files.
8921
8922                  if not (Current_Sem_Unit = Main_Unit
8923                           or else In_Extended_Main_Source_Unit (N))
8924                  then
8925                     return;
8926
8927                  --  Don't allow in a subunit unless already specified in
8928                  --  body or spec.
8929
8930                  elsif Nkind (Parent (N)) = N_Compilation_Unit
8931                    and then Nkind (Unit (Parent (N))) = N_Subunit
8932                    and then not Restriction_Active (No_Elaboration_Code)
8933                  then
8934                     Error_Msg_N
8935                       ("invalid specification of ""No_Elaboration_Code""",
8936                        N);
8937                     Error_Msg_N
8938                       ("\restriction cannot be specified in a subunit", N);
8939                     Error_Msg_N
8940                       ("\unless also specified in body or spec", N);
8941                     return;
8942
8943                  --  If we have a No_Elaboration_Code pragma that we
8944                  --  accept, then it needs to be added to the configuration
8945                  --  restrcition set so that we get proper application to
8946                  --  other units in the main extended source as required.
8947
8948                  else
8949                     Add_To_Config_Boolean_Restrictions (No_Elaboration_Code);
8950                  end if;
8951               end if;
8952
8953               --  If this is a warning, then set the warning unless we already
8954               --  have a real restriction active (we never want a warning to
8955               --  override a real restriction).
8956
8957               if Warn then
8958                  if not Restriction_Active (R_Id) then
8959                     Set_Restriction (R_Id, N);
8960                     Restriction_Warnings (R_Id) := True;
8961                  end if;
8962
8963               --  If real restriction case, then set it and make sure that the
8964               --  restriction warning flag is off, since a real restriction
8965               --  always overrides a warning.
8966
8967               else
8968                  Set_Restriction (R_Id, N);
8969                  Restriction_Warnings (R_Id) := False;
8970               end if;
8971
8972               --  Check for obsolescent restrictions in Ada 2005 mode
8973
8974               if not Warn
8975                 and then Ada_Version >= Ada_2005
8976                 and then (R_Id = No_Asynchronous_Control
8977                            or else
8978                           R_Id = No_Unchecked_Deallocation
8979                            or else
8980                           R_Id = No_Unchecked_Conversion)
8981               then
8982                  Check_Restriction (No_Obsolescent_Features, N);
8983               end if;
8984
8985               --  A very special case that must be processed here: pragma
8986               --  Restrictions (No_Exceptions) turns off all run-time
8987               --  checking. This is a bit dubious in terms of the formal
8988               --  language definition, but it is what is intended by RM
8989               --  H.4(12). Restriction_Warnings never affects generated code
8990               --  so this is done only in the real restriction case.
8991
8992               --  Atomic_Synchronization is not a real check, so it is not
8993               --  affected by this processing).
8994
8995               if R_Id = No_Exceptions and then not Warn then
8996                  for J in Scope_Suppress.Suppress'Range loop
8997                     if J /= Atomic_Synchronization then
8998                        Scope_Suppress.Suppress (J) := True;
8999                     end if;
9000                  end loop;
9001               end if;
9002
9003            --  Case of No_Dependence => unit-name. Note that the parser
9004            --  already made the necessary entry in the No_Dependence table.
9005
9006            elsif Id = Name_No_Dependence then
9007               if not OK_No_Dependence_Unit_Name (Expr) then
9008                  raise Pragma_Exit;
9009               end if;
9010
9011            --  Case of No_Specification_Of_Aspect => Identifier.
9012
9013            elsif Id = Name_No_Specification_Of_Aspect then
9014               declare
9015                  A_Id : Aspect_Id;
9016
9017               begin
9018                  if Nkind (Expr) /= N_Identifier then
9019                     A_Id := No_Aspect;
9020                  else
9021                     A_Id := Get_Aspect_Id (Chars (Expr));
9022                  end if;
9023
9024                  if A_Id = No_Aspect then
9025                     Error_Pragma_Arg ("invalid restriction name", Arg);
9026                  else
9027                     Set_Restriction_No_Specification_Of_Aspect (Expr, Warn);
9028                  end if;
9029               end;
9030
9031            elsif Id = Name_No_Use_Of_Attribute then
9032               if Nkind (Expr) /= N_Identifier
9033                 or else not Is_Attribute_Name (Chars (Expr))
9034               then
9035                  Error_Msg_N ("unknown attribute name?", Expr);
9036
9037               else
9038                  Set_Restriction_No_Use_Of_Attribute (Expr, Warn);
9039               end if;
9040
9041            elsif Id = Name_No_Use_Of_Pragma then
9042               if Nkind (Expr) /= N_Identifier
9043                 or else not Is_Pragma_Name (Chars (Expr))
9044               then
9045                  Error_Msg_N ("unknown pragma name?", Expr);
9046
9047               else
9048                  Set_Restriction_No_Use_Of_Pragma (Expr, Warn);
9049               end if;
9050
9051            --  All other cases of restriction identifier present
9052
9053            else
9054               R_Id := Get_Restriction_Id (Process_Restriction_Synonyms (Arg));
9055               Analyze_And_Resolve (Expr, Any_Integer);
9056
9057               if R_Id not in All_Parameter_Restrictions then
9058                  Error_Pragma_Arg
9059                    ("invalid restriction parameter identifier", Arg);
9060
9061               elsif not Is_OK_Static_Expression (Expr) then
9062                  Flag_Non_Static_Expr
9063                    ("value must be static expression!", Expr);
9064                  raise Pragma_Exit;
9065
9066               elsif not Is_Integer_Type (Etype (Expr))
9067                 or else Expr_Value (Expr) < 0
9068               then
9069                  Error_Pragma_Arg
9070                    ("value must be non-negative integer", Arg);
9071               end if;
9072
9073               --  Restriction pragma is active
9074
9075               Val := Expr_Value (Expr);
9076
9077               if not UI_Is_In_Int_Range (Val) then
9078                  Error_Pragma_Arg
9079                    ("pragma ignored, value too large??", Arg);
9080               end if;
9081
9082               --  Warning case. If the real restriction is active, then we
9083               --  ignore the request, since warning never overrides a real
9084               --  restriction. Otherwise we set the proper warning. Note that
9085               --  this circuit sets the warning again if it is already set,
9086               --  which is what we want, since the constant may have changed.
9087
9088               if Warn then
9089                  if not Restriction_Active (R_Id) then
9090                     Set_Restriction
9091                       (R_Id, N, Integer (UI_To_Int (Val)));
9092                     Restriction_Warnings (R_Id) := True;
9093                  end if;
9094
9095               --  Real restriction case, set restriction and make sure warning
9096               --  flag is off since real restriction always overrides warning.
9097
9098               else
9099                  Set_Restriction (R_Id, N, Integer (UI_To_Int (Val)));
9100                  Restriction_Warnings (R_Id) := False;
9101               end if;
9102            end if;
9103
9104            Next (Arg);
9105         end loop;
9106      end Process_Restrictions_Or_Restriction_Warnings;
9107
9108      ---------------------------------
9109      -- Process_Suppress_Unsuppress --
9110      ---------------------------------
9111
9112      --  Note: this procedure makes entries in the check suppress data
9113      --  structures managed by Sem. See spec of package Sem for full
9114      --  details on how we handle recording of check suppression.
9115
9116      procedure Process_Suppress_Unsuppress (Suppress_Case : Boolean) is
9117         C    : Check_Id;
9118         E_Id : Node_Id;
9119         E    : Entity_Id;
9120
9121         In_Package_Spec : constant Boolean :=
9122                             Is_Package_Or_Generic_Package (Current_Scope)
9123                               and then not In_Package_Body (Current_Scope);
9124
9125         procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id);
9126         --  Used to suppress a single check on the given entity
9127
9128         --------------------------------
9129         -- Suppress_Unsuppress_Echeck --
9130         --------------------------------
9131
9132         procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id) is
9133         begin
9134            --  Check for error of trying to set atomic synchronization for
9135            --  a non-atomic variable.
9136
9137            if C = Atomic_Synchronization
9138              and then not (Is_Atomic (E) or else Has_Atomic_Components (E))
9139            then
9140               Error_Msg_N
9141                 ("pragma & requires atomic type or variable",
9142                  Pragma_Identifier (Original_Node (N)));
9143            end if;
9144
9145            Set_Checks_May_Be_Suppressed (E);
9146
9147            if In_Package_Spec then
9148               Push_Global_Suppress_Stack_Entry
9149                 (Entity   => E,
9150                  Check    => C,
9151                  Suppress => Suppress_Case);
9152            else
9153               Push_Local_Suppress_Stack_Entry
9154                 (Entity   => E,
9155                  Check    => C,
9156                  Suppress => Suppress_Case);
9157            end if;
9158
9159            --  If this is a first subtype, and the base type is distinct,
9160            --  then also set the suppress flags on the base type.
9161
9162            if Is_First_Subtype (E) and then Etype (E) /= E then
9163               Suppress_Unsuppress_Echeck (Etype (E), C);
9164            end if;
9165         end Suppress_Unsuppress_Echeck;
9166
9167      --  Start of processing for Process_Suppress_Unsuppress
9168
9169      begin
9170         --  Ignore pragma Suppress/Unsuppress in CodePeer and GNATprove modes
9171         --  on user code: we want to generate checks for analysis purposes, as
9172         --  set respectively by -gnatC and -gnatd.F
9173
9174         if (CodePeer_Mode or GNATprove_Mode)
9175           and then Comes_From_Source (N)
9176         then
9177            return;
9178         end if;
9179
9180         --  Suppress/Unsuppress can appear as a configuration pragma, or in a
9181         --  declarative part or a package spec (RM 11.5(5)).
9182
9183         if not Is_Configuration_Pragma then
9184            Check_Is_In_Decl_Part_Or_Package_Spec;
9185         end if;
9186
9187         Check_At_Least_N_Arguments (1);
9188         Check_At_Most_N_Arguments (2);
9189         Check_No_Identifier (Arg1);
9190         Check_Arg_Is_Identifier (Arg1);
9191
9192         C := Get_Check_Id (Chars (Get_Pragma_Arg (Arg1)));
9193
9194         if C = No_Check_Id then
9195            Error_Pragma_Arg
9196              ("argument of pragma% is not valid check name", Arg1);
9197         end if;
9198
9199         if Arg_Count = 1 then
9200
9201            --  Make an entry in the local scope suppress table. This is the
9202            --  table that directly shows the current value of the scope
9203            --  suppress check for any check id value.
9204
9205            if C = All_Checks then
9206
9207               --  For All_Checks, we set all specific predefined checks with
9208               --  the exception of Elaboration_Check, which is handled
9209               --  specially because of not wanting All_Checks to have the
9210               --  effect of deactivating static elaboration order processing.
9211               --  Atomic_Synchronization is also not affected, since this is
9212               --  not a real check.
9213
9214               for J in Scope_Suppress.Suppress'Range loop
9215                  if J /= Elaboration_Check
9216                       and then
9217                     J /= Atomic_Synchronization
9218                  then
9219                     Scope_Suppress.Suppress (J) := Suppress_Case;
9220                  end if;
9221               end loop;
9222
9223            --  If not All_Checks, and predefined check, then set appropriate
9224            --  scope entry. Note that we will set Elaboration_Check if this
9225            --  is explicitly specified. Atomic_Synchronization is allowed
9226            --  only if internally generated and entity is atomic.
9227
9228            elsif C in Predefined_Check_Id
9229              and then (not Comes_From_Source (N)
9230                         or else C /= Atomic_Synchronization)
9231            then
9232               Scope_Suppress.Suppress (C) := Suppress_Case;
9233            end if;
9234
9235            --  Also make an entry in the Local_Entity_Suppress table
9236
9237            Push_Local_Suppress_Stack_Entry
9238              (Entity   => Empty,
9239               Check    => C,
9240               Suppress => Suppress_Case);
9241
9242         --  Case of two arguments present, where the check is suppressed for
9243         --  a specified entity (given as the second argument of the pragma)
9244
9245         else
9246            --  This is obsolescent in Ada 2005 mode
9247
9248            if Ada_Version >= Ada_2005 then
9249               Check_Restriction (No_Obsolescent_Features, Arg2);
9250            end if;
9251
9252            Check_Optional_Identifier (Arg2, Name_On);
9253            E_Id := Get_Pragma_Arg (Arg2);
9254            Analyze (E_Id);
9255
9256            if not Is_Entity_Name (E_Id) then
9257               Error_Pragma_Arg
9258                 ("second argument of pragma% must be entity name", Arg2);
9259            end if;
9260
9261            E := Entity (E_Id);
9262
9263            if E = Any_Id then
9264               return;
9265            end if;
9266
9267            --  Enforce RM 11.5(7) which requires that for a pragma that
9268            --  appears within a package spec, the named entity must be
9269            --  within the package spec. We allow the package name itself
9270            --  to be mentioned since that makes sense, although it is not
9271            --  strictly allowed by 11.5(7).
9272
9273            if In_Package_Spec
9274              and then E /= Current_Scope
9275              and then Scope (E) /= Current_Scope
9276            then
9277               Error_Pragma_Arg
9278                 ("entity in pragma% is not in package spec (RM 11.5(7))",
9279                  Arg2);
9280            end if;
9281
9282            --  Loop through homonyms. As noted below, in the case of a package
9283            --  spec, only homonyms within the package spec are considered.
9284
9285            loop
9286               Suppress_Unsuppress_Echeck (E, C);
9287
9288               if Is_Generic_Instance (E)
9289                 and then Is_Subprogram (E)
9290                 and then Present (Alias (E))
9291               then
9292                  Suppress_Unsuppress_Echeck (Alias (E), C);
9293               end if;
9294
9295               --  Move to next homonym if not aspect spec case
9296
9297               exit when From_Aspect_Specification (N);
9298               E := Homonym (E);
9299               exit when No (E);
9300
9301               --  If we are within a package specification, the pragma only
9302               --  applies to homonyms in the same scope.
9303
9304               exit when In_Package_Spec
9305                 and then Scope (E) /= Current_Scope;
9306            end loop;
9307         end if;
9308      end Process_Suppress_Unsuppress;
9309
9310      ------------------
9311      -- Set_Exported --
9312      ------------------
9313
9314      procedure Set_Exported (E : Entity_Id; Arg : Node_Id) is
9315      begin
9316         if Is_Imported (E) then
9317            Error_Pragma_Arg
9318              ("cannot export entity& that was previously imported", Arg);
9319
9320         elsif Present (Address_Clause (E))
9321           and then not Relaxed_RM_Semantics
9322         then
9323            Error_Pragma_Arg
9324              ("cannot export entity& that has an address clause", Arg);
9325         end if;
9326
9327         Set_Is_Exported (E);
9328
9329         --  Generate a reference for entity explicitly, because the
9330         --  identifier may be overloaded and name resolution will not
9331         --  generate one.
9332
9333         Generate_Reference (E, Arg);
9334
9335         --  Deal with exporting non-library level entity
9336
9337         if not Is_Library_Level_Entity (E) then
9338
9339            --  Not allowed at all for subprograms
9340
9341            if Is_Subprogram (E) then
9342               Error_Pragma_Arg ("local subprogram& cannot be exported", Arg);
9343
9344            --  Otherwise set public and statically allocated
9345
9346            else
9347               Set_Is_Public (E);
9348               Set_Is_Statically_Allocated (E);
9349
9350               --  Warn if the corresponding W flag is set and the pragma comes
9351               --  from source. The latter may not be true e.g. on VMS where we
9352               --  expand export pragmas for exception codes associated with
9353               --  imported or exported exceptions. We do not want to generate
9354               --  a warning for something that the user did not write.
9355
9356               if Warn_On_Export_Import
9357                 and then Comes_From_Source (Arg)
9358               then
9359                  Error_Msg_NE
9360                    ("?x?& has been made static as a result of Export",
9361                     Arg, E);
9362                  Error_Msg_N
9363                    ("\?x?this usage is non-standard and non-portable",
9364                     Arg);
9365               end if;
9366            end if;
9367         end if;
9368
9369         if Warn_On_Export_Import and then Is_Type (E) then
9370            Error_Msg_NE ("exporting a type has no effect?x?", Arg, E);
9371         end if;
9372
9373         if Warn_On_Export_Import and Inside_A_Generic then
9374            Error_Msg_NE
9375              ("all instances of& will have the same external name?x?",
9376               Arg, E);
9377         end if;
9378      end Set_Exported;
9379
9380      ----------------------------------------------
9381      -- Set_Extended_Import_Export_External_Name --
9382      ----------------------------------------------
9383
9384      procedure Set_Extended_Import_Export_External_Name
9385        (Internal_Ent : Entity_Id;
9386         Arg_External : Node_Id)
9387      is
9388         Old_Name : constant Node_Id := Interface_Name (Internal_Ent);
9389         New_Name : Node_Id;
9390
9391      begin
9392         if No (Arg_External) then
9393            return;
9394         end if;
9395
9396         Check_Arg_Is_External_Name (Arg_External);
9397
9398         if Nkind (Arg_External) = N_String_Literal then
9399            if String_Length (Strval (Arg_External)) = 0 then
9400               return;
9401            else
9402               New_Name := Adjust_External_Name_Case (Arg_External);
9403            end if;
9404
9405         elsif Nkind (Arg_External) = N_Identifier then
9406            New_Name := Get_Default_External_Name (Arg_External);
9407
9408         --  Check_Arg_Is_External_Name should let through only identifiers and
9409         --  string literals or static string expressions (which are folded to
9410         --  string literals).
9411
9412         else
9413            raise Program_Error;
9414         end if;
9415
9416         --  If we already have an external name set (by a prior normal Import
9417         --  or Export pragma), then the external names must match
9418
9419         if Present (Interface_Name (Internal_Ent)) then
9420
9421            --  Ignore mismatching names in CodePeer mode, to support some
9422            --  old compilers which would export the same procedure under
9423            --  different names, e.g:
9424            --     procedure P;
9425            --     pragma Export_Procedure (P, "a");
9426            --     pragma Export_Procedure (P, "b");
9427
9428            if CodePeer_Mode then
9429               return;
9430            end if;
9431
9432            Check_Matching_Internal_Names : declare
9433               S1 : constant String_Id := Strval (Old_Name);
9434               S2 : constant String_Id := Strval (New_Name);
9435
9436               procedure Mismatch;
9437               pragma No_Return (Mismatch);
9438               --  Called if names do not match
9439
9440               --------------
9441               -- Mismatch --
9442               --------------
9443
9444               procedure Mismatch is
9445               begin
9446                  Error_Msg_Sloc := Sloc (Old_Name);
9447                  Error_Pragma_Arg
9448                    ("external name does not match that given #",
9449                     Arg_External);
9450               end Mismatch;
9451
9452            --  Start of processing for Check_Matching_Internal_Names
9453
9454            begin
9455               if String_Length (S1) /= String_Length (S2) then
9456                  Mismatch;
9457
9458               else
9459                  for J in 1 .. String_Length (S1) loop
9460                     if Get_String_Char (S1, J) /= Get_String_Char (S2, J) then
9461                        Mismatch;
9462                     end if;
9463                  end loop;
9464               end if;
9465            end Check_Matching_Internal_Names;
9466
9467         --  Otherwise set the given name
9468
9469         else
9470            Set_Encoded_Interface_Name (Internal_Ent, New_Name);
9471            Check_Duplicated_Export_Name (New_Name);
9472         end if;
9473      end Set_Extended_Import_Export_External_Name;
9474
9475      ------------------
9476      -- Set_Imported --
9477      ------------------
9478
9479      procedure Set_Imported (E : Entity_Id) is
9480      begin
9481         --  Error message if already imported or exported
9482
9483         if Is_Exported (E) or else Is_Imported (E) then
9484
9485            --  Error if being set Exported twice
9486
9487            if Is_Exported (E) then
9488               Error_Msg_NE ("entity& was previously exported", N, E);
9489
9490            --  Ignore error in CodePeer mode where we treat all imported
9491            --  subprograms as unknown.
9492
9493            elsif CodePeer_Mode then
9494               goto OK;
9495
9496            --  OK if Import/Interface case
9497
9498            elsif Import_Interface_Present (N) then
9499               goto OK;
9500
9501            --  Error if being set Imported twice
9502
9503            else
9504               Error_Msg_NE ("entity& was previously imported", N, E);
9505            end if;
9506
9507            Error_Msg_Name_1 := Pname;
9508            Error_Msg_N
9509              ("\(pragma% applies to all previous entities)", N);
9510
9511            Error_Msg_Sloc  := Sloc (E);
9512            Error_Msg_NE ("\import not allowed for& declared#", N, E);
9513
9514         --  Here if not previously imported or exported, OK to import
9515
9516         else
9517            Set_Is_Imported (E);
9518
9519            --  For subprogram, set Import_Pragma field
9520
9521            if Is_Subprogram (E) then
9522               Set_Import_Pragma (E, N);
9523            end if;
9524
9525            --  If the entity is an object that is not at the library level,
9526            --  then it is statically allocated. We do not worry about objects
9527            --  with address clauses in this context since they are not really
9528            --  imported in the linker sense.
9529
9530            if Is_Object (E)
9531              and then not Is_Library_Level_Entity (E)
9532              and then No (Address_Clause (E))
9533            then
9534               Set_Is_Statically_Allocated (E);
9535            end if;
9536         end if;
9537
9538         <<OK>> null;
9539      end Set_Imported;
9540
9541      -------------------------
9542      -- Set_Mechanism_Value --
9543      -------------------------
9544
9545      --  Note: the mechanism name has not been analyzed (and cannot indeed be
9546      --  analyzed, since it is semantic nonsense), so we get it in the exact
9547      --  form created by the parser.
9548
9549      procedure Set_Mechanism_Value (Ent : Entity_Id; Mech_Name : Node_Id) is
9550         Class        : Node_Id;
9551         Param        : Node_Id;
9552         Mech_Name_Id : Name_Id;
9553
9554         procedure Bad_Class;
9555         pragma No_Return (Bad_Class);
9556         --  Signal bad descriptor class name
9557
9558         procedure Bad_Mechanism;
9559         pragma No_Return (Bad_Mechanism);
9560         --  Signal bad mechanism name
9561
9562         ---------------
9563         -- Bad_Class --
9564         ---------------
9565
9566         procedure Bad_Class is
9567         begin
9568            Error_Pragma_Arg ("unrecognized descriptor class name", Class);
9569         end Bad_Class;
9570
9571         -------------------------
9572         -- Bad_Mechanism_Value --
9573         -------------------------
9574
9575         procedure Bad_Mechanism is
9576         begin
9577            Error_Pragma_Arg ("unrecognized mechanism name", Mech_Name);
9578         end Bad_Mechanism;
9579
9580      --  Start of processing for Set_Mechanism_Value
9581
9582      begin
9583         if Mechanism (Ent) /= Default_Mechanism then
9584            Error_Msg_NE
9585              ("mechanism for & has already been set", Mech_Name, Ent);
9586         end if;
9587
9588         --  MECHANISM_NAME ::= value | reference | descriptor |
9589         --                     short_descriptor
9590
9591         if Nkind (Mech_Name) = N_Identifier then
9592            if Chars (Mech_Name) = Name_Value then
9593               Set_Mechanism (Ent, By_Copy);
9594               return;
9595
9596            elsif Chars (Mech_Name) = Name_Reference then
9597               Set_Mechanism (Ent, By_Reference);
9598               return;
9599
9600            elsif Chars (Mech_Name) = Name_Descriptor then
9601               Check_VMS (Mech_Name);
9602
9603               --  Descriptor => Short_Descriptor if pragma was given
9604
9605               if Short_Descriptors then
9606                  Set_Mechanism (Ent, By_Short_Descriptor);
9607               else
9608                  Set_Mechanism (Ent, By_Descriptor);
9609               end if;
9610
9611               return;
9612
9613            elsif Chars (Mech_Name) = Name_Short_Descriptor then
9614               Check_VMS (Mech_Name);
9615               Set_Mechanism (Ent, By_Short_Descriptor);
9616               return;
9617
9618            elsif Chars (Mech_Name) = Name_Copy then
9619               Error_Pragma_Arg
9620                 ("bad mechanism name, Value assumed", Mech_Name);
9621
9622            else
9623               Bad_Mechanism;
9624            end if;
9625
9626         --  MECHANISM_NAME ::= descriptor (CLASS_NAME) |
9627         --                     short_descriptor (CLASS_NAME)
9628         --  CLASS_NAME     ::= ubs | ubsb | uba | s | sb | a | nca
9629
9630         --  Note: this form is parsed as an indexed component
9631
9632         elsif Nkind (Mech_Name) = N_Indexed_Component then
9633            Class := First (Expressions (Mech_Name));
9634
9635            if Nkind (Prefix (Mech_Name)) /= N_Identifier
9636              or else
9637                not Nam_In (Chars (Prefix (Mech_Name)), Name_Descriptor,
9638                                                        Name_Short_Descriptor)
9639              or else Present (Next (Class))
9640            then
9641               Bad_Mechanism;
9642            else
9643               Mech_Name_Id := Chars (Prefix (Mech_Name));
9644
9645               --  Change Descriptor => Short_Descriptor if pragma was given
9646
9647               if Mech_Name_Id = Name_Descriptor
9648                 and then Short_Descriptors
9649               then
9650                  Mech_Name_Id := Name_Short_Descriptor;
9651               end if;
9652            end if;
9653
9654         --  MECHANISM_NAME ::= descriptor (Class => CLASS_NAME) |
9655         --                     short_descriptor (Class => CLASS_NAME)
9656         --  CLASS_NAME     ::= ubs | ubsb | uba | s | sb | a | nca
9657
9658         --  Note: this form is parsed as a function call
9659
9660         elsif Nkind (Mech_Name) = N_Function_Call then
9661            Param := First (Parameter_Associations (Mech_Name));
9662
9663            if Nkind (Name (Mech_Name)) /= N_Identifier
9664              or else
9665                not Nam_In (Chars (Name (Mech_Name)), Name_Descriptor,
9666                                                      Name_Short_Descriptor)
9667              or else Present (Next (Param))
9668              or else No (Selector_Name (Param))
9669              or else Chars (Selector_Name (Param)) /= Name_Class
9670            then
9671               Bad_Mechanism;
9672            else
9673               Class := Explicit_Actual_Parameter (Param);
9674               Mech_Name_Id := Chars (Name (Mech_Name));
9675            end if;
9676
9677         else
9678            Bad_Mechanism;
9679         end if;
9680
9681         --  Fall through here with Class set to descriptor class name
9682
9683         Check_VMS (Mech_Name);
9684
9685         if Nkind (Class) /= N_Identifier then
9686            Bad_Class;
9687
9688         elsif Mech_Name_Id = Name_Descriptor
9689           and then Chars (Class) = Name_UBS
9690         then
9691            Set_Mechanism (Ent, By_Descriptor_UBS);
9692
9693         elsif Mech_Name_Id = Name_Descriptor
9694           and then Chars (Class) = Name_UBSB
9695         then
9696            Set_Mechanism (Ent, By_Descriptor_UBSB);
9697
9698         elsif Mech_Name_Id = Name_Descriptor
9699           and then Chars (Class) = Name_UBA
9700         then
9701            Set_Mechanism (Ent, By_Descriptor_UBA);
9702
9703         elsif Mech_Name_Id = Name_Descriptor
9704           and then Chars (Class) = Name_S
9705         then
9706            Set_Mechanism (Ent, By_Descriptor_S);
9707
9708         elsif Mech_Name_Id = Name_Descriptor
9709           and then Chars (Class) = Name_SB
9710         then
9711            Set_Mechanism (Ent, By_Descriptor_SB);
9712
9713         elsif Mech_Name_Id = Name_Descriptor
9714           and then Chars (Class) = Name_A
9715         then
9716            Set_Mechanism (Ent, By_Descriptor_A);
9717
9718         elsif Mech_Name_Id = Name_Descriptor
9719           and then Chars (Class) = Name_NCA
9720         then
9721            Set_Mechanism (Ent, By_Descriptor_NCA);
9722
9723         elsif Mech_Name_Id = Name_Short_Descriptor
9724           and then Chars (Class) = Name_UBS
9725         then
9726            Set_Mechanism (Ent, By_Short_Descriptor_UBS);
9727
9728         elsif Mech_Name_Id = Name_Short_Descriptor
9729           and then Chars (Class) = Name_UBSB
9730         then
9731            Set_Mechanism (Ent, By_Short_Descriptor_UBSB);
9732
9733         elsif Mech_Name_Id = Name_Short_Descriptor
9734           and then Chars (Class) = Name_UBA
9735         then
9736            Set_Mechanism (Ent, By_Short_Descriptor_UBA);
9737
9738         elsif Mech_Name_Id = Name_Short_Descriptor
9739           and then Chars (Class) = Name_S
9740         then
9741            Set_Mechanism (Ent, By_Short_Descriptor_S);
9742
9743         elsif Mech_Name_Id = Name_Short_Descriptor
9744           and then Chars (Class) = Name_SB
9745         then
9746            Set_Mechanism (Ent, By_Short_Descriptor_SB);
9747
9748         elsif Mech_Name_Id = Name_Short_Descriptor
9749           and then Chars (Class) = Name_A
9750         then
9751            Set_Mechanism (Ent, By_Short_Descriptor_A);
9752
9753         elsif Mech_Name_Id = Name_Short_Descriptor
9754           and then Chars (Class) = Name_NCA
9755         then
9756            Set_Mechanism (Ent, By_Short_Descriptor_NCA);
9757
9758         else
9759            Bad_Class;
9760         end if;
9761      end Set_Mechanism_Value;
9762
9763      --------------------------
9764      -- Set_Rational_Profile --
9765      --------------------------
9766
9767      --  The Rational profile includes Implicit_Packing, Use_Vads_Size, and
9768      --  and extension to the semantics of renaming declarations.
9769
9770      procedure Set_Rational_Profile is
9771      begin
9772         Implicit_Packing     := True;
9773         Overriding_Renamings := True;
9774         Use_VADS_Size        := True;
9775      end Set_Rational_Profile;
9776
9777      ---------------------------
9778      -- Set_Ravenscar_Profile --
9779      ---------------------------
9780
9781      --  The tasks to be done here are
9782
9783      --    Set required policies
9784
9785      --      pragma Task_Dispatching_Policy (FIFO_Within_Priorities)
9786      --      pragma Locking_Policy (Ceiling_Locking)
9787
9788      --    Set Detect_Blocking mode
9789
9790      --    Set required restrictions (see System.Rident for detailed list)
9791
9792      --    Set the No_Dependence rules
9793      --      No_Dependence => Ada.Asynchronous_Task_Control
9794      --      No_Dependence => Ada.Calendar
9795      --      No_Dependence => Ada.Execution_Time.Group_Budget
9796      --      No_Dependence => Ada.Execution_Time.Timers
9797      --      No_Dependence => Ada.Task_Attributes
9798      --      No_Dependence => System.Multiprocessors.Dispatching_Domains
9799
9800      procedure Set_Ravenscar_Profile (N : Node_Id) is
9801         Prefix_Entity   : Entity_Id;
9802         Selector_Entity : Entity_Id;
9803         Prefix_Node     : Node_Id;
9804         Node            : Node_Id;
9805
9806      begin
9807         --  pragma Task_Dispatching_Policy (FIFO_Within_Priorities)
9808
9809         if Task_Dispatching_Policy /= ' '
9810           and then Task_Dispatching_Policy /= 'F'
9811         then
9812            Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
9813            Error_Pragma ("Profile (Ravenscar) incompatible with policy#");
9814
9815         --  Set the FIFO_Within_Priorities policy, but always preserve
9816         --  System_Location since we like the error message with the run time
9817         --  name.
9818
9819         else
9820            Task_Dispatching_Policy := 'F';
9821
9822            if Task_Dispatching_Policy_Sloc /= System_Location then
9823               Task_Dispatching_Policy_Sloc := Loc;
9824            end if;
9825         end if;
9826
9827         --  pragma Locking_Policy (Ceiling_Locking)
9828
9829         if Locking_Policy /= ' '
9830           and then Locking_Policy /= 'C'
9831         then
9832            Error_Msg_Sloc := Locking_Policy_Sloc;
9833            Error_Pragma ("Profile (Ravenscar) incompatible with policy#");
9834
9835         --  Set the Ceiling_Locking policy, but preserve System_Location since
9836         --  we like the error message with the run time name.
9837
9838         else
9839            Locking_Policy := 'C';
9840
9841            if Locking_Policy_Sloc /= System_Location then
9842               Locking_Policy_Sloc := Loc;
9843            end if;
9844         end if;
9845
9846         --  pragma Detect_Blocking
9847
9848         Detect_Blocking := True;
9849
9850         --  Set the corresponding restrictions
9851
9852         Set_Profile_Restrictions
9853           (Ravenscar, N, Warn => Treat_Restrictions_As_Warnings);
9854
9855         --  Set the No_Dependence restrictions
9856
9857         --  The following No_Dependence restrictions:
9858         --    No_Dependence => Ada.Asynchronous_Task_Control
9859         --    No_Dependence => Ada.Calendar
9860         --    No_Dependence => Ada.Task_Attributes
9861         --  are already set by previous call to Set_Profile_Restrictions.
9862
9863         --  Set the following restrictions which were added to Ada 2005:
9864         --    No_Dependence => Ada.Execution_Time.Group_Budget
9865         --    No_Dependence => Ada.Execution_Time.Timers
9866
9867         if Ada_Version >= Ada_2005 then
9868            Name_Buffer (1 .. 3) := "ada";
9869            Name_Len := 3;
9870
9871            Prefix_Entity := Make_Identifier (Loc, Name_Find);
9872
9873            Name_Buffer (1 .. 14) := "execution_time";
9874            Name_Len := 14;
9875
9876            Selector_Entity := Make_Identifier (Loc, Name_Find);
9877
9878            Prefix_Node :=
9879              Make_Selected_Component
9880                (Sloc          => Loc,
9881                 Prefix        => Prefix_Entity,
9882                 Selector_Name => Selector_Entity);
9883
9884            Name_Buffer (1 .. 13) := "group_budgets";
9885            Name_Len := 13;
9886
9887            Selector_Entity := Make_Identifier (Loc, Name_Find);
9888
9889            Node :=
9890              Make_Selected_Component
9891                (Sloc          => Loc,
9892                 Prefix        => Prefix_Node,
9893                 Selector_Name => Selector_Entity);
9894
9895            Set_Restriction_No_Dependence
9896              (Unit    => Node,
9897               Warn    => Treat_Restrictions_As_Warnings,
9898               Profile => Ravenscar);
9899
9900            Name_Buffer (1 .. 6) := "timers";
9901            Name_Len := 6;
9902
9903            Selector_Entity := Make_Identifier (Loc, Name_Find);
9904
9905            Node :=
9906              Make_Selected_Component
9907                (Sloc          => Loc,
9908                 Prefix        => Prefix_Node,
9909                 Selector_Name => Selector_Entity);
9910
9911            Set_Restriction_No_Dependence
9912              (Unit    => Node,
9913               Warn    => Treat_Restrictions_As_Warnings,
9914               Profile => Ravenscar);
9915         end if;
9916
9917         --  Set the following restrictions which was added to Ada 2012 (see
9918         --  AI-0171):
9919         --    No_Dependence => System.Multiprocessors.Dispatching_Domains
9920
9921         if Ada_Version >= Ada_2012 then
9922            Name_Buffer (1 .. 6) := "system";
9923            Name_Len := 6;
9924
9925            Prefix_Entity := Make_Identifier (Loc, Name_Find);
9926
9927            Name_Buffer (1 .. 15) := "multiprocessors";
9928            Name_Len := 15;
9929
9930            Selector_Entity := Make_Identifier (Loc, Name_Find);
9931
9932            Prefix_Node :=
9933              Make_Selected_Component
9934                (Sloc          => Loc,
9935                 Prefix        => Prefix_Entity,
9936                 Selector_Name => Selector_Entity);
9937
9938            Name_Buffer (1 .. 19) := "dispatching_domains";
9939            Name_Len := 19;
9940
9941            Selector_Entity := Make_Identifier (Loc, Name_Find);
9942
9943            Node :=
9944              Make_Selected_Component
9945                (Sloc          => Loc,
9946                 Prefix        => Prefix_Node,
9947                 Selector_Name => Selector_Entity);
9948
9949            Set_Restriction_No_Dependence
9950              (Unit    => Node,
9951               Warn    => Treat_Restrictions_As_Warnings,
9952               Profile => Ravenscar);
9953         end if;
9954      end Set_Ravenscar_Profile;
9955
9956   --  Start of processing for Analyze_Pragma
9957
9958   begin
9959      --  The following code is a defense against recursion. Not clear that
9960      --  this can happen legitimately, but perhaps some error situations
9961      --  can cause it, and we did see this recursion during testing.
9962
9963      if Analyzed (N) then
9964         return;
9965      else
9966         Set_Analyzed (N, True);
9967      end if;
9968
9969      --  Deal with unrecognized pragma
9970
9971      Pname := Pragma_Name (N);
9972
9973      if not Is_Pragma_Name (Pname) then
9974         if Warn_On_Unrecognized_Pragma then
9975            Error_Msg_Name_1 := Pname;
9976            Error_Msg_N ("?g?unrecognized pragma%!", Pragma_Identifier (N));
9977
9978            for PN in First_Pragma_Name .. Last_Pragma_Name loop
9979               if Is_Bad_Spelling_Of (Pname, PN) then
9980                  Error_Msg_Name_1 := PN;
9981                  Error_Msg_N -- CODEFIX
9982                    ("\?g?possible misspelling of %!", Pragma_Identifier (N));
9983                  exit;
9984               end if;
9985            end loop;
9986         end if;
9987
9988         return;
9989      end if;
9990
9991      --  Here to start processing for recognized pragma
9992
9993      Prag_Id := Get_Pragma_Id (Pname);
9994      Pname := Original_Aspect_Name (N);
9995
9996      --  Check applicable policy. We skip this if Is_Checked or Is_Ignored
9997      --  is already set, indicating that we have already checked the policy
9998      --  at the right point. This happens for example in the case of a pragma
9999      --  that is derived from an Aspect.
10000
10001      if Is_Ignored (N) or else Is_Checked (N) then
10002         null;
10003
10004      --  For a pragma that is a rewriting of another pragma, copy the
10005      --  Is_Checked/Is_Ignored status from the rewritten pragma.
10006
10007      elsif Is_Rewrite_Substitution (N)
10008        and then Nkind (Original_Node (N)) = N_Pragma
10009        and then Original_Node (N) /= N
10010      then
10011         Set_Is_Ignored (N, Is_Ignored (Original_Node (N)));
10012         Set_Is_Checked (N, Is_Checked (Original_Node (N)));
10013
10014      --  Otherwise query the applicable policy at this point
10015
10016      else
10017         Check_Applicable_Policy (N);
10018
10019         --  If pragma is disabled, rewrite as NULL and skip analysis
10020
10021         if Is_Disabled (N) then
10022            Rewrite (N, Make_Null_Statement (Loc));
10023            Analyze (N);
10024            raise Pragma_Exit;
10025         end if;
10026      end if;
10027
10028      --  Preset arguments
10029
10030      Arg_Count := 0;
10031      Arg1      := Empty;
10032      Arg2      := Empty;
10033      Arg3      := Empty;
10034      Arg4      := Empty;
10035
10036      if Present (Pragma_Argument_Associations (N)) then
10037         Arg_Count := List_Length (Pragma_Argument_Associations (N));
10038         Arg1 := First (Pragma_Argument_Associations (N));
10039
10040         if Present (Arg1) then
10041            Arg2 := Next (Arg1);
10042
10043            if Present (Arg2) then
10044               Arg3 := Next (Arg2);
10045
10046               if Present (Arg3) then
10047                  Arg4 := Next (Arg3);
10048               end if;
10049            end if;
10050         end if;
10051      end if;
10052
10053      Check_Restriction_No_Use_Of_Pragma (N);
10054
10055      --  An enumeration type defines the pragmas that are supported by the
10056      --  implementation. Get_Pragma_Id (in package Prag) transforms a name
10057      --  into the corresponding enumeration value for the following case.
10058
10059      case Prag_Id is
10060
10061         -----------------
10062         -- Abort_Defer --
10063         -----------------
10064
10065         --  pragma Abort_Defer;
10066
10067         when Pragma_Abort_Defer =>
10068            GNAT_Pragma;
10069            Check_Arg_Count (0);
10070
10071            --  The only required semantic processing is to check the
10072            --  placement. This pragma must appear at the start of the
10073            --  statement sequence of a handled sequence of statements.
10074
10075            if Nkind (Parent (N)) /= N_Handled_Sequence_Of_Statements
10076              or else N /= First (Statements (Parent (N)))
10077            then
10078               Pragma_Misplaced;
10079            end if;
10080
10081         --------------------
10082         -- Abstract_State --
10083         --------------------
10084
10085         --  pragma Abstract_State (ABSTRACT_STATE_LIST);
10086
10087         --  ABSTRACT_STATE_LIST ::=
10088         --     null
10089         --  |  STATE_NAME_WITH_OPTIONS
10090         --  | (STATE_NAME_WITH_OPTIONS {, STATE_NAME_WITH_OPTIONS} )
10091
10092         --  STATE_NAME_WITH_OPTIONS ::=
10093         --     STATE_NAME
10094         --  | (STATE_NAME with OPTION_LIST)
10095
10096         --  OPTION_LIST ::= OPTION {, OPTION}
10097
10098         --  OPTION ::=
10099         --    SIMPLE_OPTION
10100         --  | NAME_VALUE_OPTION
10101
10102         --  SIMPLE_OPTION ::= identifier
10103
10104         --  NAME_VALUE_OPTION ::=
10105         --    Part_Of => ABSTRACT_STATE
10106         --  | External [=> EXTERNAL_PROPERTY_LIST]
10107
10108         --  EXTERNAL_PROPERTY_LIST ::=
10109         --     EXTERNAL_PROPERTY
10110         --  | (EXTERNAL_PROPERTY {, EXTERNAL_PROPERTY} )
10111
10112         --  EXTERNAL_PROPERTY ::=
10113         --    Async_Readers    [=> boolean_EXPRESSION]
10114         --  | Async_Writers    [=> boolean_EXPRESSION]
10115         --  | Effective_Reads  [=> boolean_EXPRESSION]
10116         --  | Effective_Writes [=> boolean_EXPRESSION]
10117         --    others            => boolean_EXPRESSION
10118
10119         --  STATE_NAME ::= defining_identifier
10120
10121         --  ABSTRACT_STATE ::= name
10122
10123         when Pragma_Abstract_State => Abstract_State : declare
10124
10125            --  Flags used to verify the consistency of states
10126
10127            Non_Null_Seen : Boolean := False;
10128            Null_Seen     : Boolean := False;
10129
10130            Pack_Id : Entity_Id;
10131            --  Entity of related package when pragma Abstract_State appears
10132
10133            procedure Analyze_Abstract_State (State : Node_Id);
10134            --  Verify the legality of a single state declaration. Create and
10135            --  decorate a state abstraction entity and introduce it into the
10136            --  visibility chain.
10137
10138            procedure Check_State_Declaration_Syntax (State : Node_Id);
10139            --  Verify the syntex of state declaration State
10140
10141            ----------------------------
10142            -- Analyze_Abstract_State --
10143            ----------------------------
10144
10145            procedure Analyze_Abstract_State (State : Node_Id) is
10146
10147               --  Flags used to verify the consistency of options
10148
10149               AR_Seen       : Boolean := False;
10150               AW_Seen       : Boolean := False;
10151               ER_Seen       : Boolean := False;
10152               EW_Seen       : Boolean := False;
10153               External_Seen : Boolean := False;
10154               Others_Seen   : Boolean := False;
10155               Part_Of_Seen  : Boolean := False;
10156
10157               --  Flags used to store the static value of all external states'
10158               --  expressions.
10159
10160               AR_Val : Boolean := False;
10161               AW_Val : Boolean := False;
10162               ER_Val : Boolean := False;
10163               EW_Val : Boolean := False;
10164
10165               State_Id : Entity_Id := Empty;
10166               --  The entity to be generated for the current state declaration
10167
10168               procedure Analyze_External_Option (Opt : Node_Id);
10169               --  Verify the legality of option External
10170
10171               procedure Analyze_External_Property
10172                 (Prop : Node_Id;
10173                  Expr : Node_Id := Empty);
10174               --  Verify the legailty of a single external property. Prop
10175               --  denotes the external property. Expr is the expression used
10176               --  to set the property.
10177
10178               procedure Analyze_Part_Of_Option (Opt : Node_Id);
10179               --  Verify the legality of option Part_Of
10180
10181               procedure Check_Duplicate_Option
10182                 (Opt    : Node_Id;
10183                  Status : in out Boolean);
10184               --  Flag Status denotes whether a particular option has been
10185               --  seen while processing a state. This routine verifies that
10186               --  Opt is not a duplicate option and sets the flag Status
10187               --  (SPARK RM 7.1.4(1)).
10188
10189               procedure Check_Duplicate_Property
10190                 (Prop   : Node_Id;
10191                  Status : in out Boolean);
10192               --  Flag Status denotes whether a particular property has been
10193               --  seen while processing option External. This routine verifies
10194               --  that Prop is not a duplicate property and sets flag Status.
10195               --  Opt is not a duplicate property and sets the flag Status.
10196               --  (SPARK RM 7.1.4(2))
10197
10198               procedure Create_Abstract_State
10199                 (Nam     : Name_Id;
10200                  Decl    : Node_Id;
10201                  Loc     : Source_Ptr;
10202                  Is_Null : Boolean);
10203               --  Generate an abstract state entity with name Nam and enter it
10204               --  into visibility. Decl is the "declaration" of the state as
10205               --  it appears in pragma Abstract_State. Loc is the location of
10206               --  the related state "declaration". Flag Is_Null should be set
10207               --  when the associated Abstract_State pragma defines a null
10208               --  state.
10209
10210               -----------------------------
10211               -- Analyze_External_Option --
10212               -----------------------------
10213
10214               procedure Analyze_External_Option (Opt : Node_Id) is
10215                  Errors : constant Nat := Serious_Errors_Detected;
10216                  Prop   : Node_Id;
10217                  Props  : Node_Id := Empty;
10218
10219               begin
10220                  Check_Duplicate_Option (Opt, External_Seen);
10221
10222                  if Nkind (Opt) = N_Component_Association then
10223                     Props := Expression (Opt);
10224                  end if;
10225
10226                  --  External state with properties
10227
10228                  if Present (Props) then
10229
10230                     --  Multiple properties appear as an aggregate
10231
10232                     if Nkind (Props) = N_Aggregate then
10233
10234                        --  Simple property form
10235
10236                        Prop := First (Expressions (Props));
10237                        while Present (Prop) loop
10238                           Analyze_External_Property (Prop);
10239                           Next (Prop);
10240                        end loop;
10241
10242                        --  Property with expression form
10243
10244                        Prop := First (Component_Associations (Props));
10245                        while Present (Prop) loop
10246                           Analyze_External_Property
10247                             (Prop => First (Choices (Prop)),
10248                              Expr => Expression (Prop));
10249
10250                           Next (Prop);
10251                        end loop;
10252
10253                     --  Single property
10254
10255                     else
10256                        Analyze_External_Property (Props);
10257                     end if;
10258
10259                  --  An external state defined without any properties defaults
10260                  --  all properties to True.
10261
10262                  else
10263                     AR_Val := True;
10264                     AW_Val := True;
10265                     ER_Val := True;
10266                     EW_Val := True;
10267                  end if;
10268
10269                  --  Once all external properties have been processed, verify
10270                  --  their mutual interaction. Do not perform the check when
10271                  --  at least one of the properties is illegal as this will
10272                  --  produce a bogus error.
10273
10274                  if Errors = Serious_Errors_Detected then
10275                     Check_External_Properties
10276                       (State, AR_Val, AW_Val, ER_Val, EW_Val);
10277                  end if;
10278               end Analyze_External_Option;
10279
10280               -------------------------------
10281               -- Analyze_External_Property --
10282               -------------------------------
10283
10284               procedure Analyze_External_Property
10285                 (Prop : Node_Id;
10286                  Expr : Node_Id := Empty)
10287               is
10288                  Expr_Val : Boolean;
10289
10290               begin
10291                  --  Check the placement of "others" (if available)
10292
10293                  if Nkind (Prop) = N_Others_Choice then
10294                     if Others_Seen then
10295                        Error_Msg_N
10296                          ("only one others choice allowed in option External",
10297                           Prop);
10298                     else
10299                        Others_Seen := True;
10300                     end if;
10301
10302                  elsif Others_Seen then
10303                     Error_Msg_N
10304                       ("others must be the last property in option External",
10305                        Prop);
10306
10307                  --  The only remaining legal options are the four predefined
10308                  --  external properties.
10309
10310                  elsif Nkind (Prop) = N_Identifier
10311                    and then Nam_In (Chars (Prop), Name_Async_Readers,
10312                                                   Name_Async_Writers,
10313                                                   Name_Effective_Reads,
10314                                                   Name_Effective_Writes)
10315                  then
10316                     null;
10317
10318                  --  Otherwise the construct is not a valid property
10319
10320                  else
10321                     Error_Msg_N ("invalid external state property", Prop);
10322                     return;
10323                  end if;
10324
10325                  --  Ensure that the expression of the external state property
10326                  --  is static Boolean (if applicable) (SPARK RM 7.1.2(5)).
10327
10328                  if Present (Expr) then
10329                     Analyze_And_Resolve (Expr, Standard_Boolean);
10330
10331                     if Is_Static_Expression (Expr) then
10332                        Expr_Val := Is_True (Expr_Value (Expr));
10333                     else
10334                        Error_Msg_N
10335                          ("expression of external state property must be "
10336                           & "static", Expr);
10337                     end if;
10338
10339                  --  The lack of expression defaults the property to True
10340
10341                  else
10342                     Expr_Val := True;
10343                  end if;
10344
10345                  --  Named properties
10346
10347                  if Nkind (Prop) = N_Identifier then
10348                     if Chars (Prop) = Name_Async_Readers then
10349                        Check_Duplicate_Property (Prop, AR_Seen);
10350                        AR_Val := Expr_Val;
10351
10352                     elsif Chars (Prop) = Name_Async_Writers then
10353                        Check_Duplicate_Property (Prop, AW_Seen);
10354                        AW_Val := Expr_Val;
10355
10356                     elsif Chars (Prop) = Name_Effective_Reads then
10357                        Check_Duplicate_Property (Prop, ER_Seen);
10358                        ER_Val := Expr_Val;
10359
10360                     else
10361                        Check_Duplicate_Property (Prop, EW_Seen);
10362                        EW_Val := Expr_Val;
10363                     end if;
10364
10365                  --  The handling of property "others" must take into account
10366                  --  all other named properties that have been encountered so
10367                  --  far. Only those that have not been seen are affected by
10368                  --  "others".
10369
10370                  else
10371                     if not AR_Seen then
10372                        AR_Val := Expr_Val;
10373                     end if;
10374
10375                     if not AW_Seen then
10376                        AW_Val := Expr_Val;
10377                     end if;
10378
10379                     if not ER_Seen then
10380                        ER_Val := Expr_Val;
10381                     end if;
10382
10383                     if not EW_Seen then
10384                        EW_Val := Expr_Val;
10385                     end if;
10386                  end if;
10387               end Analyze_External_Property;
10388
10389               ----------------------------
10390               -- Analyze_Part_Of_Option --
10391               ----------------------------
10392
10393               procedure Analyze_Part_Of_Option (Opt : Node_Id) is
10394                  Encaps    : constant Node_Id := Expression (Opt);
10395                  Encaps_Id : Entity_Id;
10396                  Legal     : Boolean;
10397
10398               begin
10399                  Check_Duplicate_Option (Opt, Part_Of_Seen);
10400
10401                  Analyze_Part_Of
10402                    (Item_Id => State_Id,
10403                     State   => Encaps,
10404                     Indic   => First (Choices (Opt)),
10405                     Legal   => Legal);
10406
10407                  --  The Part_Of indicator turns an abstract state into a
10408                  --  constituent of the encapsulating state.
10409
10410                  if Legal then
10411                     Encaps_Id := Entity (Encaps);
10412
10413                     Append_Elmt (State_Id, Part_Of_Constituents (Encaps_Id));
10414                     Set_Encapsulating_State (State_Id, Encaps_Id);
10415                  end if;
10416               end Analyze_Part_Of_Option;
10417
10418               ----------------------------
10419               -- Check_Duplicate_Option --
10420               ----------------------------
10421
10422               procedure Check_Duplicate_Option
10423                 (Opt    : Node_Id;
10424                  Status : in out Boolean)
10425               is
10426               begin
10427                  if Status then
10428                     Error_Msg_N ("duplicate state option", Opt);
10429                  end if;
10430
10431                  Status := True;
10432               end Check_Duplicate_Option;
10433
10434               ------------------------------
10435               -- Check_Duplicate_Property --
10436               ------------------------------
10437
10438               procedure Check_Duplicate_Property
10439                 (Prop   : Node_Id;
10440                  Status : in out Boolean)
10441               is
10442               begin
10443                  if Status then
10444                     Error_Msg_N ("duplicate external property", Prop);
10445                  end if;
10446
10447                  Status := True;
10448               end Check_Duplicate_Property;
10449
10450               ---------------------------
10451               -- Create_Abstract_State --
10452               ---------------------------
10453
10454               procedure Create_Abstract_State
10455                 (Nam     : Name_Id;
10456                  Decl    : Node_Id;
10457                  Loc     : Source_Ptr;
10458                  Is_Null : Boolean)
10459               is
10460               begin
10461                  --  The generated state abstraction reuses the same chars
10462                  --  from the original state declaration. Decorate the entity.
10463
10464                  State_Id := Make_Defining_Identifier (Loc, Nam);
10465
10466                  --  Null states never come from source
10467
10468                  Set_Comes_From_Source       (State_Id, not Is_Null);
10469                  Set_Parent                  (State_Id, State);
10470                  Set_Ekind                   (State_Id, E_Abstract_State);
10471                  Set_Etype                   (State_Id, Standard_Void_Type);
10472                  Set_Encapsulating_State     (State_Id, Empty);
10473                  Set_Refinement_Constituents (State_Id, New_Elmt_List);
10474                  Set_Part_Of_Constituents    (State_Id, New_Elmt_List);
10475
10476                  --  Establish a link between the state declaration and the
10477                  --  abstract state entity. Note that a null state remains as
10478                  --  N_Null and does not carry any linkages.
10479
10480                  if not Is_Null then
10481                     if Present (Decl) then
10482                        Set_Entity (Decl, State_Id);
10483                        Set_Etype  (Decl, Standard_Void_Type);
10484                     end if;
10485
10486                     --  Every non-null state must be defined, nameable and
10487                     --  resolvable.
10488
10489                     Push_Scope (Pack_Id);
10490                     Generate_Definition (State_Id);
10491                     Enter_Name (State_Id);
10492                     Pop_Scope;
10493                  end if;
10494               end Create_Abstract_State;
10495
10496               --  Local variables
10497
10498               Opt     : Node_Id;
10499               Opt_Nam : Node_Id;
10500
10501            --  Start of processing for Analyze_Abstract_State
10502
10503            begin
10504               --  A package with a null abstract state is not allowed to
10505               --  declare additional states.
10506
10507               if Null_Seen then
10508                  Error_Msg_NE
10509                    ("package & has null abstract state", State, Pack_Id);
10510
10511               --  Null states appear as internally generated entities
10512
10513               elsif Nkind (State) = N_Null then
10514                  Create_Abstract_State
10515                    (Nam     => New_Internal_Name ('S'),
10516                     Decl    => Empty,
10517                     Loc     => Sloc (State),
10518                     Is_Null => True);
10519                  Null_Seen := True;
10520
10521                  --  Catch a case where a null state appears in a list of
10522                  --  non-null states.
10523
10524                  if Non_Null_Seen then
10525                     Error_Msg_NE
10526                       ("package & has non-null abstract state",
10527                        State, Pack_Id);
10528                  end if;
10529
10530               --  Simple state declaration
10531
10532               elsif Nkind (State) = N_Identifier then
10533                  Create_Abstract_State
10534                    (Nam     => Chars (State),
10535                     Decl    => State,
10536                     Loc     => Sloc (State),
10537                     Is_Null => False);
10538                  Non_Null_Seen := True;
10539
10540               --  State declaration with various options. This construct
10541               --  appears as an extension aggregate in the tree.
10542
10543               elsif Nkind (State) = N_Extension_Aggregate then
10544                  if Nkind (Ancestor_Part (State)) = N_Identifier then
10545                     Create_Abstract_State
10546                       (Nam     => Chars (Ancestor_Part (State)),
10547                        Decl    => Ancestor_Part (State),
10548                        Loc     => Sloc (Ancestor_Part (State)),
10549                        Is_Null => False);
10550                     Non_Null_Seen := True;
10551                  else
10552                     Error_Msg_N
10553                       ("state name must be an identifier",
10554                        Ancestor_Part (State));
10555                  end if;
10556
10557                  --  Catch an attempt to introduce a simple option which is
10558                  --  currently not allowed. An exception to this is External
10559                  --  defined without any properties.
10560
10561                  Opt := First (Expressions (State));
10562                  while Present (Opt) loop
10563                     if Nkind (Opt) = N_Identifier
10564                       and then Chars (Opt) = Name_External
10565                     then
10566                        Analyze_External_Option (Opt);
10567
10568                     --  When an erroneous option Part_Of is without a parent
10569                     --  state, it appears in the list of expression of the
10570                     --  aggregate rather than the component associations
10571                     --  (SPARK RM 7.1.4(9)).
10572
10573                     elsif Chars (Opt) = Name_Part_Of then
10574                        Error_Msg_N
10575                          ("indicator Part_Of must denote an abstract state",
10576                           Opt);
10577
10578                     else
10579                        Error_Msg_N
10580                          ("simple option not allowed in state declaration",
10581                           Opt);
10582                     end if;
10583
10584                     Next (Opt);
10585                  end loop;
10586
10587                  --  Options External and Part_Of appear as component
10588                  --  associations.
10589
10590                  Opt := First (Component_Associations (State));
10591                  while Present (Opt) loop
10592                     Opt_Nam := First (Choices (Opt));
10593
10594                     if Nkind (Opt_Nam) = N_Identifier then
10595                        if Chars (Opt_Nam) = Name_External then
10596                           Analyze_External_Option (Opt);
10597
10598                        elsif Chars (Opt_Nam) = Name_Part_Of then
10599                           Analyze_Part_Of_Option (Opt);
10600
10601                        else
10602                           Error_Msg_N ("invalid state option", Opt);
10603                        end if;
10604                     else
10605                        Error_Msg_N ("invalid state option", Opt);
10606                     end if;
10607
10608                     Next (Opt);
10609                  end loop;
10610
10611               --  Any other attempt to declare a state is erroneous
10612
10613               else
10614                  Error_Msg_N ("malformed abstract state declaration", State);
10615               end if;
10616
10617               --  Guard against a junk state. In such cases no entity is
10618               --  generated and the subsequent checks cannot be applied.
10619
10620               if Present (State_Id) then
10621
10622                  --  Verify whether the state does not introduce an illegal
10623                  --  hidden state within a package subject to a null abstract
10624                  --  state.
10625
10626                  Check_No_Hidden_State (State_Id);
10627
10628                  --  Check whether the lack of option Part_Of agrees with the
10629                  --  placement of the abstract state with respect to the state
10630                  --  space.
10631
10632                  if not Part_Of_Seen then
10633                     Check_Missing_Part_Of (State_Id);
10634                  end if;
10635
10636                  --  Associate the state with its related package
10637
10638                  if No (Abstract_States (Pack_Id)) then
10639                     Set_Abstract_States (Pack_Id, New_Elmt_List);
10640                  end if;
10641
10642                  Append_Elmt (State_Id, Abstract_States (Pack_Id));
10643               end if;
10644            end Analyze_Abstract_State;
10645
10646            ------------------------------------
10647            -- Check_State_Declaration_Syntax --
10648            ------------------------------------
10649
10650            procedure Check_State_Declaration_Syntax (State : Node_Id) is
10651               Decl : Node_Id;
10652
10653            begin
10654               --  Null abstract state
10655
10656               if Nkind (State) = N_Null then
10657                  null;
10658
10659               --  Single state
10660
10661               elsif Nkind (State) = N_Identifier then
10662                  null;
10663
10664               --  State with various options
10665
10666               elsif Nkind (State) = N_Extension_Aggregate then
10667                  if Nkind (Ancestor_Part (State)) /= N_Identifier then
10668                     Error_Msg_N
10669                       ("state name must be an identifier",
10670                        Ancestor_Part (State));
10671                  end if;
10672
10673               --  Multiple states
10674
10675               elsif Nkind (State) = N_Aggregate
10676                 and then Present (Expressions (State))
10677               then
10678                  Decl := First (Expressions (State));
10679                  while Present (Decl) loop
10680                     Check_State_Declaration_Syntax (Decl);
10681                     Next (Decl);
10682                  end loop;
10683
10684               else
10685                  Error_Msg_N ("malformed abstract state", State);
10686               end if;
10687            end Check_State_Declaration_Syntax;
10688
10689            --  Local variables
10690
10691            Context : constant Node_Id := Parent (Parent (N));
10692            State   : Node_Id;
10693
10694         --  Start of processing for Abstract_State
10695
10696         begin
10697            GNAT_Pragma;
10698            Check_Arg_Count (1);
10699            Ensure_Aggregate_Form (Arg1);
10700
10701            --  Ensure the proper placement of the pragma. Abstract states must
10702            --  be associated with a package declaration.
10703
10704            if not Nkind_In (Context, N_Generic_Package_Declaration,
10705                                      N_Package_Declaration)
10706            then
10707               Pragma_Misplaced;
10708               return;
10709            end if;
10710
10711            State := Expression (Arg1);
10712
10713            --  Verify the syntax of pragma Abstract_State when SPARK checks
10714            --  are suppressed. Semantic analysis is disabled in this mode.
10715
10716            if SPARK_Mode = Off then
10717               Check_State_Declaration_Syntax (State);
10718               return;
10719            end if;
10720
10721            Pack_Id := Defining_Entity (Context);
10722
10723            --  Multiple non-null abstract states appear as an aggregate
10724
10725            if Nkind (State) = N_Aggregate then
10726               State := First (Expressions (State));
10727               while Present (State) loop
10728                  Analyze_Abstract_State (State);
10729                  Next (State);
10730               end loop;
10731
10732            --  Various forms of a single abstract state. Note that these may
10733            --  include malformed state declarations.
10734
10735            else
10736               Analyze_Abstract_State (State);
10737            end if;
10738
10739            --  Save the pragma for retrieval by other tools
10740
10741            Add_Contract_Item (N, Pack_Id);
10742
10743            --  Verify the declaration order of pragmas Abstract_State and
10744            --  Initializes.
10745
10746            Check_Declaration_Order
10747              (First  => N,
10748               Second => Get_Pragma (Pack_Id, Pragma_Initializes));
10749         end Abstract_State;
10750
10751         ------------
10752         -- Ada_83 --
10753         ------------
10754
10755         --  pragma Ada_83;
10756
10757         --  Note: this pragma also has some specific processing in Par.Prag
10758         --  because we want to set the Ada version mode during parsing.
10759
10760         when Pragma_Ada_83 =>
10761            GNAT_Pragma;
10762            Check_Arg_Count (0);
10763
10764            --  We really should check unconditionally for proper configuration
10765            --  pragma placement, since we really don't want mixed Ada modes
10766            --  within a single unit, and the GNAT reference manual has always
10767            --  said this was a configuration pragma, but we did not check and
10768            --  are hesitant to add the check now.
10769
10770            --  However, we really cannot tolerate mixing Ada 2005 or Ada 2012
10771            --  with Ada 83 or Ada 95, so we must check if we are in Ada 2005
10772            --  or Ada 2012 mode.
10773
10774            if Ada_Version >= Ada_2005 then
10775               Check_Valid_Configuration_Pragma;
10776            end if;
10777
10778            --  Now set Ada 83 mode
10779
10780            Ada_Version          := Ada_83;
10781            Ada_Version_Explicit := Ada_83;
10782            Ada_Version_Pragma   := N;
10783
10784         ------------
10785         -- Ada_95 --
10786         ------------
10787
10788         --  pragma Ada_95;
10789
10790         --  Note: this pragma also has some specific processing in Par.Prag
10791         --  because we want to set the Ada 83 version mode during parsing.
10792
10793         when Pragma_Ada_95 =>
10794            GNAT_Pragma;
10795            Check_Arg_Count (0);
10796
10797            --  We really should check unconditionally for proper configuration
10798            --  pragma placement, since we really don't want mixed Ada modes
10799            --  within a single unit, and the GNAT reference manual has always
10800            --  said this was a configuration pragma, but we did not check and
10801            --  are hesitant to add the check now.
10802
10803            --  However, we really cannot tolerate mixing Ada 2005 with Ada 83
10804            --  or Ada 95, so we must check if we are in Ada 2005 mode.
10805
10806            if Ada_Version >= Ada_2005 then
10807               Check_Valid_Configuration_Pragma;
10808            end if;
10809
10810            --  Now set Ada 95 mode
10811
10812            Ada_Version          := Ada_95;
10813            Ada_Version_Explicit := Ada_95;
10814            Ada_Version_Pragma   := N;
10815
10816         ---------------------
10817         -- Ada_05/Ada_2005 --
10818         ---------------------
10819
10820         --  pragma Ada_05;
10821         --  pragma Ada_05 (LOCAL_NAME);
10822
10823         --  pragma Ada_2005;
10824         --  pragma Ada_2005 (LOCAL_NAME):
10825
10826         --  Note: these pragmas also have some specific processing in Par.Prag
10827         --  because we want to set the Ada 2005 version mode during parsing.
10828
10829         --  The one argument form is used for managing the transition from
10830         --  Ada 95 to Ada 2005 in the run-time library. If an entity is marked
10831         --  as Ada_2005 only, then referencing the entity in Ada_83 or Ada_95
10832         --  mode will generate a warning. In addition, in Ada_83 or Ada_95
10833         --  mode, a preference rule is established which does not choose
10834         --  such an entity unless it is unambiguously specified. This avoids
10835         --  extra subprograms marked this way from generating ambiguities in
10836         --  otherwise legal pre-Ada_2005 programs. The one argument form is
10837         --  intended for exclusive use in the GNAT run-time library.
10838
10839         when Pragma_Ada_05 | Pragma_Ada_2005 => declare
10840            E_Id : Node_Id;
10841
10842         begin
10843            GNAT_Pragma;
10844
10845            if Arg_Count = 1 then
10846               Check_Arg_Is_Local_Name (Arg1);
10847               E_Id := Get_Pragma_Arg (Arg1);
10848
10849               if Etype (E_Id) = Any_Type then
10850                  return;
10851               end if;
10852
10853               Set_Is_Ada_2005_Only (Entity (E_Id));
10854               Record_Rep_Item (Entity (E_Id), N);
10855
10856            else
10857               Check_Arg_Count (0);
10858
10859               --  For Ada_2005 we unconditionally enforce the documented
10860               --  configuration pragma placement, since we do not want to
10861               --  tolerate mixed modes in a unit involving Ada 2005. That
10862               --  would cause real difficulties for those cases where there
10863               --  are incompatibilities between Ada 95 and Ada 2005.
10864
10865               Check_Valid_Configuration_Pragma;
10866
10867               --  Now set appropriate Ada mode
10868
10869               Ada_Version          := Ada_2005;
10870               Ada_Version_Explicit := Ada_2005;
10871               Ada_Version_Pragma   := N;
10872            end if;
10873         end;
10874
10875         ---------------------
10876         -- Ada_12/Ada_2012 --
10877         ---------------------
10878
10879         --  pragma Ada_12;
10880         --  pragma Ada_12 (LOCAL_NAME);
10881
10882         --  pragma Ada_2012;
10883         --  pragma Ada_2012 (LOCAL_NAME):
10884
10885         --  Note: these pragmas also have some specific processing in Par.Prag
10886         --  because we want to set the Ada 2012 version mode during parsing.
10887
10888         --  The one argument form is used for managing the transition from Ada
10889         --  2005 to Ada 2012 in the run-time library. If an entity is marked
10890         --  as Ada_201 only, then referencing the entity in any pre-Ada_2012
10891         --  mode will generate a warning. In addition, in any pre-Ada_2012
10892         --  mode, a preference rule is established which does not choose
10893         --  such an entity unless it is unambiguously specified. This avoids
10894         --  extra subprograms marked this way from generating ambiguities in
10895         --  otherwise legal pre-Ada_2012 programs. The one argument form is
10896         --  intended for exclusive use in the GNAT run-time library.
10897
10898         when Pragma_Ada_12 | Pragma_Ada_2012 => declare
10899            E_Id : Node_Id;
10900
10901         begin
10902            GNAT_Pragma;
10903
10904            if Arg_Count = 1 then
10905               Check_Arg_Is_Local_Name (Arg1);
10906               E_Id := Get_Pragma_Arg (Arg1);
10907
10908               if Etype (E_Id) = Any_Type then
10909                  return;
10910               end if;
10911
10912               Set_Is_Ada_2012_Only (Entity (E_Id));
10913               Record_Rep_Item (Entity (E_Id), N);
10914
10915            else
10916               Check_Arg_Count (0);
10917
10918               --  For Ada_2012 we unconditionally enforce the documented
10919               --  configuration pragma placement, since we do not want to
10920               --  tolerate mixed modes in a unit involving Ada 2012. That
10921               --  would cause real difficulties for those cases where there
10922               --  are incompatibilities between Ada 95 and Ada 2012. We could
10923               --  allow mixing of Ada 2005 and Ada 2012 but it's not worth it.
10924
10925               Check_Valid_Configuration_Pragma;
10926
10927               --  Now set appropriate Ada mode
10928
10929               Ada_Version          := Ada_2012;
10930               Ada_Version_Explicit := Ada_2012;
10931               Ada_Version_Pragma   := N;
10932            end if;
10933         end;
10934
10935         ----------------------
10936         -- All_Calls_Remote --
10937         ----------------------
10938
10939         --  pragma All_Calls_Remote [(library_package_NAME)];
10940
10941         when Pragma_All_Calls_Remote => All_Calls_Remote : declare
10942            Lib_Entity : Entity_Id;
10943
10944         begin
10945            Check_Ada_83_Warning;
10946            Check_Valid_Library_Unit_Pragma;
10947
10948            if Nkind (N) = N_Null_Statement then
10949               return;
10950            end if;
10951
10952            Lib_Entity := Find_Lib_Unit_Name;
10953
10954            --  This pragma should only apply to a RCI unit (RM E.2.3(23))
10955
10956            if Present (Lib_Entity)
10957              and then not Debug_Flag_U
10958            then
10959               if not Is_Remote_Call_Interface (Lib_Entity) then
10960                  Error_Pragma ("pragma% only apply to rci unit");
10961
10962               --  Set flag for entity of the library unit
10963
10964               else
10965                  Set_Has_All_Calls_Remote (Lib_Entity);
10966               end if;
10967
10968            end if;
10969         end All_Calls_Remote;
10970
10971         ---------------------------
10972         -- Allow_Integer_Address --
10973         ---------------------------
10974
10975         --  pragma Allow_Integer_Address;
10976
10977         when Pragma_Allow_Integer_Address =>
10978            GNAT_Pragma;
10979            Check_Valid_Configuration_Pragma;
10980            Check_Arg_Count (0);
10981
10982            --  If Address is a private type, then set the flag to allow
10983            --  integer address values. If Address is not private (e.g. on
10984            --  VMS, where it is an integer type), then this pragma has no
10985            --  purpose, so it is simply ignored.
10986
10987            if Is_Private_Type (RTE (RE_Address)) then
10988               Opt.Allow_Integer_Address := True;
10989            end if;
10990
10991         --------------
10992         -- Annotate --
10993         --------------
10994
10995         --  pragma Annotate (IDENTIFIER [, IDENTIFIER {, ARG}]);
10996         --  ARG ::= NAME | EXPRESSION
10997
10998         --  The first two arguments are by convention intended to refer to an
10999         --  external tool and a tool-specific function. These arguments are
11000         --  not analyzed.
11001
11002         when Pragma_Annotate => Annotate : declare
11003            Arg : Node_Id;
11004            Exp : Node_Id;
11005
11006         begin
11007            GNAT_Pragma;
11008            Check_At_Least_N_Arguments (1);
11009            Check_Arg_Is_Identifier (Arg1);
11010            Check_No_Identifiers;
11011            Store_Note (N);
11012
11013            --  Second parameter is optional, it is never analyzed
11014
11015            if No (Arg2) then
11016               null;
11017
11018            --  Here if we have a second parameter
11019
11020            else
11021               --  Second parameter must be identifier
11022
11023               Check_Arg_Is_Identifier (Arg2);
11024
11025               --  Process remaining parameters if any
11026
11027               Arg := Next (Arg2);
11028               while Present (Arg) loop
11029                  Exp := Get_Pragma_Arg (Arg);
11030                  Analyze (Exp);
11031
11032                  if Is_Entity_Name (Exp) then
11033                     null;
11034
11035                  --  For string literals, we assume Standard_String as the
11036                  --  type, unless the string contains wide or wide_wide
11037                  --  characters.
11038
11039                  elsif Nkind (Exp) = N_String_Literal then
11040                     if Has_Wide_Wide_Character (Exp) then
11041                        Resolve (Exp, Standard_Wide_Wide_String);
11042                     elsif Has_Wide_Character (Exp) then
11043                        Resolve (Exp, Standard_Wide_String);
11044                     else
11045                        Resolve (Exp, Standard_String);
11046                     end if;
11047
11048                  elsif Is_Overloaded (Exp) then
11049                        Error_Pragma_Arg
11050                          ("ambiguous argument for pragma%", Exp);
11051
11052                  else
11053                     Resolve (Exp);
11054                  end if;
11055
11056                  Next (Arg);
11057               end loop;
11058            end if;
11059         end Annotate;
11060
11061         -------------------------------------------------
11062         -- Assert/Assert_And_Cut/Assume/Loop_Invariant --
11063         -------------------------------------------------
11064
11065         --  pragma Assert
11066         --    (   [Check => ]  Boolean_EXPRESSION
11067         --     [, [Message =>] Static_String_EXPRESSION]);
11068
11069         --  pragma Assert_And_Cut
11070         --    (   [Check => ]  Boolean_EXPRESSION
11071         --     [, [Message =>] Static_String_EXPRESSION]);
11072
11073         --  pragma Assume
11074         --    (   [Check => ]  Boolean_EXPRESSION
11075         --     [, [Message =>] Static_String_EXPRESSION]);
11076
11077         --  pragma Loop_Invariant
11078         --    (   [Check => ]  Boolean_EXPRESSION
11079         --     [, [Message =>] Static_String_EXPRESSION]);
11080
11081         when Pragma_Assert         |
11082              Pragma_Assert_And_Cut |
11083              Pragma_Assume         |
11084              Pragma_Loop_Invariant =>
11085         Assert : declare
11086            Expr : Node_Id;
11087            Newa : List_Id;
11088
11089            Has_Loop_Entry : Boolean;
11090            --  Set True by
11091
11092            function Contains_Loop_Entry return Boolean;
11093            --  Tests if Expr contains a Loop_Entry attribute reference
11094
11095            -------------------------
11096            -- Contains_Loop_Entry --
11097            -------------------------
11098
11099            function Contains_Loop_Entry return Boolean is
11100               function Process (N : Node_Id) return Traverse_Result;
11101               --  Process function for traversal to look for Loop_Entry
11102
11103               -------------
11104               -- Process --
11105               -------------
11106
11107               function Process (N : Node_Id) return Traverse_Result is
11108               begin
11109                  if Nkind (N) = N_Attribute_Reference
11110                    and then Attribute_Name (N) = Name_Loop_Entry
11111                  then
11112                     Has_Loop_Entry := True;
11113                     return Abandon;
11114                  else
11115                     return OK;
11116                  end if;
11117               end Process;
11118
11119               procedure Traverse is new Traverse_Proc (Process);
11120
11121            --  Start of processing for Contains_Loop_Entry
11122
11123            begin
11124               Has_Loop_Entry := False;
11125               Traverse (Expr);
11126               return Has_Loop_Entry;
11127            end Contains_Loop_Entry;
11128
11129         --  Start of processing for Assert
11130
11131         begin
11132            --  Assert is an Ada 2005 RM-defined pragma
11133
11134            if Prag_Id = Pragma_Assert then
11135               Ada_2005_Pragma;
11136
11137            --  The remaining ones are GNAT pragmas
11138
11139            else
11140               GNAT_Pragma;
11141            end if;
11142
11143            Check_At_Least_N_Arguments (1);
11144            Check_At_Most_N_Arguments (2);
11145            Check_Arg_Order ((Name_Check, Name_Message));
11146            Check_Optional_Identifier (Arg1, Name_Check);
11147            Expr := Get_Pragma_Arg (Arg1);
11148
11149            --  Special processing for Loop_Invariant or for other cases if
11150            --  a Loop_Entry attribute is present.
11151
11152            if Prag_Id = Pragma_Loop_Invariant
11153              or else Contains_Loop_Entry
11154            then
11155               --  Check restricted placement, must be within a loop
11156
11157               Check_Loop_Pragma_Placement;
11158
11159               --  Do preanalyze to deal with embedded Loop_Entry attribute
11160
11161               Preanalyze_Assert_Expression (Expression (Arg1), Any_Boolean);
11162            end if;
11163
11164            --  Implement Assert[_And_Cut]/Assume/Loop_Invariant by generating
11165            --  a corresponding Check pragma:
11166
11167            --    pragma Check (name, condition [, msg]);
11168
11169            --  Where name is the identifier matching the pragma name. So
11170            --  rewrite pragma in this manner, transfer the message argument
11171            --  if present, and analyze the result
11172
11173            --  Note: When dealing with a semantically analyzed tree, the
11174            --  information that a Check node N corresponds to a source Assert,
11175            --  Assume, or Assert_And_Cut pragma can be retrieved from the
11176            --  pragma kind of Original_Node(N).
11177
11178            Newa := New_List (
11179              Make_Pragma_Argument_Association (Loc,
11180                Expression => Make_Identifier (Loc, Pname)),
11181              Make_Pragma_Argument_Association (Sloc (Expr),
11182                Expression => Expr));
11183
11184            if Arg_Count > 1 then
11185               Check_Optional_Identifier (Arg2, Name_Message);
11186               Append_To (Newa, New_Copy_Tree (Arg2));
11187            end if;
11188
11189            --  Rewrite as Check pragma
11190
11191            Rewrite (N,
11192              Make_Pragma (Loc,
11193                Chars                        => Name_Check,
11194                Pragma_Argument_Associations => Newa));
11195            Analyze (N);
11196         end Assert;
11197
11198         ----------------------
11199         -- Assertion_Policy --
11200         ----------------------
11201
11202         --  pragma Assertion_Policy (POLICY_IDENTIFIER);
11203
11204         --  The following form is Ada 2012 only, but we allow it in all modes
11205
11206         --  Pragma Assertion_Policy (
11207         --      ASSERTION_KIND => POLICY_IDENTIFIER
11208         --   {, ASSERTION_KIND => POLICY_IDENTIFIER});
11209
11210         --  ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND
11211
11212         --  RM_ASSERTION_KIND ::= Assert               |
11213         --                        Static_Predicate     |
11214         --                        Dynamic_Predicate    |
11215         --                        Pre                  |
11216         --                        Pre'Class            |
11217         --                        Post                 |
11218         --                        Post'Class           |
11219         --                        Type_Invariant       |
11220         --                        Type_Invariant'Class
11221
11222         --  ID_ASSERTION_KIND ::= Assert_And_Cut       |
11223         --                        Assume               |
11224         --                        Contract_Cases       |
11225         --                        Debug                |
11226         --                        Initial_Condition    |
11227         --                        Loop_Invariant       |
11228         --                        Loop_Variant         |
11229         --                        Postcondition        |
11230         --                        Precondition         |
11231         --                        Predicate            |
11232         --                        Refined_Post         |
11233         --                        Statement_Assertions
11234
11235         --  Note: The RM_ASSERTION_KIND list is language-defined, and the
11236         --  ID_ASSERTION_KIND list contains implementation-defined additions
11237         --  recognized by GNAT. The effect is to control the behavior of
11238         --  identically named aspects and pragmas, depending on the specified
11239         --  policy identifier:
11240
11241         --  POLICY_IDENTIFIER ::= Check | Disable | Ignore
11242
11243         --  Note: Check and Ignore are language-defined. Disable is a GNAT
11244         --  implementation defined addition that results in totally ignoring
11245         --  the corresponding assertion. If Disable is specified, then the
11246         --  argument of the assertion is not even analyzed. This is useful
11247         --  when the aspect/pragma argument references entities in a with'ed
11248         --  package that is replaced by a dummy package in the final build.
11249
11250         --  Note: the attribute forms Pre'Class, Post'Class, Invariant'Class,
11251         --  and Type_Invariant'Class were recognized by the parser and
11252         --  transformed into references to the special internal identifiers
11253         --  _Pre, _Post, _Invariant, and _Type_Invariant, so no special
11254         --  processing is required here.
11255
11256         when Pragma_Assertion_Policy => Assertion_Policy : declare
11257            LocP   : Source_Ptr;
11258            Policy : Node_Id;
11259            Arg    : Node_Id;
11260            Kind   : Name_Id;
11261
11262         begin
11263            Ada_2005_Pragma;
11264
11265            --  This can always appear as a configuration pragma
11266
11267            if Is_Configuration_Pragma then
11268               null;
11269
11270            --  It can also appear in a declarative part or package spec in Ada
11271            --  2012 mode. We allow this in other modes, but in that case we
11272            --  consider that we have an Ada 2012 pragma on our hands.
11273
11274            else
11275               Check_Is_In_Decl_Part_Or_Package_Spec;
11276               Ada_2012_Pragma;
11277            end if;
11278
11279            --  One argument case with no identifier (first form above)
11280
11281            if Arg_Count = 1
11282              and then (Nkind (Arg1) /= N_Pragma_Argument_Association
11283                         or else Chars (Arg1) = No_Name)
11284            then
11285               Check_Arg_Is_One_Of
11286                 (Arg1, Name_Check, Name_Disable, Name_Ignore);
11287
11288               --  Treat one argument Assertion_Policy as equivalent to:
11289
11290               --    pragma Check_Policy (Assertion, policy)
11291
11292               --  So rewrite pragma in that manner and link on to the chain
11293               --  of Check_Policy pragmas, marking the pragma as analyzed.
11294
11295               Policy := Get_Pragma_Arg (Arg1);
11296
11297               Rewrite (N,
11298                 Make_Pragma (Loc,
11299                   Chars                        => Name_Check_Policy,
11300                   Pragma_Argument_Associations => New_List (
11301                     Make_Pragma_Argument_Association (Loc,
11302                       Expression => Make_Identifier (Loc, Name_Assertion)),
11303
11304                     Make_Pragma_Argument_Association (Loc,
11305                       Expression =>
11306                         Make_Identifier (Sloc (Policy), Chars (Policy))))));
11307               Analyze (N);
11308
11309            --  Here if we have two or more arguments
11310
11311            else
11312               Check_At_Least_N_Arguments (1);
11313               Ada_2012_Pragma;
11314
11315               --  Loop through arguments
11316
11317               Arg := Arg1;
11318               while Present (Arg) loop
11319                  LocP := Sloc (Arg);
11320
11321                  --  Kind must be specified
11322
11323                  if Nkind (Arg) /= N_Pragma_Argument_Association
11324                    or else Chars (Arg) = No_Name
11325                  then
11326                     Error_Pragma_Arg
11327                       ("missing assertion kind for pragma%", Arg);
11328                  end if;
11329
11330                  --  Check Kind and Policy have allowed forms
11331
11332                  Kind := Chars (Arg);
11333
11334                  if not Is_Valid_Assertion_Kind (Kind) then
11335                     Error_Pragma_Arg
11336                       ("invalid assertion kind for pragma%", Arg);
11337                  end if;
11338
11339                  Check_Arg_Is_One_Of
11340                    (Arg, Name_Check, Name_Disable, Name_Ignore);
11341
11342                  --  We rewrite the Assertion_Policy pragma as a series of
11343                  --  Check_Policy pragmas:
11344
11345                  --    Check_Policy (Kind, Policy);
11346
11347                  Insert_Action (N,
11348                    Make_Pragma (LocP,
11349                      Chars                        => Name_Check_Policy,
11350                      Pragma_Argument_Associations => New_List (
11351                         Make_Pragma_Argument_Association (LocP,
11352                           Expression => Make_Identifier (LocP, Kind)),
11353                         Make_Pragma_Argument_Association (LocP,
11354                           Expression => Get_Pragma_Arg (Arg)))));
11355
11356                  Arg := Next (Arg);
11357               end loop;
11358
11359               --  Rewrite the Assertion_Policy pragma as null since we have
11360               --  now inserted all the equivalent Check pragmas.
11361
11362               Rewrite (N, Make_Null_Statement (Loc));
11363               Analyze (N);
11364            end if;
11365         end Assertion_Policy;
11366
11367         ------------------------------
11368         -- Assume_No_Invalid_Values --
11369         ------------------------------
11370
11371         --  pragma Assume_No_Invalid_Values (On | Off);
11372
11373         when Pragma_Assume_No_Invalid_Values =>
11374            GNAT_Pragma;
11375            Check_Valid_Configuration_Pragma;
11376            Check_Arg_Count (1);
11377            Check_No_Identifiers;
11378            Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
11379
11380            if Chars (Get_Pragma_Arg (Arg1)) = Name_On then
11381               Assume_No_Invalid_Values := True;
11382            else
11383               Assume_No_Invalid_Values := False;
11384            end if;
11385
11386         --------------------------
11387         -- Attribute_Definition --
11388         --------------------------
11389
11390         --  pragma Attribute_Definition
11391         --    ([Attribute  =>] ATTRIBUTE_DESIGNATOR,
11392         --     [Entity     =>] LOCAL_NAME,
11393         --     [Expression =>] EXPRESSION | NAME);
11394
11395         when Pragma_Attribute_Definition => Attribute_Definition : declare
11396            Attribute_Designator : constant Node_Id := Get_Pragma_Arg (Arg1);
11397            Aname                : Name_Id;
11398
11399         begin
11400            GNAT_Pragma;
11401            Check_Arg_Count (3);
11402            Check_Optional_Identifier (Arg1, "attribute");
11403            Check_Optional_Identifier (Arg2, "entity");
11404            Check_Optional_Identifier (Arg3, "expression");
11405
11406            if Nkind (Attribute_Designator) /= N_Identifier then
11407               Error_Msg_N ("attribute name expected", Attribute_Designator);
11408               return;
11409            end if;
11410
11411            Check_Arg_Is_Local_Name (Arg2);
11412
11413            --  If the attribute is not recognized, then issue a warning (not
11414            --  an error), and ignore the pragma.
11415
11416            Aname := Chars (Attribute_Designator);
11417
11418            if not Is_Attribute_Name (Aname) then
11419               Bad_Attribute (Attribute_Designator, Aname, Warn => True);
11420               return;
11421            end if;
11422
11423            --  Otherwise, rewrite the pragma as an attribute definition clause
11424
11425            Rewrite (N,
11426              Make_Attribute_Definition_Clause (Loc,
11427                Name       => Get_Pragma_Arg (Arg2),
11428                Chars      => Aname,
11429                Expression => Get_Pragma_Arg (Arg3)));
11430            Analyze (N);
11431         end Attribute_Definition;
11432
11433         ---------------
11434         -- AST_Entry --
11435         ---------------
11436
11437         --  pragma AST_Entry (entry_IDENTIFIER);
11438
11439         when Pragma_AST_Entry => AST_Entry : declare
11440            Ent : Node_Id;
11441
11442         begin
11443            GNAT_Pragma;
11444            Check_VMS (N);
11445            Check_Arg_Count (1);
11446            Check_No_Identifiers;
11447            Check_Arg_Is_Local_Name (Arg1);
11448            Ent := Entity (Get_Pragma_Arg (Arg1));
11449
11450            --  Note: the implementation of the AST_Entry pragma could handle
11451            --  the entry family case fine, but for now we are consistent with
11452            --  the DEC rules, and do not allow the pragma, which of course
11453            --  has the effect of also forbidding the attribute.
11454
11455            if Ekind (Ent) /= E_Entry then
11456               Error_Pragma_Arg
11457                 ("pragma% argument must be simple entry name", Arg1);
11458
11459            elsif Is_AST_Entry (Ent) then
11460               Error_Pragma_Arg
11461                 ("duplicate % pragma for entry", Arg1);
11462
11463            elsif Has_Homonym (Ent) then
11464               Error_Pragma_Arg
11465                 ("pragma% argument cannot specify overloaded entry", Arg1);
11466
11467            else
11468               declare
11469                  FF : constant Entity_Id := First_Formal (Ent);
11470
11471               begin
11472                  if Present (FF) then
11473                     if Present (Next_Formal (FF)) then
11474                        Error_Pragma_Arg
11475                          ("entry for pragma% can have only one argument",
11476                           Arg1);
11477
11478                     elsif Parameter_Mode (FF) /= E_In_Parameter then
11479                        Error_Pragma_Arg
11480                          ("entry parameter for pragma% must have mode IN",
11481                           Arg1);
11482                     end if;
11483                  end if;
11484               end;
11485
11486               Set_Is_AST_Entry (Ent);
11487            end if;
11488         end AST_Entry;
11489
11490         ------------------------------------------------------------------
11491         -- Async_Readers/Async_Writers/Effective_Reads/Effective_Writes --
11492         ------------------------------------------------------------------
11493
11494         --  pragma Asynch_Readers   ( identifier [, boolean_EXPRESSION] );
11495         --  pragma Asynch_Writers   ( identifier [, boolean_EXPRESSION] );
11496         --  pragma Effective_Reads  ( identifier [, boolean_EXPRESSION] );
11497         --  pragma Effective_Writes ( identifier [, boolean_EXPRESSION] );
11498
11499         when Pragma_Async_Readers    |
11500              Pragma_Async_Writers    |
11501              Pragma_Effective_Reads  |
11502              Pragma_Effective_Writes =>
11503         Async_Effective : declare
11504            Duplic : Node_Id;
11505            Obj_Id : Entity_Id;
11506
11507         begin
11508            GNAT_Pragma;
11509            Check_No_Identifiers;
11510            Check_At_Least_N_Arguments (1);
11511            Check_At_Most_N_Arguments  (2);
11512            Check_Arg_Is_Local_Name (Arg1);
11513
11514            Arg1 := Get_Pragma_Arg (Arg1);
11515
11516            --  Perform minimal verification to ensure that the argument is at
11517            --  least a variable. Subsequent finer grained checks will be done
11518            --  at the end of the declarative region the contains the pragma.
11519
11520            if Is_Entity_Name (Arg1) and then Present (Entity (Arg1)) then
11521               Obj_Id := Entity (Get_Pragma_Arg (Arg1));
11522
11523               --  It is not efficient to examine preceding statements in order
11524               --  to detect duplicate pragmas as Boolean aspects may appear
11525               --  anywhere between the related object declaration and its
11526               --  freeze point. As an alternative, inspect the contents of the
11527               --  variable contract.
11528
11529               if Ekind (Obj_Id) = E_Variable then
11530                  Duplic := Get_Pragma (Obj_Id, Prag_Id);
11531
11532                  if Present (Duplic) then
11533                     Error_Msg_Name_1 := Pname;
11534                     Error_Msg_Sloc   := Sloc (Duplic);
11535                     Error_Msg_N ("pragma % duplicates pragma declared #", N);
11536
11537                  --  Chain the pragma on the contract for further processing.
11538                  --  This also aids in detecting duplicates.
11539
11540                  else
11541                     Add_Contract_Item (N, Obj_Id);
11542                  end if;
11543
11544                  --  The minimum legality requirements have been met, do not
11545                  --  fall through to the error message.
11546
11547                  return;
11548               end if;
11549            end if;
11550
11551            --  If we get here, then the pragma applies to a non-object
11552            --  construct, issue a generic error (SPARK RM 7.1.3(2)).
11553
11554            Error_Pragma ("pragma % must apply to a volatile object");
11555         end Async_Effective;
11556
11557         ------------------
11558         -- Asynchronous --
11559         ------------------
11560
11561         --  pragma Asynchronous (LOCAL_NAME);
11562
11563         when Pragma_Asynchronous => Asynchronous : declare
11564            Nm     : Entity_Id;
11565            C_Ent  : Entity_Id;
11566            L      : List_Id;
11567            S      : Node_Id;
11568            N      : Node_Id;
11569            Formal : Entity_Id;
11570
11571            procedure Process_Async_Pragma;
11572            --  Common processing for procedure and access-to-procedure case
11573
11574            --------------------------
11575            -- Process_Async_Pragma --
11576            --------------------------
11577
11578            procedure Process_Async_Pragma is
11579            begin
11580               if No (L) then
11581                  Set_Is_Asynchronous (Nm);
11582                  return;
11583               end if;
11584
11585               --  The formals should be of mode IN (RM E.4.1(6))
11586
11587               S := First (L);
11588               while Present (S) loop
11589                  Formal := Defining_Identifier (S);
11590
11591                  if Nkind (Formal) = N_Defining_Identifier
11592                    and then Ekind (Formal) /= E_In_Parameter
11593                  then
11594                     Error_Pragma_Arg
11595                       ("pragma% procedure can only have IN parameter",
11596                        Arg1);
11597                  end if;
11598
11599                  Next (S);
11600               end loop;
11601
11602               Set_Is_Asynchronous (Nm);
11603            end Process_Async_Pragma;
11604
11605         --  Start of processing for pragma Asynchronous
11606
11607         begin
11608            Check_Ada_83_Warning;
11609            Check_No_Identifiers;
11610            Check_Arg_Count (1);
11611            Check_Arg_Is_Local_Name (Arg1);
11612
11613            if Debug_Flag_U then
11614               return;
11615            end if;
11616
11617            C_Ent := Cunit_Entity (Current_Sem_Unit);
11618            Analyze (Get_Pragma_Arg (Arg1));
11619            Nm := Entity (Get_Pragma_Arg (Arg1));
11620
11621            if not Is_Remote_Call_Interface (C_Ent)
11622              and then not Is_Remote_Types (C_Ent)
11623            then
11624               --  This pragma should only appear in an RCI or Remote Types
11625               --  unit (RM E.4.1(4)).
11626
11627               Error_Pragma
11628                 ("pragma% not in Remote_Call_Interface or Remote_Types unit");
11629            end if;
11630
11631            if Ekind (Nm) = E_Procedure
11632              and then Nkind (Parent (Nm)) = N_Procedure_Specification
11633            then
11634               if not Is_Remote_Call_Interface (Nm) then
11635                  Error_Pragma_Arg
11636                    ("pragma% cannot be applied on non-remote procedure",
11637                     Arg1);
11638               end if;
11639
11640               L := Parameter_Specifications (Parent (Nm));
11641               Process_Async_Pragma;
11642               return;
11643
11644            elsif Ekind (Nm) = E_Function then
11645               Error_Pragma_Arg
11646                 ("pragma% cannot be applied to function", Arg1);
11647
11648            elsif Is_Remote_Access_To_Subprogram_Type (Nm) then
11649                  if Is_Record_Type (Nm) then
11650
11651                  --  A record type that is the Equivalent_Type for a remote
11652                  --  access-to-subprogram type.
11653
11654                     N := Declaration_Node (Corresponding_Remote_Type (Nm));
11655
11656                  else
11657                     --  A non-expanded RAS type (distribution is not enabled)
11658
11659                     N := Declaration_Node (Nm);
11660                  end if;
11661
11662               if Nkind (N) = N_Full_Type_Declaration
11663                 and then Nkind (Type_Definition (N)) =
11664                                     N_Access_Procedure_Definition
11665               then
11666                  L := Parameter_Specifications (Type_Definition (N));
11667                  Process_Async_Pragma;
11668
11669                  if Is_Asynchronous (Nm)
11670                    and then Expander_Active
11671                    and then Get_PCS_Name /= Name_No_DSA
11672                  then
11673                     RACW_Type_Is_Asynchronous (Underlying_RACW_Type (Nm));
11674                  end if;
11675
11676               else
11677                  Error_Pragma_Arg
11678                    ("pragma% cannot reference access-to-function type",
11679                    Arg1);
11680               end if;
11681
11682            --  Only other possibility is Access-to-class-wide type
11683
11684            elsif Is_Access_Type (Nm)
11685              and then Is_Class_Wide_Type (Designated_Type (Nm))
11686            then
11687               Check_First_Subtype (Arg1);
11688               Set_Is_Asynchronous (Nm);
11689               if Expander_Active then
11690                  RACW_Type_Is_Asynchronous (Nm);
11691               end if;
11692
11693            else
11694               Error_Pragma_Arg ("inappropriate argument for pragma%", Arg1);
11695            end if;
11696         end Asynchronous;
11697
11698         ------------
11699         -- Atomic --
11700         ------------
11701
11702         --  pragma Atomic (LOCAL_NAME);
11703
11704         when Pragma_Atomic =>
11705            Process_Atomic_Shared_Volatile;
11706
11707         -----------------------
11708         -- Atomic_Components --
11709         -----------------------
11710
11711         --  pragma Atomic_Components (array_LOCAL_NAME);
11712
11713         --  This processing is shared by Volatile_Components
11714
11715         when Pragma_Atomic_Components   |
11716              Pragma_Volatile_Components =>
11717
11718         Atomic_Components : declare
11719            E_Id : Node_Id;
11720            E    : Entity_Id;
11721            D    : Node_Id;
11722            K    : Node_Kind;
11723
11724         begin
11725            Check_Ada_83_Warning;
11726            Check_No_Identifiers;
11727            Check_Arg_Count (1);
11728            Check_Arg_Is_Local_Name (Arg1);
11729            E_Id := Get_Pragma_Arg (Arg1);
11730
11731            if Etype (E_Id) = Any_Type then
11732               return;
11733            end if;
11734
11735            E := Entity (E_Id);
11736
11737            Check_Duplicate_Pragma (E);
11738
11739            if Rep_Item_Too_Early (E, N)
11740                 or else
11741               Rep_Item_Too_Late (E, N)
11742            then
11743               return;
11744            end if;
11745
11746            D := Declaration_Node (E);
11747            K := Nkind (D);
11748
11749            if (K = N_Full_Type_Declaration and then Is_Array_Type (E))
11750              or else
11751                ((Ekind (E) = E_Constant or else Ekind (E) = E_Variable)
11752                   and then Nkind (D) = N_Object_Declaration
11753                   and then Nkind (Object_Definition (D)) =
11754                                       N_Constrained_Array_Definition)
11755            then
11756               --  The flag is set on the object, or on the base type
11757
11758               if Nkind (D) /= N_Object_Declaration then
11759                  E := Base_Type (E);
11760               end if;
11761
11762               Set_Has_Volatile_Components (E);
11763
11764               if Prag_Id = Pragma_Atomic_Components then
11765                  Set_Has_Atomic_Components (E);
11766               end if;
11767
11768            else
11769               Error_Pragma_Arg ("inappropriate entity for pragma%", Arg1);
11770            end if;
11771         end Atomic_Components;
11772
11773         --------------------
11774         -- Attach_Handler --
11775         --------------------
11776
11777         --  pragma Attach_Handler (handler_NAME, EXPRESSION);
11778
11779         when Pragma_Attach_Handler =>
11780            Check_Ada_83_Warning;
11781            Check_No_Identifiers;
11782            Check_Arg_Count (2);
11783
11784            if No_Run_Time_Mode then
11785               Error_Msg_CRT ("Attach_Handler pragma", N);
11786            else
11787               Check_Interrupt_Or_Attach_Handler;
11788
11789               --  The expression that designates the attribute may depend on a
11790               --  discriminant, and is therefore a per-object expression, to
11791               --  be expanded in the init proc. If expansion is enabled, then
11792               --  perform semantic checks on a copy only.
11793
11794               declare
11795                  Temp  : Node_Id;
11796                  Typ   : Node_Id;
11797                  Parg2 : constant Node_Id := Get_Pragma_Arg (Arg2);
11798
11799               begin
11800                  --  In Relaxed_RM_Semantics mode, we allow any static
11801                  --  integer value, for compatibility with other compilers.
11802
11803                  if Relaxed_RM_Semantics
11804                    and then Nkind (Parg2) = N_Integer_Literal
11805                  then
11806                     Typ := Standard_Integer;
11807                  else
11808                     Typ := RTE (RE_Interrupt_ID);
11809                  end if;
11810
11811                  if Expander_Active then
11812                     Temp := New_Copy_Tree (Parg2);
11813                     Set_Parent (Temp, N);
11814                     Preanalyze_And_Resolve (Temp, Typ);
11815                  else
11816                     Analyze (Parg2);
11817                     Resolve (Parg2, Typ);
11818                  end if;
11819               end;
11820
11821               Process_Interrupt_Or_Attach_Handler;
11822            end if;
11823
11824         --------------------
11825         -- C_Pass_By_Copy --
11826         --------------------
11827
11828         --  pragma C_Pass_By_Copy ([Max_Size =>] static_integer_EXPRESSION);
11829
11830         when Pragma_C_Pass_By_Copy => C_Pass_By_Copy : declare
11831            Arg : Node_Id;
11832            Val : Uint;
11833
11834         begin
11835            GNAT_Pragma;
11836            Check_Valid_Configuration_Pragma;
11837            Check_Arg_Count (1);
11838            Check_Optional_Identifier (Arg1, "max_size");
11839
11840            Arg := Get_Pragma_Arg (Arg1);
11841            Check_Arg_Is_Static_Expression (Arg, Any_Integer);
11842
11843            Val := Expr_Value (Arg);
11844
11845            if Val <= 0 then
11846               Error_Pragma_Arg
11847                 ("maximum size for pragma% must be positive", Arg1);
11848
11849            elsif UI_Is_In_Int_Range (Val) then
11850               Default_C_Record_Mechanism := UI_To_Int (Val);
11851
11852            --  If a giant value is given, Int'Last will do well enough.
11853            --  If sometime someone complains that a record larger than
11854            --  two gigabytes is not copied, we will worry about it then.
11855
11856            else
11857               Default_C_Record_Mechanism := Mechanism_Type'Last;
11858            end if;
11859         end C_Pass_By_Copy;
11860
11861         -----------
11862         -- Check --
11863         -----------
11864
11865         --  pragma Check ([Name    =>] CHECK_KIND,
11866         --                [Check   =>] Boolean_EXPRESSION
11867         --              [,[Message =>] String_EXPRESSION]);
11868
11869         --  CHECK_KIND ::= IDENTIFIER           |
11870         --                 Pre'Class            |
11871         --                 Post'Class           |
11872         --                 Invariant'Class      |
11873         --                 Type_Invariant'Class
11874
11875         --  The identifiers Assertions and Statement_Assertions are not
11876         --  allowed, since they have special meaning for Check_Policy.
11877
11878         when Pragma_Check => Check : declare
11879            Expr  : Node_Id;
11880            Eloc  : Source_Ptr;
11881            Cname : Name_Id;
11882            Str   : Node_Id;
11883
11884         begin
11885            GNAT_Pragma;
11886            Check_At_Least_N_Arguments (2);
11887            Check_At_Most_N_Arguments (3);
11888            Check_Optional_Identifier (Arg1, Name_Name);
11889            Check_Optional_Identifier (Arg2, Name_Check);
11890
11891            if Arg_Count = 3 then
11892               Check_Optional_Identifier (Arg3, Name_Message);
11893               Str := Get_Pragma_Arg (Arg3);
11894            end if;
11895
11896            Rewrite_Assertion_Kind (Get_Pragma_Arg (Arg1));
11897            Check_Arg_Is_Identifier (Arg1);
11898            Cname := Chars (Get_Pragma_Arg (Arg1));
11899
11900            --  Check forbidden name Assertions or Statement_Assertions
11901
11902            case Cname is
11903               when Name_Assertions =>
11904                  Error_Pragma_Arg
11905                    ("""Assertions"" is not allowed as a check kind "
11906                     & "for pragma%", Arg1);
11907
11908               when Name_Statement_Assertions =>
11909                  Error_Pragma_Arg
11910                    ("""Statement_Assertions"" is not allowed as a check kind "
11911                     & "for pragma%", Arg1);
11912
11913               when others =>
11914                  null;
11915            end case;
11916
11917            --  Check applicable policy. We skip this if Checked/Ignored status
11918            --  is already set (e.g. in the casse of a pragma from an aspect).
11919
11920            if Is_Checked (N) or else Is_Ignored (N) then
11921               null;
11922
11923            --  For a non-source pragma that is a rewriting of another pragma,
11924            --  copy the Is_Checked/Ignored status from the rewritten pragma.
11925
11926            elsif Is_Rewrite_Substitution (N)
11927              and then Nkind (Original_Node (N)) = N_Pragma
11928              and then Original_Node (N) /= N
11929            then
11930               Set_Is_Ignored (N, Is_Ignored (Original_Node (N)));
11931               Set_Is_Checked (N, Is_Checked (Original_Node (N)));
11932
11933            --  Otherwise query the applicable policy at this point
11934
11935            else
11936               case Check_Kind (Cname) is
11937                  when Name_Ignore =>
11938                     Set_Is_Ignored (N, True);
11939                     Set_Is_Checked (N, False);
11940
11941                  when Name_Check =>
11942                     Set_Is_Ignored (N, False);
11943                     Set_Is_Checked (N, True);
11944
11945                  --  For disable, rewrite pragma as null statement and skip
11946                  --  rest of the analysis of the pragma.
11947
11948                  when Name_Disable =>
11949                     Rewrite (N, Make_Null_Statement (Loc));
11950                     Analyze (N);
11951                     raise Pragma_Exit;
11952
11953                     --  No other possibilities
11954
11955                  when others =>
11956                     raise Program_Error;
11957               end case;
11958            end if;
11959
11960            --  If check kind was not Disable, then continue pragma analysis
11961
11962            Expr := Get_Pragma_Arg (Arg2);
11963
11964            --  Deal with SCO generation
11965
11966            case Cname is
11967               when Name_Predicate |
11968                    Name_Invariant =>
11969
11970                  --  Nothing to do: since checks occur in client units,
11971                  --  the SCO for the aspect in the declaration unit is
11972                  --  conservatively always enabled.
11973
11974                  null;
11975
11976               when others =>
11977
11978                  if Is_Checked (N) and then not Split_PPC (N) then
11979
11980                     --  Mark aspect/pragma SCO as enabled
11981
11982                     Set_SCO_Pragma_Enabled (Loc);
11983                  end if;
11984            end case;
11985
11986            --  Deal with analyzing the string argument.
11987
11988            if Arg_Count = 3 then
11989
11990               --  If checks are not on we don't want any expansion (since
11991               --  such expansion would not get properly deleted) but
11992               --  we do want to analyze (to get proper references).
11993               --  The Preanalyze_And_Resolve routine does just what we want
11994
11995               if Is_Ignored (N) then
11996                  Preanalyze_And_Resolve (Str, Standard_String);
11997
11998                  --  Otherwise we need a proper analysis and expansion
11999
12000               else
12001                  Analyze_And_Resolve (Str, Standard_String);
12002               end if;
12003            end if;
12004
12005            --  Now you might think we could just do the same with the Boolean
12006            --  expression if checks are off (and expansion is on) and then
12007            --  rewrite the check as a null statement. This would work but we
12008            --  would lose the useful warnings about an assertion being bound
12009            --  to fail even if assertions are turned off.
12010
12011            --  So instead we wrap the boolean expression in an if statement
12012            --  that looks like:
12013
12014            --    if False and then condition then
12015            --       null;
12016            --    end if;
12017
12018            --  The reason we do this rewriting during semantic analysis rather
12019            --  than as part of normal expansion is that we cannot analyze and
12020            --  expand the code for the boolean expression directly, or it may
12021            --  cause insertion of actions that would escape the attempt to
12022            --  suppress the check code.
12023
12024            --  Note that the Sloc for the if statement corresponds to the
12025            --  argument condition, not the pragma itself. The reason for
12026            --  this is that we may generate a warning if the condition is
12027            --  False at compile time, and we do not want to delete this
12028            --  warning when we delete the if statement.
12029
12030            if Expander_Active and Is_Ignored (N) then
12031               Eloc := Sloc (Expr);
12032
12033               Rewrite (N,
12034                 Make_If_Statement (Eloc,
12035                   Condition =>
12036                     Make_And_Then (Eloc,
12037                       Left_Opnd  => New_Occurrence_Of (Standard_False, Eloc),
12038                       Right_Opnd => Expr),
12039                   Then_Statements => New_List (
12040                     Make_Null_Statement (Eloc))));
12041
12042               In_Assertion_Expr := In_Assertion_Expr + 1;
12043               Analyze (N);
12044               In_Assertion_Expr := In_Assertion_Expr - 1;
12045
12046            --  Check is active or expansion not active. In these cases we can
12047            --  just go ahead and analyze the boolean with no worries.
12048
12049            else
12050               In_Assertion_Expr := In_Assertion_Expr + 1;
12051               Analyze_And_Resolve (Expr, Any_Boolean);
12052               In_Assertion_Expr := In_Assertion_Expr - 1;
12053            end if;
12054         end Check;
12055
12056         --------------------------
12057         -- Check_Float_Overflow --
12058         --------------------------
12059
12060         --  pragma Check_Float_Overflow;
12061
12062         when Pragma_Check_Float_Overflow =>
12063            GNAT_Pragma;
12064            Check_Valid_Configuration_Pragma;
12065            Check_Arg_Count (0);
12066            Check_Float_Overflow := True;
12067
12068         ----------------
12069         -- Check_Name --
12070         ----------------
12071
12072         --  pragma Check_Name (check_IDENTIFIER);
12073
12074         when Pragma_Check_Name =>
12075            GNAT_Pragma;
12076            Check_No_Identifiers;
12077            Check_Valid_Configuration_Pragma;
12078            Check_Arg_Count (1);
12079            Check_Arg_Is_Identifier (Arg1);
12080
12081            declare
12082               Nam : constant Name_Id := Chars (Get_Pragma_Arg (Arg1));
12083
12084            begin
12085               for J in Check_Names.First .. Check_Names.Last loop
12086                  if Check_Names.Table (J) = Nam then
12087                     return;
12088                  end if;
12089               end loop;
12090
12091               Check_Names.Append (Nam);
12092            end;
12093
12094         ------------------
12095         -- Check_Policy --
12096         ------------------
12097
12098         --  This is the old style syntax, which is still allowed in all modes:
12099
12100         --  pragma Check_Policy ([Name   =>] CHECK_KIND
12101         --                       [Policy =>] POLICY_IDENTIFIER);
12102
12103         --  POLICY_IDENTIFIER ::= On | Off | Check | Disable | Ignore
12104
12105         --  CHECK_KIND ::= IDENTIFIER           |
12106         --                 Pre'Class            |
12107         --                 Post'Class           |
12108         --                 Type_Invariant'Class |
12109         --                 Invariant'Class
12110
12111         --  This is the new style syntax, compatible with Assertion_Policy
12112         --  and also allowed in all modes.
12113
12114         --  Pragma Check_Policy (
12115         --      CHECK_KIND => POLICY_IDENTIFIER
12116         --   {, CHECK_KIND => POLICY_IDENTIFIER});
12117
12118         --  Note: the identifiers Name and Policy are not allowed as
12119         --  Check_Kind values. This avoids ambiguities between the old and
12120         --  new form syntax.
12121
12122         when Pragma_Check_Policy => Check_Policy : declare
12123            Kind : Node_Id;
12124
12125         begin
12126            GNAT_Pragma;
12127            Check_At_Least_N_Arguments (1);
12128
12129            --  A Check_Policy pragma can appear either as a configuration
12130            --  pragma, or in a declarative part or a package spec (see RM
12131            --  11.5(5) for rules for Suppress/Unsuppress which are also
12132            --  followed for Check_Policy).
12133
12134            if not Is_Configuration_Pragma then
12135               Check_Is_In_Decl_Part_Or_Package_Spec;
12136            end if;
12137
12138            --  Figure out if we have the old or new syntax. We have the
12139            --  old syntax if the first argument has no identifier, or the
12140            --  identifier is Name.
12141
12142            if Nkind (Arg1) /= N_Pragma_Argument_Association
12143               or else Nam_In (Chars (Arg1), No_Name, Name_Name)
12144            then
12145               --  Old syntax
12146
12147               Check_Arg_Count (2);
12148               Check_Optional_Identifier (Arg1, Name_Name);
12149               Kind := Get_Pragma_Arg (Arg1);
12150               Rewrite_Assertion_Kind (Kind);
12151               Check_Arg_Is_Identifier (Arg1);
12152
12153               --  Check forbidden check kind
12154
12155               if Nam_In (Chars (Kind), Name_Name, Name_Policy) then
12156                  Error_Msg_Name_2 := Chars (Kind);
12157                     Error_Pragma_Arg
12158                       ("pragma% does not allow% as check name", Arg1);
12159               end if;
12160
12161               --  Check policy
12162
12163               Check_Optional_Identifier (Arg2, Name_Policy);
12164               Check_Arg_Is_One_Of
12165                 (Arg2,
12166                  Name_On, Name_Off, Name_Check, Name_Disable, Name_Ignore);
12167
12168               --  And chain pragma on the Check_Policy_List for search
12169
12170               Set_Next_Pragma (N, Opt.Check_Policy_List);
12171               Opt.Check_Policy_List := N;
12172
12173            --  For the new syntax, what we do is to convert each argument to
12174            --  an old syntax equivalent. We do that because we want to chain
12175            --  old style Check_Policy pragmas for the search (we don't want
12176            --  to have to deal with multiple arguments in the search).
12177
12178            else
12179               declare
12180                  Arg  : Node_Id;
12181                  Argx : Node_Id;
12182                  LocP : Source_Ptr;
12183
12184               begin
12185                  Arg := Arg1;
12186                  while Present (Arg) loop
12187                     LocP := Sloc (Arg);
12188                     Argx := Get_Pragma_Arg (Arg);
12189
12190                     --  Kind must be specified
12191
12192                     if Nkind (Arg) /= N_Pragma_Argument_Association
12193                       or else Chars (Arg) = No_Name
12194                     then
12195                        Error_Pragma_Arg
12196                          ("missing assertion kind for pragma%", Arg);
12197                     end if;
12198
12199                     --  Construct equivalent old form syntax Check_Policy
12200                     --  pragma and insert it to get remaining checks.
12201
12202                     Insert_Action (N,
12203                       Make_Pragma (LocP,
12204                         Chars                        => Name_Check_Policy,
12205                         Pragma_Argument_Associations => New_List (
12206                           Make_Pragma_Argument_Association (LocP,
12207                             Expression =>
12208                               Make_Identifier (LocP, Chars (Arg))),
12209                           Make_Pragma_Argument_Association (Sloc (Argx),
12210                             Expression => Argx))));
12211
12212                     Arg := Next (Arg);
12213                  end loop;
12214
12215                  --  Rewrite original Check_Policy pragma to null, since we
12216                  --  have converted it into a series of old syntax pragmas.
12217
12218                  Rewrite (N, Make_Null_Statement (Loc));
12219                  Analyze (N);
12220               end;
12221            end if;
12222         end Check_Policy;
12223
12224         ---------------------
12225         -- CIL_Constructor --
12226         ---------------------
12227
12228         --  pragma CIL_Constructor ([Entity =>] LOCAL_NAME);
12229
12230         --  Processing for this pragma is shared with Java_Constructor
12231
12232         -------------
12233         -- Comment --
12234         -------------
12235
12236         --  pragma Comment (static_string_EXPRESSION)
12237
12238         --  Processing for pragma Comment shares the circuitry for pragma
12239         --  Ident. The only differences are that Ident enforces a limit of 31
12240         --  characters on its argument, and also enforces limitations on
12241         --  placement for DEC compatibility. Pragma Comment shares neither of
12242         --  these restrictions.
12243
12244         -------------------
12245         -- Common_Object --
12246         -------------------
12247
12248         --  pragma Common_Object (
12249         --        [Internal =>] LOCAL_NAME
12250         --     [, [External =>] EXTERNAL_SYMBOL]
12251         --     [, [Size     =>] EXTERNAL_SYMBOL]);
12252
12253         --  Processing for this pragma is shared with Psect_Object
12254
12255         ------------------------
12256         -- Compile_Time_Error --
12257         ------------------------
12258
12259         --  pragma Compile_Time_Error
12260         --    (boolean_EXPRESSION, static_string_EXPRESSION);
12261
12262         when Pragma_Compile_Time_Error =>
12263            GNAT_Pragma;
12264            Process_Compile_Time_Warning_Or_Error;
12265
12266         --------------------------
12267         -- Compile_Time_Warning --
12268         --------------------------
12269
12270         --  pragma Compile_Time_Warning
12271         --    (boolean_EXPRESSION, static_string_EXPRESSION);
12272
12273         when Pragma_Compile_Time_Warning =>
12274            GNAT_Pragma;
12275            Process_Compile_Time_Warning_Or_Error;
12276
12277         ---------------------------
12278         -- Compiler_Unit_Warning --
12279         ---------------------------
12280
12281         --  pragma Compiler_Unit_Warning;
12282
12283         --  Historical note
12284
12285         --  Originally, we had only pragma Compiler_Unit, and it resulted in
12286         --  errors not warnings. This means that we had introduced a big extra
12287         --  inertia to compiler changes, since even if we implemented a new
12288         --  feature, and even if all versions to be used for bootstrapping
12289         --  implemented this new feature, we could not use it, since old
12290         --  compilers would give errors for using this feature in units
12291         --  having Compiler_Unit pragmas.
12292
12293         --  By changing Compiler_Unit to Compiler_Unit_Warning, we solve the
12294         --  problem. We no longer have any units mentioning Compiler_Unit,
12295         --  so old compilers see Compiler_Unit_Warning which is unrecognized,
12296         --  and thus generates a warning which can be ignored. So that deals
12297         --  with the problem of old compilers not implementing the newer form
12298         --  of the pragma.
12299
12300         --  Newer compilers recognize the new pragma, but generate warning
12301         --  messages instead of errors, which again can be ignored in the
12302         --  case of an old compiler which implements a wanted new feature
12303         --  but at the time felt like warning about it for older compilers.
12304
12305         --  We retain Compiler_Unit so that new compilers can be used to build
12306         --  older run-times that use this pragma. That's an unusual case, but
12307         --  it's easy enough to handle, so why not?
12308
12309         when Pragma_Compiler_Unit | Pragma_Compiler_Unit_Warning =>
12310            GNAT_Pragma;
12311            Check_Arg_Count (0);
12312            Set_Is_Compiler_Unit (Get_Source_Unit (N));
12313
12314         -----------------------------
12315         -- Complete_Representation --
12316         -----------------------------
12317
12318         --  pragma Complete_Representation;
12319
12320         when Pragma_Complete_Representation =>
12321            GNAT_Pragma;
12322            Check_Arg_Count (0);
12323
12324            if Nkind (Parent (N)) /= N_Record_Representation_Clause then
12325               Error_Pragma
12326                 ("pragma & must appear within record representation clause");
12327            end if;
12328
12329         ----------------------------
12330         -- Complex_Representation --
12331         ----------------------------
12332
12333         --  pragma Complex_Representation ([Entity =>] LOCAL_NAME);
12334
12335         when Pragma_Complex_Representation => Complex_Representation : declare
12336            E_Id : Entity_Id;
12337            E    : Entity_Id;
12338            Ent  : Entity_Id;
12339
12340         begin
12341            GNAT_Pragma;
12342            Check_Arg_Count (1);
12343            Check_Optional_Identifier (Arg1, Name_Entity);
12344            Check_Arg_Is_Local_Name (Arg1);
12345            E_Id := Get_Pragma_Arg (Arg1);
12346
12347            if Etype (E_Id) = Any_Type then
12348               return;
12349            end if;
12350
12351            E := Entity (E_Id);
12352
12353            if not Is_Record_Type (E) then
12354               Error_Pragma_Arg
12355                 ("argument for pragma% must be record type", Arg1);
12356            end if;
12357
12358            Ent := First_Entity (E);
12359
12360            if No (Ent)
12361              or else No (Next_Entity (Ent))
12362              or else Present (Next_Entity (Next_Entity (Ent)))
12363              or else not Is_Floating_Point_Type (Etype (Ent))
12364              or else Etype (Ent) /= Etype (Next_Entity (Ent))
12365            then
12366               Error_Pragma_Arg
12367                 ("record for pragma% must have two fields of the same "
12368                  & "floating-point type", Arg1);
12369
12370            else
12371               Set_Has_Complex_Representation (Base_Type (E));
12372
12373               --  We need to treat the type has having a non-standard
12374               --  representation, for back-end purposes, even though in
12375               --  general a complex will have the default representation
12376               --  of a record with two real components.
12377
12378               Set_Has_Non_Standard_Rep (Base_Type (E));
12379            end if;
12380         end Complex_Representation;
12381
12382         -------------------------
12383         -- Component_Alignment --
12384         -------------------------
12385
12386         --  pragma Component_Alignment (
12387         --        [Form =>] ALIGNMENT_CHOICE
12388         --     [, [Name =>] type_LOCAL_NAME]);
12389         --
12390         --   ALIGNMENT_CHOICE ::=
12391         --     Component_Size
12392         --   | Component_Size_4
12393         --   | Storage_Unit
12394         --   | Default
12395
12396         when Pragma_Component_Alignment => Component_AlignmentP : declare
12397            Args  : Args_List (1 .. 2);
12398            Names : constant Name_List (1 .. 2) := (
12399                      Name_Form,
12400                      Name_Name);
12401
12402            Form  : Node_Id renames Args (1);
12403            Name  : Node_Id renames Args (2);
12404
12405            Atype : Component_Alignment_Kind;
12406            Typ   : Entity_Id;
12407
12408         begin
12409            GNAT_Pragma;
12410            Gather_Associations (Names, Args);
12411
12412            if No (Form) then
12413               Error_Pragma ("missing Form argument for pragma%");
12414            end if;
12415
12416            Check_Arg_Is_Identifier (Form);
12417
12418            --  Get proper alignment, note that Default = Component_Size on all
12419            --  machines we have so far, and we want to set this value rather
12420            --  than the default value to indicate that it has been explicitly
12421            --  set (and thus will not get overridden by the default component
12422            --  alignment for the current scope)
12423
12424            if Chars (Form) = Name_Component_Size then
12425               Atype := Calign_Component_Size;
12426
12427            elsif Chars (Form) = Name_Component_Size_4 then
12428               Atype := Calign_Component_Size_4;
12429
12430            elsif Chars (Form) = Name_Default then
12431               Atype := Calign_Component_Size;
12432
12433            elsif Chars (Form) = Name_Storage_Unit then
12434               Atype := Calign_Storage_Unit;
12435
12436            else
12437               Error_Pragma_Arg
12438                 ("invalid Form parameter for pragma%", Form);
12439            end if;
12440
12441            --  Case with no name, supplied, affects scope table entry
12442
12443            if No (Name) then
12444               Scope_Stack.Table
12445                 (Scope_Stack.Last).Component_Alignment_Default := Atype;
12446
12447            --  Case of name supplied
12448
12449            else
12450               Check_Arg_Is_Local_Name (Name);
12451               Find_Type (Name);
12452               Typ := Entity (Name);
12453
12454               if Typ = Any_Type
12455                 or else Rep_Item_Too_Early (Typ, N)
12456               then
12457                  return;
12458               else
12459                  Typ := Underlying_Type (Typ);
12460               end if;
12461
12462               if not Is_Record_Type (Typ)
12463                 and then not Is_Array_Type (Typ)
12464               then
12465                  Error_Pragma_Arg
12466                    ("Name parameter of pragma% must identify record or "
12467                     & "array type", Name);
12468               end if;
12469
12470               --  An explicit Component_Alignment pragma overrides an
12471               --  implicit pragma Pack, but not an explicit one.
12472
12473               if not Has_Pragma_Pack (Base_Type (Typ)) then
12474                  Set_Is_Packed (Base_Type (Typ), False);
12475                  Set_Component_Alignment (Base_Type (Typ), Atype);
12476               end if;
12477            end if;
12478         end Component_AlignmentP;
12479
12480         --------------------
12481         -- Contract_Cases --
12482         --------------------
12483
12484         --  pragma Contract_Cases ((CONTRACT_CASE {, CONTRACT_CASE));
12485
12486         --  CONTRACT_CASE ::= CASE_GUARD => CONSEQUENCE
12487
12488         --  CASE_GUARD ::= boolean_EXPRESSION | others
12489
12490         --  CONSEQUENCE ::= boolean_EXPRESSION
12491
12492         when Pragma_Contract_Cases => Contract_Cases : declare
12493            Subp_Decl : Node_Id;
12494
12495         begin
12496            GNAT_Pragma;
12497            Check_Arg_Count (1);
12498            Ensure_Aggregate_Form (Arg1);
12499
12500            --  The pragma is analyzed at the end of the declarative part which
12501            --  contains the related subprogram. Reset the analyzed flag.
12502
12503            Set_Analyzed (N, False);
12504
12505            --  Ensure the proper placement of the pragma. Contract_Cases must
12506            --  be associated with a subprogram declaration or a body that acts
12507            --  as a spec.
12508
12509            Subp_Decl :=
12510              Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
12511
12512            if Nkind (Subp_Decl) = N_Subprogram_Declaration then
12513               null;
12514
12515            --  Body acts as spec
12516
12517            elsif Nkind (Subp_Decl) = N_Subprogram_Body
12518              and then No (Corresponding_Spec (Subp_Decl))
12519            then
12520               null;
12521
12522            --  Body stub acts as spec
12523
12524            elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub
12525              and then No (Corresponding_Spec_Of_Stub (Subp_Decl))
12526            then
12527               null;
12528
12529            else
12530               Pragma_Misplaced;
12531               return;
12532            end if;
12533
12534            --  When the pragma appears on a subprogram body, perform the full
12535            --  analysis now.
12536
12537            if Nkind (Subp_Decl) = N_Subprogram_Body then
12538               Analyze_Contract_Cases_In_Decl_Part (N);
12539
12540            --  When Contract_Cases applies to a subprogram compilation unit,
12541            --  the corresponding pragma is placed after the unit's declaration
12542            --  node and needs to be analyzed immediately.
12543
12544            elsif Nkind (Subp_Decl) = N_Subprogram_Declaration
12545              and then Nkind (Parent (Subp_Decl)) = N_Compilation_Unit
12546            then
12547               Analyze_Contract_Cases_In_Decl_Part (N);
12548            end if;
12549
12550            --  Chain the pragma on the contract for further processing
12551
12552            Add_Contract_Item (N, Defining_Entity (Subp_Decl));
12553         end Contract_Cases;
12554
12555         ----------------
12556         -- Controlled --
12557         ----------------
12558
12559         --  pragma Controlled (first_subtype_LOCAL_NAME);
12560
12561         when Pragma_Controlled => Controlled : declare
12562            Arg : Node_Id;
12563
12564         begin
12565            Check_No_Identifiers;
12566            Check_Arg_Count (1);
12567            Check_Arg_Is_Local_Name (Arg1);
12568            Arg := Get_Pragma_Arg (Arg1);
12569
12570            if not Is_Entity_Name (Arg)
12571              or else not Is_Access_Type (Entity (Arg))
12572            then
12573               Error_Pragma_Arg ("pragma% requires access type", Arg1);
12574            else
12575               Set_Has_Pragma_Controlled (Base_Type (Entity (Arg)));
12576            end if;
12577         end Controlled;
12578
12579         ----------------
12580         -- Convention --
12581         ----------------
12582
12583         --  pragma Convention ([Convention =>] convention_IDENTIFIER,
12584         --    [Entity =>] LOCAL_NAME);
12585
12586         when Pragma_Convention => Convention : declare
12587            C : Convention_Id;
12588            E : Entity_Id;
12589            pragma Warnings (Off, C);
12590            pragma Warnings (Off, E);
12591         begin
12592            Check_Arg_Order ((Name_Convention, Name_Entity));
12593            Check_Ada_83_Warning;
12594            Check_Arg_Count (2);
12595            Process_Convention (C, E);
12596         end Convention;
12597
12598         ---------------------------
12599         -- Convention_Identifier --
12600         ---------------------------
12601
12602         --  pragma Convention_Identifier ([Name =>] IDENTIFIER,
12603         --    [Convention =>] convention_IDENTIFIER);
12604
12605         when Pragma_Convention_Identifier => Convention_Identifier : declare
12606            Idnam : Name_Id;
12607            Cname : Name_Id;
12608
12609         begin
12610            GNAT_Pragma;
12611            Check_Arg_Order ((Name_Name, Name_Convention));
12612            Check_Arg_Count (2);
12613            Check_Optional_Identifier (Arg1, Name_Name);
12614            Check_Optional_Identifier (Arg2, Name_Convention);
12615            Check_Arg_Is_Identifier (Arg1);
12616            Check_Arg_Is_Identifier (Arg2);
12617            Idnam := Chars (Get_Pragma_Arg (Arg1));
12618            Cname := Chars (Get_Pragma_Arg (Arg2));
12619
12620            if Is_Convention_Name (Cname) then
12621               Record_Convention_Identifier
12622                 (Idnam, Get_Convention_Id (Cname));
12623            else
12624               Error_Pragma_Arg
12625                 ("second arg for % pragma must be convention", Arg2);
12626            end if;
12627         end Convention_Identifier;
12628
12629         ---------------
12630         -- CPP_Class --
12631         ---------------
12632
12633         --  pragma CPP_Class ([Entity =>] local_NAME)
12634
12635         when Pragma_CPP_Class => CPP_Class : declare
12636         begin
12637            GNAT_Pragma;
12638
12639            if Warn_On_Obsolescent_Feature then
12640               Error_Msg_N
12641                 ("'G'N'A'T pragma cpp'_class is now obsolete and has no "
12642                  & "effect; replace it by pragma import?j?", N);
12643            end if;
12644
12645            Check_Arg_Count (1);
12646
12647            Rewrite (N,
12648              Make_Pragma (Loc,
12649                Chars                        => Name_Import,
12650                Pragma_Argument_Associations => New_List (
12651                  Make_Pragma_Argument_Association (Loc,
12652                    Expression => Make_Identifier (Loc, Name_CPP)),
12653                  New_Copy (First (Pragma_Argument_Associations (N))))));
12654            Analyze (N);
12655         end CPP_Class;
12656
12657         ---------------------
12658         -- CPP_Constructor --
12659         ---------------------
12660
12661         --  pragma CPP_Constructor ([Entity =>] LOCAL_NAME
12662         --    [, [External_Name =>] static_string_EXPRESSION ]
12663         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
12664
12665         when Pragma_CPP_Constructor => CPP_Constructor : declare
12666            Elmt    : Elmt_Id;
12667            Id      : Entity_Id;
12668            Def_Id  : Entity_Id;
12669            Tag_Typ : Entity_Id;
12670
12671         begin
12672            GNAT_Pragma;
12673            Check_At_Least_N_Arguments (1);
12674            Check_At_Most_N_Arguments (3);
12675            Check_Optional_Identifier (Arg1, Name_Entity);
12676            Check_Arg_Is_Local_Name (Arg1);
12677
12678            Id := Get_Pragma_Arg (Arg1);
12679            Find_Program_Unit_Name (Id);
12680
12681            --  If we did not find the name, we are done
12682
12683            if Etype (Id) = Any_Type then
12684               return;
12685            end if;
12686
12687            Def_Id := Entity (Id);
12688
12689            --  Check if already defined as constructor
12690
12691            if Is_Constructor (Def_Id) then
12692               Error_Msg_N
12693                 ("??duplicate argument for pragma 'C'P'P_Constructor", Arg1);
12694               return;
12695            end if;
12696
12697            if Ekind (Def_Id) = E_Function
12698              and then (Is_CPP_Class (Etype (Def_Id))
12699                         or else (Is_Class_Wide_Type (Etype (Def_Id))
12700                                   and then
12701                                  Is_CPP_Class (Root_Type (Etype (Def_Id)))))
12702            then
12703               if Scope (Def_Id) /= Scope (Etype (Def_Id)) then
12704                  Error_Msg_N
12705                    ("'C'P'P constructor must be defined in the scope of "
12706                     & "its returned type", Arg1);
12707               end if;
12708
12709               if Arg_Count >= 2 then
12710                  Set_Imported (Def_Id);
12711                  Set_Is_Public (Def_Id);
12712                  Process_Interface_Name (Def_Id, Arg2, Arg3);
12713               end if;
12714
12715               Set_Has_Completion (Def_Id);
12716               Set_Is_Constructor (Def_Id);
12717               Set_Convention (Def_Id, Convention_CPP);
12718
12719               --  Imported C++ constructors are not dispatching primitives
12720               --  because in C++ they don't have a dispatch table slot.
12721               --  However, in Ada the constructor has the profile of a
12722               --  function that returns a tagged type and therefore it has
12723               --  been treated as a primitive operation during semantic
12724               --  analysis. We now remove it from the list of primitive
12725               --  operations of the type.
12726
12727               if Is_Tagged_Type (Etype (Def_Id))
12728                 and then not Is_Class_Wide_Type (Etype (Def_Id))
12729                 and then Is_Dispatching_Operation (Def_Id)
12730               then
12731                  Tag_Typ := Etype (Def_Id);
12732
12733                  Elmt := First_Elmt (Primitive_Operations (Tag_Typ));
12734                  while Present (Elmt) and then Node (Elmt) /= Def_Id loop
12735                     Next_Elmt (Elmt);
12736                  end loop;
12737
12738                  Remove_Elmt (Primitive_Operations (Tag_Typ), Elmt);
12739                  Set_Is_Dispatching_Operation (Def_Id, False);
12740               end if;
12741
12742               --  For backward compatibility, if the constructor returns a
12743               --  class wide type, and we internally change the return type to
12744               --  the corresponding root type.
12745
12746               if Is_Class_Wide_Type (Etype (Def_Id)) then
12747                  Set_Etype (Def_Id, Root_Type (Etype (Def_Id)));
12748               end if;
12749            else
12750               Error_Pragma_Arg
12751                 ("pragma% requires function returning a 'C'P'P_Class type",
12752                   Arg1);
12753            end if;
12754         end CPP_Constructor;
12755
12756         -----------------
12757         -- CPP_Virtual --
12758         -----------------
12759
12760         when Pragma_CPP_Virtual => CPP_Virtual : declare
12761         begin
12762            GNAT_Pragma;
12763
12764            if Warn_On_Obsolescent_Feature then
12765               Error_Msg_N
12766                 ("'G'N'A'T pragma Cpp'_Virtual is now obsolete and has no "
12767                  & "effect?j?", N);
12768            end if;
12769         end CPP_Virtual;
12770
12771         ----------------
12772         -- CPP_Vtable --
12773         ----------------
12774
12775         when Pragma_CPP_Vtable => CPP_Vtable : declare
12776         begin
12777            GNAT_Pragma;
12778
12779            if Warn_On_Obsolescent_Feature then
12780               Error_Msg_N
12781                 ("'G'N'A'T pragma Cpp'_Vtable is now obsolete and has no "
12782                  & "effect?j?", N);
12783            end if;
12784         end CPP_Vtable;
12785
12786         ---------
12787         -- CPU --
12788         ---------
12789
12790         --  pragma CPU (EXPRESSION);
12791
12792         when Pragma_CPU => CPU : declare
12793            P   : constant Node_Id := Parent (N);
12794            Arg : Node_Id;
12795            Ent : Entity_Id;
12796
12797         begin
12798            Ada_2012_Pragma;
12799            Check_No_Identifiers;
12800            Check_Arg_Count (1);
12801
12802            --  Subprogram case
12803
12804            if Nkind (P) = N_Subprogram_Body then
12805               Check_In_Main_Program;
12806
12807               Arg := Get_Pragma_Arg (Arg1);
12808               Analyze_And_Resolve (Arg, Any_Integer);
12809
12810               Ent := Defining_Unit_Name (Specification (P));
12811
12812               if Nkind (Ent) = N_Defining_Program_Unit_Name then
12813                  Ent := Defining_Identifier (Ent);
12814               end if;
12815
12816               --  Must be static
12817
12818               if not Is_Static_Expression (Arg) then
12819                  Flag_Non_Static_Expr
12820                    ("main subprogram affinity is not static!", Arg);
12821                  raise Pragma_Exit;
12822
12823               --  If constraint error, then we already signalled an error
12824
12825               elsif Raises_Constraint_Error (Arg) then
12826                  null;
12827
12828               --  Otherwise check in range
12829
12830               else
12831                  declare
12832                     CPU_Id : constant Entity_Id := RTE (RE_CPU_Range);
12833                     --  This is the entity System.Multiprocessors.CPU_Range;
12834
12835                     Val : constant Uint := Expr_Value (Arg);
12836
12837                  begin
12838                     if Val < Expr_Value (Type_Low_Bound (CPU_Id))
12839                          or else
12840                        Val > Expr_Value (Type_High_Bound (CPU_Id))
12841                     then
12842                        Error_Pragma_Arg
12843                          ("main subprogram CPU is out of range", Arg1);
12844                     end if;
12845                  end;
12846               end if;
12847
12848               Set_Main_CPU
12849                    (Current_Sem_Unit, UI_To_Int (Expr_Value (Arg)));
12850
12851            --  Task case
12852
12853            elsif Nkind (P) = N_Task_Definition then
12854               Arg := Get_Pragma_Arg (Arg1);
12855               Ent := Defining_Identifier (Parent (P));
12856
12857               --  The expression must be analyzed in the special manner
12858               --  described in "Handling of Default and Per-Object
12859               --  Expressions" in sem.ads.
12860
12861               Preanalyze_Spec_Expression (Arg, RTE (RE_CPU_Range));
12862
12863            --  Anything else is incorrect
12864
12865            else
12866               Pragma_Misplaced;
12867            end if;
12868
12869            --  Check duplicate pragma before we chain the pragma in the Rep
12870            --  Item chain of Ent.
12871
12872            Check_Duplicate_Pragma (Ent);
12873            Record_Rep_Item (Ent, N);
12874         end CPU;
12875
12876         -----------
12877         -- Debug --
12878         -----------
12879
12880         --  pragma Debug ([boolean_EXPRESSION,] PROCEDURE_CALL_STATEMENT);
12881
12882         when Pragma_Debug => Debug : declare
12883            Cond : Node_Id;
12884            Call : Node_Id;
12885
12886         begin
12887            GNAT_Pragma;
12888
12889            --  The condition for executing the call is that the expander
12890            --  is active and that we are not ignoring this debug pragma.
12891
12892            Cond :=
12893              New_Occurrence_Of
12894                (Boolean_Literals
12895                  (Expander_Active and then not Is_Ignored (N)),
12896                 Loc);
12897
12898            if not Is_Ignored (N) then
12899               Set_SCO_Pragma_Enabled (Loc);
12900            end if;
12901
12902            if Arg_Count = 2 then
12903               Cond :=
12904                 Make_And_Then (Loc,
12905                   Left_Opnd  => Relocate_Node (Cond),
12906                   Right_Opnd => Get_Pragma_Arg (Arg1));
12907               Call := Get_Pragma_Arg (Arg2);
12908            else
12909               Call := Get_Pragma_Arg (Arg1);
12910            end if;
12911
12912            if Nkind_In (Call,
12913                 N_Indexed_Component,
12914                 N_Function_Call,
12915                 N_Identifier,
12916                 N_Expanded_Name,
12917                 N_Selected_Component)
12918            then
12919               --  If this pragma Debug comes from source, its argument was
12920               --  parsed as a name form (which is syntactically identical).
12921               --  In a generic context a parameterless call will be left as
12922               --  an expanded name (if global) or selected_component if local.
12923               --  Change it to a procedure call statement now.
12924
12925               Change_Name_To_Procedure_Call_Statement (Call);
12926
12927            elsif Nkind (Call) = N_Procedure_Call_Statement then
12928
12929               --  Already in the form of a procedure call statement: nothing
12930               --  to do (could happen in case of an internally generated
12931               --  pragma Debug).
12932
12933               null;
12934
12935            else
12936               --  All other cases: diagnose error
12937
12938               Error_Msg
12939                 ("argument of pragma ""Debug"" is not procedure call",
12940                  Sloc (Call));
12941               return;
12942            end if;
12943
12944            --  Rewrite into a conditional with an appropriate condition. We
12945            --  wrap the procedure call in a block so that overhead from e.g.
12946            --  use of the secondary stack does not generate execution overhead
12947            --  for suppressed conditions.
12948
12949            --  Normally the analysis that follows will freeze the subprogram
12950            --  being called. However, if the call is to a null procedure,
12951            --  we want to freeze it before creating the block, because the
12952            --  analysis that follows may be done with expansion disabled, in
12953            --  which case the body will not be generated, leading to spurious
12954            --  errors.
12955
12956            if Nkind (Call) = N_Procedure_Call_Statement
12957              and then Is_Entity_Name (Name (Call))
12958            then
12959               Analyze (Name (Call));
12960               Freeze_Before (N, Entity (Name (Call)));
12961            end if;
12962
12963            Rewrite (N,
12964              Make_Implicit_If_Statement (N,
12965                Condition       => Cond,
12966                Then_Statements => New_List (
12967                  Make_Block_Statement (Loc,
12968                    Handled_Statement_Sequence =>
12969                      Make_Handled_Sequence_Of_Statements (Loc,
12970                        Statements => New_List (Relocate_Node (Call)))))));
12971            Analyze (N);
12972
12973            --  Ignore pragma Debug in GNATprove mode. Do this rewriting
12974            --  after analysis of the normally rewritten node, to capture all
12975            --  references to entities, which avoids issuing wrong warnings
12976            --  about unused entities.
12977
12978            if GNATprove_Mode then
12979               Rewrite (N, Make_Null_Statement (Loc));
12980            end if;
12981         end Debug;
12982
12983         ------------------
12984         -- Debug_Policy --
12985         ------------------
12986
12987         --  pragma Debug_Policy (On | Off | Check | Disable | Ignore)
12988
12989         when Pragma_Debug_Policy =>
12990            GNAT_Pragma;
12991            Check_Arg_Count (1);
12992            Check_No_Identifiers;
12993            Check_Arg_Is_Identifier (Arg1);
12994
12995            --  Exactly equivalent to pragma Check_Policy (Debug, arg), so
12996            --  rewrite it that way, and let the rest of the checking come
12997            --  from analyzing the rewritten pragma.
12998
12999            Rewrite (N,
13000              Make_Pragma (Loc,
13001                Chars                        => Name_Check_Policy,
13002                Pragma_Argument_Associations => New_List (
13003                  Make_Pragma_Argument_Association (Loc,
13004                    Expression => Make_Identifier (Loc, Name_Debug)),
13005
13006                  Make_Pragma_Argument_Association (Loc,
13007                    Expression => Get_Pragma_Arg (Arg1)))));
13008            Analyze (N);
13009
13010         -------------
13011         -- Depends --
13012         -------------
13013
13014         --  pragma Depends (DEPENDENCY_RELATION);
13015
13016         --  DEPENDENCY_RELATION ::=
13017         --    null
13018         --  | DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE}
13019
13020         --  DEPENDENCY_CLAUSE ::=
13021         --    OUTPUT_LIST =>[+] INPUT_LIST
13022         --  | NULL_DEPENDENCY_CLAUSE
13023
13024         --  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST
13025
13026         --  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})
13027
13028         --  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})
13029
13030         --  OUTPUT ::= NAME | FUNCTION_RESULT
13031         --  INPUT  ::= NAME
13032
13033         --  where FUNCTION_RESULT is a function Result attribute_reference
13034
13035         when Pragma_Depends => Depends : declare
13036            Subp_Decl : Node_Id;
13037
13038         begin
13039            GNAT_Pragma;
13040            Check_Arg_Count (1);
13041            Ensure_Aggregate_Form (Arg1);
13042
13043            --  Ensure the proper placement of the pragma. Depends must be
13044            --  associated with a subprogram declaration or a body that acts
13045            --  as a spec.
13046
13047            Subp_Decl :=
13048              Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
13049
13050            if Nkind (Subp_Decl) = N_Subprogram_Declaration then
13051               null;
13052
13053            --  Body acts as spec
13054
13055            elsif Nkind (Subp_Decl) = N_Subprogram_Body
13056              and then No (Corresponding_Spec (Subp_Decl))
13057            then
13058               null;
13059
13060            --  Body stub acts as spec
13061
13062            elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub
13063              and then No (Corresponding_Spec_Of_Stub (Subp_Decl))
13064            then
13065               null;
13066
13067            else
13068               Pragma_Misplaced;
13069               return;
13070            end if;
13071
13072            --  When the pragma appears on a subprogram body, perform the full
13073            --  analysis now.
13074
13075            if Nkind (Subp_Decl) = N_Subprogram_Body then
13076               Analyze_Depends_In_Decl_Part (N);
13077
13078            --  When Depends applies to a subprogram compilation unit, the
13079            --  corresponding pragma is placed after the unit's declaration
13080            --  node and needs to be analyzed immediately.
13081
13082            elsif Nkind (Subp_Decl) = N_Subprogram_Declaration
13083              and then Nkind (Parent (Subp_Decl)) = N_Compilation_Unit
13084            then
13085               Analyze_Depends_In_Decl_Part (N);
13086            end if;
13087
13088            --  Chain the pragma on the contract for further processing
13089
13090            Add_Contract_Item (N, Defining_Entity (Subp_Decl));
13091         end Depends;
13092
13093         ---------------------
13094         -- Detect_Blocking --
13095         ---------------------
13096
13097         --  pragma Detect_Blocking;
13098
13099         when Pragma_Detect_Blocking =>
13100            Ada_2005_Pragma;
13101            Check_Arg_Count (0);
13102            Check_Valid_Configuration_Pragma;
13103            Detect_Blocking := True;
13104
13105         --------------------------
13106         -- Default_Storage_Pool --
13107         --------------------------
13108
13109         --  pragma Default_Storage_Pool (storage_pool_NAME | null);
13110
13111         when Pragma_Default_Storage_Pool =>
13112            Ada_2012_Pragma;
13113            Check_Arg_Count (1);
13114
13115            --  Default_Storage_Pool can appear as a configuration pragma, or
13116            --  in a declarative part or a package spec.
13117
13118            if not Is_Configuration_Pragma then
13119               Check_Is_In_Decl_Part_Or_Package_Spec;
13120            end if;
13121
13122            --  Case of Default_Storage_Pool (null);
13123
13124            if Nkind (Expression (Arg1)) = N_Null then
13125               Analyze (Expression (Arg1));
13126
13127               --  This is an odd case, this is not really an expression, so
13128               --  we don't have a type for it. So just set the type to Empty.
13129
13130               Set_Etype (Expression (Arg1), Empty);
13131
13132            --  Case of Default_Storage_Pool (storage_pool_NAME);
13133
13134            else
13135               --  If it's a configuration pragma, then the only allowed
13136               --  argument is "null".
13137
13138               if Is_Configuration_Pragma then
13139                  Error_Pragma_Arg ("NULL expected", Arg1);
13140               end if;
13141
13142               --  The expected type for a non-"null" argument is
13143               --  Root_Storage_Pool'Class.
13144
13145               Analyze_And_Resolve
13146                 (Get_Pragma_Arg (Arg1),
13147                  Typ => Class_Wide_Type (RTE (RE_Root_Storage_Pool)));
13148            end if;
13149
13150            --  Finally, record the pool name (or null). Freeze.Freeze_Entity
13151            --  for an access type will use this information to set the
13152            --  appropriate attributes of the access type.
13153
13154            Default_Pool := Expression (Arg1);
13155
13156         ------------------------------------
13157         -- Disable_Atomic_Synchronization --
13158         ------------------------------------
13159
13160         --  pragma Disable_Atomic_Synchronization [(Entity)];
13161
13162         when Pragma_Disable_Atomic_Synchronization =>
13163            GNAT_Pragma;
13164            Process_Disable_Enable_Atomic_Sync (Name_Suppress);
13165
13166         -------------------
13167         -- Discard_Names --
13168         -------------------
13169
13170         --  pragma Discard_Names [([On =>] LOCAL_NAME)];
13171
13172         when Pragma_Discard_Names => Discard_Names : declare
13173            E    : Entity_Id;
13174            E_Id : Entity_Id;
13175
13176         begin
13177            Check_Ada_83_Warning;
13178
13179            --  Deal with configuration pragma case
13180
13181            if Arg_Count = 0 and then Is_Configuration_Pragma then
13182               Global_Discard_Names := True;
13183               return;
13184
13185            --  Otherwise, check correct appropriate context
13186
13187            else
13188               Check_Is_In_Decl_Part_Or_Package_Spec;
13189
13190               if Arg_Count = 0 then
13191
13192                  --  If there is no parameter, then from now on this pragma
13193                  --  applies to any enumeration, exception or tagged type
13194                  --  defined in the current declarative part, and recursively
13195                  --  to any nested scope.
13196
13197                  Set_Discard_Names (Current_Scope);
13198                  return;
13199
13200               else
13201                  Check_Arg_Count (1);
13202                  Check_Optional_Identifier (Arg1, Name_On);
13203                  Check_Arg_Is_Local_Name (Arg1);
13204
13205                  E_Id := Get_Pragma_Arg (Arg1);
13206
13207                  if Etype (E_Id) = Any_Type then
13208                     return;
13209                  else
13210                     E := Entity (E_Id);
13211                  end if;
13212
13213                  if (Is_First_Subtype (E)
13214                      and then
13215                        (Is_Enumeration_Type (E) or else Is_Tagged_Type (E)))
13216                    or else Ekind (E) = E_Exception
13217                  then
13218                     Set_Discard_Names (E);
13219                     Record_Rep_Item (E, N);
13220
13221                  else
13222                     Error_Pragma_Arg
13223                       ("inappropriate entity for pragma%", Arg1);
13224                  end if;
13225
13226               end if;
13227            end if;
13228         end Discard_Names;
13229
13230         ------------------------
13231         -- Dispatching_Domain --
13232         ------------------------
13233
13234         --  pragma Dispatching_Domain (EXPRESSION);
13235
13236         when Pragma_Dispatching_Domain => Dispatching_Domain : declare
13237            P   : constant Node_Id := Parent (N);
13238            Arg : Node_Id;
13239            Ent : Entity_Id;
13240
13241         begin
13242            Ada_2012_Pragma;
13243            Check_No_Identifiers;
13244            Check_Arg_Count (1);
13245
13246            --  This pragma is born obsolete, but not the aspect
13247
13248            if not From_Aspect_Specification (N) then
13249               Check_Restriction
13250                 (No_Obsolescent_Features, Pragma_Identifier (N));
13251            end if;
13252
13253            if Nkind (P) = N_Task_Definition then
13254               Arg := Get_Pragma_Arg (Arg1);
13255               Ent := Defining_Identifier (Parent (P));
13256
13257               --  The expression must be analyzed in the special manner
13258               --  described in "Handling of Default and Per-Object
13259               --  Expressions" in sem.ads.
13260
13261               Preanalyze_Spec_Expression (Arg, RTE (RE_Dispatching_Domain));
13262
13263               --  Check duplicate pragma before we chain the pragma in the Rep
13264               --  Item chain of Ent.
13265
13266               Check_Duplicate_Pragma (Ent);
13267               Record_Rep_Item (Ent, N);
13268
13269            --  Anything else is incorrect
13270
13271            else
13272               Pragma_Misplaced;
13273            end if;
13274         end Dispatching_Domain;
13275
13276         ---------------
13277         -- Elaborate --
13278         ---------------
13279
13280         --  pragma Elaborate (library_unit_NAME {, library_unit_NAME});
13281
13282         when Pragma_Elaborate => Elaborate : declare
13283            Arg   : Node_Id;
13284            Citem : Node_Id;
13285
13286         begin
13287            --  Pragma must be in context items list of a compilation unit
13288
13289            if not Is_In_Context_Clause then
13290               Pragma_Misplaced;
13291            end if;
13292
13293            --  Must be at least one argument
13294
13295            if Arg_Count = 0 then
13296               Error_Pragma ("pragma% requires at least one argument");
13297            end if;
13298
13299            --  In Ada 83 mode, there can be no items following it in the
13300            --  context list except other pragmas and implicit with clauses
13301            --  (e.g. those added by use of Rtsfind). In Ada 95 mode, this
13302            --  placement rule does not apply.
13303
13304            if Ada_Version = Ada_83 and then Comes_From_Source (N) then
13305               Citem := Next (N);
13306               while Present (Citem) loop
13307                  if Nkind (Citem) = N_Pragma
13308                    or else (Nkind (Citem) = N_With_Clause
13309                              and then Implicit_With (Citem))
13310                  then
13311                     null;
13312                  else
13313                     Error_Pragma
13314                       ("(Ada 83) pragma% must be at end of context clause");
13315                  end if;
13316
13317                  Next (Citem);
13318               end loop;
13319            end if;
13320
13321            --  Finally, the arguments must all be units mentioned in a with
13322            --  clause in the same context clause. Note we already checked (in
13323            --  Par.Prag) that the arguments are all identifiers or selected
13324            --  components.
13325
13326            Arg := Arg1;
13327            Outer : while Present (Arg) loop
13328               Citem := First (List_Containing (N));
13329               Inner : while Citem /= N loop
13330                  if Nkind (Citem) = N_With_Clause
13331                    and then Same_Name (Name (Citem), Get_Pragma_Arg (Arg))
13332                  then
13333                     Set_Elaborate_Present (Citem, True);
13334                     Set_Unit_Name (Get_Pragma_Arg (Arg), Name (Citem));
13335                     Generate_Reference (Entity (Name (Citem)), Citem);
13336
13337                     --  With the pragma present, elaboration calls on
13338                     --  subprograms from the named unit need no further
13339                     --  checks, as long as the pragma appears in the current
13340                     --  compilation unit. If the pragma appears in some unit
13341                     --  in the context, there might still be a need for an
13342                     --  Elaborate_All_Desirable from the current compilation
13343                     --  to the named unit, so we keep the check enabled.
13344
13345                     if In_Extended_Main_Source_Unit (N) then
13346                        Set_Suppress_Elaboration_Warnings
13347                          (Entity (Name (Citem)));
13348                     end if;
13349
13350                     exit Inner;
13351                  end if;
13352
13353                  Next (Citem);
13354               end loop Inner;
13355
13356               if Citem = N then
13357                  Error_Pragma_Arg
13358                    ("argument of pragma% is not withed unit", Arg);
13359               end if;
13360
13361               Next (Arg);
13362            end loop Outer;
13363
13364            --  Give a warning if operating in static mode with one of the
13365            --  gnatwl/-gnatwE (elaboration warnings enabled) switches set.
13366
13367            if Elab_Warnings and not Dynamic_Elaboration_Checks then
13368               Error_Msg_N
13369                 ("?l?use of pragma Elaborate may not be safe", N);
13370               Error_Msg_N
13371                 ("?l?use pragma Elaborate_All instead if possible", N);
13372            end if;
13373         end Elaborate;
13374
13375         -------------------
13376         -- Elaborate_All --
13377         -------------------
13378
13379         --  pragma Elaborate_All (library_unit_NAME {, library_unit_NAME});
13380
13381         when Pragma_Elaborate_All => Elaborate_All : declare
13382            Arg   : Node_Id;
13383            Citem : Node_Id;
13384
13385         begin
13386            Check_Ada_83_Warning;
13387
13388            --  Pragma must be in context items list of a compilation unit
13389
13390            if not Is_In_Context_Clause then
13391               Pragma_Misplaced;
13392            end if;
13393
13394            --  Must be at least one argument
13395
13396            if Arg_Count = 0 then
13397               Error_Pragma ("pragma% requires at least one argument");
13398            end if;
13399
13400            --  Note: unlike pragma Elaborate, pragma Elaborate_All does not
13401            --  have to appear at the end of the context clause, but may
13402            --  appear mixed in with other items, even in Ada 83 mode.
13403
13404            --  Final check: the arguments must all be units mentioned in
13405            --  a with clause in the same context clause. Note that we
13406            --  already checked (in Par.Prag) that all the arguments are
13407            --  either identifiers or selected components.
13408
13409            Arg := Arg1;
13410            Outr : while Present (Arg) loop
13411               Citem := First (List_Containing (N));
13412               Innr : while Citem /= N loop
13413                  if Nkind (Citem) = N_With_Clause
13414                    and then Same_Name (Name (Citem), Get_Pragma_Arg (Arg))
13415                  then
13416                     Set_Elaborate_All_Present (Citem, True);
13417                     Set_Unit_Name (Get_Pragma_Arg (Arg), Name (Citem));
13418
13419                     --  Suppress warnings and elaboration checks on the named
13420                     --  unit if the pragma is in the current compilation, as
13421                     --  for pragma Elaborate.
13422
13423                     if In_Extended_Main_Source_Unit (N) then
13424                        Set_Suppress_Elaboration_Warnings
13425                          (Entity (Name (Citem)));
13426                     end if;
13427                     exit Innr;
13428                  end if;
13429
13430                  Next (Citem);
13431               end loop Innr;
13432
13433               if Citem = N then
13434                  Set_Error_Posted (N);
13435                  Error_Pragma_Arg
13436                    ("argument of pragma% is not withed unit", Arg);
13437               end if;
13438
13439               Next (Arg);
13440            end loop Outr;
13441         end Elaborate_All;
13442
13443         --------------------
13444         -- Elaborate_Body --
13445         --------------------
13446
13447         --  pragma Elaborate_Body [( library_unit_NAME )];
13448
13449         when Pragma_Elaborate_Body => Elaborate_Body : declare
13450            Cunit_Node : Node_Id;
13451            Cunit_Ent  : Entity_Id;
13452
13453         begin
13454            Check_Ada_83_Warning;
13455            Check_Valid_Library_Unit_Pragma;
13456
13457            if Nkind (N) = N_Null_Statement then
13458               return;
13459            end if;
13460
13461            Cunit_Node := Cunit (Current_Sem_Unit);
13462            Cunit_Ent  := Cunit_Entity (Current_Sem_Unit);
13463
13464            if Nkind_In (Unit (Cunit_Node), N_Package_Body,
13465                                            N_Subprogram_Body)
13466            then
13467               Error_Pragma ("pragma% must refer to a spec, not a body");
13468            else
13469               Set_Body_Required (Cunit_Node, True);
13470               Set_Has_Pragma_Elaborate_Body (Cunit_Ent);
13471
13472               --  If we are in dynamic elaboration mode, then we suppress
13473               --  elaboration warnings for the unit, since it is definitely
13474               --  fine NOT to do dynamic checks at the first level (and such
13475               --  checks will be suppressed because no elaboration boolean
13476               --  is created for Elaborate_Body packages).
13477
13478               --  But in the static model of elaboration, Elaborate_Body is
13479               --  definitely NOT good enough to ensure elaboration safety on
13480               --  its own, since the body may WITH other units that are not
13481               --  safe from an elaboration point of view, so a client must
13482               --  still do an Elaborate_All on such units.
13483
13484               --  Debug flag -gnatdD restores the old behavior of 3.13, where
13485               --  Elaborate_Body always suppressed elab warnings.
13486
13487               if Dynamic_Elaboration_Checks or Debug_Flag_DD then
13488                  Set_Suppress_Elaboration_Warnings (Cunit_Ent);
13489               end if;
13490            end if;
13491         end Elaborate_Body;
13492
13493         ------------------------
13494         -- Elaboration_Checks --
13495         ------------------------
13496
13497         --  pragma Elaboration_Checks (Static | Dynamic);
13498
13499         when Pragma_Elaboration_Checks =>
13500            GNAT_Pragma;
13501            Check_Arg_Count (1);
13502            Check_Arg_Is_One_Of (Arg1, Name_Static, Name_Dynamic);
13503            Dynamic_Elaboration_Checks :=
13504              (Chars (Get_Pragma_Arg (Arg1)) = Name_Dynamic);
13505
13506         ---------------
13507         -- Eliminate --
13508         ---------------
13509
13510         --  pragma Eliminate (
13511         --      [Unit_Name  =>] IDENTIFIER | SELECTED_COMPONENT,
13512         --    [,[Entity     =>] IDENTIFIER |
13513         --                      SELECTED_COMPONENT |
13514         --                      STRING_LITERAL]
13515         --    [,                OVERLOADING_RESOLUTION]);
13516
13517         --  OVERLOADING_RESOLUTION ::= PARAMETER_AND_RESULT_TYPE_PROFILE |
13518         --                             SOURCE_LOCATION
13519
13520         --  PARAMETER_AND_RESULT_TYPE_PROFILE ::= PROCEDURE_PROFILE |
13521         --                                        FUNCTION_PROFILE
13522
13523         --  PROCEDURE_PROFILE ::= Parameter_Types => PARAMETER_TYPES
13524
13525         --  FUNCTION_PROFILE ::= [Parameter_Types => PARAMETER_TYPES,]
13526         --                       Result_Type => result_SUBTYPE_NAME]
13527
13528         --  PARAMETER_TYPES ::= (SUBTYPE_NAME {, SUBTYPE_NAME})
13529         --  SUBTYPE_NAME    ::= STRING_LITERAL
13530
13531         --  SOURCE_LOCATION ::= Source_Location => SOURCE_TRACE
13532         --  SOURCE_TRACE    ::= STRING_LITERAL
13533
13534         when Pragma_Eliminate => Eliminate : declare
13535            Args  : Args_List (1 .. 5);
13536            Names : constant Name_List (1 .. 5) := (
13537                      Name_Unit_Name,
13538                      Name_Entity,
13539                      Name_Parameter_Types,
13540                      Name_Result_Type,
13541                      Name_Source_Location);
13542
13543            Unit_Name       : Node_Id renames Args (1);
13544            Entity          : Node_Id renames Args (2);
13545            Parameter_Types : Node_Id renames Args (3);
13546            Result_Type     : Node_Id renames Args (4);
13547            Source_Location : Node_Id renames Args (5);
13548
13549         begin
13550            GNAT_Pragma;
13551            Check_Valid_Configuration_Pragma;
13552            Gather_Associations (Names, Args);
13553
13554            if No (Unit_Name) then
13555               Error_Pragma ("missing Unit_Name argument for pragma%");
13556            end if;
13557
13558            if No (Entity)
13559              and then (Present (Parameter_Types)
13560                          or else
13561                        Present (Result_Type)
13562                          or else
13563                        Present (Source_Location))
13564            then
13565               Error_Pragma ("missing Entity argument for pragma%");
13566            end if;
13567
13568            if (Present (Parameter_Types)
13569                  or else
13570                Present (Result_Type))
13571              and then
13572                Present (Source_Location)
13573            then
13574               Error_Pragma
13575                 ("parameter profile and source location cannot be used "
13576                  & "together in pragma%");
13577            end if;
13578
13579            Process_Eliminate_Pragma
13580              (N,
13581               Unit_Name,
13582               Entity,
13583               Parameter_Types,
13584               Result_Type,
13585               Source_Location);
13586         end Eliminate;
13587
13588         -----------------------------------
13589         -- Enable_Atomic_Synchronization --
13590         -----------------------------------
13591
13592         --  pragma Enable_Atomic_Synchronization [(Entity)];
13593
13594         when Pragma_Enable_Atomic_Synchronization =>
13595            GNAT_Pragma;
13596            Process_Disable_Enable_Atomic_Sync (Name_Unsuppress);
13597
13598         ------------
13599         -- Export --
13600         ------------
13601
13602         --  pragma Export (
13603         --    [   Convention    =>] convention_IDENTIFIER,
13604         --    [   Entity        =>] local_NAME
13605         --    [, [External_Name =>] static_string_EXPRESSION ]
13606         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
13607
13608         when Pragma_Export => Export : declare
13609            C      : Convention_Id;
13610            Def_Id : Entity_Id;
13611
13612            pragma Warnings (Off, C);
13613
13614         begin
13615            Check_Ada_83_Warning;
13616            Check_Arg_Order
13617              ((Name_Convention,
13618                Name_Entity,
13619                Name_External_Name,
13620                Name_Link_Name));
13621
13622            Check_At_Least_N_Arguments (2);
13623            Check_At_Most_N_Arguments  (4);
13624
13625            --  In Relaxed_RM_Semantics, support old Ada 83 style:
13626            --  pragma Export (Entity, "external name");
13627
13628            if Relaxed_RM_Semantics
13629              and then Arg_Count = 2
13630              and then Nkind (Expression (Arg2)) = N_String_Literal
13631            then
13632               C := Convention_C;
13633               Def_Id := Get_Pragma_Arg (Arg1);
13634               Analyze (Def_Id);
13635
13636               if not Is_Entity_Name (Def_Id) then
13637                  Error_Pragma_Arg ("entity name required", Arg1);
13638               end if;
13639
13640               Def_Id := Entity (Def_Id);
13641               Set_Exported (Def_Id, Arg1);
13642
13643            else
13644               Process_Convention (C, Def_Id);
13645
13646               if Ekind (Def_Id) /= E_Constant then
13647                  Note_Possible_Modification
13648                    (Get_Pragma_Arg (Arg2), Sure => False);
13649               end if;
13650
13651               Process_Interface_Name (Def_Id, Arg3, Arg4);
13652               Set_Exported (Def_Id, Arg2);
13653            end if;
13654
13655            --  If the entity is a deferred constant, propagate the information
13656            --  to the full view, because gigi elaborates the full view only.
13657
13658            if Ekind (Def_Id) = E_Constant
13659              and then Present (Full_View (Def_Id))
13660            then
13661               declare
13662                  Id2 : constant Entity_Id := Full_View (Def_Id);
13663               begin
13664                  Set_Is_Exported    (Id2, Is_Exported          (Def_Id));
13665                  Set_First_Rep_Item (Id2, First_Rep_Item       (Def_Id));
13666                  Set_Interface_Name (Id2, Einfo.Interface_Name (Def_Id));
13667               end;
13668            end if;
13669         end Export;
13670
13671         ----------------------
13672         -- Export_Exception --
13673         ----------------------
13674
13675         --  pragma Export_Exception (
13676         --        [Internal         =>] LOCAL_NAME
13677         --     [, [External         =>] EXTERNAL_SYMBOL]
13678         --     [, [Form     =>] Ada | VMS]
13679         --     [, [Code     =>] static_integer_EXPRESSION]);
13680
13681         when Pragma_Export_Exception => Export_Exception : declare
13682            Args  : Args_List (1 .. 4);
13683            Names : constant Name_List (1 .. 4) := (
13684                      Name_Internal,
13685                      Name_External,
13686                      Name_Form,
13687                      Name_Code);
13688
13689            Internal : Node_Id renames Args (1);
13690            External : Node_Id renames Args (2);
13691            Form     : Node_Id renames Args (3);
13692            Code     : Node_Id renames Args (4);
13693
13694         begin
13695            GNAT_Pragma;
13696
13697            if Inside_A_Generic then
13698               Error_Pragma ("pragma% cannot be used for generic entities");
13699            end if;
13700
13701            Gather_Associations (Names, Args);
13702            Process_Extended_Import_Export_Exception_Pragma (
13703              Arg_Internal => Internal,
13704              Arg_External => External,
13705              Arg_Form     => Form,
13706              Arg_Code     => Code);
13707
13708            if not Is_VMS_Exception (Entity (Internal)) then
13709               Set_Exported (Entity (Internal), Internal);
13710            end if;
13711         end Export_Exception;
13712
13713         ---------------------
13714         -- Export_Function --
13715         ---------------------
13716
13717         --  pragma Export_Function (
13718         --        [Internal         =>] LOCAL_NAME
13719         --     [, [External         =>] EXTERNAL_SYMBOL]
13720         --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
13721         --     [, [Result_Type      =>] TYPE_DESIGNATOR]
13722         --     [, [Mechanism        =>] MECHANISM]
13723         --     [, [Result_Mechanism =>] MECHANISM_NAME]);
13724
13725         --  EXTERNAL_SYMBOL ::=
13726         --    IDENTIFIER
13727         --  | static_string_EXPRESSION
13728
13729         --  PARAMETER_TYPES ::=
13730         --    null
13731         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
13732
13733         --  TYPE_DESIGNATOR ::=
13734         --    subtype_NAME
13735         --  | subtype_Name ' Access
13736
13737         --  MECHANISM ::=
13738         --    MECHANISM_NAME
13739         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
13740
13741         --  MECHANISM_ASSOCIATION ::=
13742         --    [formal_parameter_NAME =>] MECHANISM_NAME
13743
13744         --  MECHANISM_NAME ::=
13745         --    Value
13746         --  | Reference
13747         --  | Descriptor [([Class =>] CLASS_NAME)]
13748
13749         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
13750
13751         when Pragma_Export_Function => Export_Function : declare
13752            Args  : Args_List (1 .. 6);
13753            Names : constant Name_List (1 .. 6) := (
13754                      Name_Internal,
13755                      Name_External,
13756                      Name_Parameter_Types,
13757                      Name_Result_Type,
13758                      Name_Mechanism,
13759                      Name_Result_Mechanism);
13760
13761            Internal         : Node_Id renames Args (1);
13762            External         : Node_Id renames Args (2);
13763            Parameter_Types  : Node_Id renames Args (3);
13764            Result_Type      : Node_Id renames Args (4);
13765            Mechanism        : Node_Id renames Args (5);
13766            Result_Mechanism : Node_Id renames Args (6);
13767
13768         begin
13769            GNAT_Pragma;
13770            Gather_Associations (Names, Args);
13771            Process_Extended_Import_Export_Subprogram_Pragma (
13772              Arg_Internal         => Internal,
13773              Arg_External         => External,
13774              Arg_Parameter_Types  => Parameter_Types,
13775              Arg_Result_Type      => Result_Type,
13776              Arg_Mechanism        => Mechanism,
13777              Arg_Result_Mechanism => Result_Mechanism);
13778         end Export_Function;
13779
13780         -------------------
13781         -- Export_Object --
13782         -------------------
13783
13784         --  pragma Export_Object (
13785         --        [Internal =>] LOCAL_NAME
13786         --     [, [External =>] EXTERNAL_SYMBOL]
13787         --     [, [Size     =>] EXTERNAL_SYMBOL]);
13788
13789         --  EXTERNAL_SYMBOL ::=
13790         --    IDENTIFIER
13791         --  | static_string_EXPRESSION
13792
13793         --  PARAMETER_TYPES ::=
13794         --    null
13795         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
13796
13797         --  TYPE_DESIGNATOR ::=
13798         --    subtype_NAME
13799         --  | subtype_Name ' Access
13800
13801         --  MECHANISM ::=
13802         --    MECHANISM_NAME
13803         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
13804
13805         --  MECHANISM_ASSOCIATION ::=
13806         --    [formal_parameter_NAME =>] MECHANISM_NAME
13807
13808         --  MECHANISM_NAME ::=
13809         --    Value
13810         --  | Reference
13811         --  | Descriptor [([Class =>] CLASS_NAME)]
13812
13813         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
13814
13815         when Pragma_Export_Object => Export_Object : declare
13816            Args  : Args_List (1 .. 3);
13817            Names : constant Name_List (1 .. 3) := (
13818                      Name_Internal,
13819                      Name_External,
13820                      Name_Size);
13821
13822            Internal : Node_Id renames Args (1);
13823            External : Node_Id renames Args (2);
13824            Size     : Node_Id renames Args (3);
13825
13826         begin
13827            GNAT_Pragma;
13828            Gather_Associations (Names, Args);
13829            Process_Extended_Import_Export_Object_Pragma (
13830              Arg_Internal => Internal,
13831              Arg_External => External,
13832              Arg_Size     => Size);
13833         end Export_Object;
13834
13835         ----------------------
13836         -- Export_Procedure --
13837         ----------------------
13838
13839         --  pragma Export_Procedure (
13840         --        [Internal         =>] LOCAL_NAME
13841         --     [, [External         =>] EXTERNAL_SYMBOL]
13842         --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
13843         --     [, [Mechanism        =>] MECHANISM]);
13844
13845         --  EXTERNAL_SYMBOL ::=
13846         --    IDENTIFIER
13847         --  | static_string_EXPRESSION
13848
13849         --  PARAMETER_TYPES ::=
13850         --    null
13851         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
13852
13853         --  TYPE_DESIGNATOR ::=
13854         --    subtype_NAME
13855         --  | subtype_Name ' Access
13856
13857         --  MECHANISM ::=
13858         --    MECHANISM_NAME
13859         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
13860
13861         --  MECHANISM_ASSOCIATION ::=
13862         --    [formal_parameter_NAME =>] MECHANISM_NAME
13863
13864         --  MECHANISM_NAME ::=
13865         --    Value
13866         --  | Reference
13867         --  | Descriptor [([Class =>] CLASS_NAME)]
13868
13869         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
13870
13871         when Pragma_Export_Procedure => Export_Procedure : declare
13872            Args  : Args_List (1 .. 4);
13873            Names : constant Name_List (1 .. 4) := (
13874                      Name_Internal,
13875                      Name_External,
13876                      Name_Parameter_Types,
13877                      Name_Mechanism);
13878
13879            Internal        : Node_Id renames Args (1);
13880            External        : Node_Id renames Args (2);
13881            Parameter_Types : Node_Id renames Args (3);
13882            Mechanism       : Node_Id renames Args (4);
13883
13884         begin
13885            GNAT_Pragma;
13886            Gather_Associations (Names, Args);
13887            Process_Extended_Import_Export_Subprogram_Pragma (
13888              Arg_Internal        => Internal,
13889              Arg_External        => External,
13890              Arg_Parameter_Types => Parameter_Types,
13891              Arg_Mechanism       => Mechanism);
13892         end Export_Procedure;
13893
13894         ------------------
13895         -- Export_Value --
13896         ------------------
13897
13898         --  pragma Export_Value (
13899         --     [Value     =>] static_integer_EXPRESSION,
13900         --     [Link_Name =>] static_string_EXPRESSION);
13901
13902         when Pragma_Export_Value =>
13903            GNAT_Pragma;
13904            Check_Arg_Order ((Name_Value, Name_Link_Name));
13905            Check_Arg_Count (2);
13906
13907            Check_Optional_Identifier (Arg1, Name_Value);
13908            Check_Arg_Is_Static_Expression (Arg1, Any_Integer);
13909
13910            Check_Optional_Identifier (Arg2, Name_Link_Name);
13911            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
13912
13913         -----------------------------
13914         -- Export_Valued_Procedure --
13915         -----------------------------
13916
13917         --  pragma Export_Valued_Procedure (
13918         --        [Internal         =>] LOCAL_NAME
13919         --     [, [External         =>] EXTERNAL_SYMBOL,]
13920         --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
13921         --     [, [Mechanism        =>] MECHANISM]);
13922
13923         --  EXTERNAL_SYMBOL ::=
13924         --    IDENTIFIER
13925         --  | static_string_EXPRESSION
13926
13927         --  PARAMETER_TYPES ::=
13928         --    null
13929         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
13930
13931         --  TYPE_DESIGNATOR ::=
13932         --    subtype_NAME
13933         --  | subtype_Name ' Access
13934
13935         --  MECHANISM ::=
13936         --    MECHANISM_NAME
13937         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
13938
13939         --  MECHANISM_ASSOCIATION ::=
13940         --    [formal_parameter_NAME =>] MECHANISM_NAME
13941
13942         --  MECHANISM_NAME ::=
13943         --    Value
13944         --  | Reference
13945         --  | Descriptor [([Class =>] CLASS_NAME)]
13946
13947         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
13948
13949         when Pragma_Export_Valued_Procedure =>
13950         Export_Valued_Procedure : declare
13951            Args  : Args_List (1 .. 4);
13952            Names : constant Name_List (1 .. 4) := (
13953                      Name_Internal,
13954                      Name_External,
13955                      Name_Parameter_Types,
13956                      Name_Mechanism);
13957
13958            Internal        : Node_Id renames Args (1);
13959            External        : Node_Id renames Args (2);
13960            Parameter_Types : Node_Id renames Args (3);
13961            Mechanism       : Node_Id renames Args (4);
13962
13963         begin
13964            GNAT_Pragma;
13965            Gather_Associations (Names, Args);
13966            Process_Extended_Import_Export_Subprogram_Pragma (
13967              Arg_Internal        => Internal,
13968              Arg_External        => External,
13969              Arg_Parameter_Types => Parameter_Types,
13970              Arg_Mechanism       => Mechanism);
13971         end Export_Valued_Procedure;
13972
13973         -------------------
13974         -- Extend_System --
13975         -------------------
13976
13977         --  pragma Extend_System ([Name =>] Identifier);
13978
13979         when Pragma_Extend_System => Extend_System : declare
13980         begin
13981            GNAT_Pragma;
13982            Check_Valid_Configuration_Pragma;
13983            Check_Arg_Count (1);
13984            Check_Optional_Identifier (Arg1, Name_Name);
13985            Check_Arg_Is_Identifier (Arg1);
13986
13987            Get_Name_String (Chars (Get_Pragma_Arg (Arg1)));
13988
13989            if Name_Len > 4
13990              and then Name_Buffer (1 .. 4) = "aux_"
13991            then
13992               if Present (System_Extend_Pragma_Arg) then
13993                  if Chars (Get_Pragma_Arg (Arg1)) =
13994                     Chars (Expression (System_Extend_Pragma_Arg))
13995                  then
13996                     null;
13997                  else
13998                     Error_Msg_Sloc := Sloc (System_Extend_Pragma_Arg);
13999                     Error_Pragma ("pragma% conflicts with that #");
14000                  end if;
14001
14002               else
14003                  System_Extend_Pragma_Arg := Arg1;
14004
14005                  if not GNAT_Mode then
14006                     System_Extend_Unit := Arg1;
14007                  end if;
14008               end if;
14009            else
14010               Error_Pragma ("incorrect name for pragma%, must be Aux_xxx");
14011            end if;
14012         end Extend_System;
14013
14014         ------------------------
14015         -- Extensions_Allowed --
14016         ------------------------
14017
14018         --  pragma Extensions_Allowed (ON | OFF);
14019
14020         when Pragma_Extensions_Allowed =>
14021            GNAT_Pragma;
14022            Check_Arg_Count (1);
14023            Check_No_Identifiers;
14024            Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
14025
14026            if Chars (Get_Pragma_Arg (Arg1)) = Name_On then
14027               Extensions_Allowed := True;
14028               Ada_Version := Ada_Version_Type'Last;
14029
14030            else
14031               Extensions_Allowed := False;
14032               Ada_Version := Ada_Version_Explicit;
14033               Ada_Version_Pragma := Empty;
14034            end if;
14035
14036         --------------
14037         -- External --
14038         --------------
14039
14040         --  pragma External (
14041         --    [   Convention    =>] convention_IDENTIFIER,
14042         --    [   Entity        =>] local_NAME
14043         --    [, [External_Name =>] static_string_EXPRESSION ]
14044         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
14045
14046         when Pragma_External => External : declare
14047               Def_Id : Entity_Id;
14048
14049               C : Convention_Id;
14050               pragma Warnings (Off, C);
14051
14052         begin
14053            GNAT_Pragma;
14054            Check_Arg_Order
14055              ((Name_Convention,
14056                Name_Entity,
14057                Name_External_Name,
14058                Name_Link_Name));
14059            Check_At_Least_N_Arguments (2);
14060            Check_At_Most_N_Arguments  (4);
14061            Process_Convention (C, Def_Id);
14062            Note_Possible_Modification
14063              (Get_Pragma_Arg (Arg2), Sure => False);
14064            Process_Interface_Name (Def_Id, Arg3, Arg4);
14065            Set_Exported (Def_Id, Arg2);
14066         end External;
14067
14068         --------------------------
14069         -- External_Name_Casing --
14070         --------------------------
14071
14072         --  pragma External_Name_Casing (
14073         --    UPPERCASE | LOWERCASE
14074         --    [, AS_IS | UPPERCASE | LOWERCASE]);
14075
14076         when Pragma_External_Name_Casing => External_Name_Casing : declare
14077         begin
14078            GNAT_Pragma;
14079            Check_No_Identifiers;
14080
14081            if Arg_Count = 2 then
14082               Check_Arg_Is_One_Of
14083                 (Arg2, Name_As_Is, Name_Uppercase, Name_Lowercase);
14084
14085               case Chars (Get_Pragma_Arg (Arg2)) is
14086                  when Name_As_Is     =>
14087                     Opt.External_Name_Exp_Casing := As_Is;
14088
14089                  when Name_Uppercase =>
14090                     Opt.External_Name_Exp_Casing := Uppercase;
14091
14092                  when Name_Lowercase =>
14093                     Opt.External_Name_Exp_Casing := Lowercase;
14094
14095                  when others =>
14096                     null;
14097               end case;
14098
14099            else
14100               Check_Arg_Count (1);
14101            end if;
14102
14103            Check_Arg_Is_One_Of (Arg1, Name_Uppercase, Name_Lowercase);
14104
14105            case Chars (Get_Pragma_Arg (Arg1)) is
14106               when Name_Uppercase =>
14107                  Opt.External_Name_Imp_Casing := Uppercase;
14108
14109               when Name_Lowercase =>
14110                  Opt.External_Name_Imp_Casing := Lowercase;
14111
14112               when others =>
14113                  null;
14114            end case;
14115         end External_Name_Casing;
14116
14117         ---------------
14118         -- Fast_Math --
14119         ---------------
14120
14121         --  pragma Fast_Math;
14122
14123         when Pragma_Fast_Math =>
14124            GNAT_Pragma;
14125            Check_No_Identifiers;
14126            Check_Valid_Configuration_Pragma;
14127            Fast_Math := True;
14128
14129         --------------------------
14130         -- Favor_Top_Level --
14131         --------------------------
14132
14133         --  pragma Favor_Top_Level (type_NAME);
14134
14135         when Pragma_Favor_Top_Level => Favor_Top_Level : declare
14136               Named_Entity : Entity_Id;
14137
14138         begin
14139            GNAT_Pragma;
14140            Check_No_Identifiers;
14141            Check_Arg_Count (1);
14142            Check_Arg_Is_Local_Name (Arg1);
14143            Named_Entity := Entity (Get_Pragma_Arg (Arg1));
14144
14145            --  If it's an access-to-subprogram type (in particular, not a
14146            --  subtype), set the flag on that type.
14147
14148            if Is_Access_Subprogram_Type (Named_Entity) then
14149               Set_Can_Use_Internal_Rep (Named_Entity, False);
14150
14151            --  Otherwise it's an error (name denotes the wrong sort of entity)
14152
14153            else
14154               Error_Pragma_Arg
14155                 ("access-to-subprogram type expected",
14156                  Get_Pragma_Arg (Arg1));
14157            end if;
14158         end Favor_Top_Level;
14159
14160         ---------------------------
14161         -- Finalize_Storage_Only --
14162         ---------------------------
14163
14164         --  pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);
14165
14166         when Pragma_Finalize_Storage_Only => Finalize_Storage : declare
14167            Assoc   : constant Node_Id := Arg1;
14168            Type_Id : constant Node_Id := Get_Pragma_Arg (Assoc);
14169            Typ     : Entity_Id;
14170
14171         begin
14172            GNAT_Pragma;
14173            Check_No_Identifiers;
14174            Check_Arg_Count (1);
14175            Check_Arg_Is_Local_Name (Arg1);
14176
14177            Find_Type (Type_Id);
14178            Typ := Entity (Type_Id);
14179
14180            if Typ = Any_Type
14181              or else Rep_Item_Too_Early (Typ, N)
14182            then
14183               return;
14184            else
14185               Typ := Underlying_Type (Typ);
14186            end if;
14187
14188            if not Is_Controlled (Typ) then
14189               Error_Pragma ("pragma% must specify controlled type");
14190            end if;
14191
14192            Check_First_Subtype (Arg1);
14193
14194            if Finalize_Storage_Only (Typ) then
14195               Error_Pragma ("duplicate pragma%, only one allowed");
14196
14197            elsif not Rep_Item_Too_Late (Typ, N) then
14198               Set_Finalize_Storage_Only (Base_Type (Typ), True);
14199            end if;
14200         end Finalize_Storage;
14201
14202         --------------------------
14203         -- Float_Representation --
14204         --------------------------
14205
14206         --  pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);
14207
14208         --  FLOAT_REP ::= VAX_Float | IEEE_Float
14209
14210         when Pragma_Float_Representation => Float_Representation : declare
14211            Argx : Node_Id;
14212            Digs : Nat;
14213            Ent  : Entity_Id;
14214
14215         begin
14216            GNAT_Pragma;
14217
14218            if Arg_Count = 1 then
14219               Check_Valid_Configuration_Pragma;
14220            else
14221               Check_Arg_Count (2);
14222               Check_Optional_Identifier (Arg2, Name_Entity);
14223               Check_Arg_Is_Local_Name (Arg2);
14224            end if;
14225
14226            Check_No_Identifier (Arg1);
14227            Check_Arg_Is_One_Of (Arg1, Name_VAX_Float, Name_IEEE_Float);
14228
14229            if not OpenVMS_On_Target then
14230               if Chars (Get_Pragma_Arg (Arg1)) = Name_VAX_Float then
14231                  Error_Pragma
14232                    ("??pragma% ignored (applies only to Open'V'M'S)");
14233               end if;
14234
14235               return;
14236            end if;
14237
14238            --  One argument case
14239
14240            if Arg_Count = 1 then
14241               if Chars (Get_Pragma_Arg (Arg1)) = Name_VAX_Float then
14242                  if Opt.Float_Format = 'I' then
14243                     Error_Pragma ("'I'E'E'E format previously specified");
14244                  end if;
14245
14246                  Opt.Float_Format := 'V';
14247
14248               else
14249                  if Opt.Float_Format = 'V' then
14250                     Error_Pragma ("'V'A'X format previously specified");
14251                  end if;
14252
14253                  Opt.Float_Format := 'I';
14254               end if;
14255
14256               Set_Standard_Fpt_Formats;
14257
14258            --  Two argument case
14259
14260            else
14261               Argx := Get_Pragma_Arg (Arg2);
14262
14263               if not Is_Entity_Name (Argx)
14264                 or else not Is_Floating_Point_Type (Entity (Argx))
14265               then
14266                  Error_Pragma_Arg
14267                    ("second argument of% pragma must be floating-point type",
14268                     Arg2);
14269               end if;
14270
14271               Ent  := Entity (Argx);
14272               Digs := UI_To_Int (Digits_Value (Ent));
14273
14274               --  Two arguments, VAX_Float case
14275
14276               if Chars (Get_Pragma_Arg (Arg1)) = Name_VAX_Float then
14277                  case Digs is
14278                     when  6 => Set_F_Float (Ent);
14279                     when  9 => Set_D_Float (Ent);
14280                     when 15 => Set_G_Float (Ent);
14281
14282                     when others =>
14283                        Error_Pragma_Arg
14284                          ("wrong digits value, must be 6,9 or 15", Arg2);
14285                  end case;
14286
14287               --  Two arguments, IEEE_Float case
14288
14289               else
14290                  case Digs is
14291                     when  6 => Set_IEEE_Short (Ent);
14292                     when 15 => Set_IEEE_Long  (Ent);
14293
14294                     when others =>
14295                        Error_Pragma_Arg
14296                          ("wrong digits value, must be 6 or 15", Arg2);
14297                  end case;
14298               end if;
14299            end if;
14300         end Float_Representation;
14301
14302         ------------
14303         -- Global --
14304         ------------
14305
14306         --  pragma Global (GLOBAL_SPECIFICATION);
14307
14308         --  GLOBAL_SPECIFICATION ::=
14309         --    null
14310         --  | GLOBAL_LIST
14311         --  | MODED_GLOBAL_LIST {, MODED_GLOBAL_LIST}
14312
14313         --  MODED_GLOBAL_LIST ::= MODE_SELECTOR => GLOBAL_LIST
14314
14315         --  MODE_SELECTOR ::= In_Out | Input | Output | Proof_In
14316         --  GLOBAL_LIST   ::= GLOBAL_ITEM | (GLOBAL_ITEM {, GLOBAL_ITEM})
14317         --  GLOBAL_ITEM   ::= NAME
14318
14319         when Pragma_Global => Global : declare
14320            Subp_Decl : Node_Id;
14321
14322         begin
14323            GNAT_Pragma;
14324            Check_Arg_Count (1);
14325            Ensure_Aggregate_Form (Arg1);
14326
14327            --  Ensure the proper placement of the pragma. Global must be
14328            --  associated with a subprogram declaration or a body that acts
14329            --  as a spec.
14330
14331            Subp_Decl :=
14332              Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
14333
14334            if Nkind (Subp_Decl) = N_Subprogram_Declaration then
14335               null;
14336
14337            --  Body acts as spec
14338
14339            elsif Nkind (Subp_Decl) = N_Subprogram_Body
14340              and then No (Corresponding_Spec (Subp_Decl))
14341            then
14342               null;
14343
14344            --  Body stub acts as spec
14345
14346            elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub
14347              and then No (Corresponding_Spec_Of_Stub (Subp_Decl))
14348            then
14349               null;
14350
14351            else
14352               Pragma_Misplaced;
14353               return;
14354            end if;
14355
14356            --  When the pragma appears on a subprogram body, perform the full
14357            --  analysis now.
14358
14359            if Nkind (Subp_Decl) = N_Subprogram_Body then
14360               Analyze_Global_In_Decl_Part (N);
14361
14362            --  When Global applies to a subprogram compilation unit, the
14363            --  corresponding pragma is placed after the unit's declaration
14364            --  node and needs to be analyzed immediately.
14365
14366            elsif Nkind (Subp_Decl) = N_Subprogram_Declaration
14367              and then Nkind (Parent (Subp_Decl)) = N_Compilation_Unit
14368            then
14369               Analyze_Global_In_Decl_Part (N);
14370            end if;
14371
14372            --  Chain the pragma on the contract for further processing
14373
14374            Add_Contract_Item (N, Defining_Entity (Subp_Decl));
14375         end Global;
14376
14377         -----------
14378         -- Ident --
14379         -----------
14380
14381         --  pragma Ident (static_string_EXPRESSION)
14382
14383         --  Note: pragma Comment shares this processing. Pragma Comment is
14384         --  identical to Ident, except that the restriction of the argument to
14385         --  31 characters and the placement restrictions are not enforced for
14386         --  pragma Comment.
14387
14388         when Pragma_Ident | Pragma_Comment => Ident : declare
14389            Str : Node_Id;
14390
14391         begin
14392            GNAT_Pragma;
14393            Check_Arg_Count (1);
14394            Check_No_Identifiers;
14395            Check_Arg_Is_Static_Expression (Arg1, Standard_String);
14396            Store_Note (N);
14397
14398            --  For pragma Ident, preserve DEC compatibility by requiring the
14399            --  pragma to appear in a declarative part or package spec.
14400
14401            if Prag_Id = Pragma_Ident then
14402               Check_Is_In_Decl_Part_Or_Package_Spec;
14403            end if;
14404
14405            Str := Expr_Value_S (Get_Pragma_Arg (Arg1));
14406
14407            declare
14408               CS : Node_Id;
14409               GP : Node_Id;
14410
14411            begin
14412               GP := Parent (Parent (N));
14413
14414               if Nkind_In (GP, N_Package_Declaration,
14415                                N_Generic_Package_Declaration)
14416               then
14417                  GP := Parent (GP);
14418               end if;
14419
14420               --  If we have a compilation unit, then record the ident value,
14421               --  checking for improper duplication.
14422
14423               if Nkind (GP) = N_Compilation_Unit then
14424                  CS := Ident_String (Current_Sem_Unit);
14425
14426                  if Present (CS) then
14427
14428                     --  For Ident, we do not permit multiple instances
14429
14430                     if Prag_Id = Pragma_Ident then
14431                        Error_Pragma ("duplicate% pragma not permitted");
14432
14433                     --  For Comment, we concatenate the string, unless we want
14434                     --  to preserve the tree structure for ASIS.
14435
14436                     elsif not ASIS_Mode then
14437                        Start_String (Strval (CS));
14438                        Store_String_Char (' ');
14439                        Store_String_Chars (Strval (Str));
14440                        Set_Strval (CS, End_String);
14441                     end if;
14442
14443                  else
14444                     --  In VMS, the effect of IDENT is achieved by passing
14445                     --  --identification=name as a --for-linker switch.
14446
14447                     if OpenVMS_On_Target then
14448                        Start_String;
14449                        Store_String_Chars
14450                          ("--for-linker=--identification=");
14451                        String_To_Name_Buffer (Strval (Str));
14452                        Store_String_Chars (Name_Buffer (1 .. Name_Len));
14453
14454                        --  Only the last processed IDENT is saved. The main
14455                        --  purpose is so an IDENT associated with a main
14456                        --  procedure will be used in preference to an IDENT
14457                        --  associated with a with'd package.
14458
14459                        Replace_Linker_Option_String
14460                          (End_String, "--for-linker=--identification=");
14461                     end if;
14462
14463                     Set_Ident_String (Current_Sem_Unit, Str);
14464                  end if;
14465
14466               --  For subunits, we just ignore the Ident, since in GNAT these
14467               --  are not separate object files, and hence not separate units
14468               --  in the unit table.
14469
14470               elsif Nkind (GP) = N_Subunit then
14471                  null;
14472
14473               --  Otherwise we have a misplaced pragma Ident, but we ignore
14474               --  this if we are in an instantiation, since it comes from
14475               --  a generic, and has no relevance to the instantiation.
14476
14477               elsif Prag_Id = Pragma_Ident then
14478                  if Instantiation_Location (Loc) = No_Location then
14479                     Error_Pragma ("pragma% only allowed at outer level");
14480                  end if;
14481               end if;
14482            end;
14483         end Ident;
14484
14485         ----------------------------
14486         -- Implementation_Defined --
14487         ----------------------------
14488
14489         --  pragma Implementation_Defined (local_NAME);
14490
14491         --  Marks previously declared entity as implementation defined. For
14492         --  an overloaded entity, applies to the most recent homonym.
14493
14494         --  pragma Implementation_Defined;
14495
14496         --  The form with no arguments appears anywhere within a scope, most
14497         --  typically a package spec, and indicates that all entities that are
14498         --  defined within the package spec are Implementation_Defined.
14499
14500         when Pragma_Implementation_Defined => Implementation_Defined : declare
14501            Ent : Entity_Id;
14502
14503         begin
14504            GNAT_Pragma;
14505            Check_No_Identifiers;
14506
14507            --  Form with no arguments
14508
14509            if Arg_Count = 0 then
14510               Set_Is_Implementation_Defined (Current_Scope);
14511
14512            --  Form with one argument
14513
14514            else
14515               Check_Arg_Count (1);
14516               Check_Arg_Is_Local_Name (Arg1);
14517               Ent := Entity (Get_Pragma_Arg (Arg1));
14518               Set_Is_Implementation_Defined (Ent);
14519            end if;
14520         end Implementation_Defined;
14521
14522         -----------------
14523         -- Implemented --
14524         -----------------
14525
14526         --  pragma Implemented (procedure_LOCAL_NAME, IMPLEMENTATION_KIND);
14527
14528         --  IMPLEMENTATION_KIND ::=
14529         --    By_Entry | By_Protected_Procedure | By_Any | Optional
14530
14531         --  "By_Any" and "Optional" are treated as synonyms in order to
14532         --  support Ada 2012 aspect Synchronization.
14533
14534         when Pragma_Implemented => Implemented : declare
14535            Proc_Id : Entity_Id;
14536            Typ     : Entity_Id;
14537
14538         begin
14539            Ada_2012_Pragma;
14540            Check_Arg_Count (2);
14541            Check_No_Identifiers;
14542            Check_Arg_Is_Identifier (Arg1);
14543            Check_Arg_Is_Local_Name (Arg1);
14544            Check_Arg_Is_One_Of (Arg2,
14545              Name_By_Any,
14546              Name_By_Entry,
14547              Name_By_Protected_Procedure,
14548              Name_Optional);
14549
14550            --  Extract the name of the local procedure
14551
14552            Proc_Id := Entity (Get_Pragma_Arg (Arg1));
14553
14554            --  Ada 2012 (AI05-0030): The procedure_LOCAL_NAME must denote a
14555            --  primitive procedure of a synchronized tagged type.
14556
14557            if Ekind (Proc_Id) = E_Procedure
14558              and then Is_Primitive (Proc_Id)
14559              and then Present (First_Formal (Proc_Id))
14560            then
14561               Typ := Etype (First_Formal (Proc_Id));
14562
14563               if Is_Tagged_Type (Typ)
14564                 and then
14565
14566                  --  Check for a protected, a synchronized or a task interface
14567
14568                   ((Is_Interface (Typ)
14569                       and then Is_Synchronized_Interface (Typ))
14570
14571                  --  Check for a protected type or a task type that implements
14572                  --  an interface.
14573
14574                   or else
14575                    (Is_Concurrent_Record_Type (Typ)
14576                       and then Present (Interfaces (Typ)))
14577
14578                  --  Check for a private record extension with keyword
14579                  --  "synchronized".
14580
14581                   or else
14582                    (Ekind_In (Typ, E_Record_Type_With_Private,
14583                                    E_Record_Subtype_With_Private)
14584                       and then Synchronized_Present (Parent (Typ))))
14585               then
14586                  null;
14587               else
14588                  Error_Pragma_Arg
14589                    ("controlling formal must be of synchronized tagged type",
14590                     Arg1);
14591                  return;
14592               end if;
14593
14594            --  Procedures declared inside a protected type must be accepted
14595
14596            elsif Ekind (Proc_Id) = E_Procedure
14597              and then Is_Protected_Type (Scope (Proc_Id))
14598            then
14599               null;
14600
14601            --  The first argument is not a primitive procedure
14602
14603            else
14604               Error_Pragma_Arg
14605                 ("pragma % must be applied to a primitive procedure", Arg1);
14606               return;
14607            end if;
14608
14609            --  Ada 2012 (AI05-0030): Cannot apply the implementation_kind
14610            --  By_Protected_Procedure to the primitive procedure of a task
14611            --  interface.
14612
14613            if Chars (Arg2) = Name_By_Protected_Procedure
14614              and then Is_Interface (Typ)
14615              and then Is_Task_Interface (Typ)
14616            then
14617               Error_Pragma_Arg
14618                 ("implementation kind By_Protected_Procedure cannot be "
14619                  & "applied to a task interface primitive", Arg2);
14620               return;
14621            end if;
14622
14623            Record_Rep_Item (Proc_Id, N);
14624         end Implemented;
14625
14626         ----------------------
14627         -- Implicit_Packing --
14628         ----------------------
14629
14630         --  pragma Implicit_Packing;
14631
14632         when Pragma_Implicit_Packing =>
14633            GNAT_Pragma;
14634            Check_Arg_Count (0);
14635            Implicit_Packing := True;
14636
14637         ------------
14638         -- Import --
14639         ------------
14640
14641         --  pragma Import (
14642         --       [Convention    =>] convention_IDENTIFIER,
14643         --       [Entity        =>] local_NAME
14644         --    [, [External_Name =>] static_string_EXPRESSION ]
14645         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
14646
14647         when Pragma_Import =>
14648            Check_Ada_83_Warning;
14649            Check_Arg_Order
14650              ((Name_Convention,
14651                Name_Entity,
14652                Name_External_Name,
14653                Name_Link_Name));
14654
14655            Check_At_Least_N_Arguments (2);
14656            Check_At_Most_N_Arguments  (4);
14657            Process_Import_Or_Interface;
14658
14659         ----------------------
14660         -- Import_Exception --
14661         ----------------------
14662
14663         --  pragma Import_Exception (
14664         --        [Internal         =>] LOCAL_NAME
14665         --     [, [External         =>] EXTERNAL_SYMBOL]
14666         --     [, [Form     =>] Ada | VMS]
14667         --     [, [Code     =>] static_integer_EXPRESSION]);
14668
14669         when Pragma_Import_Exception => Import_Exception : declare
14670            Args  : Args_List (1 .. 4);
14671            Names : constant Name_List (1 .. 4) := (
14672                      Name_Internal,
14673                      Name_External,
14674                      Name_Form,
14675                      Name_Code);
14676
14677            Internal : Node_Id renames Args (1);
14678            External : Node_Id renames Args (2);
14679            Form     : Node_Id renames Args (3);
14680            Code     : Node_Id renames Args (4);
14681
14682         begin
14683            GNAT_Pragma;
14684            Gather_Associations (Names, Args);
14685
14686            if Present (External) and then Present (Code) then
14687               Error_Pragma
14688                 ("cannot give both External and Code options for pragma%");
14689            end if;
14690
14691            Process_Extended_Import_Export_Exception_Pragma (
14692              Arg_Internal => Internal,
14693              Arg_External => External,
14694              Arg_Form     => Form,
14695              Arg_Code     => Code);
14696
14697            if not Is_VMS_Exception (Entity (Internal)) then
14698               Set_Imported (Entity (Internal));
14699            end if;
14700         end Import_Exception;
14701
14702         ---------------------
14703         -- Import_Function --
14704         ---------------------
14705
14706         --  pragma Import_Function (
14707         --        [Internal                 =>] LOCAL_NAME,
14708         --     [, [External                 =>] EXTERNAL_SYMBOL]
14709         --     [, [Parameter_Types          =>] (PARAMETER_TYPES)]
14710         --     [, [Result_Type              =>] SUBTYPE_MARK]
14711         --     [, [Mechanism                =>] MECHANISM]
14712         --     [, [Result_Mechanism         =>] MECHANISM_NAME]
14713         --     [, [First_Optional_Parameter =>] IDENTIFIER]);
14714
14715         --  EXTERNAL_SYMBOL ::=
14716         --    IDENTIFIER
14717         --  | static_string_EXPRESSION
14718
14719         --  PARAMETER_TYPES ::=
14720         --    null
14721         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
14722
14723         --  TYPE_DESIGNATOR ::=
14724         --    subtype_NAME
14725         --  | subtype_Name ' Access
14726
14727         --  MECHANISM ::=
14728         --    MECHANISM_NAME
14729         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
14730
14731         --  MECHANISM_ASSOCIATION ::=
14732         --    [formal_parameter_NAME =>] MECHANISM_NAME
14733
14734         --  MECHANISM_NAME ::=
14735         --    Value
14736         --  | Reference
14737         --  | Descriptor [([Class =>] CLASS_NAME)]
14738
14739         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
14740
14741         when Pragma_Import_Function => Import_Function : declare
14742            Args  : Args_List (1 .. 7);
14743            Names : constant Name_List (1 .. 7) := (
14744                      Name_Internal,
14745                      Name_External,
14746                      Name_Parameter_Types,
14747                      Name_Result_Type,
14748                      Name_Mechanism,
14749                      Name_Result_Mechanism,
14750                      Name_First_Optional_Parameter);
14751
14752            Internal                 : Node_Id renames Args (1);
14753            External                 : Node_Id renames Args (2);
14754            Parameter_Types          : Node_Id renames Args (3);
14755            Result_Type              : Node_Id renames Args (4);
14756            Mechanism                : Node_Id renames Args (5);
14757            Result_Mechanism         : Node_Id renames Args (6);
14758            First_Optional_Parameter : Node_Id renames Args (7);
14759
14760         begin
14761            GNAT_Pragma;
14762            Gather_Associations (Names, Args);
14763            Process_Extended_Import_Export_Subprogram_Pragma (
14764              Arg_Internal                 => Internal,
14765              Arg_External                 => External,
14766              Arg_Parameter_Types          => Parameter_Types,
14767              Arg_Result_Type              => Result_Type,
14768              Arg_Mechanism                => Mechanism,
14769              Arg_Result_Mechanism         => Result_Mechanism,
14770              Arg_First_Optional_Parameter => First_Optional_Parameter);
14771         end Import_Function;
14772
14773         -------------------
14774         -- Import_Object --
14775         -------------------
14776
14777         --  pragma Import_Object (
14778         --        [Internal =>] LOCAL_NAME
14779         --     [, [External =>] EXTERNAL_SYMBOL]
14780         --     [, [Size     =>] EXTERNAL_SYMBOL]);
14781
14782         --  EXTERNAL_SYMBOL ::=
14783         --    IDENTIFIER
14784         --  | static_string_EXPRESSION
14785
14786         when Pragma_Import_Object => Import_Object : declare
14787            Args  : Args_List (1 .. 3);
14788            Names : constant Name_List (1 .. 3) := (
14789                      Name_Internal,
14790                      Name_External,
14791                      Name_Size);
14792
14793            Internal : Node_Id renames Args (1);
14794            External : Node_Id renames Args (2);
14795            Size     : Node_Id renames Args (3);
14796
14797         begin
14798            GNAT_Pragma;
14799            Gather_Associations (Names, Args);
14800            Process_Extended_Import_Export_Object_Pragma (
14801              Arg_Internal => Internal,
14802              Arg_External => External,
14803              Arg_Size     => Size);
14804         end Import_Object;
14805
14806         ----------------------
14807         -- Import_Procedure --
14808         ----------------------
14809
14810         --  pragma Import_Procedure (
14811         --        [Internal                 =>] LOCAL_NAME
14812         --     [, [External                 =>] EXTERNAL_SYMBOL]
14813         --     [, [Parameter_Types          =>] (PARAMETER_TYPES)]
14814         --     [, [Mechanism                =>] MECHANISM]
14815         --     [, [First_Optional_Parameter =>] IDENTIFIER]);
14816
14817         --  EXTERNAL_SYMBOL ::=
14818         --    IDENTIFIER
14819         --  | static_string_EXPRESSION
14820
14821         --  PARAMETER_TYPES ::=
14822         --    null
14823         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
14824
14825         --  TYPE_DESIGNATOR ::=
14826         --    subtype_NAME
14827         --  | subtype_Name ' Access
14828
14829         --  MECHANISM ::=
14830         --    MECHANISM_NAME
14831         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
14832
14833         --  MECHANISM_ASSOCIATION ::=
14834         --    [formal_parameter_NAME =>] MECHANISM_NAME
14835
14836         --  MECHANISM_NAME ::=
14837         --    Value
14838         --  | Reference
14839         --  | Descriptor [([Class =>] CLASS_NAME)]
14840
14841         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
14842
14843         when Pragma_Import_Procedure => Import_Procedure : declare
14844            Args  : Args_List (1 .. 5);
14845            Names : constant Name_List (1 .. 5) := (
14846                      Name_Internal,
14847                      Name_External,
14848                      Name_Parameter_Types,
14849                      Name_Mechanism,
14850                      Name_First_Optional_Parameter);
14851
14852            Internal                 : Node_Id renames Args (1);
14853            External                 : Node_Id renames Args (2);
14854            Parameter_Types          : Node_Id renames Args (3);
14855            Mechanism                : Node_Id renames Args (4);
14856            First_Optional_Parameter : Node_Id renames Args (5);
14857
14858         begin
14859            GNAT_Pragma;
14860            Gather_Associations (Names, Args);
14861            Process_Extended_Import_Export_Subprogram_Pragma (
14862              Arg_Internal                 => Internal,
14863              Arg_External                 => External,
14864              Arg_Parameter_Types          => Parameter_Types,
14865              Arg_Mechanism                => Mechanism,
14866              Arg_First_Optional_Parameter => First_Optional_Parameter);
14867         end Import_Procedure;
14868
14869         -----------------------------
14870         -- Import_Valued_Procedure --
14871         -----------------------------
14872
14873         --  pragma Import_Valued_Procedure (
14874         --        [Internal                 =>] LOCAL_NAME
14875         --     [, [External                 =>] EXTERNAL_SYMBOL]
14876         --     [, [Parameter_Types          =>] (PARAMETER_TYPES)]
14877         --     [, [Mechanism                =>] MECHANISM]
14878         --     [, [First_Optional_Parameter =>] IDENTIFIER]);
14879
14880         --  EXTERNAL_SYMBOL ::=
14881         --    IDENTIFIER
14882         --  | static_string_EXPRESSION
14883
14884         --  PARAMETER_TYPES ::=
14885         --    null
14886         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
14887
14888         --  TYPE_DESIGNATOR ::=
14889         --    subtype_NAME
14890         --  | subtype_Name ' Access
14891
14892         --  MECHANISM ::=
14893         --    MECHANISM_NAME
14894         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
14895
14896         --  MECHANISM_ASSOCIATION ::=
14897         --    [formal_parameter_NAME =>] MECHANISM_NAME
14898
14899         --  MECHANISM_NAME ::=
14900         --    Value
14901         --  | Reference
14902         --  | Descriptor [([Class =>] CLASS_NAME)]
14903
14904         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
14905
14906         when Pragma_Import_Valued_Procedure =>
14907         Import_Valued_Procedure : declare
14908            Args  : Args_List (1 .. 5);
14909            Names : constant Name_List (1 .. 5) := (
14910                      Name_Internal,
14911                      Name_External,
14912                      Name_Parameter_Types,
14913                      Name_Mechanism,
14914                      Name_First_Optional_Parameter);
14915
14916            Internal                 : Node_Id renames Args (1);
14917            External                 : Node_Id renames Args (2);
14918            Parameter_Types          : Node_Id renames Args (3);
14919            Mechanism                : Node_Id renames Args (4);
14920            First_Optional_Parameter : Node_Id renames Args (5);
14921
14922         begin
14923            GNAT_Pragma;
14924            Gather_Associations (Names, Args);
14925            Process_Extended_Import_Export_Subprogram_Pragma (
14926              Arg_Internal                 => Internal,
14927              Arg_External                 => External,
14928              Arg_Parameter_Types          => Parameter_Types,
14929              Arg_Mechanism                => Mechanism,
14930              Arg_First_Optional_Parameter => First_Optional_Parameter);
14931         end Import_Valued_Procedure;
14932
14933         -----------------
14934         -- Independent --
14935         -----------------
14936
14937         --  pragma Independent (LOCAL_NAME);
14938
14939         when Pragma_Independent => Independent : declare
14940            E_Id : Node_Id;
14941            E    : Entity_Id;
14942            D    : Node_Id;
14943            K    : Node_Kind;
14944
14945         begin
14946            Check_Ada_83_Warning;
14947            Ada_2012_Pragma;
14948            Check_No_Identifiers;
14949            Check_Arg_Count (1);
14950            Check_Arg_Is_Local_Name (Arg1);
14951            E_Id := Get_Pragma_Arg (Arg1);
14952
14953            if Etype (E_Id) = Any_Type then
14954               return;
14955            end if;
14956
14957            E := Entity (E_Id);
14958            D := Declaration_Node (E);
14959            K := Nkind (D);
14960
14961            --  Check duplicate before we chain ourselves
14962
14963            Check_Duplicate_Pragma (E);
14964
14965            --  Check appropriate entity
14966
14967            if Is_Type (E) then
14968               if Rep_Item_Too_Early (E, N)
14969                    or else
14970                  Rep_Item_Too_Late (E, N)
14971               then
14972                  return;
14973               else
14974                  Check_First_Subtype (Arg1);
14975               end if;
14976
14977            elsif K = N_Object_Declaration
14978              or else (K = N_Component_Declaration
14979                        and then Original_Record_Component (E) = E)
14980            then
14981               if Rep_Item_Too_Late (E, N) then
14982                  return;
14983               end if;
14984
14985            else
14986               Error_Pragma_Arg
14987                 ("inappropriate entity for pragma%", Arg1);
14988            end if;
14989
14990            Independence_Checks.Append ((N, E));
14991         end Independent;
14992
14993         ----------------------------
14994         -- Independent_Components --
14995         ----------------------------
14996
14997         --  pragma Atomic_Components (array_LOCAL_NAME);
14998
14999         --  This processing is shared by Volatile_Components
15000
15001         when Pragma_Independent_Components => Independent_Components : declare
15002            E_Id : Node_Id;
15003            E    : Entity_Id;
15004            D    : Node_Id;
15005            K    : Node_Kind;
15006
15007         begin
15008            Check_Ada_83_Warning;
15009            Ada_2012_Pragma;
15010            Check_No_Identifiers;
15011            Check_Arg_Count (1);
15012            Check_Arg_Is_Local_Name (Arg1);
15013            E_Id := Get_Pragma_Arg (Arg1);
15014
15015            if Etype (E_Id) = Any_Type then
15016               return;
15017            end if;
15018
15019            E := Entity (E_Id);
15020
15021            --  Check duplicate before we chain ourselves
15022
15023            Check_Duplicate_Pragma (E);
15024
15025            --  Check appropriate entity
15026
15027            if Rep_Item_Too_Early (E, N)
15028                 or else
15029               Rep_Item_Too_Late (E, N)
15030            then
15031               return;
15032            end if;
15033
15034            D := Declaration_Node (E);
15035            K := Nkind (D);
15036
15037            if K = N_Full_Type_Declaration
15038              and then (Is_Array_Type (E) or else Is_Record_Type (E))
15039            then
15040               Independence_Checks.Append ((N, E));
15041               Set_Has_Independent_Components (Base_Type (E));
15042
15043            elsif (Ekind (E) = E_Constant or else Ekind (E) = E_Variable)
15044              and then Nkind (D) = N_Object_Declaration
15045              and then Nkind (Object_Definition (D)) =
15046                                           N_Constrained_Array_Definition
15047            then
15048               Independence_Checks.Append ((N, E));
15049               Set_Has_Independent_Components (E);
15050
15051            else
15052               Error_Pragma_Arg ("inappropriate entity for pragma%", Arg1);
15053            end if;
15054         end Independent_Components;
15055
15056         -----------------------
15057         -- Initial_Condition --
15058         -----------------------
15059
15060         --  pragma Initial_Condition (boolean_EXPRESSION);
15061
15062         when Pragma_Initial_Condition => Initial_Condition : declare
15063            Context : constant Node_Id := Parent (Parent (N));
15064            Pack_Id : Entity_Id;
15065            Stmt    : Node_Id;
15066
15067         begin
15068            GNAT_Pragma;
15069            Check_Arg_Count (1);
15070
15071            --  Ensure the proper placement of the pragma. Initial_Condition
15072            --  must be associated with a package declaration.
15073
15074            if not Nkind_In (Context, N_Generic_Package_Declaration,
15075                                      N_Package_Declaration)
15076            then
15077               Pragma_Misplaced;
15078               return;
15079            end if;
15080
15081            Stmt := Prev (N);
15082            while Present (Stmt) loop
15083
15084               --  Skip prior pragmas, but check for duplicates
15085
15086               if Nkind (Stmt) = N_Pragma then
15087                  if Pragma_Name (Stmt) = Pname then
15088                     Error_Msg_Name_1 := Pname;
15089                     Error_Msg_Sloc   := Sloc (Stmt);
15090                     Error_Msg_N ("pragma % duplicates pragma declared #", N);
15091                  end if;
15092
15093               --  Skip internally generated code
15094
15095               elsif not Comes_From_Source (Stmt) then
15096                  null;
15097
15098               --  The pragma does not apply to a legal construct, issue an
15099               --  error and stop the analysis.
15100
15101               else
15102                  Pragma_Misplaced;
15103                  return;
15104               end if;
15105
15106               Stmt := Prev (Stmt);
15107            end loop;
15108
15109            --  The pragma must be analyzed at the end of the visible
15110            --  declarations of the related package. Save the pragma for later
15111            --  (see Analyze_Initial_Condition_In_Decl_Part) by adding it to
15112            --  the contract of the package.
15113
15114            Pack_Id := Defining_Entity (Context);
15115            Add_Contract_Item (N, Pack_Id);
15116
15117            --  Verify the declaration order of pragma Initial_Condition with
15118            --  respect to pragmas Abstract_State and Initializes when SPARK
15119            --  checks are enabled.
15120
15121            if SPARK_Mode /= Off then
15122               Check_Declaration_Order
15123                 (First  => Get_Pragma (Pack_Id, Pragma_Abstract_State),
15124                  Second => N);
15125
15126               Check_Declaration_Order
15127                 (First  => Get_Pragma (Pack_Id, Pragma_Initializes),
15128                  Second => N);
15129            end if;
15130         end Initial_Condition;
15131
15132         ------------------------
15133         -- Initialize_Scalars --
15134         ------------------------
15135
15136         --  pragma Initialize_Scalars;
15137
15138         when Pragma_Initialize_Scalars =>
15139            GNAT_Pragma;
15140            Check_Arg_Count (0);
15141            Check_Valid_Configuration_Pragma;
15142            Check_Restriction (No_Initialize_Scalars, N);
15143
15144            --  Initialize_Scalars creates false positives in CodePeer, and
15145            --  incorrect negative results in GNATprove mode, so ignore this
15146            --  pragma in these modes.
15147
15148            if not Restriction_Active (No_Initialize_Scalars)
15149              and then not (CodePeer_Mode or GNATprove_Mode)
15150            then
15151               Init_Or_Norm_Scalars := True;
15152               Initialize_Scalars := True;
15153            end if;
15154
15155         -----------------
15156         -- Initializes --
15157         -----------------
15158
15159         --  pragma Initializes (INITIALIZATION_SPEC);
15160
15161         --  INITIALIZATION_SPEC ::= null | INITIALIZATION_LIST
15162
15163         --  INITIALIZATION_LIST ::=
15164         --    INITIALIZATION_ITEM
15165         --    | (INITIALIZATION_ITEM {, INITIALIZATION_ITEM})
15166
15167         --  INITIALIZATION_ITEM ::= name [=> INPUT_LIST]
15168
15169         --  INPUT_LIST ::=
15170         --    null
15171         --    | INPUT
15172         --    | (INPUT {, INPUT})
15173
15174         --  INPUT ::= name
15175
15176         when Pragma_Initializes => Initializes : declare
15177            Context : constant Node_Id := Parent (Parent (N));
15178            Pack_Id : Entity_Id;
15179            Stmt    : Node_Id;
15180
15181         begin
15182            GNAT_Pragma;
15183            Check_Arg_Count (1);
15184            Ensure_Aggregate_Form (Arg1);
15185
15186            --  Ensure the proper placement of the pragma. Initializes must be
15187            --  associated with a package declaration.
15188
15189            if not Nkind_In (Context, N_Generic_Package_Declaration,
15190                                      N_Package_Declaration)
15191            then
15192               Pragma_Misplaced;
15193               return;
15194            end if;
15195
15196            Stmt := Prev (N);
15197            while Present (Stmt) loop
15198
15199               --  Skip prior pragmas, but check for duplicates
15200
15201               if Nkind (Stmt) = N_Pragma then
15202                  if Pragma_Name (Stmt) = Pname then
15203                     Error_Msg_Name_1 := Pname;
15204                     Error_Msg_Sloc   := Sloc (Stmt);
15205                     Error_Msg_N ("pragma % duplicates pragma declared #", N);
15206                  end if;
15207
15208               --  Skip internally generated code
15209
15210               elsif not Comes_From_Source (Stmt) then
15211                  null;
15212
15213               --  The pragma does not apply to a legal construct, issue an
15214               --  error and stop the analysis.
15215
15216               else
15217                  Pragma_Misplaced;
15218                  return;
15219               end if;
15220
15221               Stmt := Prev (Stmt);
15222            end loop;
15223
15224            --  The pragma must be analyzed at the end of the visible
15225            --  declarations of the related package. Save the pragma for later
15226            --  (see Analyze_Initializes_In_Decl_Part) by adding it to the
15227            --  contract of the package.
15228
15229            Pack_Id := Defining_Entity (Context);
15230            Add_Contract_Item (N, Pack_Id);
15231
15232            --  Verify the declaration order of pragmas Abstract_State and
15233            --  Initializes when SPARK checks are enabled.
15234
15235            if SPARK_Mode /= Off then
15236               Check_Declaration_Order
15237                 (First  => Get_Pragma (Pack_Id, Pragma_Abstract_State),
15238                  Second => N);
15239            end if;
15240         end Initializes;
15241
15242         ------------
15243         -- Inline --
15244         ------------
15245
15246         --  pragma Inline ( NAME {, NAME} );
15247
15248         when Pragma_Inline =>
15249
15250            --  Inline status is Enabled if inlining option is active
15251
15252            if Inline_Active then
15253               Process_Inline (Enabled);
15254            else
15255               Process_Inline (Disabled);
15256            end if;
15257
15258         -------------------
15259         -- Inline_Always --
15260         -------------------
15261
15262         --  pragma Inline_Always ( NAME {, NAME} );
15263
15264         when Pragma_Inline_Always =>
15265            GNAT_Pragma;
15266
15267            --  Pragma always active unless in CodePeer or GNATprove mode,
15268            --  since this causes walk order issues.
15269
15270            if not (CodePeer_Mode or GNATprove_Mode) then
15271               Process_Inline (Enabled);
15272            end if;
15273
15274         --------------------
15275         -- Inline_Generic --
15276         --------------------
15277
15278         --  pragma Inline_Generic (NAME {, NAME});
15279
15280         when Pragma_Inline_Generic =>
15281            GNAT_Pragma;
15282            Process_Generic_List;
15283
15284         ----------------------
15285         -- Inspection_Point --
15286         ----------------------
15287
15288         --  pragma Inspection_Point [(object_NAME {, object_NAME})];
15289
15290         when Pragma_Inspection_Point => Inspection_Point : declare
15291            Arg : Node_Id;
15292            Exp : Node_Id;
15293
15294         begin
15295            if Arg_Count > 0 then
15296               Arg := Arg1;
15297               loop
15298                  Exp := Get_Pragma_Arg (Arg);
15299                  Analyze (Exp);
15300
15301                  if not Is_Entity_Name (Exp)
15302                    or else not Is_Object (Entity (Exp))
15303                  then
15304                     Error_Pragma_Arg ("object name required", Arg);
15305                  end if;
15306
15307                  Next (Arg);
15308                  exit when No (Arg);
15309               end loop;
15310            end if;
15311         end Inspection_Point;
15312
15313         ---------------
15314         -- Interface --
15315         ---------------
15316
15317         --  pragma Interface (
15318         --    [   Convention    =>] convention_IDENTIFIER,
15319         --    [   Entity        =>] local_NAME
15320         --    [, [External_Name =>] static_string_EXPRESSION ]
15321         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
15322
15323         when Pragma_Interface =>
15324            GNAT_Pragma;
15325            Check_Arg_Order
15326              ((Name_Convention,
15327                Name_Entity,
15328                Name_External_Name,
15329                Name_Link_Name));
15330            Check_At_Least_N_Arguments (2);
15331            Check_At_Most_N_Arguments  (4);
15332            Process_Import_Or_Interface;
15333
15334            --  In Ada 2005, the permission to use Interface (a reserved word)
15335            --  as a pragma name is considered an obsolescent feature, and this
15336            --  pragma was already obsolescent in Ada 95.
15337
15338            if Ada_Version >= Ada_95 then
15339               Check_Restriction
15340                 (No_Obsolescent_Features, Pragma_Identifier (N));
15341
15342               if Warn_On_Obsolescent_Feature then
15343                  Error_Msg_N
15344                    ("pragma Interface is an obsolescent feature?j?", N);
15345                  Error_Msg_N
15346                    ("|use pragma Import instead?j?", N);
15347               end if;
15348            end if;
15349
15350         --------------------
15351         -- Interface_Name --
15352         --------------------
15353
15354         --  pragma Interface_Name (
15355         --    [  Entity        =>] local_NAME
15356         --    [,[External_Name =>] static_string_EXPRESSION ]
15357         --    [,[Link_Name     =>] static_string_EXPRESSION ]);
15358
15359         when Pragma_Interface_Name => Interface_Name : declare
15360            Id     : Node_Id;
15361            Def_Id : Entity_Id;
15362            Hom_Id : Entity_Id;
15363            Found  : Boolean;
15364
15365         begin
15366            GNAT_Pragma;
15367            Check_Arg_Order
15368              ((Name_Entity, Name_External_Name, Name_Link_Name));
15369            Check_At_Least_N_Arguments (2);
15370            Check_At_Most_N_Arguments  (3);
15371            Id := Get_Pragma_Arg (Arg1);
15372            Analyze (Id);
15373
15374            --  This is obsolete from Ada 95 on, but it is an implementation
15375            --  defined pragma, so we do not consider that it violates the
15376            --  restriction (No_Obsolescent_Features).
15377
15378            if Ada_Version >= Ada_95 then
15379               if Warn_On_Obsolescent_Feature then
15380                  Error_Msg_N
15381                    ("pragma Interface_Name is an obsolescent feature?j?", N);
15382                  Error_Msg_N
15383                    ("|use pragma Import instead?j?", N);
15384               end if;
15385            end if;
15386
15387            if not Is_Entity_Name (Id) then
15388               Error_Pragma_Arg
15389                 ("first argument for pragma% must be entity name", Arg1);
15390            elsif Etype (Id) = Any_Type then
15391               return;
15392            else
15393               Def_Id := Entity (Id);
15394            end if;
15395
15396            --  Special DEC-compatible processing for the object case, forces
15397            --  object to be imported.
15398
15399            if Ekind (Def_Id) = E_Variable then
15400               Kill_Size_Check_Code (Def_Id);
15401               Note_Possible_Modification (Id, Sure => False);
15402
15403               --  Initialization is not allowed for imported variable
15404
15405               if Present (Expression (Parent (Def_Id)))
15406                 and then Comes_From_Source (Expression (Parent (Def_Id)))
15407               then
15408                  Error_Msg_Sloc := Sloc (Def_Id);
15409                  Error_Pragma_Arg
15410                    ("no initialization allowed for declaration of& #",
15411                     Arg2);
15412
15413               else
15414                  --  For compatibility, support VADS usage of providing both
15415                  --  pragmas Interface and Interface_Name to obtain the effect
15416                  --  of a single Import pragma.
15417
15418                  if Is_Imported (Def_Id)
15419                    and then Present (First_Rep_Item (Def_Id))
15420                    and then Nkind (First_Rep_Item (Def_Id)) = N_Pragma
15421                    and then
15422                      Pragma_Name (First_Rep_Item (Def_Id)) = Name_Interface
15423                  then
15424                     null;
15425                  else
15426                     Set_Imported (Def_Id);
15427                  end if;
15428
15429                  Set_Is_Public (Def_Id);
15430                  Process_Interface_Name (Def_Id, Arg2, Arg3);
15431               end if;
15432
15433            --  Otherwise must be subprogram
15434
15435            elsif not Is_Subprogram (Def_Id) then
15436               Error_Pragma_Arg
15437                 ("argument of pragma% is not subprogram", Arg1);
15438
15439            else
15440               Check_At_Most_N_Arguments (3);
15441               Hom_Id := Def_Id;
15442               Found := False;
15443
15444               --  Loop through homonyms
15445
15446               loop
15447                  Def_Id := Get_Base_Subprogram (Hom_Id);
15448
15449                  if Is_Imported (Def_Id) then
15450                     Process_Interface_Name (Def_Id, Arg2, Arg3);
15451                     Found := True;
15452                  end if;
15453
15454                  exit when From_Aspect_Specification (N);
15455                  Hom_Id := Homonym (Hom_Id);
15456
15457                  exit when No (Hom_Id)
15458                    or else Scope (Hom_Id) /= Current_Scope;
15459               end loop;
15460
15461               if not Found then
15462                  Error_Pragma_Arg
15463                    ("argument of pragma% is not imported subprogram",
15464                     Arg1);
15465               end if;
15466            end if;
15467         end Interface_Name;
15468
15469         -----------------------
15470         -- Interrupt_Handler --
15471         -----------------------
15472
15473         --  pragma Interrupt_Handler (handler_NAME);
15474
15475         when Pragma_Interrupt_Handler =>
15476            Check_Ada_83_Warning;
15477            Check_Arg_Count (1);
15478            Check_No_Identifiers;
15479
15480            if No_Run_Time_Mode then
15481               Error_Msg_CRT ("Interrupt_Handler pragma", N);
15482            else
15483               Check_Interrupt_Or_Attach_Handler;
15484               Process_Interrupt_Or_Attach_Handler;
15485            end if;
15486
15487         ------------------------
15488         -- Interrupt_Priority --
15489         ------------------------
15490
15491         --  pragma Interrupt_Priority [(EXPRESSION)];
15492
15493         when Pragma_Interrupt_Priority => Interrupt_Priority : declare
15494            P   : constant Node_Id := Parent (N);
15495            Arg : Node_Id;
15496            Ent : Entity_Id;
15497
15498         begin
15499            Check_Ada_83_Warning;
15500
15501            if Arg_Count /= 0 then
15502               Arg := Get_Pragma_Arg (Arg1);
15503               Check_Arg_Count (1);
15504               Check_No_Identifiers;
15505
15506               --  The expression must be analyzed in the special manner
15507               --  described in "Handling of Default and Per-Object
15508               --  Expressions" in sem.ads.
15509
15510               Preanalyze_Spec_Expression (Arg, RTE (RE_Interrupt_Priority));
15511            end if;
15512
15513            if not Nkind_In (P, N_Task_Definition, N_Protected_Definition) then
15514               Pragma_Misplaced;
15515               return;
15516
15517            else
15518               Ent := Defining_Identifier (Parent (P));
15519
15520               --  Check duplicate pragma before we chain the pragma in the Rep
15521               --  Item chain of Ent.
15522
15523               Check_Duplicate_Pragma (Ent);
15524               Record_Rep_Item (Ent, N);
15525            end if;
15526         end Interrupt_Priority;
15527
15528         ---------------------
15529         -- Interrupt_State --
15530         ---------------------
15531
15532         --  pragma Interrupt_State (
15533         --    [Name  =>] INTERRUPT_ID,
15534         --    [State =>] INTERRUPT_STATE);
15535
15536         --  INTERRUPT_ID => IDENTIFIER | static_integer_EXPRESSION
15537         --  INTERRUPT_STATE => System | Runtime | User
15538
15539         --  Note: if the interrupt id is given as an identifier, then it must
15540         --  be one of the identifiers in Ada.Interrupts.Names. Otherwise it is
15541         --  given as a static integer expression which must be in the range of
15542         --  Ada.Interrupts.Interrupt_ID.
15543
15544         when Pragma_Interrupt_State => Interrupt_State : declare
15545            Int_Id : constant Entity_Id := RTE (RE_Interrupt_ID);
15546            --  This is the entity Ada.Interrupts.Interrupt_ID;
15547
15548            State_Type : Character;
15549            --  Set to 's'/'r'/'u' for System/Runtime/User
15550
15551            IST_Num : Pos;
15552            --  Index to entry in Interrupt_States table
15553
15554            Int_Val : Uint;
15555            --  Value of interrupt
15556
15557            Arg1X : constant Node_Id := Get_Pragma_Arg (Arg1);
15558            --  The first argument to the pragma
15559
15560            Int_Ent : Entity_Id;
15561            --  Interrupt entity in Ada.Interrupts.Names
15562
15563         begin
15564            GNAT_Pragma;
15565            Check_Arg_Order ((Name_Name, Name_State));
15566            Check_Arg_Count (2);
15567
15568            Check_Optional_Identifier (Arg1, Name_Name);
15569            Check_Optional_Identifier (Arg2, Name_State);
15570            Check_Arg_Is_Identifier (Arg2);
15571
15572            --  First argument is identifier
15573
15574            if Nkind (Arg1X) = N_Identifier then
15575
15576               --  Search list of names in Ada.Interrupts.Names
15577
15578               Int_Ent := First_Entity (RTE (RE_Names));
15579               loop
15580                  if No (Int_Ent) then
15581                     Error_Pragma_Arg ("invalid interrupt name", Arg1);
15582
15583                  elsif Chars (Int_Ent) = Chars (Arg1X) then
15584                     Int_Val := Expr_Value (Constant_Value (Int_Ent));
15585                     exit;
15586                  end if;
15587
15588                  Next_Entity (Int_Ent);
15589               end loop;
15590
15591            --  First argument is not an identifier, so it must be a static
15592            --  expression of type Ada.Interrupts.Interrupt_ID.
15593
15594            else
15595               Check_Arg_Is_Static_Expression (Arg1, Any_Integer);
15596               Int_Val := Expr_Value (Arg1X);
15597
15598               if Int_Val < Expr_Value (Type_Low_Bound (Int_Id))
15599                    or else
15600                  Int_Val > Expr_Value (Type_High_Bound (Int_Id))
15601               then
15602                  Error_Pragma_Arg
15603                    ("value not in range of type "
15604                     & """Ada.Interrupts.Interrupt_'I'D""", Arg1);
15605               end if;
15606            end if;
15607
15608            --  Check OK state
15609
15610            case Chars (Get_Pragma_Arg (Arg2)) is
15611               when Name_Runtime => State_Type := 'r';
15612               when Name_System  => State_Type := 's';
15613               when Name_User    => State_Type := 'u';
15614
15615               when others =>
15616                  Error_Pragma_Arg ("invalid interrupt state", Arg2);
15617            end case;
15618
15619            --  Check if entry is already stored
15620
15621            IST_Num := Interrupt_States.First;
15622            loop
15623               --  If entry not found, add it
15624
15625               if IST_Num > Interrupt_States.Last then
15626                  Interrupt_States.Append
15627                    ((Interrupt_Number => UI_To_Int (Int_Val),
15628                      Interrupt_State  => State_Type,
15629                      Pragma_Loc       => Loc));
15630                  exit;
15631
15632               --  Case of entry for the same entry
15633
15634               elsif Int_Val = Interrupt_States.Table (IST_Num).
15635                                                           Interrupt_Number
15636               then
15637                  --  If state matches, done, no need to make redundant entry
15638
15639                  exit when
15640                    State_Type = Interrupt_States.Table (IST_Num).
15641                                                           Interrupt_State;
15642
15643                  --  Otherwise if state does not match, error
15644
15645                  Error_Msg_Sloc :=
15646                    Interrupt_States.Table (IST_Num).Pragma_Loc;
15647                  Error_Pragma_Arg
15648                    ("state conflicts with that given #", Arg2);
15649                  exit;
15650               end if;
15651
15652               IST_Num := IST_Num + 1;
15653            end loop;
15654         end Interrupt_State;
15655
15656         ---------------
15657         -- Invariant --
15658         ---------------
15659
15660         --  pragma Invariant
15661         --    ([Entity =>]    type_LOCAL_NAME,
15662         --     [Check  =>]    EXPRESSION
15663         --     [,[Message =>] String_Expression]);
15664
15665         when Pragma_Invariant => Invariant : declare
15666            Type_Id : Node_Id;
15667            Typ     : Entity_Id;
15668            PDecl   : Node_Id;
15669
15670            Discard : Boolean;
15671            pragma Unreferenced (Discard);
15672
15673         begin
15674            GNAT_Pragma;
15675            Check_At_Least_N_Arguments (2);
15676            Check_At_Most_N_Arguments  (3);
15677            Check_Optional_Identifier (Arg1, Name_Entity);
15678            Check_Optional_Identifier (Arg2, Name_Check);
15679
15680            if Arg_Count = 3 then
15681               Check_Optional_Identifier (Arg3, Name_Message);
15682               Check_Arg_Is_Static_Expression (Arg3, Standard_String);
15683            end if;
15684
15685            Check_Arg_Is_Local_Name (Arg1);
15686
15687            Type_Id := Get_Pragma_Arg (Arg1);
15688            Find_Type (Type_Id);
15689            Typ := Entity (Type_Id);
15690
15691            if Typ = Any_Type then
15692               return;
15693
15694            --  An invariant must apply to a private type, or appear in the
15695            --  private part of a package spec and apply to a completion.
15696            --  a class-wide invariant can only appear on a private declaration
15697            --  or private extension, not a completion.
15698
15699            elsif Ekind_In (Typ, E_Private_Type,
15700                                 E_Record_Type_With_Private,
15701                                 E_Limited_Private_Type)
15702            then
15703               null;
15704
15705            elsif In_Private_Part (Current_Scope)
15706              and then Has_Private_Declaration (Typ)
15707              and then not Class_Present (N)
15708            then
15709               null;
15710
15711            elsif In_Private_Part (Current_Scope) then
15712               Error_Pragma_Arg
15713                 ("pragma% only allowed for private type declared in "
15714                  & "visible part", Arg1);
15715
15716            else
15717               Error_Pragma_Arg
15718                 ("pragma% only allowed for private type", Arg1);
15719            end if;
15720
15721            --  Note that the type has at least one invariant, and also that
15722            --  it has inheritable invariants if we have Invariant'Class
15723            --  or Type_Invariant'Class. Build the corresponding invariant
15724            --  procedure declaration, so that calls to it can be generated
15725            --  before the body is built (e.g. within an expression function).
15726
15727            PDecl := Build_Invariant_Procedure_Declaration (Typ);
15728
15729            Insert_After (N, PDecl);
15730            Analyze (PDecl);
15731
15732            if Class_Present (N) then
15733               Set_Has_Inheritable_Invariants (Typ);
15734            end if;
15735
15736            --  The remaining processing is simply to link the pragma on to
15737            --  the rep item chain, for processing when the type is frozen.
15738            --  This is accomplished by a call to Rep_Item_Too_Late.
15739
15740            Discard := Rep_Item_Too_Late (Typ, N, FOnly => True);
15741         end Invariant;
15742
15743         ----------------------
15744         -- Java_Constructor --
15745         ----------------------
15746
15747         --  pragma Java_Constructor ([Entity =>] LOCAL_NAME);
15748
15749         --  Also handles pragma CIL_Constructor
15750
15751         when Pragma_CIL_Constructor | Pragma_Java_Constructor =>
15752         Java_Constructor : declare
15753            Convention  : Convention_Id;
15754            Def_Id      : Entity_Id;
15755            Hom_Id      : Entity_Id;
15756            Id          : Entity_Id;
15757            This_Formal : Entity_Id;
15758
15759         begin
15760            GNAT_Pragma;
15761            Check_Arg_Count (1);
15762            Check_Optional_Identifier (Arg1, Name_Entity);
15763            Check_Arg_Is_Local_Name (Arg1);
15764
15765            Id := Get_Pragma_Arg (Arg1);
15766            Find_Program_Unit_Name (Id);
15767
15768            --  If we did not find the name, we are done
15769
15770            if Etype (Id) = Any_Type then
15771               return;
15772            end if;
15773
15774            --  Check wrong use of pragma in wrong VM target
15775
15776            if VM_Target = No_VM then
15777               return;
15778
15779            elsif VM_Target = CLI_Target
15780              and then Prag_Id = Pragma_Java_Constructor
15781            then
15782               Error_Pragma ("must use pragma 'C'I'L_'Constructor");
15783
15784            elsif VM_Target = JVM_Target
15785              and then Prag_Id = Pragma_CIL_Constructor
15786            then
15787               Error_Pragma ("must use pragma 'Java_'Constructor");
15788            end if;
15789
15790            case Prag_Id is
15791               when Pragma_CIL_Constructor  => Convention := Convention_CIL;
15792               when Pragma_Java_Constructor => Convention := Convention_Java;
15793               when others                  => null;
15794            end case;
15795
15796            Hom_Id := Entity (Id);
15797
15798            --  Loop through homonyms
15799
15800            loop
15801               Def_Id := Get_Base_Subprogram (Hom_Id);
15802
15803               --  The constructor is required to be a function
15804
15805               if Ekind (Def_Id) /= E_Function then
15806                  if VM_Target = JVM_Target then
15807                     Error_Pragma_Arg
15808                       ("pragma% requires function returning a 'Java access "
15809                        & "type", Def_Id);
15810                  else
15811                     Error_Pragma_Arg
15812                       ("pragma% requires function returning a 'C'I'L access "
15813                        & "type", Def_Id);
15814                  end if;
15815               end if;
15816
15817               --  Check arguments: For tagged type the first formal must be
15818               --  named "this" and its type must be a named access type
15819               --  designating a class-wide tagged type that has convention
15820               --  CIL/Java. The first formal must also have a null default
15821               --  value. For example:
15822
15823               --      type Typ is tagged ...
15824               --      type Ref is access all Typ;
15825               --      pragma Convention (CIL, Typ);
15826
15827               --      function New_Typ (This : Ref) return Ref;
15828               --      function New_Typ (This : Ref; I : Integer) return Ref;
15829               --      pragma Cil_Constructor (New_Typ);
15830
15831               --  Reason: The first formal must NOT be a primitive of the
15832               --  tagged type.
15833
15834               --  This rule also applies to constructors of delegates used
15835               --  to interface with standard target libraries. For example:
15836
15837               --      type Delegate is access procedure ...
15838               --      pragma Import (CIL, Delegate, ...);
15839
15840               --      function new_Delegate
15841               --        (This : Delegate := null; ... ) return Delegate;
15842
15843               --  For value-types this rule does not apply.
15844
15845               if not Is_Value_Type (Etype (Def_Id)) then
15846                  if No (First_Formal (Def_Id)) then
15847                     Error_Msg_Name_1 := Pname;
15848                     Error_Msg_N ("% function must have parameters", Def_Id);
15849                     return;
15850                  end if;
15851
15852                  --  In the JRE library we have several occurrences in which
15853                  --  the "this" parameter is not the first formal.
15854
15855                  This_Formal := First_Formal (Def_Id);
15856
15857                  --  In the JRE library we have several occurrences in which
15858                  --  the "this" parameter is not the first formal. Search for
15859                  --  it.
15860
15861                  if VM_Target = JVM_Target then
15862                     while Present (This_Formal)
15863                       and then Get_Name_String (Chars (This_Formal)) /= "this"
15864                     loop
15865                        Next_Formal (This_Formal);
15866                     end loop;
15867
15868                     if No (This_Formal) then
15869                        This_Formal := First_Formal (Def_Id);
15870                     end if;
15871                  end if;
15872
15873                  --  Warning: The first parameter should be named "this".
15874                  --  We temporarily allow it because we have the following
15875                  --  case in the Java runtime (file s-osinte.ads) ???
15876
15877                  --    function new_Thread
15878                  --      (Self_Id : System.Address) return Thread_Id;
15879                  --    pragma Java_Constructor (new_Thread);
15880
15881                  if VM_Target = JVM_Target
15882                    and then Get_Name_String (Chars (First_Formal (Def_Id)))
15883                               = "self_id"
15884                    and then Etype (First_Formal (Def_Id)) = RTE (RE_Address)
15885                  then
15886                     null;
15887
15888                  elsif Get_Name_String (Chars (This_Formal)) /= "this" then
15889                     Error_Msg_Name_1 := Pname;
15890                     Error_Msg_N
15891                       ("first formal of % function must be named `this`",
15892                        Parent (This_Formal));
15893
15894                  elsif not Is_Access_Type (Etype (This_Formal)) then
15895                     Error_Msg_Name_1 := Pname;
15896                     Error_Msg_N
15897                       ("first formal of % function must be an access type",
15898                        Parameter_Type (Parent (This_Formal)));
15899
15900                  --  For delegates the type of the first formal must be a
15901                  --  named access-to-subprogram type (see previous example)
15902
15903                  elsif Ekind (Etype (Def_Id)) = E_Access_Subprogram_Type
15904                    and then Ekind (Etype (This_Formal))
15905                               /= E_Access_Subprogram_Type
15906                  then
15907                     Error_Msg_Name_1 := Pname;
15908                     Error_Msg_N
15909                       ("first formal of % function must be a named access "
15910                        & "to subprogram type",
15911                        Parameter_Type (Parent (This_Formal)));
15912
15913                  --  Warning: We should reject anonymous access types because
15914                  --  the constructor must not be handled as a primitive of the
15915                  --  tagged type. We temporarily allow it because this profile
15916                  --  is currently generated by cil2ada???
15917
15918                  elsif Ekind (Etype (Def_Id)) /= E_Access_Subprogram_Type
15919                    and then not Ekind_In (Etype (This_Formal),
15920                                             E_Access_Type,
15921                                             E_General_Access_Type,
15922                                             E_Anonymous_Access_Type)
15923                  then
15924                     Error_Msg_Name_1 := Pname;
15925                     Error_Msg_N
15926                       ("first formal of % function must be a named access "
15927                        & "type", Parameter_Type (Parent (This_Formal)));
15928
15929                  elsif Atree.Convention
15930                         (Designated_Type (Etype (This_Formal))) /= Convention
15931                  then
15932                     Error_Msg_Name_1 := Pname;
15933
15934                     if Convention = Convention_Java then
15935                        Error_Msg_N
15936                          ("pragma% requires convention 'Cil in designated "
15937                           & "type", Parameter_Type (Parent (This_Formal)));
15938                     else
15939                        Error_Msg_N
15940                          ("pragma% requires convention 'Java in designated "
15941                           & "type", Parameter_Type (Parent (This_Formal)));
15942                     end if;
15943
15944                  elsif No (Expression (Parent (This_Formal)))
15945                    or else Nkind (Expression (Parent (This_Formal))) /= N_Null
15946                  then
15947                     Error_Msg_Name_1 := Pname;
15948                     Error_Msg_N
15949                       ("pragma% requires first formal with default `null`",
15950                        Parameter_Type (Parent (This_Formal)));
15951                  end if;
15952               end if;
15953
15954               --  Check result type: the constructor must be a function
15955               --  returning:
15956               --   * a value type (only allowed in the CIL compiler)
15957               --   * an access-to-subprogram type with convention Java/CIL
15958               --   * an access-type designating a type that has convention
15959               --     Java/CIL.
15960
15961               if Is_Value_Type (Etype (Def_Id)) then
15962                  null;
15963
15964               --  Access-to-subprogram type with convention Java/CIL
15965
15966               elsif Ekind (Etype (Def_Id)) = E_Access_Subprogram_Type then
15967                  if Atree.Convention (Etype (Def_Id)) /= Convention then
15968                     if Convention = Convention_Java then
15969                        Error_Pragma_Arg
15970                          ("pragma% requires function returning a 'Java "
15971                           & "access type", Arg1);
15972                     else
15973                        pragma Assert (Convention = Convention_CIL);
15974                        Error_Pragma_Arg
15975                          ("pragma% requires function returning a 'C'I'L "
15976                           & "access type", Arg1);
15977                     end if;
15978                  end if;
15979
15980               elsif Ekind (Etype (Def_Id)) in Access_Kind then
15981                  if not Ekind_In (Etype (Def_Id), E_Access_Type,
15982                                                   E_General_Access_Type)
15983                    or else
15984                      Atree.Convention
15985                        (Designated_Type (Etype (Def_Id))) /= Convention
15986                  then
15987                     Error_Msg_Name_1 := Pname;
15988
15989                     if Convention = Convention_Java then
15990                        Error_Pragma_Arg
15991                          ("pragma% requires function returning a named "
15992                           & "'Java access type", Arg1);
15993                     else
15994                        Error_Pragma_Arg
15995                          ("pragma% requires function returning a named "
15996                           & "'C'I'L access type", Arg1);
15997                     end if;
15998                  end if;
15999               end if;
16000
16001               Set_Is_Constructor (Def_Id);
16002               Set_Convention     (Def_Id, Convention);
16003               Set_Is_Imported    (Def_Id);
16004
16005               exit when From_Aspect_Specification (N);
16006               Hom_Id := Homonym (Hom_Id);
16007
16008               exit when No (Hom_Id) or else Scope (Hom_Id) /= Current_Scope;
16009            end loop;
16010         end Java_Constructor;
16011
16012         ----------------------
16013         -- Java_Interface --
16014         ----------------------
16015
16016         --  pragma Java_Interface ([Entity =>] LOCAL_NAME);
16017
16018         when Pragma_Java_Interface => Java_Interface : declare
16019            Arg : Node_Id;
16020            Typ : Entity_Id;
16021
16022         begin
16023            GNAT_Pragma;
16024            Check_Arg_Count (1);
16025            Check_Optional_Identifier (Arg1, Name_Entity);
16026            Check_Arg_Is_Local_Name (Arg1);
16027
16028            Arg := Get_Pragma_Arg (Arg1);
16029            Analyze (Arg);
16030
16031            if Etype (Arg) = Any_Type then
16032               return;
16033            end if;
16034
16035            if not Is_Entity_Name (Arg)
16036              or else not Is_Type (Entity (Arg))
16037            then
16038               Error_Pragma_Arg ("pragma% requires a type mark", Arg1);
16039            end if;
16040
16041            Typ := Underlying_Type (Entity (Arg));
16042
16043            --  For now simply check some of the semantic constraints on the
16044            --  type. This currently leaves out some restrictions on interface
16045            --  types, namely that the parent type must be java.lang.Object.Typ
16046            --  and that all primitives of the type should be declared
16047            --  abstract. ???
16048
16049            if not Is_Tagged_Type (Typ) or else not Is_Abstract_Type (Typ) then
16050               Error_Pragma_Arg
16051                 ("pragma% requires an abstract tagged type", Arg1);
16052
16053            elsif not Has_Discriminants (Typ)
16054              or else Ekind (Etype (First_Discriminant (Typ)))
16055                        /= E_Anonymous_Access_Type
16056              or else
16057                not Is_Class_Wide_Type
16058                      (Designated_Type (Etype (First_Discriminant (Typ))))
16059            then
16060               Error_Pragma_Arg
16061                 ("type must have a class-wide access discriminant", Arg1);
16062            end if;
16063         end Java_Interface;
16064
16065         ----------------
16066         -- Keep_Names --
16067         ----------------
16068
16069         --  pragma Keep_Names ([On => ] local_NAME);
16070
16071         when Pragma_Keep_Names => Keep_Names : declare
16072            Arg : Node_Id;
16073
16074         begin
16075            GNAT_Pragma;
16076            Check_Arg_Count (1);
16077            Check_Optional_Identifier (Arg1, Name_On);
16078            Check_Arg_Is_Local_Name (Arg1);
16079
16080            Arg := Get_Pragma_Arg (Arg1);
16081            Analyze (Arg);
16082
16083            if Etype (Arg) = Any_Type then
16084               return;
16085            end if;
16086
16087            if not Is_Entity_Name (Arg)
16088              or else Ekind (Entity (Arg)) /= E_Enumeration_Type
16089            then
16090               Error_Pragma_Arg
16091                 ("pragma% requires a local enumeration type", Arg1);
16092            end if;
16093
16094            Set_Discard_Names (Entity (Arg), False);
16095         end Keep_Names;
16096
16097         -------------
16098         -- License --
16099         -------------
16100
16101         --  pragma License (RESTRICTED | UNRESTRICTED | GPL | MODIFIED_GPL);
16102
16103         when Pragma_License =>
16104            GNAT_Pragma;
16105            Check_Arg_Count (1);
16106            Check_No_Identifiers;
16107            Check_Valid_Configuration_Pragma;
16108            Check_Arg_Is_Identifier (Arg1);
16109
16110            declare
16111               Sind : constant Source_File_Index :=
16112                        Source_Index (Current_Sem_Unit);
16113
16114            begin
16115               case Chars (Get_Pragma_Arg (Arg1)) is
16116                  when Name_GPL =>
16117                     Set_License (Sind, GPL);
16118
16119                  when Name_Modified_GPL =>
16120                     Set_License (Sind, Modified_GPL);
16121
16122                  when Name_Restricted =>
16123                     Set_License (Sind, Restricted);
16124
16125                  when Name_Unrestricted =>
16126                     Set_License (Sind, Unrestricted);
16127
16128                  when others =>
16129                     Error_Pragma_Arg ("invalid license name", Arg1);
16130               end case;
16131            end;
16132
16133         ---------------
16134         -- Link_With --
16135         ---------------
16136
16137         --  pragma Link_With (string_EXPRESSION {, string_EXPRESSION});
16138
16139         when Pragma_Link_With => Link_With : declare
16140            Arg : Node_Id;
16141
16142         begin
16143            GNAT_Pragma;
16144
16145            if Operating_Mode = Generate_Code
16146              and then In_Extended_Main_Source_Unit (N)
16147            then
16148               Check_At_Least_N_Arguments (1);
16149               Check_No_Identifiers;
16150               Check_Is_In_Decl_Part_Or_Package_Spec;
16151               Check_Arg_Is_Static_Expression (Arg1, Standard_String);
16152               Start_String;
16153
16154               Arg := Arg1;
16155               while Present (Arg) loop
16156                  Check_Arg_Is_Static_Expression (Arg, Standard_String);
16157
16158                  --  Store argument, converting sequences of spaces to a
16159                  --  single null character (this is one of the differences
16160                  --  in processing between Link_With and Linker_Options).
16161
16162                  Arg_Store : declare
16163                     C : constant Char_Code := Get_Char_Code (' ');
16164                     S : constant String_Id :=
16165                           Strval (Expr_Value_S (Get_Pragma_Arg (Arg)));
16166                     L : constant Nat := String_Length (S);
16167                     F : Nat := 1;
16168
16169                     procedure Skip_Spaces;
16170                     --  Advance F past any spaces
16171
16172                     -----------------
16173                     -- Skip_Spaces --
16174                     -----------------
16175
16176                     procedure Skip_Spaces is
16177                     begin
16178                        while F <= L and then Get_String_Char (S, F) = C loop
16179                           F := F + 1;
16180                        end loop;
16181                     end Skip_Spaces;
16182
16183                  --  Start of processing for Arg_Store
16184
16185                  begin
16186                     Skip_Spaces; -- skip leading spaces
16187
16188                     --  Loop through characters, changing any embedded
16189                     --  sequence of spaces to a single null character (this
16190                     --  is how Link_With/Linker_Options differ)
16191
16192                     while F <= L loop
16193                        if Get_String_Char (S, F) = C then
16194                           Skip_Spaces;
16195                           exit when F > L;
16196                           Store_String_Char (ASCII.NUL);
16197
16198                        else
16199                           Store_String_Char (Get_String_Char (S, F));
16200                           F := F + 1;
16201                        end if;
16202                     end loop;
16203                  end Arg_Store;
16204
16205                  Arg := Next (Arg);
16206
16207                  if Present (Arg) then
16208                     Store_String_Char (ASCII.NUL);
16209                  end if;
16210               end loop;
16211
16212               Store_Linker_Option_String (End_String);
16213            end if;
16214         end Link_With;
16215
16216         ------------------
16217         -- Linker_Alias --
16218         ------------------
16219
16220         --  pragma Linker_Alias (
16221         --      [Entity =>]  LOCAL_NAME
16222         --      [Target =>]  static_string_EXPRESSION);
16223
16224         when Pragma_Linker_Alias =>
16225            GNAT_Pragma;
16226            Check_Arg_Order ((Name_Entity, Name_Target));
16227            Check_Arg_Count (2);
16228            Check_Optional_Identifier (Arg1, Name_Entity);
16229            Check_Optional_Identifier (Arg2, Name_Target);
16230            Check_Arg_Is_Library_Level_Local_Name (Arg1);
16231            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
16232
16233            --  The only processing required is to link this item on to the
16234            --  list of rep items for the given entity. This is accomplished
16235            --  by the call to Rep_Item_Too_Late (when no error is detected
16236            --  and False is returned).
16237
16238            if Rep_Item_Too_Late (Entity (Get_Pragma_Arg (Arg1)), N) then
16239               return;
16240            else
16241               Set_Has_Gigi_Rep_Item (Entity (Get_Pragma_Arg (Arg1)));
16242            end if;
16243
16244         ------------------------
16245         -- Linker_Constructor --
16246         ------------------------
16247
16248         --  pragma Linker_Constructor (procedure_LOCAL_NAME);
16249
16250         --  Code is shared with Linker_Destructor
16251
16252         -----------------------
16253         -- Linker_Destructor --
16254         -----------------------
16255
16256         --  pragma Linker_Destructor (procedure_LOCAL_NAME);
16257
16258         when Pragma_Linker_Constructor |
16259              Pragma_Linker_Destructor =>
16260         Linker_Constructor : declare
16261            Arg1_X : Node_Id;
16262            Proc   : Entity_Id;
16263
16264         begin
16265            GNAT_Pragma;
16266            Check_Arg_Count (1);
16267            Check_No_Identifiers;
16268            Check_Arg_Is_Local_Name (Arg1);
16269            Arg1_X := Get_Pragma_Arg (Arg1);
16270            Analyze (Arg1_X);
16271            Proc := Find_Unique_Parameterless_Procedure (Arg1_X, Arg1);
16272
16273            if not Is_Library_Level_Entity (Proc) then
16274               Error_Pragma_Arg
16275                ("argument for pragma% must be library level entity", Arg1);
16276            end if;
16277
16278            --  The only processing required is to link this item on to the
16279            --  list of rep items for the given entity. This is accomplished
16280            --  by the call to Rep_Item_Too_Late (when no error is detected
16281            --  and False is returned).
16282
16283            if Rep_Item_Too_Late (Proc, N) then
16284               return;
16285            else
16286               Set_Has_Gigi_Rep_Item (Proc);
16287            end if;
16288         end Linker_Constructor;
16289
16290         --------------------
16291         -- Linker_Options --
16292         --------------------
16293
16294         --  pragma Linker_Options (string_EXPRESSION {, string_EXPRESSION});
16295
16296         when Pragma_Linker_Options => Linker_Options : declare
16297            Arg : Node_Id;
16298
16299         begin
16300            Check_Ada_83_Warning;
16301            Check_No_Identifiers;
16302            Check_Arg_Count (1);
16303            Check_Is_In_Decl_Part_Or_Package_Spec;
16304            Check_Arg_Is_Static_Expression (Arg1, Standard_String);
16305            Start_String (Strval (Expr_Value_S (Get_Pragma_Arg (Arg1))));
16306
16307            Arg := Arg2;
16308            while Present (Arg) loop
16309               Check_Arg_Is_Static_Expression (Arg, Standard_String);
16310               Store_String_Char (ASCII.NUL);
16311               Store_String_Chars
16312                 (Strval (Expr_Value_S (Get_Pragma_Arg (Arg))));
16313               Arg := Next (Arg);
16314            end loop;
16315
16316            if Operating_Mode = Generate_Code
16317              and then In_Extended_Main_Source_Unit (N)
16318            then
16319               Store_Linker_Option_String (End_String);
16320            end if;
16321         end Linker_Options;
16322
16323         --------------------
16324         -- Linker_Section --
16325         --------------------
16326
16327         --  pragma Linker_Section (
16328         --      [Entity  =>]  LOCAL_NAME
16329         --      [Section =>]  static_string_EXPRESSION);
16330
16331         when Pragma_Linker_Section => Linker_Section : declare
16332            Arg : Node_Id;
16333            Ent : Entity_Id;
16334
16335         begin
16336            GNAT_Pragma;
16337            Check_Arg_Order ((Name_Entity, Name_Section));
16338            Check_Arg_Count (2);
16339            Check_Optional_Identifier (Arg1, Name_Entity);
16340            Check_Optional_Identifier (Arg2, Name_Section);
16341            Check_Arg_Is_Library_Level_Local_Name (Arg1);
16342            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
16343
16344            --  Check kind of entity
16345
16346            Arg := Get_Pragma_Arg (Arg1);
16347            Ent := Entity (Arg);
16348
16349            case Ekind (Ent) is
16350
16351               --  Objects (constants and variables) and types. For these cases
16352               --  all we need to do is to set the Linker_Section_pragma field.
16353
16354               when E_Constant | E_Variable | Type_Kind =>
16355                  Set_Linker_Section_Pragma (Ent, N);
16356
16357               --  Subprograms
16358
16359               when Subprogram_Kind =>
16360
16361                  --  Aspect case, entity already set
16362
16363                  if From_Aspect_Specification (N) then
16364                     Set_Linker_Section_Pragma
16365                       (Entity (Corresponding_Aspect (N)), N);
16366
16367                  --  Pragma case, we must climb the homonym chain, but skip
16368                  --  any for which the linker section is already set.
16369
16370                  else
16371                     loop
16372                        if No (Linker_Section_Pragma (Ent)) then
16373                           Set_Linker_Section_Pragma (Ent, N);
16374                        end if;
16375
16376                        Ent := Homonym (Ent);
16377                        exit when No (Ent)
16378                          or else Scope (Ent) /= Current_Scope;
16379                     end loop;
16380                  end if;
16381
16382               --  All other cases are illegal
16383
16384               when others =>
16385                  Error_Pragma_Arg
16386                    ("pragma% applies only to objects, subprograms, and types",
16387                     Arg1);
16388            end case;
16389         end Linker_Section;
16390
16391         ----------
16392         -- List --
16393         ----------
16394
16395         --  pragma List (On | Off)
16396
16397         --  There is nothing to do here, since we did all the processing for
16398         --  this pragma in Par.Prag (so that it works properly even in syntax
16399         --  only mode).
16400
16401         when Pragma_List =>
16402            null;
16403
16404         ---------------
16405         -- Lock_Free --
16406         ---------------
16407
16408         --  pragma Lock_Free [(Boolean_EXPRESSION)];
16409
16410         when Pragma_Lock_Free => Lock_Free : declare
16411            P   : constant Node_Id := Parent (N);
16412            Arg : Node_Id;
16413            Ent : Entity_Id;
16414            Val : Boolean;
16415
16416         begin
16417            Check_No_Identifiers;
16418            Check_At_Most_N_Arguments (1);
16419
16420            --  Protected definition case
16421
16422            if Nkind (P) = N_Protected_Definition then
16423               Ent := Defining_Identifier (Parent (P));
16424
16425               --  One argument
16426
16427               if Arg_Count = 1 then
16428                  Arg := Get_Pragma_Arg (Arg1);
16429                  Val := Is_True (Static_Boolean (Arg));
16430
16431               --  No arguments (expression is considered to be True)
16432
16433               else
16434                  Val := True;
16435               end if;
16436
16437               --  Check duplicate pragma before we chain the pragma in the Rep
16438               --  Item chain of Ent.
16439
16440               Check_Duplicate_Pragma (Ent);
16441               Record_Rep_Item        (Ent, N);
16442               Set_Uses_Lock_Free     (Ent, Val);
16443
16444            --  Anything else is incorrect placement
16445
16446            else
16447               Pragma_Misplaced;
16448            end if;
16449         end Lock_Free;
16450
16451         --------------------
16452         -- Locking_Policy --
16453         --------------------
16454
16455         --  pragma Locking_Policy (policy_IDENTIFIER);
16456
16457         when Pragma_Locking_Policy => declare
16458            subtype LP_Range is Name_Id
16459              range First_Locking_Policy_Name .. Last_Locking_Policy_Name;
16460            LP_Val : LP_Range;
16461            LP     : Character;
16462
16463         begin
16464            Check_Ada_83_Warning;
16465            Check_Arg_Count (1);
16466            Check_No_Identifiers;
16467            Check_Arg_Is_Locking_Policy (Arg1);
16468            Check_Valid_Configuration_Pragma;
16469            LP_Val := Chars (Get_Pragma_Arg (Arg1));
16470
16471            case LP_Val is
16472               when Name_Ceiling_Locking            =>
16473                  LP := 'C';
16474               when Name_Inheritance_Locking        =>
16475                  LP := 'I';
16476               when Name_Concurrent_Readers_Locking =>
16477                  LP := 'R';
16478            end case;
16479
16480            if Locking_Policy /= ' '
16481              and then Locking_Policy /= LP
16482            then
16483               Error_Msg_Sloc := Locking_Policy_Sloc;
16484               Error_Pragma ("locking policy incompatible with policy#");
16485
16486            --  Set new policy, but always preserve System_Location since we
16487            --  like the error message with the run time name.
16488
16489            else
16490               Locking_Policy := LP;
16491
16492               if Locking_Policy_Sloc /= System_Location then
16493                  Locking_Policy_Sloc := Loc;
16494               end if;
16495            end if;
16496         end;
16497
16498         ----------------
16499         -- Long_Float --
16500         ----------------
16501
16502         --  pragma Long_Float (D_Float | G_Float);
16503
16504         when Pragma_Long_Float => Long_Float : declare
16505         begin
16506            GNAT_Pragma;
16507            Check_Valid_Configuration_Pragma;
16508            Check_Arg_Count (1);
16509            Check_No_Identifier (Arg1);
16510            Check_Arg_Is_One_Of (Arg1, Name_D_Float, Name_G_Float);
16511
16512            if not OpenVMS_On_Target then
16513               Error_Pragma ("??pragma% ignored (applies only to Open'V'M'S)");
16514            end if;
16515
16516            --  D_Float case
16517
16518            if Chars (Get_Pragma_Arg (Arg1)) = Name_D_Float then
16519               if Opt.Float_Format_Long = 'G' then
16520                  Error_Pragma_Arg
16521                    ("G_Float previously specified", Arg1);
16522
16523               elsif Current_Sem_Unit /= Main_Unit
16524                 and then Opt.Float_Format_Long /= 'D'
16525               then
16526                  Error_Pragma_Arg
16527                    ("main unit not compiled with pragma Long_Float (D_Float)",
16528                     "\pragma% must be used consistently for whole partition",
16529                     Arg1);
16530
16531               else
16532                  Opt.Float_Format_Long := 'D';
16533               end if;
16534
16535            --  G_Float case (this is the default, does not need overriding)
16536
16537            else
16538               if Opt.Float_Format_Long = 'D' then
16539                  Error_Pragma ("D_Float previously specified");
16540
16541               elsif Current_Sem_Unit /= Main_Unit
16542                 and then Opt.Float_Format_Long /= 'G'
16543               then
16544                  Error_Pragma_Arg
16545                    ("main unit not compiled with pragma Long_Float (G_Float)",
16546                     "\pragma% must be used consistently for whole partition",
16547                     Arg1);
16548
16549               else
16550                  Opt.Float_Format_Long := 'G';
16551               end if;
16552            end if;
16553
16554            Set_Standard_Fpt_Formats;
16555         end Long_Float;
16556
16557         -------------------
16558         -- Loop_Optimize --
16559         -------------------
16560
16561         --  pragma Loop_Optimize ( OPTIMIZATION_HINT {, OPTIMIZATION_HINT } );
16562
16563         --  OPTIMIZATION_HINT ::= No_Unroll | Unroll | No_Vector | Vector
16564
16565         when Pragma_Loop_Optimize => Loop_Optimize : declare
16566            Hint : Node_Id;
16567
16568         begin
16569            GNAT_Pragma;
16570            Check_At_Least_N_Arguments (1);
16571            Check_No_Identifiers;
16572
16573            Hint := First (Pragma_Argument_Associations (N));
16574            while Present (Hint) loop
16575               Check_Arg_Is_One_Of (Hint,
16576                 Name_No_Unroll, Name_Unroll, Name_No_Vector, Name_Vector);
16577               Next (Hint);
16578            end loop;
16579
16580            Check_Loop_Pragma_Placement;
16581         end Loop_Optimize;
16582
16583         ------------------
16584         -- Loop_Variant --
16585         ------------------
16586
16587         --  pragma Loop_Variant
16588         --         ( LOOP_VARIANT_ITEM {, LOOP_VARIANT_ITEM } );
16589
16590         --  LOOP_VARIANT_ITEM ::= CHANGE_DIRECTION => discrete_EXPRESSION
16591
16592         --  CHANGE_DIRECTION ::= Increases | Decreases
16593
16594         when Pragma_Loop_Variant => Loop_Variant : declare
16595            Variant : Node_Id;
16596
16597         begin
16598            GNAT_Pragma;
16599            Check_At_Least_N_Arguments (1);
16600            Check_Loop_Pragma_Placement;
16601
16602            --  Process all increasing / decreasing expressions
16603
16604            Variant := First (Pragma_Argument_Associations (N));
16605            while Present (Variant) loop
16606               if not Nam_In (Chars (Variant), Name_Decreases,
16607                                               Name_Increases)
16608               then
16609                  Error_Pragma_Arg ("wrong change modifier", Variant);
16610               end if;
16611
16612               Preanalyze_Assert_Expression
16613                 (Expression (Variant), Any_Discrete);
16614
16615               Next (Variant);
16616            end loop;
16617         end Loop_Variant;
16618
16619         -----------------------
16620         -- Machine_Attribute --
16621         -----------------------
16622
16623         --  pragma Machine_Attribute (
16624         --       [Entity         =>] LOCAL_NAME,
16625         --       [Attribute_Name =>] static_string_EXPRESSION
16626         --    [, [Info           =>] static_EXPRESSION] );
16627
16628         when Pragma_Machine_Attribute => Machine_Attribute : declare
16629            Def_Id : Entity_Id;
16630
16631         begin
16632            GNAT_Pragma;
16633            Check_Arg_Order ((Name_Entity, Name_Attribute_Name, Name_Info));
16634
16635            if Arg_Count = 3 then
16636               Check_Optional_Identifier (Arg3, Name_Info);
16637               Check_Arg_Is_Static_Expression (Arg3);
16638            else
16639               Check_Arg_Count (2);
16640            end if;
16641
16642            Check_Optional_Identifier (Arg1, Name_Entity);
16643            Check_Optional_Identifier (Arg2, Name_Attribute_Name);
16644            Check_Arg_Is_Local_Name (Arg1);
16645            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
16646            Def_Id := Entity (Get_Pragma_Arg (Arg1));
16647
16648            if Is_Access_Type (Def_Id) then
16649               Def_Id := Designated_Type (Def_Id);
16650            end if;
16651
16652            if Rep_Item_Too_Early (Def_Id, N) then
16653               return;
16654            end if;
16655
16656            Def_Id := Underlying_Type (Def_Id);
16657
16658            --  The only processing required is to link this item on to the
16659            --  list of rep items for the given entity. This is accomplished
16660            --  by the call to Rep_Item_Too_Late (when no error is detected
16661            --  and False is returned).
16662
16663            if Rep_Item_Too_Late (Def_Id, N) then
16664               return;
16665            else
16666               Set_Has_Gigi_Rep_Item (Entity (Get_Pragma_Arg (Arg1)));
16667            end if;
16668         end Machine_Attribute;
16669
16670         ----------
16671         -- Main --
16672         ----------
16673
16674         --  pragma Main
16675         --   (MAIN_OPTION [, MAIN_OPTION]);
16676
16677         --  MAIN_OPTION ::=
16678         --    [STACK_SIZE              =>] static_integer_EXPRESSION
16679         --  | [TASK_STACK_SIZE_DEFAULT =>] static_integer_EXPRESSION
16680         --  | [TIME_SLICING_ENABLED    =>] static_boolean_EXPRESSION
16681
16682         when Pragma_Main => Main : declare
16683            Args  : Args_List (1 .. 3);
16684            Names : constant Name_List (1 .. 3) := (
16685                      Name_Stack_Size,
16686                      Name_Task_Stack_Size_Default,
16687                      Name_Time_Slicing_Enabled);
16688
16689            Nod : Node_Id;
16690
16691         begin
16692            GNAT_Pragma;
16693            Gather_Associations (Names, Args);
16694
16695            for J in 1 .. 2 loop
16696               if Present (Args (J)) then
16697                  Check_Arg_Is_Static_Expression (Args (J), Any_Integer);
16698               end if;
16699            end loop;
16700
16701            if Present (Args (3)) then
16702               Check_Arg_Is_Static_Expression (Args (3), Standard_Boolean);
16703            end if;
16704
16705            Nod := Next (N);
16706            while Present (Nod) loop
16707               if Nkind (Nod) = N_Pragma
16708                 and then Pragma_Name (Nod) = Name_Main
16709               then
16710                  Error_Msg_Name_1 := Pname;
16711                  Error_Msg_N ("duplicate pragma% not permitted", Nod);
16712               end if;
16713
16714               Next (Nod);
16715            end loop;
16716         end Main;
16717
16718         ------------------
16719         -- Main_Storage --
16720         ------------------
16721
16722         --  pragma Main_Storage
16723         --   (MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]);
16724
16725         --  MAIN_STORAGE_OPTION ::=
16726         --    [WORKING_STORAGE =>] static_SIMPLE_EXPRESSION
16727         --  | [TOP_GUARD =>] static_SIMPLE_EXPRESSION
16728
16729         when Pragma_Main_Storage => Main_Storage : declare
16730            Args  : Args_List (1 .. 2);
16731            Names : constant Name_List (1 .. 2) := (
16732                      Name_Working_Storage,
16733                      Name_Top_Guard);
16734
16735            Nod : Node_Id;
16736
16737         begin
16738            GNAT_Pragma;
16739            Gather_Associations (Names, Args);
16740
16741            for J in 1 .. 2 loop
16742               if Present (Args (J)) then
16743                  Check_Arg_Is_Static_Expression (Args (J), Any_Integer);
16744               end if;
16745            end loop;
16746
16747            Check_In_Main_Program;
16748
16749            Nod := Next (N);
16750            while Present (Nod) loop
16751               if Nkind (Nod) = N_Pragma
16752                 and then Pragma_Name (Nod) = Name_Main_Storage
16753               then
16754                  Error_Msg_Name_1 := Pname;
16755                  Error_Msg_N ("duplicate pragma% not permitted", Nod);
16756               end if;
16757
16758               Next (Nod);
16759            end loop;
16760         end Main_Storage;
16761
16762         -----------------
16763         -- Memory_Size --
16764         -----------------
16765
16766         --  pragma Memory_Size (NUMERIC_LITERAL)
16767
16768         when Pragma_Memory_Size =>
16769            GNAT_Pragma;
16770
16771            --  Memory size is simply ignored
16772
16773            Check_No_Identifiers;
16774            Check_Arg_Count (1);
16775            Check_Arg_Is_Integer_Literal (Arg1);
16776
16777         -------------
16778         -- No_Body --
16779         -------------
16780
16781         --  pragma No_Body;
16782
16783         --  The only correct use of this pragma is on its own in a file, in
16784         --  which case it is specially processed (see Gnat1drv.Check_Bad_Body
16785         --  and Frontend, which use Sinput.L.Source_File_Is_Pragma_No_Body to
16786         --  check for a file containing nothing but a No_Body pragma). If we
16787         --  attempt to process it during normal semantics processing, it means
16788         --  it was misplaced.
16789
16790         when Pragma_No_Body =>
16791            GNAT_Pragma;
16792            Pragma_Misplaced;
16793
16794         ---------------
16795         -- No_Inline --
16796         ---------------
16797
16798         --  pragma No_Inline ( NAME {, NAME} );
16799
16800         when Pragma_No_Inline =>
16801            GNAT_Pragma;
16802            Process_Inline (Suppressed);
16803
16804         ---------------
16805         -- No_Return --
16806         ---------------
16807
16808         --  pragma No_Return (procedure_LOCAL_NAME {, procedure_Local_Name});
16809
16810         when Pragma_No_Return => No_Return : declare
16811            Id    : Node_Id;
16812            E     : Entity_Id;
16813            Found : Boolean;
16814            Arg   : Node_Id;
16815
16816         begin
16817            Ada_2005_Pragma;
16818            Check_At_Least_N_Arguments (1);
16819
16820            --  Loop through arguments of pragma
16821
16822            Arg := Arg1;
16823            while Present (Arg) loop
16824               Check_Arg_Is_Local_Name (Arg);
16825               Id := Get_Pragma_Arg (Arg);
16826               Analyze (Id);
16827
16828               if not Is_Entity_Name (Id) then
16829                  Error_Pragma_Arg ("entity name required", Arg);
16830               end if;
16831
16832               if Etype (Id) = Any_Type then
16833                  raise Pragma_Exit;
16834               end if;
16835
16836               --  Loop to find matching procedures
16837
16838               E := Entity (Id);
16839               Found := False;
16840               while Present (E)
16841                 and then Scope (E) = Current_Scope
16842               loop
16843                  if Ekind_In (E, E_Procedure, E_Generic_Procedure) then
16844                     Set_No_Return (E);
16845
16846                     --  Set flag on any alias as well
16847
16848                     if Is_Overloadable (E) and then Present (Alias (E)) then
16849                        Set_No_Return (Alias (E));
16850                     end if;
16851
16852                     Found := True;
16853                  end if;
16854
16855                  exit when From_Aspect_Specification (N);
16856                  E := Homonym (E);
16857               end loop;
16858
16859               --  If entity in not in current scope it may be the enclosing
16860               --  suprogram body to which the aspect applies.
16861
16862               if not Found then
16863                  if Entity (Id) = Current_Scope
16864                    and then From_Aspect_Specification (N)
16865                  then
16866                     Set_No_Return (Entity (Id));
16867                  else
16868                     Error_Pragma_Arg ("no procedure& found for pragma%", Arg);
16869                  end if;
16870               end if;
16871
16872               Next (Arg);
16873            end loop;
16874         end No_Return;
16875
16876         -----------------
16877         -- No_Run_Time --
16878         -----------------
16879
16880         --  pragma No_Run_Time;
16881
16882         --  Note: this pragma is retained for backwards compatibility. See
16883         --  body of Rtsfind for full details on its handling.
16884
16885         when Pragma_No_Run_Time =>
16886            GNAT_Pragma;
16887            Check_Valid_Configuration_Pragma;
16888            Check_Arg_Count (0);
16889
16890            No_Run_Time_Mode           := True;
16891            Configurable_Run_Time_Mode := True;
16892
16893            --  Set Duration to 32 bits if word size is 32
16894
16895            if Ttypes.System_Word_Size = 32 then
16896               Duration_32_Bits_On_Target := True;
16897            end if;
16898
16899            --  Set appropriate restrictions
16900
16901            Set_Restriction (No_Finalization, N);
16902            Set_Restriction (No_Exception_Handlers, N);
16903            Set_Restriction (Max_Tasks, N, 0);
16904            Set_Restriction (No_Tasking, N);
16905
16906         ------------------------
16907         -- No_Strict_Aliasing --
16908         ------------------------
16909
16910         --  pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];
16911
16912         when Pragma_No_Strict_Aliasing => No_Strict_Aliasing : declare
16913            E_Id : Entity_Id;
16914
16915         begin
16916            GNAT_Pragma;
16917            Check_At_Most_N_Arguments (1);
16918
16919            if Arg_Count = 0 then
16920               Check_Valid_Configuration_Pragma;
16921               Opt.No_Strict_Aliasing := True;
16922
16923            else
16924               Check_Optional_Identifier (Arg2, Name_Entity);
16925               Check_Arg_Is_Local_Name (Arg1);
16926               E_Id := Entity (Get_Pragma_Arg (Arg1));
16927
16928               if E_Id = Any_Type then
16929                  return;
16930               elsif No (E_Id) or else not Is_Access_Type (E_Id) then
16931                  Error_Pragma_Arg ("pragma% requires access type", Arg1);
16932               end if;
16933
16934               Set_No_Strict_Aliasing (Implementation_Base_Type (E_Id));
16935            end if;
16936         end No_Strict_Aliasing;
16937
16938         -----------------------
16939         -- Normalize_Scalars --
16940         -----------------------
16941
16942         --  pragma Normalize_Scalars;
16943
16944         when Pragma_Normalize_Scalars =>
16945            Check_Ada_83_Warning;
16946            Check_Arg_Count (0);
16947            Check_Valid_Configuration_Pragma;
16948
16949            --  Normalize_Scalars creates false positives in CodePeer, and
16950            --  incorrect negative results in GNATprove mode, so ignore this
16951            --  pragma in these modes.
16952
16953            if not (CodePeer_Mode or GNATprove_Mode) then
16954               Normalize_Scalars := True;
16955               Init_Or_Norm_Scalars := True;
16956            end if;
16957
16958         -----------------
16959         -- Obsolescent --
16960         -----------------
16961
16962         --  pragma Obsolescent;
16963
16964         --  pragma Obsolescent (
16965         --    [Message =>] static_string_EXPRESSION
16966         --  [,[Version =>] Ada_05]]);
16967
16968         --  pragma Obsolescent (
16969         --    [Entity  =>] NAME
16970         --  [,[Message =>] static_string_EXPRESSION
16971         --  [,[Version =>] Ada_05]] );
16972
16973         when Pragma_Obsolescent => Obsolescent : declare
16974            Ename : Node_Id;
16975            Decl  : Node_Id;
16976
16977            procedure Set_Obsolescent (E : Entity_Id);
16978            --  Given an entity Ent, mark it as obsolescent if appropriate
16979
16980            ---------------------
16981            -- Set_Obsolescent --
16982            ---------------------
16983
16984            procedure Set_Obsolescent (E : Entity_Id) is
16985               Active : Boolean;
16986               Ent    : Entity_Id;
16987               S      : String_Id;
16988
16989            begin
16990               Active := True;
16991               Ent    := E;
16992
16993               --  Entity name was given
16994
16995               if Present (Ename) then
16996
16997                  --  If entity name matches, we are fine. Save entity in
16998                  --  pragma argument, for ASIS use.
16999
17000                  if Chars (Ename) = Chars (Ent) then
17001                     Set_Entity (Ename, Ent);
17002                     Generate_Reference (Ent, Ename);
17003
17004                  --  If entity name does not match, only possibility is an
17005                  --  enumeration literal from an enumeration type declaration.
17006
17007                  elsif Ekind (Ent) /= E_Enumeration_Type then
17008                     Error_Pragma
17009                       ("pragma % entity name does not match declaration");
17010
17011                  else
17012                     Ent := First_Literal (E);
17013                     loop
17014                        if No (Ent) then
17015                           Error_Pragma
17016                             ("pragma % entity name does not match any "
17017                              & "enumeration literal");
17018
17019                        elsif Chars (Ent) = Chars (Ename) then
17020                           Set_Entity (Ename, Ent);
17021                           Generate_Reference (Ent, Ename);
17022                           exit;
17023
17024                        else
17025                           Ent := Next_Literal (Ent);
17026                        end if;
17027                     end loop;
17028                  end if;
17029               end if;
17030
17031               --  Ent points to entity to be marked
17032
17033               if Arg_Count >= 1 then
17034
17035                  --  Deal with static string argument
17036
17037                  Check_Arg_Is_Static_Expression (Arg1, Standard_String);
17038                  S := Strval (Get_Pragma_Arg (Arg1));
17039
17040                  for J in 1 .. String_Length (S) loop
17041                     if not In_Character_Range (Get_String_Char (S, J)) then
17042                        Error_Pragma_Arg
17043                          ("pragma% argument does not allow wide characters",
17044                           Arg1);
17045                     end if;
17046                  end loop;
17047
17048                  Obsolescent_Warnings.Append
17049                    ((Ent => Ent, Msg => Strval (Get_Pragma_Arg (Arg1))));
17050
17051                  --  Check for Ada_05 parameter
17052
17053                  if Arg_Count /= 1 then
17054                     Check_Arg_Count (2);
17055
17056                     declare
17057                        Argx : constant Node_Id := Get_Pragma_Arg (Arg2);
17058
17059                     begin
17060                        Check_Arg_Is_Identifier (Argx);
17061
17062                        if Chars (Argx) /= Name_Ada_05 then
17063                           Error_Msg_Name_2 := Name_Ada_05;
17064                           Error_Pragma_Arg
17065                             ("only allowed argument for pragma% is %", Argx);
17066                        end if;
17067
17068                        if Ada_Version_Explicit < Ada_2005
17069                          or else not Warn_On_Ada_2005_Compatibility
17070                        then
17071                           Active := False;
17072                        end if;
17073                     end;
17074                  end if;
17075               end if;
17076
17077               --  Set flag if pragma active
17078
17079               if Active then
17080                  Set_Is_Obsolescent (Ent);
17081               end if;
17082
17083               return;
17084            end Set_Obsolescent;
17085
17086         --  Start of processing for pragma Obsolescent
17087
17088         begin
17089            GNAT_Pragma;
17090
17091            Check_At_Most_N_Arguments (3);
17092
17093            --  See if first argument specifies an entity name
17094
17095            if Arg_Count >= 1
17096              and then
17097                (Chars (Arg1) = Name_Entity
17098                   or else
17099                     Nkind_In (Get_Pragma_Arg (Arg1), N_Character_Literal,
17100                                                      N_Identifier,
17101                                                      N_Operator_Symbol))
17102            then
17103               Ename := Get_Pragma_Arg (Arg1);
17104
17105               --  Eliminate first argument, so we can share processing
17106
17107               Arg1 := Arg2;
17108               Arg2 := Arg3;
17109               Arg_Count := Arg_Count - 1;
17110
17111            --  No Entity name argument given
17112
17113            else
17114               Ename := Empty;
17115            end if;
17116
17117            if Arg_Count >= 1 then
17118               Check_Optional_Identifier (Arg1, Name_Message);
17119
17120               if Arg_Count = 2 then
17121                  Check_Optional_Identifier (Arg2, Name_Version);
17122               end if;
17123            end if;
17124
17125            --  Get immediately preceding declaration
17126
17127            Decl := Prev (N);
17128            while Present (Decl) and then Nkind (Decl) = N_Pragma loop
17129               Prev (Decl);
17130            end loop;
17131
17132            --  Cases where we do not follow anything other than another pragma
17133
17134            if No (Decl) then
17135
17136               --  First case: library level compilation unit declaration with
17137               --  the pragma immediately following the declaration.
17138
17139               if Nkind (Parent (N)) = N_Compilation_Unit_Aux then
17140                  Set_Obsolescent
17141                    (Defining_Entity (Unit (Parent (Parent (N)))));
17142                  return;
17143
17144               --  Case 2: library unit placement for package
17145
17146               else
17147                  declare
17148                     Ent : constant Entity_Id := Find_Lib_Unit_Name;
17149                  begin
17150                     if Is_Package_Or_Generic_Package (Ent) then
17151                        Set_Obsolescent (Ent);
17152                        return;
17153                     end if;
17154                  end;
17155               end if;
17156
17157            --  Cases where we must follow a declaration
17158
17159            else
17160               if         Nkind (Decl) not in N_Declaration
17161                 and then Nkind (Decl) not in N_Later_Decl_Item
17162                 and then Nkind (Decl) not in N_Generic_Declaration
17163                 and then Nkind (Decl) not in N_Renaming_Declaration
17164               then
17165                  Error_Pragma
17166                    ("pragma% misplaced, "
17167                     & "must immediately follow a declaration");
17168
17169               else
17170                  Set_Obsolescent (Defining_Entity (Decl));
17171                  return;
17172               end if;
17173            end if;
17174         end Obsolescent;
17175
17176         --------------
17177         -- Optimize --
17178         --------------
17179
17180         --  pragma Optimize (Time | Space | Off);
17181
17182         --  The actual check for optimize is done in Gigi. Note that this
17183         --  pragma does not actually change the optimization setting, it
17184         --  simply checks that it is consistent with the pragma.
17185
17186         when Pragma_Optimize =>
17187            Check_No_Identifiers;
17188            Check_Arg_Count (1);
17189            Check_Arg_Is_One_Of (Arg1, Name_Time, Name_Space, Name_Off);
17190
17191         ------------------------
17192         -- Optimize_Alignment --
17193         ------------------------
17194
17195         --  pragma Optimize_Alignment (Time | Space | Off);
17196
17197         when Pragma_Optimize_Alignment => Optimize_Alignment : begin
17198            GNAT_Pragma;
17199            Check_No_Identifiers;
17200            Check_Arg_Count (1);
17201            Check_Valid_Configuration_Pragma;
17202
17203            declare
17204               Nam : constant Name_Id := Chars (Get_Pragma_Arg (Arg1));
17205            begin
17206               case Nam is
17207                  when Name_Time =>
17208                     Opt.Optimize_Alignment := 'T';
17209                  when Name_Space =>
17210                     Opt.Optimize_Alignment := 'S';
17211                  when Name_Off =>
17212                     Opt.Optimize_Alignment := 'O';
17213                  when others =>
17214                     Error_Pragma_Arg ("invalid argument for pragma%", Arg1);
17215               end case;
17216            end;
17217
17218            --  Set indication that mode is set locally. If we are in fact in a
17219            --  configuration pragma file, this setting is harmless since the
17220            --  switch will get reset anyway at the start of each unit.
17221
17222            Optimize_Alignment_Local := True;
17223         end Optimize_Alignment;
17224
17225         -------------
17226         -- Ordered --
17227         -------------
17228
17229         --  pragma Ordered (first_enumeration_subtype_LOCAL_NAME);
17230
17231         when Pragma_Ordered => Ordered : declare
17232            Assoc   : constant Node_Id := Arg1;
17233            Type_Id : Node_Id;
17234            Typ     : Entity_Id;
17235
17236         begin
17237            GNAT_Pragma;
17238            Check_No_Identifiers;
17239            Check_Arg_Count (1);
17240            Check_Arg_Is_Local_Name (Arg1);
17241
17242            Type_Id := Get_Pragma_Arg (Assoc);
17243            Find_Type (Type_Id);
17244            Typ := Entity (Type_Id);
17245
17246            if Typ = Any_Type then
17247               return;
17248            else
17249               Typ := Underlying_Type (Typ);
17250            end if;
17251
17252            if not Is_Enumeration_Type (Typ) then
17253               Error_Pragma ("pragma% must specify enumeration type");
17254            end if;
17255
17256            Check_First_Subtype (Arg1);
17257            Set_Has_Pragma_Ordered (Base_Type (Typ));
17258         end Ordered;
17259
17260         -------------------
17261         -- Overflow_Mode --
17262         -------------------
17263
17264         --  pragma Overflow_Mode
17265         --    ([General => ] MODE [, [Assertions => ] MODE]);
17266
17267         --  MODE := STRICT | MINIMIZED | ELIMINATED
17268
17269         --  Note: ELIMINATED is allowed only if Long_Long_Integer'Size is 64
17270         --  since System.Bignums makes this assumption. This is true of nearly
17271         --  all (all?) targets.
17272
17273         when Pragma_Overflow_Mode => Overflow_Mode : declare
17274            function Get_Overflow_Mode
17275              (Name : Name_Id;
17276               Arg  : Node_Id) return Overflow_Mode_Type;
17277            --  Function to process one pragma argument, Arg. If an identifier
17278            --  is present, it must be Name. Mode type is returned if a valid
17279            --  argument exists, otherwise an error is signalled.
17280
17281            -----------------------
17282            -- Get_Overflow_Mode --
17283            -----------------------
17284
17285            function Get_Overflow_Mode
17286              (Name : Name_Id;
17287               Arg  : Node_Id) return Overflow_Mode_Type
17288            is
17289               Argx : constant Node_Id := Get_Pragma_Arg (Arg);
17290
17291            begin
17292               Check_Optional_Identifier (Arg, Name);
17293               Check_Arg_Is_Identifier (Argx);
17294
17295               if Chars (Argx) = Name_Strict then
17296                  return Strict;
17297
17298               elsif Chars (Argx) = Name_Minimized then
17299                  return Minimized;
17300
17301               elsif Chars (Argx) = Name_Eliminated then
17302                  if Ttypes.Standard_Long_Long_Integer_Size /= 64 then
17303                     Error_Pragma_Arg
17304                       ("Eliminated not implemented on this target", Argx);
17305                  else
17306                     return Eliminated;
17307                  end if;
17308
17309               else
17310                  Error_Pragma_Arg ("invalid argument for pragma%", Argx);
17311               end if;
17312            end Get_Overflow_Mode;
17313
17314         --  Start of processing for Overflow_Mode
17315
17316         begin
17317            GNAT_Pragma;
17318            Check_At_Least_N_Arguments (1);
17319            Check_At_Most_N_Arguments  (2);
17320
17321            --  Process first argument
17322
17323            Scope_Suppress.Overflow_Mode_General :=
17324              Get_Overflow_Mode (Name_General, Arg1);
17325
17326            --  Case of only one argument
17327
17328            if Arg_Count = 1 then
17329               Scope_Suppress.Overflow_Mode_Assertions :=
17330                 Scope_Suppress.Overflow_Mode_General;
17331
17332            --  Case of two arguments present
17333
17334            else
17335               Scope_Suppress.Overflow_Mode_Assertions  :=
17336                 Get_Overflow_Mode (Name_Assertions, Arg2);
17337            end if;
17338         end Overflow_Mode;
17339
17340         --------------------------
17341         -- Overriding Renamings --
17342         --------------------------
17343
17344         --  pragma Overriding_Renamings;
17345
17346         when Pragma_Overriding_Renamings =>
17347            GNAT_Pragma;
17348            Check_Arg_Count (0);
17349            Check_Valid_Configuration_Pragma;
17350            Overriding_Renamings := True;
17351
17352         ----------
17353         -- Pack --
17354         ----------
17355
17356         --  pragma Pack (first_subtype_LOCAL_NAME);
17357
17358         when Pragma_Pack => Pack : declare
17359            Assoc   : constant Node_Id := Arg1;
17360            Type_Id : Node_Id;
17361            Typ     : Entity_Id;
17362            Ctyp    : Entity_Id;
17363            Ignore  : Boolean := False;
17364
17365         begin
17366            Check_No_Identifiers;
17367            Check_Arg_Count (1);
17368            Check_Arg_Is_Local_Name (Arg1);
17369
17370            Type_Id := Get_Pragma_Arg (Assoc);
17371            Find_Type (Type_Id);
17372            Typ := Entity (Type_Id);
17373
17374            if Typ = Any_Type
17375              or else Rep_Item_Too_Early (Typ, N)
17376            then
17377               return;
17378            else
17379               Typ := Underlying_Type (Typ);
17380            end if;
17381
17382            if not Is_Array_Type (Typ) and then not Is_Record_Type (Typ) then
17383               Error_Pragma ("pragma% must specify array or record type");
17384            end if;
17385
17386            Check_First_Subtype (Arg1);
17387            Check_Duplicate_Pragma (Typ);
17388
17389            --  Array type
17390
17391            if Is_Array_Type (Typ) then
17392               Ctyp := Component_Type (Typ);
17393
17394               --  Ignore pack that does nothing
17395
17396               if Known_Static_Esize (Ctyp)
17397                 and then Known_Static_RM_Size (Ctyp)
17398                 and then Esize (Ctyp) = RM_Size (Ctyp)
17399                 and then Addressable (Esize (Ctyp))
17400               then
17401                  Ignore := True;
17402               end if;
17403
17404               --  Process OK pragma Pack. Note that if there is a separate
17405               --  component clause present, the Pack will be cancelled. This
17406               --  processing is in Freeze.
17407
17408               if not Rep_Item_Too_Late (Typ, N) then
17409
17410                  --  In CodePeer mode, we do not need complex front-end
17411                  --  expansions related to pragma Pack, so disable handling
17412                  --  of pragma Pack.
17413
17414                  if CodePeer_Mode then
17415                     null;
17416
17417                  --  Don't attempt any packing for VM targets. We possibly
17418                  --  could deal with some cases of array bit-packing, but we
17419                  --  don't bother, since this is not a typical kind of
17420                  --  representation in the VM context anyway (and would not
17421                  --  for example work nicely with the debugger).
17422
17423                  elsif VM_Target /= No_VM then
17424                     if not GNAT_Mode then
17425                        Error_Pragma
17426                          ("??pragma% ignored in this configuration");
17427                     end if;
17428
17429                  --  Normal case where we do the pack action
17430
17431                  else
17432                     if not Ignore then
17433                        Set_Is_Packed            (Base_Type (Typ));
17434                        Set_Has_Non_Standard_Rep (Base_Type (Typ));
17435                     end if;
17436
17437                     Set_Has_Pragma_Pack (Base_Type (Typ));
17438                  end if;
17439               end if;
17440
17441            --  For record types, the pack is always effective
17442
17443            else pragma Assert (Is_Record_Type (Typ));
17444               if not Rep_Item_Too_Late (Typ, N) then
17445
17446                  --  Ignore pack request with warning in VM mode (skip warning
17447                  --  if we are compiling GNAT run time library).
17448
17449                  if VM_Target /= No_VM then
17450                     if not GNAT_Mode then
17451                        Error_Pragma
17452                          ("??pragma% ignored in this configuration");
17453                     end if;
17454
17455                  --  Normal case of pack request active
17456
17457                  else
17458                     Set_Is_Packed            (Base_Type (Typ));
17459                     Set_Has_Pragma_Pack      (Base_Type (Typ));
17460                     Set_Has_Non_Standard_Rep (Base_Type (Typ));
17461                  end if;
17462               end if;
17463            end if;
17464         end Pack;
17465
17466         ----------
17467         -- Page --
17468         ----------
17469
17470         --  pragma Page;
17471
17472         --  There is nothing to do here, since we did all the processing for
17473         --  this pragma in Par.Prag (so that it works properly even in syntax
17474         --  only mode).
17475
17476         when Pragma_Page =>
17477            null;
17478
17479         -------------
17480         -- Part_Of --
17481         -------------
17482
17483         --  pragma Part_Of (ABSTRACT_STATE);
17484
17485         --  ABSTRACT_STATE ::= name
17486
17487         when Pragma_Part_Of => Part_Of : declare
17488            procedure Propagate_Part_Of
17489              (Pack_Id  : Entity_Id;
17490               State_Id : Entity_Id;
17491               Instance : Node_Id);
17492            --  Propagate the Part_Of indicator to all abstract states and
17493            --  variables declared in the visible state space of a package
17494            --  denoted by Pack_Id. State_Id is the encapsulating state.
17495            --  Instance is the package instantiation node.
17496
17497            -----------------------
17498            -- Propagate_Part_Of --
17499            -----------------------
17500
17501            procedure Propagate_Part_Of
17502              (Pack_Id  : Entity_Id;
17503               State_Id : Entity_Id;
17504               Instance : Node_Id)
17505            is
17506               Has_Item : Boolean := False;
17507               --  Flag set when the visible state space contains at least one
17508               --  abstract state or variable.
17509
17510               procedure Propagate_Part_Of (Pack_Id : Entity_Id);
17511               --  Propagate the Part_Of indicator to all abstract states and
17512               --  variables declared in the visible state space of a package
17513               --  denoted by Pack_Id.
17514
17515               -----------------------
17516               -- Propagate_Part_Of --
17517               -----------------------
17518
17519               procedure Propagate_Part_Of (Pack_Id : Entity_Id) is
17520                  Item_Id : Entity_Id;
17521
17522               begin
17523                  --  Traverse the entity chain of the package and set relevant
17524                  --  attributes of abstract states and variables declared in
17525                  --  the visible state space of the package.
17526
17527                  Item_Id := First_Entity (Pack_Id);
17528                  while Present (Item_Id)
17529                    and then not In_Private_Part (Item_Id)
17530                  loop
17531                     --  Do not consider internally generated items
17532
17533                     if not Comes_From_Source (Item_Id) then
17534                        null;
17535
17536                     --  The Part_Of indicator turns an abstract state or
17537                     --  variable into a constituent of the encapsulating
17538                     --  state.
17539
17540                     elsif Ekind_In (Item_Id, E_Abstract_State,
17541                                              E_Variable)
17542                     then
17543                        Has_Item := True;
17544
17545                        Append_Elmt (Item_Id, Part_Of_Constituents (State_Id));
17546                        Set_Encapsulating_State (Item_Id, State_Id);
17547
17548                     --  Recursively handle nested packages and instantiations
17549
17550                     elsif Ekind (Item_Id) = E_Package then
17551                        Propagate_Part_Of (Item_Id);
17552                     end if;
17553
17554                     Next_Entity (Item_Id);
17555                  end loop;
17556               end Propagate_Part_Of;
17557
17558            --  Start of processing for Propagate_Part_Of
17559
17560            begin
17561               Propagate_Part_Of (Pack_Id);
17562
17563               --  Detect a package instantiation that is subject to a Part_Of
17564               --  indicator, but has no visible state.
17565
17566               if not Has_Item then
17567                  Error_Msg_NE
17568                    ("package instantiation & has Part_Of indicator but "
17569                     & "lacks visible state", Instance, Pack_Id);
17570               end if;
17571            end Propagate_Part_Of;
17572
17573            --  Local variables
17574
17575            Item_Id  : Entity_Id;
17576            Legal    : Boolean;
17577            State    : Node_Id;
17578            State_Id : Entity_Id;
17579            Stmt     : Node_Id;
17580
17581         --  Start of processing for Part_Of
17582
17583         begin
17584            GNAT_Pragma;
17585            Check_Arg_Count (1);
17586
17587            --  Ensure the proper placement of the pragma. Part_Of must appear
17588            --  on a variable declaration or a package instantiation.
17589
17590            Stmt := Prev (N);
17591            while Present (Stmt) loop
17592
17593               --  Skip prior pragmas, but check for duplicates
17594
17595               if Nkind (Stmt) = N_Pragma then
17596                  if Pragma_Name (Stmt) = Pname then
17597                     Error_Msg_Name_1 := Pname;
17598                     Error_Msg_Sloc   := Sloc (Stmt);
17599                     Error_Msg_N ("pragma% duplicates pragma declared#", N);
17600                  end if;
17601
17602               --  Skip internally generated code
17603
17604               elsif not Comes_From_Source (Stmt) then
17605                  null;
17606
17607               --  The pragma applies to an object declaration (possibly a
17608               --  variable) or a package instantiation. Stop the traversal
17609               --  and continue the analysis.
17610
17611               elsif Nkind_In (Stmt, N_Object_Declaration,
17612                                     N_Package_Instantiation)
17613               then
17614                  exit;
17615
17616               --  The pragma does not apply to a legal construct, issue an
17617               --  error and stop the analysis.
17618
17619               else
17620                  Pragma_Misplaced;
17621                  return;
17622               end if;
17623
17624               Stmt := Prev (Stmt);
17625            end loop;
17626
17627            --  When the context is an object declaration, ensure that we are
17628            --  dealing with a variable.
17629
17630            if Nkind (Stmt) = N_Object_Declaration
17631              and then Ekind (Defining_Entity (Stmt)) /= E_Variable
17632            then
17633               Error_Msg_N ("indicator Part_Of must apply to a variable", N);
17634               return;
17635            end if;
17636
17637            --  Extract the entity of the related object declaration or package
17638            --  instantiation. In the case of the instantiation, use the entity
17639            --  of the instance spec.
17640
17641            if Nkind (Stmt) = N_Package_Instantiation then
17642               Stmt := Instance_Spec (Stmt);
17643            end if;
17644
17645            Item_Id := Defining_Entity (Stmt);
17646            State   := Get_Pragma_Arg  (Arg1);
17647
17648            --  Detect any discrepancies between the placement of the object
17649            --  or package instantiation with respect to state space and the
17650            --  encapsulating state.
17651
17652            Analyze_Part_Of
17653              (Item_Id => Item_Id,
17654               State   => State,
17655               Indic   => N,
17656               Legal   => Legal);
17657
17658            if Legal then
17659               State_Id := Entity (State);
17660
17661               --  Add the pragma to the contract of the item. This aids with
17662               --  the detection of a missing but required Part_Of indicator.
17663
17664               Add_Contract_Item (N, Item_Id);
17665
17666               --  The Part_Of indicator turns a variable into a constituent
17667               --  of the encapsulating state.
17668
17669               if Ekind (Item_Id) = E_Variable then
17670                  Append_Elmt (Item_Id, Part_Of_Constituents (State_Id));
17671                  Set_Encapsulating_State (Item_Id, State_Id);
17672
17673               --  Propagate the Part_Of indicator to the visible state space
17674               --  of the package instantiation.
17675
17676               else
17677                  Propagate_Part_Of
17678                    (Pack_Id  => Item_Id,
17679                     State_Id => State_Id,
17680                     Instance => Stmt);
17681               end if;
17682            end if;
17683         end Part_Of;
17684
17685         ----------------------------------
17686         -- Partition_Elaboration_Policy --
17687         ----------------------------------
17688
17689         --  pragma Partition_Elaboration_Policy (policy_IDENTIFIER);
17690
17691         when Pragma_Partition_Elaboration_Policy => declare
17692            subtype PEP_Range is Name_Id
17693              range First_Partition_Elaboration_Policy_Name
17694                 .. Last_Partition_Elaboration_Policy_Name;
17695            PEP_Val : PEP_Range;
17696            PEP     : Character;
17697
17698         begin
17699            Ada_2005_Pragma;
17700            Check_Arg_Count (1);
17701            Check_No_Identifiers;
17702            Check_Arg_Is_Partition_Elaboration_Policy (Arg1);
17703            Check_Valid_Configuration_Pragma;
17704            PEP_Val := Chars (Get_Pragma_Arg (Arg1));
17705
17706            case PEP_Val is
17707               when Name_Concurrent =>
17708                  PEP := 'C';
17709               when Name_Sequential =>
17710                  PEP := 'S';
17711            end case;
17712
17713            if Partition_Elaboration_Policy /= ' '
17714              and then Partition_Elaboration_Policy /= PEP
17715            then
17716               Error_Msg_Sloc := Partition_Elaboration_Policy_Sloc;
17717               Error_Pragma
17718                 ("partition elaboration policy incompatible with policy#");
17719
17720            --  Set new policy, but always preserve System_Location since we
17721            --  like the error message with the run time name.
17722
17723            else
17724               Partition_Elaboration_Policy := PEP;
17725
17726               if Partition_Elaboration_Policy_Sloc /= System_Location then
17727                  Partition_Elaboration_Policy_Sloc := Loc;
17728               end if;
17729            end if;
17730         end;
17731
17732         -------------
17733         -- Passive --
17734         -------------
17735
17736         --  pragma Passive [(PASSIVE_FORM)];
17737
17738         --  PASSIVE_FORM ::= Semaphore | No
17739
17740         when Pragma_Passive =>
17741            GNAT_Pragma;
17742
17743            if Nkind (Parent (N)) /= N_Task_Definition then
17744               Error_Pragma ("pragma% must be within task definition");
17745            end if;
17746
17747            if Arg_Count /= 0 then
17748               Check_Arg_Count (1);
17749               Check_Arg_Is_One_Of (Arg1, Name_Semaphore, Name_No);
17750            end if;
17751
17752         ----------------------------------
17753         -- Preelaborable_Initialization --
17754         ----------------------------------
17755
17756         --  pragma Preelaborable_Initialization (DIRECT_NAME);
17757
17758         when Pragma_Preelaborable_Initialization => Preelab_Init : declare
17759            Ent : Entity_Id;
17760
17761         begin
17762            Ada_2005_Pragma;
17763            Check_Arg_Count (1);
17764            Check_No_Identifiers;
17765            Check_Arg_Is_Identifier (Arg1);
17766            Check_Arg_Is_Local_Name (Arg1);
17767            Check_First_Subtype (Arg1);
17768            Ent := Entity (Get_Pragma_Arg (Arg1));
17769
17770            --  The pragma may come from an aspect on a private declaration,
17771            --  even if the freeze point at which this is analyzed in the
17772            --  private part after the full view.
17773
17774            if Has_Private_Declaration (Ent)
17775              and then From_Aspect_Specification (N)
17776            then
17777               null;
17778
17779            elsif Is_Private_Type (Ent)
17780              or else Is_Protected_Type (Ent)
17781              or else (Is_Generic_Type (Ent) and then Is_Derived_Type (Ent))
17782            then
17783               null;
17784
17785            else
17786               Error_Pragma_Arg
17787                 ("pragma % can only be applied to private, formal derived or "
17788                  & "protected type",
17789                  Arg1);
17790            end if;
17791
17792            --  Give an error if the pragma is applied to a protected type that
17793            --  does not qualify (due to having entries, or due to components
17794            --  that do not qualify).
17795
17796            if Is_Protected_Type (Ent)
17797              and then not Has_Preelaborable_Initialization (Ent)
17798            then
17799               Error_Msg_N
17800                 ("protected type & does not have preelaborable "
17801                  & "initialization", Ent);
17802
17803            --  Otherwise mark the type as definitely having preelaborable
17804            --  initialization.
17805
17806            else
17807               Set_Known_To_Have_Preelab_Init (Ent);
17808            end if;
17809
17810            if Has_Pragma_Preelab_Init (Ent)
17811              and then Warn_On_Redundant_Constructs
17812            then
17813               Error_Pragma ("?r?duplicate pragma%!");
17814            else
17815               Set_Has_Pragma_Preelab_Init (Ent);
17816            end if;
17817         end Preelab_Init;
17818
17819         --------------------
17820         -- Persistent_BSS --
17821         --------------------
17822
17823         --  pragma Persistent_BSS [(object_NAME)];
17824
17825         when Pragma_Persistent_BSS => Persistent_BSS :  declare
17826            Decl : Node_Id;
17827            Ent  : Entity_Id;
17828            Prag : Node_Id;
17829
17830         begin
17831            GNAT_Pragma;
17832            Check_At_Most_N_Arguments (1);
17833
17834            --  Case of application to specific object (one argument)
17835
17836            if Arg_Count = 1 then
17837               Check_Arg_Is_Library_Level_Local_Name (Arg1);
17838
17839               if not Is_Entity_Name (Get_Pragma_Arg (Arg1))
17840                 or else not
17841                   Ekind_In (Entity (Get_Pragma_Arg (Arg1)), E_Variable,
17842                                                             E_Constant)
17843               then
17844                  Error_Pragma_Arg ("pragma% only applies to objects", Arg1);
17845               end if;
17846
17847               Ent := Entity (Get_Pragma_Arg (Arg1));
17848               Decl := Parent (Ent);
17849
17850               --  Check for duplication before inserting in list of
17851               --  representation items.
17852
17853               Check_Duplicate_Pragma (Ent);
17854
17855               if Rep_Item_Too_Late (Ent, N) then
17856                  return;
17857               end if;
17858
17859               if Present (Expression (Decl)) then
17860                  Error_Pragma_Arg
17861                    ("object for pragma% cannot have initialization", Arg1);
17862               end if;
17863
17864               if not Is_Potentially_Persistent_Type (Etype (Ent)) then
17865                  Error_Pragma_Arg
17866                    ("object type for pragma% is not potentially persistent",
17867                     Arg1);
17868               end if;
17869
17870               Prag :=
17871                 Make_Linker_Section_Pragma
17872                   (Ent, Sloc (N), ".persistent.bss");
17873               Insert_After (N, Prag);
17874               Analyze (Prag);
17875
17876            --  Case of use as configuration pragma with no arguments
17877
17878            else
17879               Check_Valid_Configuration_Pragma;
17880               Persistent_BSS_Mode := True;
17881            end if;
17882         end Persistent_BSS;
17883
17884         -------------
17885         -- Polling --
17886         -------------
17887
17888         --  pragma Polling (ON | OFF);
17889
17890         when Pragma_Polling =>
17891            GNAT_Pragma;
17892            Check_Arg_Count (1);
17893            Check_No_Identifiers;
17894            Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
17895            Polling_Required := (Chars (Get_Pragma_Arg (Arg1)) = Name_On);
17896
17897         ------------------
17898         -- Post[_Class] --
17899         ------------------
17900
17901         --  pragma Post (Boolean_EXPRESSION);
17902         --  pragma Post_Class (Boolean_EXPRESSION);
17903
17904         when Pragma_Post | Pragma_Post_Class => Post : declare
17905            PC_Pragma : Node_Id;
17906
17907         begin
17908            GNAT_Pragma;
17909            Check_Arg_Count (1);
17910            Check_No_Identifiers;
17911            Check_Pre_Post;
17912
17913            --  Rewrite Post[_Class] pragma as Precondition pragma setting the
17914            --  flag Class_Present to True for the Post_Class case.
17915
17916            Set_Class_Present (N, Prag_Id = Pragma_Pre_Class);
17917            PC_Pragma := New_Copy (N);
17918            Set_Pragma_Identifier
17919              (PC_Pragma, Make_Identifier (Loc, Name_Postcondition));
17920            Rewrite (N, PC_Pragma);
17921            Set_Analyzed (N, False);
17922            Analyze (N);
17923         end Post;
17924
17925         -------------------
17926         -- Postcondition --
17927         -------------------
17928
17929         --  pragma Postcondition ([Check   =>] Boolean_EXPRESSION
17930         --                      [,[Message =>] String_EXPRESSION]);
17931
17932         when Pragma_Postcondition => Postcondition : declare
17933            In_Body : Boolean;
17934
17935         begin
17936            GNAT_Pragma;
17937            Check_At_Least_N_Arguments (1);
17938            Check_At_Most_N_Arguments (2);
17939            Check_Optional_Identifier (Arg1, Name_Check);
17940
17941            --  Verify the proper placement of the pragma. The remainder of the
17942            --  processing is found in Sem_Ch6/Sem_Ch7.
17943
17944            Check_Precondition_Postcondition (In_Body);
17945
17946            --  When the pragma is a source construct appearing inside a body,
17947            --  preanalyze the boolean_expression to detect illegal forward
17948            --  references:
17949
17950            --    procedure P is
17951            --       pragma Postcondition (X'Old ...);
17952            --       X : ...
17953
17954            if Comes_From_Source (N) and then In_Body then
17955               Preanalyze_Spec_Expression (Expression (Arg1), Any_Boolean);
17956            end if;
17957         end Postcondition;
17958
17959         -----------------
17960         -- Pre[_Class] --
17961         -----------------
17962
17963         --  pragma Pre (Boolean_EXPRESSION);
17964         --  pragma Pre_Class (Boolean_EXPRESSION);
17965
17966         when Pragma_Pre | Pragma_Pre_Class => Pre : declare
17967            PC_Pragma : Node_Id;
17968
17969         begin
17970            GNAT_Pragma;
17971            Check_Arg_Count (1);
17972            Check_No_Identifiers;
17973            Check_Pre_Post;
17974
17975            --  Rewrite Pre[_Class] pragma as Precondition pragma setting the
17976            --  flag Class_Present to True for the Pre_Class case.
17977
17978            Set_Class_Present (N, Prag_Id = Pragma_Pre_Class);
17979            PC_Pragma := New_Copy (N);
17980            Set_Pragma_Identifier
17981              (PC_Pragma, Make_Identifier (Loc, Name_Precondition));
17982            Rewrite (N, PC_Pragma);
17983            Set_Analyzed (N, False);
17984            Analyze (N);
17985         end Pre;
17986
17987         ------------------
17988         -- Precondition --
17989         ------------------
17990
17991         --  pragma Precondition ([Check   =>] Boolean_EXPRESSION
17992         --                     [,[Message =>] String_EXPRESSION]);
17993
17994         when Pragma_Precondition => Precondition : declare
17995            In_Body : Boolean;
17996
17997         begin
17998            GNAT_Pragma;
17999            Check_At_Least_N_Arguments (1);
18000            Check_At_Most_N_Arguments  (2);
18001            Check_Optional_Identifier (Arg1, Name_Check);
18002            Check_Precondition_Postcondition (In_Body);
18003
18004            --  If in spec, nothing more to do. If in body, then we convert
18005            --  the pragma to an equivalent pragma Check. That works fine since
18006            --  pragma Check will analyze the condition in the proper context.
18007
18008            --  The form of the pragma Check is either:
18009
18010            --    pragma Check (Precondition, cond [, msg])
18011            --       or
18012            --    pragma Check (Pre, cond [, msg])
18013
18014            --  We use the Pre form if this pragma derived from a Pre aspect.
18015            --  This is needed to make sure that the right set of Policy
18016            --  pragmas are checked.
18017
18018            if In_Body then
18019
18020               --  Rewrite as Check pragma
18021
18022               Rewrite (N,
18023                 Make_Pragma (Loc,
18024                   Chars                        => Name_Check,
18025                   Pragma_Argument_Associations => New_List (
18026                     Make_Pragma_Argument_Association (Loc,
18027                     Expression => Make_Identifier (Loc, Pname)),
18028
18029                     Make_Pragma_Argument_Association (Sloc (Arg1),
18030                       Expression =>
18031                         Relocate_Node (Get_Pragma_Arg (Arg1))))));
18032
18033               if Arg_Count = 2 then
18034                  Append_To (Pragma_Argument_Associations (N),
18035                    Make_Pragma_Argument_Association (Sloc (Arg2),
18036                      Expression =>
18037                        Relocate_Node (Get_Pragma_Arg (Arg2))));
18038               end if;
18039
18040               Analyze (N);
18041            end if;
18042         end Precondition;
18043
18044         ---------------
18045         -- Predicate --
18046         ---------------
18047
18048         --  pragma Predicate
18049         --    ([Entity =>] type_LOCAL_NAME,
18050         --     [Check  =>] boolean_EXPRESSION);
18051
18052         when Pragma_Predicate => Predicate : declare
18053            Type_Id : Node_Id;
18054            Typ     : Entity_Id;
18055
18056            Discard : Boolean;
18057            pragma Unreferenced (Discard);
18058
18059         begin
18060            GNAT_Pragma;
18061            Check_Arg_Count (2);
18062            Check_Optional_Identifier (Arg1, Name_Entity);
18063            Check_Optional_Identifier (Arg2, Name_Check);
18064
18065            Check_Arg_Is_Local_Name (Arg1);
18066
18067            Type_Id := Get_Pragma_Arg (Arg1);
18068            Find_Type (Type_Id);
18069            Typ := Entity (Type_Id);
18070
18071            if Typ = Any_Type then
18072               return;
18073            end if;
18074
18075            --  The remaining processing is simply to link the pragma on to
18076            --  the rep item chain, for processing when the type is frozen.
18077            --  This is accomplished by a call to Rep_Item_Too_Late. We also
18078            --  mark the type as having predicates.
18079
18080            Set_Has_Predicates (Typ);
18081            Discard := Rep_Item_Too_Late (Typ, N, FOnly => True);
18082         end Predicate;
18083
18084         ------------------
18085         -- Preelaborate --
18086         ------------------
18087
18088         --  pragma Preelaborate [(library_unit_NAME)];
18089
18090         --  Set the flag Is_Preelaborated of program unit name entity
18091
18092         when Pragma_Preelaborate => Preelaborate : declare
18093            Pa  : constant Node_Id   := Parent (N);
18094            Pk  : constant Node_Kind := Nkind (Pa);
18095            Ent : Entity_Id;
18096
18097         begin
18098            Check_Ada_83_Warning;
18099            Check_Valid_Library_Unit_Pragma;
18100
18101            if Nkind (N) = N_Null_Statement then
18102               return;
18103            end if;
18104
18105            Ent := Find_Lib_Unit_Name;
18106            Check_Duplicate_Pragma (Ent);
18107
18108            --  This filters out pragmas inside generic parents that show up
18109            --  inside instantiations. Pragmas that come from aspects in the
18110            --  unit are not ignored.
18111
18112            if Present (Ent) then
18113               if Pk = N_Package_Specification
18114                 and then Present (Generic_Parent (Pa))
18115                 and then not From_Aspect_Specification (N)
18116               then
18117                  null;
18118
18119               else
18120                  if not Debug_Flag_U then
18121                     Set_Is_Preelaborated (Ent);
18122                     Set_Suppress_Elaboration_Warnings (Ent);
18123                  end if;
18124               end if;
18125            end if;
18126         end Preelaborate;
18127
18128         ---------------------
18129         -- Preelaborate_05 --
18130         ---------------------
18131
18132         --  pragma Preelaborate_05 [(library_unit_NAME)];
18133
18134         --  This pragma is useable only in GNAT_Mode, where it is used like
18135         --  pragma Preelaborate but it is only effective in Ada 2005 mode
18136         --  (otherwise it is ignored). This is used to implement AI-362 which
18137         --  recategorizes some run-time packages in Ada 2005 mode.
18138
18139         when Pragma_Preelaborate_05 => Preelaborate_05 : declare
18140            Ent : Entity_Id;
18141
18142         begin
18143            GNAT_Pragma;
18144            Check_Valid_Library_Unit_Pragma;
18145
18146            if not GNAT_Mode then
18147               Error_Pragma ("pragma% only available in GNAT mode");
18148            end if;
18149
18150            if Nkind (N) = N_Null_Statement then
18151               return;
18152            end if;
18153
18154            --  This is one of the few cases where we need to test the value of
18155            --  Ada_Version_Explicit rather than Ada_Version (which is always
18156            --  set to Ada_2012 in a predefined unit), we need to know the
18157            --  explicit version set to know if this pragma is active.
18158
18159            if Ada_Version_Explicit >= Ada_2005 then
18160               Ent := Find_Lib_Unit_Name;
18161               Set_Is_Preelaborated (Ent);
18162               Set_Suppress_Elaboration_Warnings (Ent);
18163            end if;
18164         end Preelaborate_05;
18165
18166         --------------
18167         -- Priority --
18168         --------------
18169
18170         --  pragma Priority (EXPRESSION);
18171
18172         when Pragma_Priority => Priority : declare
18173            P   : constant Node_Id := Parent (N);
18174            Arg : Node_Id;
18175            Ent : Entity_Id;
18176
18177         begin
18178            Check_No_Identifiers;
18179            Check_Arg_Count (1);
18180
18181            --  Subprogram case
18182
18183            if Nkind (P) = N_Subprogram_Body then
18184               Check_In_Main_Program;
18185
18186               Ent := Defining_Unit_Name (Specification (P));
18187
18188               if Nkind (Ent) = N_Defining_Program_Unit_Name then
18189                  Ent := Defining_Identifier (Ent);
18190               end if;
18191
18192               Arg := Get_Pragma_Arg (Arg1);
18193               Analyze_And_Resolve (Arg, Standard_Integer);
18194
18195               --  Must be static
18196
18197               if not Is_Static_Expression (Arg) then
18198                  Flag_Non_Static_Expr
18199                    ("main subprogram priority is not static!", Arg);
18200                  raise Pragma_Exit;
18201
18202               --  If constraint error, then we already signalled an error
18203
18204               elsif Raises_Constraint_Error (Arg) then
18205                  null;
18206
18207               --  Otherwise check in range except if Relaxed_RM_Semantics
18208               --  where we ignore the value if out of range.
18209
18210               else
18211                  declare
18212                     Val : constant Uint := Expr_Value (Arg);
18213                  begin
18214                     if not Relaxed_RM_Semantics
18215                       and then
18216                         (Val < 0
18217                           or else Val > Expr_Value (Expression
18218                                           (Parent (RTE (RE_Max_Priority)))))
18219                     then
18220                        Error_Pragma_Arg
18221                          ("main subprogram priority is out of range", Arg1);
18222                     else
18223                        Set_Main_Priority
18224                          (Current_Sem_Unit, UI_To_Int (Expr_Value (Arg)));
18225                     end if;
18226                  end;
18227               end if;
18228
18229               --  Load an arbitrary entity from System.Tasking.Stages or
18230               --  System.Tasking.Restricted.Stages (depending on the
18231               --  supported profile) to make sure that one of these packages
18232               --  is implicitly with'ed, since we need to have the tasking
18233               --  run time active for the pragma Priority to have any effect.
18234               --  Previously with with'ed the package System.Tasking, but
18235               --  this package does not trigger the required initialization
18236               --  of the run-time library.
18237
18238               declare
18239                  Discard : Entity_Id;
18240                  pragma Warnings (Off, Discard);
18241               begin
18242                  if Restricted_Profile then
18243                     Discard := RTE (RE_Activate_Restricted_Tasks);
18244                  else
18245                     Discard := RTE (RE_Activate_Tasks);
18246                  end if;
18247               end;
18248
18249            --  Task or Protected, must be of type Integer
18250
18251            elsif Nkind_In (P, N_Protected_Definition, N_Task_Definition) then
18252               Arg := Get_Pragma_Arg (Arg1);
18253               Ent := Defining_Identifier (Parent (P));
18254
18255               --  The expression must be analyzed in the special manner
18256               --  described in "Handling of Default and Per-Object
18257               --  Expressions" in sem.ads.
18258
18259               Preanalyze_Spec_Expression (Arg, RTE (RE_Any_Priority));
18260
18261               if not Is_Static_Expression (Arg) then
18262                  Check_Restriction (Static_Priorities, Arg);
18263               end if;
18264
18265            --  Anything else is incorrect
18266
18267            else
18268               Pragma_Misplaced;
18269            end if;
18270
18271            --  Check duplicate pragma before we chain the pragma in the Rep
18272            --  Item chain of Ent.
18273
18274            Check_Duplicate_Pragma (Ent);
18275            Record_Rep_Item (Ent, N);
18276         end Priority;
18277
18278         -----------------------------------
18279         -- Priority_Specific_Dispatching --
18280         -----------------------------------
18281
18282         --  pragma Priority_Specific_Dispatching (
18283         --    policy_IDENTIFIER,
18284         --    first_priority_EXPRESSION,
18285         --    last_priority_EXPRESSION);
18286
18287         when Pragma_Priority_Specific_Dispatching =>
18288         Priority_Specific_Dispatching : declare
18289            Prio_Id : constant Entity_Id := RTE (RE_Any_Priority);
18290            --  This is the entity System.Any_Priority;
18291
18292            DP          : Character;
18293            Lower_Bound : Node_Id;
18294            Upper_Bound : Node_Id;
18295            Lower_Val   : Uint;
18296            Upper_Val   : Uint;
18297
18298         begin
18299            Ada_2005_Pragma;
18300            Check_Arg_Count (3);
18301            Check_No_Identifiers;
18302            Check_Arg_Is_Task_Dispatching_Policy (Arg1);
18303            Check_Valid_Configuration_Pragma;
18304            Get_Name_String (Chars (Get_Pragma_Arg (Arg1)));
18305            DP := Fold_Upper (Name_Buffer (1));
18306
18307            Lower_Bound := Get_Pragma_Arg (Arg2);
18308            Check_Arg_Is_Static_Expression (Lower_Bound, Standard_Integer);
18309            Lower_Val := Expr_Value (Lower_Bound);
18310
18311            Upper_Bound := Get_Pragma_Arg (Arg3);
18312            Check_Arg_Is_Static_Expression (Upper_Bound, Standard_Integer);
18313            Upper_Val := Expr_Value (Upper_Bound);
18314
18315            --  It is not allowed to use Task_Dispatching_Policy and
18316            --  Priority_Specific_Dispatching in the same partition.
18317
18318            if Task_Dispatching_Policy /= ' ' then
18319               Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
18320               Error_Pragma
18321                 ("pragma% incompatible with Task_Dispatching_Policy#");
18322
18323            --  Check lower bound in range
18324
18325            elsif Lower_Val < Expr_Value (Type_Low_Bound (Prio_Id))
18326                    or else
18327                  Lower_Val > Expr_Value (Type_High_Bound (Prio_Id))
18328            then
18329               Error_Pragma_Arg
18330                 ("first_priority is out of range", Arg2);
18331
18332            --  Check upper bound in range
18333
18334            elsif Upper_Val < Expr_Value (Type_Low_Bound (Prio_Id))
18335                    or else
18336                  Upper_Val > Expr_Value (Type_High_Bound (Prio_Id))
18337            then
18338               Error_Pragma_Arg
18339                 ("last_priority is out of range", Arg3);
18340
18341            --  Check that the priority range is valid
18342
18343            elsif Lower_Val > Upper_Val then
18344               Error_Pragma
18345                 ("last_priority_expression must be greater than or equal to "
18346                  & "first_priority_expression");
18347
18348            --  Store the new policy, but always preserve System_Location since
18349            --  we like the error message with the run-time name.
18350
18351            else
18352               --  Check overlapping in the priority ranges specified in other
18353               --  Priority_Specific_Dispatching pragmas within the same
18354               --  partition. We can only check those we know about.
18355
18356               for J in
18357                  Specific_Dispatching.First .. Specific_Dispatching.Last
18358               loop
18359                  if Specific_Dispatching.Table (J).First_Priority in
18360                    UI_To_Int (Lower_Val) .. UI_To_Int (Upper_Val)
18361                  or else Specific_Dispatching.Table (J).Last_Priority in
18362                    UI_To_Int (Lower_Val) .. UI_To_Int (Upper_Val)
18363                  then
18364                     Error_Msg_Sloc :=
18365                       Specific_Dispatching.Table (J).Pragma_Loc;
18366                        Error_Pragma
18367                          ("priority range overlaps with "
18368                           & "Priority_Specific_Dispatching#");
18369                  end if;
18370               end loop;
18371
18372               --  The use of Priority_Specific_Dispatching is incompatible
18373               --  with Task_Dispatching_Policy.
18374
18375               if Task_Dispatching_Policy /= ' ' then
18376                  Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
18377                     Error_Pragma
18378                       ("Priority_Specific_Dispatching incompatible "
18379                        & "with Task_Dispatching_Policy#");
18380               end if;
18381
18382               --  The use of Priority_Specific_Dispatching forces ceiling
18383               --  locking policy.
18384
18385               if Locking_Policy /= ' ' and then Locking_Policy /= 'C' then
18386                  Error_Msg_Sloc := Locking_Policy_Sloc;
18387                     Error_Pragma
18388                       ("Priority_Specific_Dispatching incompatible "
18389                        & "with Locking_Policy#");
18390
18391               --  Set the Ceiling_Locking policy, but preserve System_Location
18392               --  since we like the error message with the run time name.
18393
18394               else
18395                  Locking_Policy := 'C';
18396
18397                  if Locking_Policy_Sloc /= System_Location then
18398                     Locking_Policy_Sloc := Loc;
18399                  end if;
18400               end if;
18401
18402               --  Add entry in the table
18403
18404               Specific_Dispatching.Append
18405                    ((Dispatching_Policy => DP,
18406                      First_Priority     => UI_To_Int (Lower_Val),
18407                      Last_Priority      => UI_To_Int (Upper_Val),
18408                      Pragma_Loc         => Loc));
18409            end if;
18410         end Priority_Specific_Dispatching;
18411
18412         -------------
18413         -- Profile --
18414         -------------
18415
18416         --  pragma Profile (profile_IDENTIFIER);
18417
18418         --  profile_IDENTIFIER => Restricted | Ravenscar | Rational
18419
18420         when Pragma_Profile =>
18421            Ada_2005_Pragma;
18422            Check_Arg_Count (1);
18423            Check_Valid_Configuration_Pragma;
18424            Check_No_Identifiers;
18425
18426            declare
18427               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
18428
18429            begin
18430               if Chars (Argx) = Name_Ravenscar then
18431                  Set_Ravenscar_Profile (N);
18432
18433               elsif Chars (Argx) = Name_Restricted then
18434                  Set_Profile_Restrictions
18435                    (Restricted,
18436                     N, Warn => Treat_Restrictions_As_Warnings);
18437
18438               elsif Chars (Argx) = Name_Rational then
18439                  Set_Rational_Profile;
18440
18441               elsif Chars (Argx) = Name_No_Implementation_Extensions then
18442                  Set_Profile_Restrictions
18443                    (No_Implementation_Extensions,
18444                     N, Warn => Treat_Restrictions_As_Warnings);
18445
18446               else
18447                  Error_Pragma_Arg ("& is not a valid profile", Argx);
18448               end if;
18449            end;
18450
18451         ----------------------
18452         -- Profile_Warnings --
18453         ----------------------
18454
18455         --  pragma Profile_Warnings (profile_IDENTIFIER);
18456
18457         --  profile_IDENTIFIER => Restricted | Ravenscar
18458
18459         when Pragma_Profile_Warnings =>
18460            GNAT_Pragma;
18461            Check_Arg_Count (1);
18462            Check_Valid_Configuration_Pragma;
18463            Check_No_Identifiers;
18464
18465            declare
18466               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
18467
18468            begin
18469               if Chars (Argx) = Name_Ravenscar then
18470                  Set_Profile_Restrictions (Ravenscar, N, Warn => True);
18471
18472               elsif Chars (Argx) = Name_Restricted then
18473                  Set_Profile_Restrictions (Restricted, N, Warn => True);
18474
18475               elsif Chars (Argx) = Name_No_Implementation_Extensions then
18476                  Set_Profile_Restrictions
18477                    (No_Implementation_Extensions, N, Warn => True);
18478
18479               else
18480                  Error_Pragma_Arg ("& is not a valid profile", Argx);
18481               end if;
18482            end;
18483
18484         --------------------------
18485         -- Propagate_Exceptions --
18486         --------------------------
18487
18488         --  pragma Propagate_Exceptions;
18489
18490         --  Note: this pragma is obsolete and has no effect
18491
18492         when Pragma_Propagate_Exceptions =>
18493            GNAT_Pragma;
18494            Check_Arg_Count (0);
18495
18496            if Warn_On_Obsolescent_Feature then
18497               Error_Msg_N
18498                 ("'G'N'A'T pragma Propagate'_Exceptions is now obsolete " &
18499                  "and has no effect?j?", N);
18500            end if;
18501
18502         -----------------------------
18503         -- Provide_Shift_Operators --
18504         -----------------------------
18505
18506         --  pragma Provide_Shift_Operators (integer_subtype_LOCAL_NAME);
18507
18508         when Pragma_Provide_Shift_Operators =>
18509         Provide_Shift_Operators : declare
18510            Ent : Entity_Id;
18511
18512            procedure Declare_Shift_Operator (Nam : Name_Id);
18513            --  Insert declaration and pragma Instrinsic for named shift op
18514
18515            ----------------------------
18516            -- Declare_Shift_Operator --
18517            ----------------------------
18518
18519            procedure Declare_Shift_Operator (Nam : Name_Id) is
18520               Func   : Node_Id;
18521               Import : Node_Id;
18522
18523            begin
18524               Func :=
18525                 Make_Subprogram_Declaration (Loc,
18526                   Make_Function_Specification (Loc,
18527                     Defining_Unit_Name       =>
18528                       Make_Defining_Identifier (Loc, Chars => Nam),
18529
18530                     Result_Definition        =>
18531                       Make_Identifier (Loc, Chars => Chars (Ent)),
18532
18533                     Parameter_Specifications => New_List (
18534                       Make_Parameter_Specification (Loc,
18535                         Defining_Identifier  =>
18536                           Make_Defining_Identifier (Loc, Name_Value),
18537                         Parameter_Type       =>
18538                           Make_Identifier (Loc, Chars => Chars (Ent))),
18539
18540                       Make_Parameter_Specification (Loc,
18541                         Defining_Identifier  =>
18542                           Make_Defining_Identifier (Loc, Name_Amount),
18543                         Parameter_Type       =>
18544                           New_Occurrence_Of (Standard_Natural, Loc)))));
18545
18546               Import :=
18547                 Make_Pragma (Loc,
18548                   Pragma_Identifier => Make_Identifier (Loc, Name_Import),
18549                   Pragma_Argument_Associations => New_List (
18550                     Make_Pragma_Argument_Association (Loc,
18551                       Expression => Make_Identifier (Loc, Name_Intrinsic)),
18552                     Make_Pragma_Argument_Association (Loc,
18553                       Expression => Make_Identifier (Loc, Nam))));
18554
18555               Insert_After (N, Import);
18556               Insert_After (N, Func);
18557            end Declare_Shift_Operator;
18558
18559         --  Start of processing for Provide_Shift_Operators
18560
18561         begin
18562            GNAT_Pragma;
18563            Check_Arg_Count (1);
18564            Check_Arg_Is_Local_Name (Arg1);
18565
18566            Arg1 := Get_Pragma_Arg (Arg1);
18567
18568            --  We must have an entity name
18569
18570            if not Is_Entity_Name (Arg1) then
18571               Error_Pragma_Arg
18572                 ("pragma % must apply to integer first subtype", Arg1);
18573            end if;
18574
18575            --  If no Entity, means there was a prior error so ignore
18576
18577            if Present (Entity (Arg1)) then
18578               Ent := Entity (Arg1);
18579
18580               --  Apply error checks
18581
18582               if not Is_First_Subtype (Ent) then
18583                  Error_Pragma_Arg
18584                    ("cannot apply pragma %",
18585                     "\& is not a first subtype",
18586                     Arg1);
18587
18588               elsif not Is_Integer_Type (Ent) then
18589                  Error_Pragma_Arg
18590                    ("cannot apply pragma %",
18591                     "\& is not an integer type",
18592                     Arg1);
18593
18594               elsif Has_Shift_Operator (Ent) then
18595                  Error_Pragma_Arg
18596                    ("cannot apply pragma %",
18597                     "\& already has declared shift operators",
18598                     Arg1);
18599
18600               elsif Is_Frozen (Ent) then
18601                  Error_Pragma_Arg
18602                    ("pragma % appears too late",
18603                     "\& is already frozen",
18604                     Arg1);
18605               end if;
18606
18607               --  Now declare the operators. We do this during analysis rather
18608               --  than expansion, since we want the operators available if we
18609               --  are operating in -gnatc or ASIS mode.
18610
18611               Declare_Shift_Operator (Name_Rotate_Left);
18612               Declare_Shift_Operator (Name_Rotate_Right);
18613               Declare_Shift_Operator (Name_Shift_Left);
18614               Declare_Shift_Operator (Name_Shift_Right);
18615               Declare_Shift_Operator (Name_Shift_Right_Arithmetic);
18616            end if;
18617         end Provide_Shift_Operators;
18618
18619         ------------------
18620         -- Psect_Object --
18621         ------------------
18622
18623         --  pragma Psect_Object (
18624         --        [Internal =>] LOCAL_NAME,
18625         --     [, [External =>] EXTERNAL_SYMBOL]
18626         --     [, [Size     =>] EXTERNAL_SYMBOL]);
18627
18628         when Pragma_Psect_Object | Pragma_Common_Object =>
18629         Psect_Object : declare
18630            Args  : Args_List (1 .. 3);
18631            Names : constant Name_List (1 .. 3) := (
18632                      Name_Internal,
18633                      Name_External,
18634                      Name_Size);
18635
18636            Internal : Node_Id renames Args (1);
18637            External : Node_Id renames Args (2);
18638            Size     : Node_Id renames Args (3);
18639
18640            Def_Id : Entity_Id;
18641
18642            procedure Check_Too_Long (Arg : Node_Id);
18643            --  Posts message if the argument is an identifier with more
18644            --  than 31 characters, or a string literal with more than
18645            --  31 characters, and we are operating under VMS
18646
18647            --------------------
18648            -- Check_Too_Long --
18649            --------------------
18650
18651            procedure Check_Too_Long (Arg : Node_Id) is
18652               X : constant Node_Id := Original_Node (Arg);
18653
18654            begin
18655               if not Nkind_In (X, N_String_Literal, N_Identifier) then
18656                  Error_Pragma_Arg
18657                    ("inappropriate argument for pragma %", Arg);
18658               end if;
18659
18660               if OpenVMS_On_Target then
18661                  if (Nkind (X) = N_String_Literal
18662                       and then String_Length (Strval (X)) > 31)
18663                    or else
18664                     (Nkind (X) = N_Identifier
18665                       and then Length_Of_Name (Chars (X)) > 31)
18666                  then
18667                     Error_Pragma_Arg
18668                       ("argument for pragma % is longer than 31 characters",
18669                        Arg);
18670                  end if;
18671               end if;
18672            end Check_Too_Long;
18673
18674         --  Start of processing for Common_Object/Psect_Object
18675
18676         begin
18677            GNAT_Pragma;
18678            Gather_Associations (Names, Args);
18679            Process_Extended_Import_Export_Internal_Arg (Internal);
18680
18681            Def_Id := Entity (Internal);
18682
18683            if not Ekind_In (Def_Id, E_Constant, E_Variable) then
18684               Error_Pragma_Arg
18685                 ("pragma% must designate an object", Internal);
18686            end if;
18687
18688            Check_Too_Long (Internal);
18689
18690            if Is_Imported (Def_Id) or else Is_Exported (Def_Id) then
18691               Error_Pragma_Arg
18692                 ("cannot use pragma% for imported/exported object",
18693                  Internal);
18694            end if;
18695
18696            if Is_Concurrent_Type (Etype (Internal)) then
18697               Error_Pragma_Arg
18698                 ("cannot specify pragma % for task/protected object",
18699                  Internal);
18700            end if;
18701
18702            if Has_Rep_Pragma (Def_Id, Name_Common_Object)
18703                 or else
18704               Has_Rep_Pragma (Def_Id, Name_Psect_Object)
18705            then
18706               Error_Msg_N ("??duplicate Common/Psect_Object pragma", N);
18707            end if;
18708
18709            if Ekind (Def_Id) = E_Constant then
18710               Error_Pragma_Arg
18711                 ("cannot specify pragma % for a constant", Internal);
18712            end if;
18713
18714            if Is_Record_Type (Etype (Internal)) then
18715               declare
18716                  Ent  : Entity_Id;
18717                  Decl : Entity_Id;
18718
18719               begin
18720                  Ent := First_Entity (Etype (Internal));
18721                  while Present (Ent) loop
18722                     Decl := Declaration_Node (Ent);
18723
18724                     if Ekind (Ent) = E_Component
18725                       and then Nkind (Decl) = N_Component_Declaration
18726                       and then Present (Expression (Decl))
18727                       and then Warn_On_Export_Import
18728                     then
18729                        Error_Msg_N
18730                          ("?x?object for pragma % has defaults", Internal);
18731                        exit;
18732
18733                     else
18734                        Next_Entity (Ent);
18735                     end if;
18736                  end loop;
18737               end;
18738            end if;
18739
18740            if Present (Size) then
18741               Check_Too_Long (Size);
18742            end if;
18743
18744            if Present (External) then
18745               Check_Arg_Is_External_Name (External);
18746               Check_Too_Long (External);
18747            end if;
18748
18749            --  If all error tests pass, link pragma on to the rep item chain
18750
18751            Record_Rep_Item (Def_Id, N);
18752         end Psect_Object;
18753
18754         ----------
18755         -- Pure --
18756         ----------
18757
18758         --  pragma Pure [(library_unit_NAME)];
18759
18760         when Pragma_Pure => Pure : declare
18761            Ent : Entity_Id;
18762
18763         begin
18764            Check_Ada_83_Warning;
18765            Check_Valid_Library_Unit_Pragma;
18766
18767            if Nkind (N) = N_Null_Statement then
18768               return;
18769            end if;
18770
18771            Ent := Find_Lib_Unit_Name;
18772            Set_Is_Pure (Ent);
18773            Set_Has_Pragma_Pure (Ent);
18774            Set_Suppress_Elaboration_Warnings (Ent);
18775         end Pure;
18776
18777         -------------
18778         -- Pure_05 --
18779         -------------
18780
18781         --  pragma Pure_05 [(library_unit_NAME)];
18782
18783         --  This pragma is useable only in GNAT_Mode, where it is used like
18784         --  pragma Pure but it is only effective in Ada 2005 mode (otherwise
18785         --  it is ignored). It may be used after a pragma Preelaborate, in
18786         --  which case it overrides the effect of the pragma Preelaborate.
18787         --  This is used to implement AI-362 which recategorizes some run-time
18788         --  packages in Ada 2005 mode.
18789
18790         when Pragma_Pure_05 => Pure_05 : declare
18791            Ent : Entity_Id;
18792
18793         begin
18794            GNAT_Pragma;
18795            Check_Valid_Library_Unit_Pragma;
18796
18797            if not GNAT_Mode then
18798               Error_Pragma ("pragma% only available in GNAT mode");
18799            end if;
18800
18801            if Nkind (N) = N_Null_Statement then
18802               return;
18803            end if;
18804
18805            --  This is one of the few cases where we need to test the value of
18806            --  Ada_Version_Explicit rather than Ada_Version (which is always
18807            --  set to Ada_2012 in a predefined unit), we need to know the
18808            --  explicit version set to know if this pragma is active.
18809
18810            if Ada_Version_Explicit >= Ada_2005 then
18811               Ent := Find_Lib_Unit_Name;
18812               Set_Is_Preelaborated (Ent, False);
18813               Set_Is_Pure (Ent);
18814               Set_Suppress_Elaboration_Warnings (Ent);
18815            end if;
18816         end Pure_05;
18817
18818         -------------
18819         -- Pure_12 --
18820         -------------
18821
18822         --  pragma Pure_12 [(library_unit_NAME)];
18823
18824         --  This pragma is useable only in GNAT_Mode, where it is used like
18825         --  pragma Pure but it is only effective in Ada 2012 mode (otherwise
18826         --  it is ignored). It may be used after a pragma Preelaborate, in
18827         --  which case it overrides the effect of the pragma Preelaborate.
18828         --  This is used to implement AI05-0212 which recategorizes some
18829         --  run-time packages in Ada 2012 mode.
18830
18831         when Pragma_Pure_12 => Pure_12 : declare
18832            Ent : Entity_Id;
18833
18834         begin
18835            GNAT_Pragma;
18836            Check_Valid_Library_Unit_Pragma;
18837
18838            if not GNAT_Mode then
18839               Error_Pragma ("pragma% only available in GNAT mode");
18840            end if;
18841
18842            if Nkind (N) = N_Null_Statement then
18843               return;
18844            end if;
18845
18846            --  This is one of the few cases where we need to test the value of
18847            --  Ada_Version_Explicit rather than Ada_Version (which is always
18848            --  set to Ada_2012 in a predefined unit), we need to know the
18849            --  explicit version set to know if this pragma is active.
18850
18851            if Ada_Version_Explicit >= Ada_2012 then
18852               Ent := Find_Lib_Unit_Name;
18853               Set_Is_Preelaborated (Ent, False);
18854               Set_Is_Pure (Ent);
18855               Set_Suppress_Elaboration_Warnings (Ent);
18856            end if;
18857         end Pure_12;
18858
18859         -------------------
18860         -- Pure_Function --
18861         -------------------
18862
18863         --  pragma Pure_Function ([Entity =>] function_LOCAL_NAME);
18864
18865         when Pragma_Pure_Function => Pure_Function : declare
18866            E_Id      : Node_Id;
18867            E         : Entity_Id;
18868            Def_Id    : Entity_Id;
18869            Effective : Boolean := False;
18870
18871         begin
18872            GNAT_Pragma;
18873            Check_Arg_Count (1);
18874            Check_Optional_Identifier (Arg1, Name_Entity);
18875            Check_Arg_Is_Local_Name (Arg1);
18876            E_Id := Get_Pragma_Arg (Arg1);
18877
18878            if Error_Posted (E_Id) then
18879               return;
18880            end if;
18881
18882            --  Loop through homonyms (overloadings) of referenced entity
18883
18884            E := Entity (E_Id);
18885
18886            if Present (E) then
18887               loop
18888                  Def_Id := Get_Base_Subprogram (E);
18889
18890                  if not Ekind_In (Def_Id, E_Function,
18891                                           E_Generic_Function,
18892                                           E_Operator)
18893                  then
18894                     Error_Pragma_Arg
18895                       ("pragma% requires a function name", Arg1);
18896                  end if;
18897
18898                  Set_Is_Pure (Def_Id);
18899
18900                  if not Has_Pragma_Pure_Function (Def_Id) then
18901                     Set_Has_Pragma_Pure_Function (Def_Id);
18902                     Effective := True;
18903                  end if;
18904
18905                  exit when From_Aspect_Specification (N);
18906                  E := Homonym (E);
18907                  exit when No (E) or else Scope (E) /= Current_Scope;
18908               end loop;
18909
18910               if not Effective
18911                 and then Warn_On_Redundant_Constructs
18912               then
18913                  Error_Msg_NE
18914                    ("pragma Pure_Function on& is redundant?r?",
18915                     N, Entity (E_Id));
18916               end if;
18917            end if;
18918         end Pure_Function;
18919
18920         --------------------
18921         -- Queuing_Policy --
18922         --------------------
18923
18924         --  pragma Queuing_Policy (policy_IDENTIFIER);
18925
18926         when Pragma_Queuing_Policy => declare
18927            QP : Character;
18928
18929         begin
18930            Check_Ada_83_Warning;
18931            Check_Arg_Count (1);
18932            Check_No_Identifiers;
18933            Check_Arg_Is_Queuing_Policy (Arg1);
18934            Check_Valid_Configuration_Pragma;
18935            Get_Name_String (Chars (Get_Pragma_Arg (Arg1)));
18936            QP := Fold_Upper (Name_Buffer (1));
18937
18938            if Queuing_Policy /= ' '
18939              and then Queuing_Policy /= QP
18940            then
18941               Error_Msg_Sloc := Queuing_Policy_Sloc;
18942               Error_Pragma ("queuing policy incompatible with policy#");
18943
18944            --  Set new policy, but always preserve System_Location since we
18945            --  like the error message with the run time name.
18946
18947            else
18948               Queuing_Policy := QP;
18949
18950               if Queuing_Policy_Sloc /= System_Location then
18951                  Queuing_Policy_Sloc := Loc;
18952               end if;
18953            end if;
18954         end;
18955
18956         --------------
18957         -- Rational --
18958         --------------
18959
18960         --  pragma Rational, for compatibility with foreign compiler
18961
18962         when Pragma_Rational =>
18963            Set_Rational_Profile;
18964
18965         ------------------------------------
18966         -- Refined_Depends/Refined_Global --
18967         ------------------------------------
18968
18969         --  pragma Refined_Depends (DEPENDENCY_RELATION);
18970
18971         --  DEPENDENCY_RELATION ::=
18972         --    null
18973         --  | DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE}
18974
18975         --  DEPENDENCY_CLAUSE ::=
18976         --    OUTPUT_LIST =>[+] INPUT_LIST
18977         --  | NULL_DEPENDENCY_CLAUSE
18978
18979         --  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST
18980
18981         --  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})
18982
18983         --  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})
18984
18985         --  OUTPUT ::= NAME | FUNCTION_RESULT
18986         --  INPUT  ::= NAME
18987
18988         --  where FUNCTION_RESULT is a function Result attribute_reference
18989
18990         --  pragma Refined_Global (GLOBAL_SPECIFICATION);
18991
18992         --  GLOBAL_SPECIFICATION ::=
18993         --    null
18994         --  | GLOBAL_LIST
18995         --  | MODED_GLOBAL_LIST {, MODED_GLOBAL_LIST}
18996
18997         --  MODED_GLOBAL_LIST ::= MODE_SELECTOR => GLOBAL_LIST
18998
18999         --  MODE_SELECTOR ::= In_Out | Input | Output | Proof_In
19000         --  GLOBAL_LIST   ::= GLOBAL_ITEM | (GLOBAL_ITEM {, GLOBAL_ITEM})
19001         --  GLOBAL_ITEM   ::= NAME
19002
19003         when Pragma_Refined_Depends |
19004              Pragma_Refined_Global  => Refined_Depends_Global :
19005         declare
19006            Body_Id : Entity_Id;
19007            Legal   : Boolean;
19008            Spec_Id : Entity_Id;
19009
19010         begin
19011            Analyze_Refined_Pragma (Spec_Id, Body_Id, Legal);
19012
19013            --  Save the pragma in the contract of the subprogram body. The
19014            --  remaining analysis is performed at the end of the enclosing
19015            --  declarations.
19016
19017            if Legal then
19018               Add_Contract_Item (N, Body_Id);
19019            end if;
19020         end Refined_Depends_Global;
19021
19022         ------------------
19023         -- Refined_Post --
19024         ------------------
19025
19026         --  pragma Refined_Post (boolean_EXPRESSION);
19027
19028         when Pragma_Refined_Post => Refined_Post : declare
19029            Body_Id     : Entity_Id;
19030            Legal       : Boolean;
19031            Result_Seen : Boolean := False;
19032            Spec_Id     : Entity_Id;
19033
19034         begin
19035            Analyze_Refined_Pragma (Spec_Id, Body_Id, Legal);
19036
19037            --  Analyze the boolean expression as a "spec expression"
19038
19039            if Legal then
19040               Analyze_Pre_Post_Condition_In_Decl_Part (N, Spec_Id);
19041
19042               --  Verify that the refined postcondition mentions attribute
19043               --  'Result and its expression introduces a post-state.
19044
19045               if Warn_On_Suspicious_Contract
19046                 and then Ekind_In (Spec_Id, E_Function, E_Generic_Function)
19047               then
19048                  Check_Result_And_Post_State (N, Result_Seen);
19049
19050                  if not Result_Seen then
19051                     Error_Pragma
19052                       ("pragma % does not mention function result?T?");
19053                  end if;
19054               end if;
19055
19056               --  Chain the pragma on the contract for easy retrieval
19057
19058               Add_Contract_Item (N, Body_Id);
19059            end if;
19060         end Refined_Post;
19061
19062         -------------------
19063         -- Refined_State --
19064         -------------------
19065
19066         --  pragma Refined_State (REFINEMENT_LIST);
19067
19068         --  REFINEMENT_LIST ::=
19069         --    REFINEMENT_CLAUSE
19070         --    | (REFINEMENT_CLAUSE {, REFINEMENT_CLAUSE})
19071
19072         --  REFINEMENT_CLAUSE ::= state_NAME => CONSTITUENT_LIST
19073
19074         --  CONSTITUENT_LIST ::=
19075         --    null
19076         --    | CONSTITUENT
19077         --    | (CONSTITUENT {, CONSTITUENT})
19078
19079         --  CONSTITUENT ::= object_NAME | state_NAME
19080
19081         when Pragma_Refined_State => Refined_State : declare
19082            Context : constant Node_Id := Parent (N);
19083            Spec_Id : Entity_Id;
19084            Stmt    : Node_Id;
19085
19086         begin
19087            GNAT_Pragma;
19088            Check_Arg_Count (1);
19089
19090            --  Ensure the proper placement of the pragma. Refined states must
19091            --  be associated with a package body.
19092
19093            if Nkind (Context) /= N_Package_Body then
19094               Pragma_Misplaced;
19095               return;
19096            end if;
19097
19098            Stmt := Prev (N);
19099            while Present (Stmt) loop
19100
19101               --  Skip prior pragmas, but check for duplicates
19102
19103               if Nkind (Stmt) = N_Pragma then
19104                  if Pragma_Name (Stmt) = Pname then
19105                     Error_Msg_Name_1 := Pname;
19106                     Error_Msg_Sloc   := Sloc (Stmt);
19107                     Error_Msg_N ("pragma % duplicates pragma declared #", N);
19108                  end if;
19109
19110               --  Skip internally generated code
19111
19112               elsif not Comes_From_Source (Stmt) then
19113                  null;
19114
19115               --  The pragma does not apply to a legal construct, issue an
19116               --  error and stop the analysis.
19117
19118               else
19119                  Pragma_Misplaced;
19120                  return;
19121               end if;
19122
19123               Stmt := Prev (Stmt);
19124            end loop;
19125
19126            Spec_Id := Corresponding_Spec (Context);
19127
19128            --  State refinement is allowed only when the corresponding package
19129            --  declaration has non-null pragma Abstract_State. Refinement not
19130            --  enforced when SPARK checks are suppressed (SPARK RM 7.2.2(3)).
19131
19132            if SPARK_Mode /= Off
19133              and then
19134                (No (Abstract_States (Spec_Id))
19135                  or else Has_Null_Abstract_State (Spec_Id))
19136            then
19137               Error_Msg_NE
19138                 ("useless refinement, package & does not define abstract "
19139                  & "states", N, Spec_Id);
19140               return;
19141            end if;
19142
19143            --  The pragma must be analyzed at the end of the declarations as
19144            --  it has visibility over the whole declarative region. Save the
19145            --  pragma for later (see Analyze_Refined_Depends_In_Decl_Part) by
19146            --  adding it to the contract of the package body.
19147
19148            Add_Contract_Item (N, Defining_Entity (Context));
19149         end Refined_State;
19150
19151         -----------------------
19152         -- Relative_Deadline --
19153         -----------------------
19154
19155         --  pragma Relative_Deadline (time_span_EXPRESSION);
19156
19157         when Pragma_Relative_Deadline => Relative_Deadline : declare
19158            P   : constant Node_Id := Parent (N);
19159            Arg : Node_Id;
19160
19161         begin
19162            Ada_2005_Pragma;
19163            Check_No_Identifiers;
19164            Check_Arg_Count (1);
19165
19166            Arg := Get_Pragma_Arg (Arg1);
19167
19168            --  The expression must be analyzed in the special manner described
19169            --  in "Handling of Default and Per-Object Expressions" in sem.ads.
19170
19171            Preanalyze_Spec_Expression (Arg, RTE (RE_Time_Span));
19172
19173            --  Subprogram case
19174
19175            if Nkind (P) = N_Subprogram_Body then
19176               Check_In_Main_Program;
19177
19178            --  Only Task and subprogram cases allowed
19179
19180            elsif Nkind (P) /= N_Task_Definition then
19181               Pragma_Misplaced;
19182            end if;
19183
19184            --  Check duplicate pragma before we set the corresponding flag
19185
19186            if Has_Relative_Deadline_Pragma (P) then
19187               Error_Pragma ("duplicate pragma% not allowed");
19188            end if;
19189
19190            --  Set Has_Relative_Deadline_Pragma only for tasks. Note that
19191            --  Relative_Deadline pragma node cannot be inserted in the Rep
19192            --  Item chain of Ent since it is rewritten by the expander as a
19193            --  procedure call statement that will break the chain.
19194
19195            Set_Has_Relative_Deadline_Pragma (P, True);
19196         end Relative_Deadline;
19197
19198         ------------------------
19199         -- Remote_Access_Type --
19200         ------------------------
19201
19202         --  pragma Remote_Access_Type ([Entity =>] formal_type_LOCAL_NAME);
19203
19204         when Pragma_Remote_Access_Type => Remote_Access_Type : declare
19205            E : Entity_Id;
19206
19207         begin
19208            GNAT_Pragma;
19209            Check_Arg_Count (1);
19210            Check_Optional_Identifier (Arg1, Name_Entity);
19211            Check_Arg_Is_Local_Name (Arg1);
19212
19213            E := Entity (Get_Pragma_Arg (Arg1));
19214
19215            if Nkind (Parent (E)) = N_Formal_Type_Declaration
19216              and then Ekind (E) = E_General_Access_Type
19217              and then Is_Class_Wide_Type (Directly_Designated_Type (E))
19218              and then Scope (Root_Type (Directly_Designated_Type (E)))
19219                         = Scope (E)
19220              and then Is_Valid_Remote_Object_Type
19221                         (Root_Type (Directly_Designated_Type (E)))
19222            then
19223               Set_Is_Remote_Types (E);
19224
19225            else
19226               Error_Pragma_Arg
19227                 ("pragma% applies only to formal access to classwide types",
19228                  Arg1);
19229            end if;
19230         end Remote_Access_Type;
19231
19232         ---------------------------
19233         -- Remote_Call_Interface --
19234         ---------------------------
19235
19236         --  pragma Remote_Call_Interface [(library_unit_NAME)];
19237
19238         when Pragma_Remote_Call_Interface => Remote_Call_Interface : declare
19239            Cunit_Node : Node_Id;
19240            Cunit_Ent  : Entity_Id;
19241            K          : Node_Kind;
19242
19243         begin
19244            Check_Ada_83_Warning;
19245            Check_Valid_Library_Unit_Pragma;
19246
19247            if Nkind (N) = N_Null_Statement then
19248               return;
19249            end if;
19250
19251            Cunit_Node := Cunit (Current_Sem_Unit);
19252            K          := Nkind (Unit (Cunit_Node));
19253            Cunit_Ent  := Cunit_Entity (Current_Sem_Unit);
19254
19255            if K = N_Package_Declaration
19256              or else K = N_Generic_Package_Declaration
19257              or else K = N_Subprogram_Declaration
19258              or else K = N_Generic_Subprogram_Declaration
19259              or else (K = N_Subprogram_Body
19260                         and then Acts_As_Spec (Unit (Cunit_Node)))
19261            then
19262               null;
19263            else
19264               Error_Pragma (
19265                 "pragma% must apply to package or subprogram declaration");
19266            end if;
19267
19268            Set_Is_Remote_Call_Interface (Cunit_Ent);
19269         end Remote_Call_Interface;
19270
19271         ------------------
19272         -- Remote_Types --
19273         ------------------
19274
19275         --  pragma Remote_Types [(library_unit_NAME)];
19276
19277         when Pragma_Remote_Types => Remote_Types : declare
19278            Cunit_Node : Node_Id;
19279            Cunit_Ent  : Entity_Id;
19280
19281         begin
19282            Check_Ada_83_Warning;
19283            Check_Valid_Library_Unit_Pragma;
19284
19285            if Nkind (N) = N_Null_Statement then
19286               return;
19287            end if;
19288
19289            Cunit_Node := Cunit (Current_Sem_Unit);
19290            Cunit_Ent  := Cunit_Entity (Current_Sem_Unit);
19291
19292            if not Nkind_In (Unit (Cunit_Node), N_Package_Declaration,
19293                                                N_Generic_Package_Declaration)
19294            then
19295               Error_Pragma
19296                 ("pragma% can only apply to a package declaration");
19297            end if;
19298
19299            Set_Is_Remote_Types (Cunit_Ent);
19300         end Remote_Types;
19301
19302         ---------------
19303         -- Ravenscar --
19304         ---------------
19305
19306         --  pragma Ravenscar;
19307
19308         when Pragma_Ravenscar =>
19309            GNAT_Pragma;
19310            Check_Arg_Count (0);
19311            Check_Valid_Configuration_Pragma;
19312            Set_Ravenscar_Profile (N);
19313
19314            if Warn_On_Obsolescent_Feature then
19315               Error_Msg_N
19316                 ("pragma Ravenscar is an obsolescent feature?j?", N);
19317               Error_Msg_N
19318                 ("|use pragma Profile (Ravenscar) instead?j?", N);
19319            end if;
19320
19321         -------------------------
19322         -- Restricted_Run_Time --
19323         -------------------------
19324
19325         --  pragma Restricted_Run_Time;
19326
19327         when Pragma_Restricted_Run_Time =>
19328            GNAT_Pragma;
19329            Check_Arg_Count (0);
19330            Check_Valid_Configuration_Pragma;
19331            Set_Profile_Restrictions
19332              (Restricted, N, Warn => Treat_Restrictions_As_Warnings);
19333
19334            if Warn_On_Obsolescent_Feature then
19335               Error_Msg_N
19336                 ("pragma Restricted_Run_Time is an obsolescent feature?j?",
19337                  N);
19338               Error_Msg_N
19339                 ("|use pragma Profile (Restricted) instead?j?", N);
19340            end if;
19341
19342         ------------------
19343         -- Restrictions --
19344         ------------------
19345
19346         --  pragma Restrictions (RESTRICTION {, RESTRICTION});
19347
19348         --  RESTRICTION ::=
19349         --    restriction_IDENTIFIER
19350         --  | restriction_parameter_IDENTIFIER => EXPRESSION
19351
19352         when Pragma_Restrictions =>
19353            Process_Restrictions_Or_Restriction_Warnings
19354              (Warn => Treat_Restrictions_As_Warnings);
19355
19356         --------------------------
19357         -- Restriction_Warnings --
19358         --------------------------
19359
19360         --  pragma Restriction_Warnings (RESTRICTION {, RESTRICTION});
19361
19362         --  RESTRICTION ::=
19363         --    restriction_IDENTIFIER
19364         --  | restriction_parameter_IDENTIFIER => EXPRESSION
19365
19366         when Pragma_Restriction_Warnings =>
19367            GNAT_Pragma;
19368            Process_Restrictions_Or_Restriction_Warnings (Warn => True);
19369
19370         ----------------
19371         -- Reviewable --
19372         ----------------
19373
19374         --  pragma Reviewable;
19375
19376         when Pragma_Reviewable =>
19377            Check_Ada_83_Warning;
19378            Check_Arg_Count (0);
19379
19380            --  Call dummy debugging function rv. This is done to assist front
19381            --  end debugging. By placing a Reviewable pragma in the source
19382            --  program, a breakpoint on rv catches this place in the source,
19383            --  allowing convenient stepping to the point of interest.
19384
19385            rv;
19386
19387         --------------------------
19388         -- Short_Circuit_And_Or --
19389         --------------------------
19390
19391         --  pragma Short_Circuit_And_Or;
19392
19393         when Pragma_Short_Circuit_And_Or =>
19394            GNAT_Pragma;
19395            Check_Arg_Count (0);
19396            Check_Valid_Configuration_Pragma;
19397            Short_Circuit_And_Or := True;
19398
19399         -------------------
19400         -- Share_Generic --
19401         -------------------
19402
19403         --  pragma Share_Generic (GNAME {, GNAME});
19404
19405         --  GNAME ::= generic_unit_NAME | generic_instance_NAME
19406
19407         when Pragma_Share_Generic =>
19408            GNAT_Pragma;
19409            Process_Generic_List;
19410
19411         ------------
19412         -- Shared --
19413         ------------
19414
19415         --  pragma Shared (LOCAL_NAME);
19416
19417         when Pragma_Shared =>
19418            GNAT_Pragma;
19419            Process_Atomic_Shared_Volatile;
19420
19421         --------------------
19422         -- Shared_Passive --
19423         --------------------
19424
19425         --  pragma Shared_Passive [(library_unit_NAME)];
19426
19427         --  Set the flag Is_Shared_Passive of program unit name entity
19428
19429         when Pragma_Shared_Passive => Shared_Passive : declare
19430            Cunit_Node : Node_Id;
19431            Cunit_Ent  : Entity_Id;
19432
19433         begin
19434            Check_Ada_83_Warning;
19435            Check_Valid_Library_Unit_Pragma;
19436
19437            if Nkind (N) = N_Null_Statement then
19438               return;
19439            end if;
19440
19441            Cunit_Node := Cunit (Current_Sem_Unit);
19442            Cunit_Ent  := Cunit_Entity (Current_Sem_Unit);
19443
19444            if not Nkind_In (Unit (Cunit_Node), N_Package_Declaration,
19445                                                N_Generic_Package_Declaration)
19446            then
19447               Error_Pragma
19448                 ("pragma% can only apply to a package declaration");
19449            end if;
19450
19451            Set_Is_Shared_Passive (Cunit_Ent);
19452         end Shared_Passive;
19453
19454         -----------------------
19455         -- Short_Descriptors --
19456         -----------------------
19457
19458         --  pragma Short_Descriptors;
19459
19460         when Pragma_Short_Descriptors =>
19461            GNAT_Pragma;
19462            Check_Arg_Count (0);
19463            Check_Valid_Configuration_Pragma;
19464            Short_Descriptors := True;
19465
19466         ------------------------------
19467         -- Simple_Storage_Pool_Type --
19468         ------------------------------
19469
19470         --  pragma Simple_Storage_Pool_Type (type_LOCAL_NAME);
19471
19472         when Pragma_Simple_Storage_Pool_Type =>
19473         Simple_Storage_Pool_Type : declare
19474            Type_Id : Node_Id;
19475            Typ     : Entity_Id;
19476
19477         begin
19478            GNAT_Pragma;
19479            Check_Arg_Count (1);
19480            Check_Arg_Is_Library_Level_Local_Name (Arg1);
19481
19482            Type_Id := Get_Pragma_Arg (Arg1);
19483            Find_Type (Type_Id);
19484            Typ := Entity (Type_Id);
19485
19486            if Typ = Any_Type then
19487               return;
19488            end if;
19489
19490            --  We require the pragma to apply to a type declared in a package
19491            --  declaration, but not (immediately) within a package body.
19492
19493            if Ekind (Current_Scope) /= E_Package
19494              or else In_Package_Body (Current_Scope)
19495            then
19496               Error_Pragma
19497                 ("pragma% can only apply to type declared immediately "
19498                  & "within a package declaration");
19499            end if;
19500
19501            --  A simple storage pool type must be an immutably limited record
19502            --  or private type. If the pragma is given for a private type,
19503            --  the full type is similarly restricted (which is checked later
19504            --  in Freeze_Entity).
19505
19506            if Is_Record_Type (Typ)
19507              and then not Is_Limited_View (Typ)
19508            then
19509               Error_Pragma
19510                 ("pragma% can only apply to explicitly limited record type");
19511
19512            elsif Is_Private_Type (Typ) and then not Is_Limited_Type (Typ) then
19513               Error_Pragma
19514                 ("pragma% can only apply to a private type that is limited");
19515
19516            elsif not Is_Record_Type (Typ)
19517              and then not Is_Private_Type (Typ)
19518            then
19519               Error_Pragma
19520                 ("pragma% can only apply to limited record or private type");
19521            end if;
19522
19523            Record_Rep_Item (Typ, N);
19524         end Simple_Storage_Pool_Type;
19525
19526         ----------------------
19527         -- Source_File_Name --
19528         ----------------------
19529
19530         --  There are five forms for this pragma:
19531
19532         --  pragma Source_File_Name (
19533         --    [UNIT_NAME      =>] unit_NAME,
19534         --     BODY_FILE_NAME =>  STRING_LITERAL
19535         --    [, [INDEX =>] INTEGER_LITERAL]);
19536
19537         --  pragma Source_File_Name (
19538         --    [UNIT_NAME      =>] unit_NAME,
19539         --     SPEC_FILE_NAME =>  STRING_LITERAL
19540         --    [, [INDEX =>] INTEGER_LITERAL]);
19541
19542         --  pragma Source_File_Name (
19543         --     BODY_FILE_NAME  => STRING_LITERAL
19544         --  [, DOT_REPLACEMENT => STRING_LITERAL]
19545         --  [, CASING          => CASING_SPEC]);
19546
19547         --  pragma Source_File_Name (
19548         --     SPEC_FILE_NAME  => STRING_LITERAL
19549         --  [, DOT_REPLACEMENT => STRING_LITERAL]
19550         --  [, CASING          => CASING_SPEC]);
19551
19552         --  pragma Source_File_Name (
19553         --     SUBUNIT_FILE_NAME  => STRING_LITERAL
19554         --  [, DOT_REPLACEMENT    => STRING_LITERAL]
19555         --  [, CASING             => CASING_SPEC]);
19556
19557         --  CASING_SPEC ::= Uppercase | Lowercase | Mixedcase
19558
19559         --  Pragma Source_File_Name_Project (SFNP) is equivalent to pragma
19560         --  Source_File_Name (SFN), however their usage is exclusive: SFN can
19561         --  only be used when no project file is used, while SFNP can only be
19562         --  used when a project file is used.
19563
19564         --  No processing here. Processing was completed during parsing, since
19565         --  we need to have file names set as early as possible. Units are
19566         --  loaded well before semantic processing starts.
19567
19568         --  The only processing we defer to this point is the check for
19569         --  correct placement.
19570
19571         when Pragma_Source_File_Name =>
19572            GNAT_Pragma;
19573            Check_Valid_Configuration_Pragma;
19574
19575         ------------------------------
19576         -- Source_File_Name_Project --
19577         ------------------------------
19578
19579         --  See Source_File_Name for syntax
19580
19581         --  No processing here. Processing was completed during parsing, since
19582         --  we need to have file names set as early as possible. Units are
19583         --  loaded well before semantic processing starts.
19584
19585         --  The only processing we defer to this point is the check for
19586         --  correct placement.
19587
19588         when Pragma_Source_File_Name_Project =>
19589            GNAT_Pragma;
19590            Check_Valid_Configuration_Pragma;
19591
19592            --  Check that a pragma Source_File_Name_Project is used only in a
19593            --  configuration pragmas file.
19594
19595            --  Pragmas Source_File_Name_Project should only be generated by
19596            --  the Project Manager in configuration pragmas files.
19597
19598            --  This is really an ugly test. It seems to depend on some
19599            --  accidental and undocumented property. At the very least it
19600            --  needs to be documented, but it would be better to have a
19601            --  clean way of testing if we are in a configuration file???
19602
19603            if Present (Parent (N)) then
19604               Error_Pragma
19605                 ("pragma% can only appear in a configuration pragmas file");
19606            end if;
19607
19608         ----------------------
19609         -- Source_Reference --
19610         ----------------------
19611
19612         --  pragma Source_Reference (INTEGER_LITERAL [, STRING_LITERAL]);
19613
19614         --  Nothing to do, all processing completed in Par.Prag, since we need
19615         --  the information for possible parser messages that are output.
19616
19617         when Pragma_Source_Reference =>
19618            GNAT_Pragma;
19619
19620         ----------------
19621         -- SPARK_Mode --
19622         ----------------
19623
19624         --  pragma SPARK_Mode [(On | Off)];
19625
19626         when Pragma_SPARK_Mode => Do_SPARK_Mode : declare
19627            Body_Id : Entity_Id;
19628            Context : Node_Id;
19629            Mode    : Name_Id;
19630            Mode_Id : SPARK_Mode_Type;
19631            Spec_Id : Entity_Id;
19632            Stmt    : Node_Id;
19633
19634            procedure Check_Pragma_Conformance
19635              (Context_Pragma : Node_Id;
19636               Entity_Pragma  : Node_Id;
19637               Entity         : Entity_Id);
19638            --  If Context_Pragma is not Empty, verify that the new pragma N
19639            --  is compatible with the pragma Context_Pragma that was inherited
19640            --  from the context:
19641            --  . if Context_Pragma is ON, then the new mode can be anything
19642            --  . if Context_Pragma is OFF, then the only allowed new mode is
19643            --    also OFF.
19644            --
19645            --  If Entity is not Empty, verify that the new pragma N is
19646            --  compatible with Entity_Pragma, the SPARK_Mode previously set
19647            --  for Entity (which may be Empty):
19648            --  . if Entity_Pragma is ON, then the new mode can be anything
19649            --  . if Entity_Pragma is OFF, then the only allowed new mode is
19650            --    also OFF.
19651            --  . if Entity_Pragma is Empty, we always issue an error, as this
19652            --    corresponds to a case where a previous section of Entity
19653            --    had no SPARK_Mode set.
19654
19655            procedure Check_Library_Level_Entity (E : Entity_Id);
19656            --  Verify that pragma is applied to library-level entity E
19657
19658            ------------------------------
19659            -- Check_Pragma_Conformance --
19660            ------------------------------
19661
19662            procedure Check_Pragma_Conformance
19663              (Context_Pragma : Node_Id;
19664               Entity_Pragma  : Node_Id;
19665               Entity         : Entity_Id)
19666            is
19667            begin
19668               if Present (Context_Pragma) then
19669                  pragma Assert (Nkind (Context_Pragma) = N_Pragma);
19670
19671                  --  New mode less restrictive than the established mode
19672
19673                  if Get_SPARK_Mode_From_Pragma (Context_Pragma) = Off
19674                    and then Mode_Id = On
19675                  then
19676                     Error_Msg_N
19677                       ("cannot change SPARK_Mode from Off to On", Arg1);
19678                     Error_Msg_Sloc := Sloc (SPARK_Mode_Pragma);
19679                     Error_Msg_N ("\SPARK_Mode was set to Off#", Arg1);
19680                     raise Pragma_Exit;
19681                  end if;
19682               end if;
19683
19684               if Present (Entity) then
19685                  if Present (Entity_Pragma) then
19686                     if Get_SPARK_Mode_From_Pragma (Entity_Pragma) = Off
19687                       and then Mode_Id = On
19688                     then
19689                        Error_Msg_N ("incorrect use of SPARK_Mode", Arg1);
19690                        Error_Msg_Sloc := Sloc (Entity_Pragma);
19691                        Error_Msg_NE
19692                          ("\value Off was set for SPARK_Mode on&#",
19693                           Arg1, Entity);
19694                        raise Pragma_Exit;
19695                     end if;
19696
19697                  else
19698                     Error_Msg_N ("incorrect use of SPARK_Mode", Arg1);
19699                     Error_Msg_Sloc := Sloc (Entity);
19700                     Error_Msg_NE
19701                       ("\no value was set for SPARK_Mode on&#",
19702                        Arg1, Entity);
19703                     raise Pragma_Exit;
19704                  end if;
19705               end if;
19706            end Check_Pragma_Conformance;
19707
19708            --------------------------------
19709            -- Check_Library_Level_Entity --
19710            --------------------------------
19711
19712            procedure Check_Library_Level_Entity (E : Entity_Id) is
19713               MsgF : String := "incorrect placement of pragma%";
19714
19715            begin
19716               if not Is_Library_Level_Entity (E) then
19717                  Error_Msg_Name_1 := Pname;
19718                  Fix_Error (MsgF);
19719                  Error_Msg_N (MsgF, N);
19720
19721                  if Ekind_In (E, E_Generic_Package,
19722                                  E_Package,
19723                                  E_Package_Body)
19724                  then
19725                     Error_Msg_NE
19726                       ("\& is not a library-level package", N, E);
19727                  else
19728                     Error_Msg_NE
19729                       ("\& is not a library-level subprogram", N, E);
19730                  end if;
19731
19732                  raise Pragma_Exit;
19733               end if;
19734            end Check_Library_Level_Entity;
19735
19736         --  Start of processing for Do_SPARK_Mode
19737
19738         begin
19739            GNAT_Pragma;
19740            Check_No_Identifiers;
19741            Check_At_Most_N_Arguments (1);
19742
19743            --  Check the legality of the mode (no argument = ON)
19744
19745            if Arg_Count = 1 then
19746               Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
19747               Mode := Chars (Get_Pragma_Arg (Arg1));
19748            else
19749               Mode := Name_On;
19750            end if;
19751
19752            Mode_Id := Get_SPARK_Mode_Type (Mode);
19753            Context := Parent (N);
19754
19755            --  Packages and subprograms declared in a generic unit cannot be
19756            --  subject to the pragma.
19757
19758            if Inside_A_Generic then
19759               Error_Pragma ("incorrect placement of pragma% in a generic");
19760
19761            --  The pragma appears in a configuration pragmas file
19762
19763            elsif No (Context) then
19764               Check_Valid_Configuration_Pragma;
19765
19766               if Present (SPARK_Mode_Pragma) then
19767                  Error_Msg_Sloc := Sloc (SPARK_Mode_Pragma);
19768                  Error_Msg_N ("pragma% duplicates pragma declared#", N);
19769                  raise Pragma_Exit;
19770               end if;
19771
19772               SPARK_Mode_Pragma := N;
19773               SPARK_Mode := Mode_Id;
19774
19775            --  When the pragma is placed before the declaration of a unit, it
19776            --  configures the whole unit.
19777
19778            elsif Nkind (Context) = N_Compilation_Unit then
19779               Check_Valid_Configuration_Pragma;
19780
19781               if Nkind (Unit (Context)) in N_Generic_Declaration
19782                 or else (Present (Library_Unit (Context))
19783                           and then Nkind (Unit (Library_Unit (Context))) in
19784                                                        N_Generic_Declaration)
19785               then
19786                  Error_Pragma ("incorrect placement of pragma% in a generic");
19787               end if;
19788
19789               SPARK_Mode_Pragma := N;
19790               SPARK_Mode := Mode_Id;
19791
19792            --  The pragma applies to a [library unit] subprogram or package
19793
19794            else
19795               --  Verify the placement of the pragma with respect to package
19796               --  or subprogram declarations and detect duplicates.
19797
19798               Stmt := Prev (N);
19799               while Present (Stmt) loop
19800
19801                  --  Skip prior pragmas, but check for duplicates
19802
19803                  if Nkind (Stmt) = N_Pragma then
19804                     if Pragma_Name (Stmt) = Pname then
19805                        Error_Msg_Name_1 := Pname;
19806                        Error_Msg_Sloc   := Sloc (Stmt);
19807                        Error_Msg_N ("pragma% duplicates pragma declared#", N);
19808                        raise Pragma_Exit;
19809                     end if;
19810
19811                  --  Skip internally generated code
19812
19813                  elsif not Comes_From_Source (Stmt) then
19814                     null;
19815
19816                  elsif Nkind (Stmt) in N_Generic_Declaration then
19817                     Error_Pragma
19818                       ("incorrect placement of pragma% on a generic");
19819
19820                  --  The pragma applies to a package declaration
19821
19822                  elsif Nkind (Stmt) = N_Package_Declaration then
19823                     Spec_Id := Defining_Entity (Stmt);
19824                     Check_Library_Level_Entity (Spec_Id);
19825                     Check_Pragma_Conformance
19826                       (Context_Pragma => SPARK_Pragma (Spec_Id),
19827                        Entity_Pragma  => Empty,
19828                        Entity         => Empty);
19829
19830                     Set_SPARK_Pragma               (Spec_Id, N);
19831                     Set_SPARK_Pragma_Inherited     (Spec_Id, False);
19832                     Set_SPARK_Aux_Pragma           (Spec_Id, N);
19833                     Set_SPARK_Aux_Pragma_Inherited (Spec_Id, True);
19834                     return;
19835
19836                  --  The pragma applies to a subprogram declaration
19837
19838                  elsif Nkind (Stmt) = N_Subprogram_Declaration then
19839                     Spec_Id := Defining_Entity (Stmt);
19840                     Check_Library_Level_Entity (Spec_Id);
19841                     Check_Pragma_Conformance
19842                       (Context_Pragma => SPARK_Pragma (Spec_Id),
19843                        Entity_Pragma  => Empty,
19844                        Entity         => Empty);
19845
19846                     Set_SPARK_Pragma               (Spec_Id, N);
19847                     Set_SPARK_Pragma_Inherited     (Spec_Id, False);
19848                     return;
19849
19850                  --  The pragma does not apply to a legal construct, issue an
19851                  --  error and stop the analysis.
19852
19853                  else
19854                     Pragma_Misplaced;
19855                     exit;
19856                  end if;
19857
19858                  Stmt := Prev (Stmt);
19859               end loop;
19860
19861               --  Handle all cases where the pragma is actually an aspect and
19862               --  applies to a library-level package spec, body or subprogram.
19863
19864               --    function F ... with SPARK_Mode => ...;
19865               --    package P with SPARK_Mode => ...;
19866               --    package body P with SPARK_Mode => ... is
19867
19868               --  The following circuitry simply prepares the proper context
19869               --  for the general pragma processing mechanism below.
19870
19871               if Nkind (Context) = N_Compilation_Unit_Aux then
19872                  Context := Unit (Parent (Context));
19873
19874                  if Nkind_In (Context, N_Package_Declaration,
19875                                        N_Subprogram_Declaration)
19876                  then
19877                     Context := Specification (Context);
19878                  end if;
19879               end if;
19880
19881               --  The pragma is at the top level of a package spec
19882
19883               --    package P is
19884               --       pragma SPARK_Mode;
19885
19886               --      or
19887
19888               --    package P is
19889               --      ...
19890               --    private
19891               --      pragma SPARK_Mode;
19892
19893               if Nkind (Context) = N_Package_Specification then
19894                  Spec_Id := Defining_Entity (Context);
19895
19896                  --  Pragma applies to private part
19897
19898                  if List_Containing (N) = Private_Declarations (Context) then
19899                     Check_Library_Level_Entity (Spec_Id);
19900                     Check_Pragma_Conformance
19901                       (Context_Pragma => Empty,
19902                        Entity_Pragma  => SPARK_Pragma (Spec_Id),
19903                        Entity         => Spec_Id);
19904                     SPARK_Mode_Pragma := N;
19905                     SPARK_Mode := Mode_Id;
19906
19907                     Set_SPARK_Aux_Pragma           (Spec_Id, N);
19908                     Set_SPARK_Aux_Pragma_Inherited (Spec_Id, False);
19909
19910                  --  Pragma applies to public part
19911
19912                  else
19913                     Check_Library_Level_Entity (Spec_Id);
19914                     Check_Pragma_Conformance
19915                       (Context_Pragma => SPARK_Pragma (Spec_Id),
19916                        Entity_Pragma  => Empty,
19917                        Entity         => Empty);
19918                     SPARK_Mode_Pragma := N;
19919                     SPARK_Mode := Mode_Id;
19920
19921                     Set_SPARK_Pragma               (Spec_Id, N);
19922                     Set_SPARK_Pragma_Inherited     (Spec_Id, False);
19923                     Set_SPARK_Aux_Pragma           (Spec_Id, N);
19924                     Set_SPARK_Aux_Pragma_Inherited (Spec_Id, True);
19925                  end if;
19926
19927               --  The pragma appears as an aspect on a subprogram.
19928
19929               --    function F ... with SPARK_Mode => ...;
19930
19931               elsif Nkind_In (Context, N_Function_Specification,
19932                                        N_Procedure_Specification)
19933               then
19934                  Spec_Id := Defining_Entity (Context);
19935                  Check_Library_Level_Entity (Spec_Id);
19936                  Check_Pragma_Conformance
19937                    (Context_Pragma => SPARK_Pragma (Spec_Id),
19938                     Entity_Pragma  => Empty,
19939                     Entity         => Empty);
19940                  Set_SPARK_Pragma           (Spec_Id, N);
19941                  Set_SPARK_Pragma_Inherited (Spec_Id, False);
19942
19943               --  Pragma is immediately within a package body
19944
19945               --    package body P is
19946               --       pragma SPARK_Mode;
19947
19948               elsif Nkind (Context) = N_Package_Body then
19949                  Spec_Id := Corresponding_Spec (Context);
19950                  Body_Id := Defining_Entity (Context);
19951                  Check_Library_Level_Entity (Body_Id);
19952                  Check_Pragma_Conformance
19953                    (Context_Pragma => SPARK_Pragma (Body_Id),
19954                     Entity_Pragma  => SPARK_Aux_Pragma (Spec_Id),
19955                     Entity         => Spec_Id);
19956                  SPARK_Mode_Pragma := N;
19957                  SPARK_Mode := Mode_Id;
19958
19959                  Set_SPARK_Pragma               (Body_Id, N);
19960                  Set_SPARK_Pragma_Inherited     (Body_Id, False);
19961                  Set_SPARK_Aux_Pragma           (Body_Id, N);
19962                  Set_SPARK_Aux_Pragma_Inherited (Body_Id, True);
19963
19964               --  Pragma is immediately within a subprogram body
19965
19966               --    function F ... is
19967               --       pragma SPARK_Mode;
19968
19969               elsif Nkind (Context) = N_Subprogram_Body then
19970                  Spec_Id := Corresponding_Spec (Context);
19971                  Context := Specification (Context);
19972                  Body_Id := Defining_Entity (Context);
19973                  Check_Library_Level_Entity (Body_Id);
19974
19975                  if Present (Spec_Id) then
19976                     Check_Pragma_Conformance
19977                       (Context_Pragma => SPARK_Pragma (Body_Id),
19978                        Entity_Pragma  => SPARK_Pragma (Spec_Id),
19979                        Entity         => Spec_Id);
19980                  else
19981                     Check_Pragma_Conformance
19982                       (Context_Pragma => SPARK_Pragma (Body_Id),
19983                        Entity_Pragma  => Empty,
19984                        Entity         => Empty);
19985                  end if;
19986
19987                  SPARK_Mode_Pragma := N;
19988                  SPARK_Mode := Mode_Id;
19989
19990                  Set_SPARK_Pragma           (Body_Id, N);
19991                  Set_SPARK_Pragma_Inherited (Body_Id, False);
19992
19993               --  The pragma applies to the statements of a package body
19994
19995               --    package body P is
19996               --    begin
19997               --       pragma SPARK_Mode;
19998
19999               elsif Nkind (Context) = N_Handled_Sequence_Of_Statements
20000                 and then Nkind (Parent (Context)) = N_Package_Body
20001               then
20002                  Context := Parent (Context);
20003                  Spec_Id := Corresponding_Spec (Context);
20004                  Body_Id := Defining_Entity (Context);
20005                  Check_Library_Level_Entity (Body_Id);
20006                  Check_Pragma_Conformance
20007                    (Context_Pragma => Empty,
20008                     Entity_Pragma  => SPARK_Pragma (Body_Id),
20009                     Entity         => Body_Id);
20010                  SPARK_Mode_Pragma := N;
20011                  SPARK_Mode := Mode_Id;
20012
20013                  Set_SPARK_Aux_Pragma           (Body_Id, N);
20014                  Set_SPARK_Aux_Pragma_Inherited (Body_Id, False);
20015
20016               --  The pragma does not apply to a legal construct, issue error
20017
20018               else
20019                  Pragma_Misplaced;
20020               end if;
20021            end if;
20022         end Do_SPARK_Mode;
20023
20024         --------------------------------
20025         -- Static_Elaboration_Desired --
20026         --------------------------------
20027
20028         --  pragma Static_Elaboration_Desired (DIRECT_NAME);
20029
20030         when Pragma_Static_Elaboration_Desired =>
20031            GNAT_Pragma;
20032            Check_At_Most_N_Arguments (1);
20033
20034            if Is_Compilation_Unit (Current_Scope)
20035              and then Ekind (Current_Scope) = E_Package
20036            then
20037               Set_Static_Elaboration_Desired (Current_Scope, True);
20038            else
20039               Error_Pragma ("pragma% must apply to a library-level package");
20040            end if;
20041
20042         ------------------
20043         -- Storage_Size --
20044         ------------------
20045
20046         --  pragma Storage_Size (EXPRESSION);
20047
20048         when Pragma_Storage_Size => Storage_Size : declare
20049            P   : constant Node_Id := Parent (N);
20050            Arg : Node_Id;
20051
20052         begin
20053            Check_No_Identifiers;
20054            Check_Arg_Count (1);
20055
20056            --  The expression must be analyzed in the special manner described
20057            --  in "Handling of Default Expressions" in sem.ads.
20058
20059            Arg := Get_Pragma_Arg (Arg1);
20060            Preanalyze_Spec_Expression (Arg, Any_Integer);
20061
20062            if not Is_Static_Expression (Arg) then
20063               Check_Restriction (Static_Storage_Size, Arg);
20064            end if;
20065
20066            if Nkind (P) /= N_Task_Definition then
20067               Pragma_Misplaced;
20068               return;
20069
20070            else
20071               if Has_Storage_Size_Pragma (P) then
20072                  Error_Pragma ("duplicate pragma% not allowed");
20073               else
20074                  Set_Has_Storage_Size_Pragma (P, True);
20075               end if;
20076
20077               Record_Rep_Item (Defining_Identifier (Parent (P)), N);
20078            end if;
20079         end Storage_Size;
20080
20081         ------------------
20082         -- Storage_Unit --
20083         ------------------
20084
20085         --  pragma Storage_Unit (NUMERIC_LITERAL);
20086
20087         --  Only permitted argument is System'Storage_Unit value
20088
20089         when Pragma_Storage_Unit =>
20090            Check_No_Identifiers;
20091            Check_Arg_Count (1);
20092            Check_Arg_Is_Integer_Literal (Arg1);
20093
20094            if Intval (Get_Pragma_Arg (Arg1)) /=
20095              UI_From_Int (Ttypes.System_Storage_Unit)
20096            then
20097               Error_Msg_Uint_1 := UI_From_Int (Ttypes.System_Storage_Unit);
20098               Error_Pragma_Arg
20099                 ("the only allowed argument for pragma% is ^", Arg1);
20100            end if;
20101
20102         --------------------
20103         -- Stream_Convert --
20104         --------------------
20105
20106         --  pragma Stream_Convert (
20107         --    [Entity =>] type_LOCAL_NAME,
20108         --    [Read   =>] function_NAME,
20109         --    [Write  =>] function NAME);
20110
20111         when Pragma_Stream_Convert => Stream_Convert : declare
20112
20113            procedure Check_OK_Stream_Convert_Function (Arg : Node_Id);
20114            --  Check that the given argument is the name of a local function
20115            --  of one argument that is not overloaded earlier in the current
20116            --  local scope. A check is also made that the argument is a
20117            --  function with one parameter.
20118
20119            --------------------------------------
20120            -- Check_OK_Stream_Convert_Function --
20121            --------------------------------------
20122
20123            procedure Check_OK_Stream_Convert_Function (Arg : Node_Id) is
20124               Ent : Entity_Id;
20125
20126            begin
20127               Check_Arg_Is_Local_Name (Arg);
20128               Ent := Entity (Get_Pragma_Arg (Arg));
20129
20130               if Has_Homonym (Ent) then
20131                  Error_Pragma_Arg
20132                    ("argument for pragma% may not be overloaded", Arg);
20133               end if;
20134
20135               if Ekind (Ent) /= E_Function
20136                 or else No (First_Formal (Ent))
20137                 or else Present (Next_Formal (First_Formal (Ent)))
20138               then
20139                  Error_Pragma_Arg
20140                    ("argument for pragma% must be function of one argument",
20141                     Arg);
20142               end if;
20143            end Check_OK_Stream_Convert_Function;
20144
20145         --  Start of processing for Stream_Convert
20146
20147         begin
20148            GNAT_Pragma;
20149            Check_Arg_Order ((Name_Entity, Name_Read, Name_Write));
20150            Check_Arg_Count (3);
20151            Check_Optional_Identifier (Arg1, Name_Entity);
20152            Check_Optional_Identifier (Arg2, Name_Read);
20153            Check_Optional_Identifier (Arg3, Name_Write);
20154            Check_Arg_Is_Local_Name (Arg1);
20155            Check_OK_Stream_Convert_Function (Arg2);
20156            Check_OK_Stream_Convert_Function (Arg3);
20157
20158            declare
20159               Typ   : constant Entity_Id :=
20160                         Underlying_Type (Entity (Get_Pragma_Arg (Arg1)));
20161               Read  : constant Entity_Id := Entity (Get_Pragma_Arg (Arg2));
20162               Write : constant Entity_Id := Entity (Get_Pragma_Arg (Arg3));
20163
20164            begin
20165               Check_First_Subtype (Arg1);
20166
20167               --  Check for too early or too late. Note that we don't enforce
20168               --  the rule about primitive operations in this case, since, as
20169               --  is the case for explicit stream attributes themselves, these
20170               --  restrictions are not appropriate. Note that the chaining of
20171               --  the pragma by Rep_Item_Too_Late is actually the critical
20172               --  processing done for this pragma.
20173
20174               if Rep_Item_Too_Early (Typ, N)
20175                    or else
20176                  Rep_Item_Too_Late (Typ, N, FOnly => True)
20177               then
20178                  return;
20179               end if;
20180
20181               --  Return if previous error
20182
20183               if Etype (Typ) = Any_Type
20184                    or else
20185                  Etype (Read) = Any_Type
20186                    or else
20187                  Etype (Write) = Any_Type
20188               then
20189                  return;
20190               end if;
20191
20192               --  Error checks
20193
20194               if Underlying_Type (Etype (Read)) /= Typ then
20195                  Error_Pragma_Arg
20196                    ("incorrect return type for function&", Arg2);
20197               end if;
20198
20199               if Underlying_Type (Etype (First_Formal (Write))) /= Typ then
20200                  Error_Pragma_Arg
20201                    ("incorrect parameter type for function&", Arg3);
20202               end if;
20203
20204               if Underlying_Type (Etype (First_Formal (Read))) /=
20205                  Underlying_Type (Etype (Write))
20206               then
20207                  Error_Pragma_Arg
20208                    ("result type of & does not match Read parameter type",
20209                     Arg3);
20210               end if;
20211            end;
20212         end Stream_Convert;
20213
20214         ------------------
20215         -- Style_Checks --
20216         ------------------
20217
20218         --  pragma Style_Checks (On | Off | ALL_CHECKS | STRING_LITERAL);
20219
20220         --  This is processed by the parser since some of the style checks
20221         --  take place during source scanning and parsing. This means that
20222         --  we don't need to issue error messages here.
20223
20224         when Pragma_Style_Checks => Style_Checks : declare
20225            A  : constant Node_Id   := Get_Pragma_Arg (Arg1);
20226            S  : String_Id;
20227            C  : Char_Code;
20228
20229         begin
20230            GNAT_Pragma;
20231            Check_No_Identifiers;
20232
20233            --  Two argument form
20234
20235            if Arg_Count = 2 then
20236               Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
20237
20238               declare
20239                  E_Id : Node_Id;
20240                  E    : Entity_Id;
20241
20242               begin
20243                  E_Id := Get_Pragma_Arg (Arg2);
20244                  Analyze (E_Id);
20245
20246                  if not Is_Entity_Name (E_Id) then
20247                     Error_Pragma_Arg
20248                       ("second argument of pragma% must be entity name",
20249                        Arg2);
20250                  end if;
20251
20252                  E := Entity (E_Id);
20253
20254                  if not Ignore_Style_Checks_Pragmas then
20255                     if E = Any_Id then
20256                        return;
20257                     else
20258                        loop
20259                           Set_Suppress_Style_Checks
20260                             (E, Chars (Get_Pragma_Arg (Arg1)) = Name_Off);
20261                           exit when No (Homonym (E));
20262                           E := Homonym (E);
20263                        end loop;
20264                     end if;
20265                  end if;
20266               end;
20267
20268            --  One argument form
20269
20270            else
20271               Check_Arg_Count (1);
20272
20273               if Nkind (A) = N_String_Literal then
20274                  S   := Strval (A);
20275
20276                  declare
20277                     Slen    : constant Natural := Natural (String_Length (S));
20278                     Options : String (1 .. Slen);
20279                     J       : Natural;
20280
20281                  begin
20282                     J := 1;
20283                     loop
20284                        C := Get_String_Char (S, Int (J));
20285                        exit when not In_Character_Range (C);
20286                        Options (J) := Get_Character (C);
20287
20288                        --  If at end of string, set options. As per discussion
20289                        --  above, no need to check for errors, since we issued
20290                        --  them in the parser.
20291
20292                        if J = Slen then
20293                           if not Ignore_Style_Checks_Pragmas then
20294                              Set_Style_Check_Options (Options);
20295                           end if;
20296
20297                           exit;
20298                        end if;
20299
20300                        J := J + 1;
20301                     end loop;
20302                  end;
20303
20304               elsif Nkind (A) = N_Identifier then
20305                  if Chars (A) = Name_All_Checks then
20306                     if not Ignore_Style_Checks_Pragmas then
20307                        if GNAT_Mode then
20308                           Set_GNAT_Style_Check_Options;
20309                        else
20310                           Set_Default_Style_Check_Options;
20311                        end if;
20312                     end if;
20313
20314                  elsif Chars (A) = Name_On then
20315                     if not Ignore_Style_Checks_Pragmas then
20316                        Style_Check := True;
20317                     end if;
20318
20319                  elsif Chars (A) = Name_Off then
20320                     if not Ignore_Style_Checks_Pragmas then
20321                        Style_Check := False;
20322                     end if;
20323                  end if;
20324               end if;
20325            end if;
20326         end Style_Checks;
20327
20328         --------------
20329         -- Subtitle --
20330         --------------
20331
20332         --  pragma Subtitle ([Subtitle =>] STRING_LITERAL);
20333
20334         when Pragma_Subtitle =>
20335            GNAT_Pragma;
20336            Check_Arg_Count (1);
20337            Check_Optional_Identifier (Arg1, Name_Subtitle);
20338            Check_Arg_Is_Static_Expression (Arg1, Standard_String);
20339            Store_Note (N);
20340
20341         --------------
20342         -- Suppress --
20343         --------------
20344
20345         --  pragma Suppress (IDENTIFIER [, [On =>] NAME]);
20346
20347         when Pragma_Suppress =>
20348            Process_Suppress_Unsuppress (True);
20349
20350         ------------------
20351         -- Suppress_All --
20352         ------------------
20353
20354         --  pragma Suppress_All;
20355
20356         --  The only check made here is that the pragma has no arguments.
20357         --  There are no placement rules, and the processing required (setting
20358         --  the Has_Pragma_Suppress_All flag in the compilation unit node was
20359         --  taken care of by the parser). Process_Compilation_Unit_Pragmas
20360         --  then creates and inserts a pragma Suppress (All_Checks).
20361
20362         when Pragma_Suppress_All =>
20363            GNAT_Pragma;
20364            Check_Arg_Count (0);
20365
20366         -------------------------
20367         -- Suppress_Debug_Info --
20368         -------------------------
20369
20370         --  pragma Suppress_Debug_Info ([Entity =>] LOCAL_NAME);
20371
20372         when Pragma_Suppress_Debug_Info =>
20373            GNAT_Pragma;
20374            Check_Arg_Count (1);
20375            Check_Optional_Identifier (Arg1, Name_Entity);
20376            Check_Arg_Is_Local_Name (Arg1);
20377            Set_Debug_Info_Off (Entity (Get_Pragma_Arg (Arg1)));
20378
20379         ----------------------------------
20380         -- Suppress_Exception_Locations --
20381         ----------------------------------
20382
20383         --  pragma Suppress_Exception_Locations;
20384
20385         when Pragma_Suppress_Exception_Locations =>
20386            GNAT_Pragma;
20387            Check_Arg_Count (0);
20388            Check_Valid_Configuration_Pragma;
20389            Exception_Locations_Suppressed := True;
20390
20391         -----------------------------
20392         -- Suppress_Initialization --
20393         -----------------------------
20394
20395         --  pragma Suppress_Initialization ([Entity =>] type_Name);
20396
20397         when Pragma_Suppress_Initialization => Suppress_Init : declare
20398            E_Id : Node_Id;
20399            E    : Entity_Id;
20400
20401         begin
20402            GNAT_Pragma;
20403            Check_Arg_Count (1);
20404            Check_Optional_Identifier (Arg1, Name_Entity);
20405            Check_Arg_Is_Local_Name (Arg1);
20406
20407            E_Id := Get_Pragma_Arg (Arg1);
20408
20409            if Etype (E_Id) = Any_Type then
20410               return;
20411            end if;
20412
20413            E := Entity (E_Id);
20414
20415            if not Is_Type (E) then
20416               Error_Pragma_Arg ("pragma% requires type or subtype", Arg1);
20417            end if;
20418
20419            if Rep_Item_Too_Early (E, N)
20420                 or else
20421               Rep_Item_Too_Late (E, N, FOnly => True)
20422            then
20423               return;
20424            end if;
20425
20426            --  For incomplete/private type, set flag on full view
20427
20428            if Is_Incomplete_Or_Private_Type (E) then
20429               if No (Full_View (Base_Type (E))) then
20430                  Error_Pragma_Arg
20431                    ("argument of pragma% cannot be an incomplete type", Arg1);
20432               else
20433                  Set_Suppress_Initialization (Full_View (Base_Type (E)));
20434               end if;
20435
20436            --  For first subtype, set flag on base type
20437
20438            elsif Is_First_Subtype (E) then
20439               Set_Suppress_Initialization (Base_Type (E));
20440
20441            --  For other than first subtype, set flag on subtype itself
20442
20443            else
20444               Set_Suppress_Initialization (E);
20445            end if;
20446         end Suppress_Init;
20447
20448         -----------------
20449         -- System_Name --
20450         -----------------
20451
20452         --  pragma System_Name (DIRECT_NAME);
20453
20454         --  Syntax check: one argument, which must be the identifier GNAT or
20455         --  the identifier GCC, no other identifiers are acceptable.
20456
20457         when Pragma_System_Name =>
20458            GNAT_Pragma;
20459            Check_No_Identifiers;
20460            Check_Arg_Count (1);
20461            Check_Arg_Is_One_Of (Arg1, Name_Gcc, Name_Gnat);
20462
20463         -----------------------------
20464         -- Task_Dispatching_Policy --
20465         -----------------------------
20466
20467         --  pragma Task_Dispatching_Policy (policy_IDENTIFIER);
20468
20469         when Pragma_Task_Dispatching_Policy => declare
20470            DP : Character;
20471
20472         begin
20473            Check_Ada_83_Warning;
20474            Check_Arg_Count (1);
20475            Check_No_Identifiers;
20476            Check_Arg_Is_Task_Dispatching_Policy (Arg1);
20477            Check_Valid_Configuration_Pragma;
20478            Get_Name_String (Chars (Get_Pragma_Arg (Arg1)));
20479            DP := Fold_Upper (Name_Buffer (1));
20480
20481            if Task_Dispatching_Policy /= ' '
20482              and then Task_Dispatching_Policy /= DP
20483            then
20484               Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
20485               Error_Pragma
20486                 ("task dispatching policy incompatible with policy#");
20487
20488            --  Set new policy, but always preserve System_Location since we
20489            --  like the error message with the run time name.
20490
20491            else
20492               Task_Dispatching_Policy := DP;
20493
20494               if Task_Dispatching_Policy_Sloc /= System_Location then
20495                  Task_Dispatching_Policy_Sloc := Loc;
20496               end if;
20497            end if;
20498         end;
20499
20500         ---------------
20501         -- Task_Info --
20502         ---------------
20503
20504         --  pragma Task_Info (EXPRESSION);
20505
20506         when Pragma_Task_Info => Task_Info : declare
20507            P   : constant Node_Id := Parent (N);
20508            Ent : Entity_Id;
20509
20510         begin
20511            GNAT_Pragma;
20512
20513            if Nkind (P) /= N_Task_Definition then
20514               Error_Pragma ("pragma% must appear in task definition");
20515            end if;
20516
20517            Check_No_Identifiers;
20518            Check_Arg_Count (1);
20519
20520            Analyze_And_Resolve
20521              (Get_Pragma_Arg (Arg1), RTE (RE_Task_Info_Type));
20522
20523            if Etype (Get_Pragma_Arg (Arg1)) = Any_Type then
20524               return;
20525            end if;
20526
20527            Ent := Defining_Identifier (Parent (P));
20528
20529            --  Check duplicate pragma before we chain the pragma in the Rep
20530            --  Item chain of Ent.
20531
20532            if Has_Rep_Pragma
20533                 (Ent, Name_Task_Info, Check_Parents => False)
20534            then
20535               Error_Pragma ("duplicate pragma% not allowed");
20536            end if;
20537
20538            Record_Rep_Item (Ent, N);
20539         end Task_Info;
20540
20541         ---------------
20542         -- Task_Name --
20543         ---------------
20544
20545         --  pragma Task_Name (string_EXPRESSION);
20546
20547         when Pragma_Task_Name => Task_Name : declare
20548            P   : constant Node_Id := Parent (N);
20549            Arg : Node_Id;
20550            Ent : Entity_Id;
20551
20552         begin
20553            Check_No_Identifiers;
20554            Check_Arg_Count (1);
20555
20556            Arg := Get_Pragma_Arg (Arg1);
20557
20558            --  The expression is used in the call to Create_Task, and must be
20559            --  expanded there, not in the context of the current spec. It must
20560            --  however be analyzed to capture global references, in case it
20561            --  appears in a generic context.
20562
20563            Preanalyze_And_Resolve (Arg, Standard_String);
20564
20565            if Nkind (P) /= N_Task_Definition then
20566               Pragma_Misplaced;
20567            end if;
20568
20569            Ent := Defining_Identifier (Parent (P));
20570
20571            --  Check duplicate pragma before we chain the pragma in the Rep
20572            --  Item chain of Ent.
20573
20574            if Has_Rep_Pragma
20575                 (Ent, Name_Task_Name, Check_Parents => False)
20576            then
20577               Error_Pragma ("duplicate pragma% not allowed");
20578            end if;
20579
20580            Record_Rep_Item (Ent, N);
20581         end Task_Name;
20582
20583         ------------------
20584         -- Task_Storage --
20585         ------------------
20586
20587         --  pragma Task_Storage (
20588         --     [Task_Type =>] LOCAL_NAME,
20589         --     [Top_Guard =>] static_integer_EXPRESSION);
20590
20591         when Pragma_Task_Storage => Task_Storage : declare
20592            Args  : Args_List (1 .. 2);
20593            Names : constant Name_List (1 .. 2) := (
20594                      Name_Task_Type,
20595                      Name_Top_Guard);
20596
20597            Task_Type : Node_Id renames Args (1);
20598            Top_Guard : Node_Id renames Args (2);
20599
20600            Ent : Entity_Id;
20601
20602         begin
20603            GNAT_Pragma;
20604            Gather_Associations (Names, Args);
20605
20606            if No (Task_Type) then
20607               Error_Pragma
20608                 ("missing task_type argument for pragma%");
20609            end if;
20610
20611            Check_Arg_Is_Local_Name (Task_Type);
20612
20613            Ent := Entity (Task_Type);
20614
20615            if not Is_Task_Type (Ent) then
20616               Error_Pragma_Arg
20617                 ("argument for pragma% must be task type", Task_Type);
20618            end if;
20619
20620            if No (Top_Guard) then
20621               Error_Pragma_Arg
20622                 ("pragma% takes two arguments", Task_Type);
20623            else
20624               Check_Arg_Is_Static_Expression (Top_Guard, Any_Integer);
20625            end if;
20626
20627            Check_First_Subtype (Task_Type);
20628
20629            if Rep_Item_Too_Late (Ent, N) then
20630               raise Pragma_Exit;
20631            end if;
20632         end Task_Storage;
20633
20634         ---------------
20635         -- Test_Case --
20636         ---------------
20637
20638         --  pragma Test_Case
20639         --    ([Name     =>] Static_String_EXPRESSION
20640         --    ,[Mode     =>] MODE_TYPE
20641         --   [, Requires =>  Boolean_EXPRESSION]
20642         --   [, Ensures  =>  Boolean_EXPRESSION]);
20643
20644         --  MODE_TYPE ::= Nominal | Robustness
20645
20646         when Pragma_Test_Case =>
20647            GNAT_Pragma;
20648            Check_Test_Case;
20649
20650         --------------------------
20651         -- Thread_Local_Storage --
20652         --------------------------
20653
20654         --  pragma Thread_Local_Storage ([Entity =>] LOCAL_NAME);
20655
20656         when Pragma_Thread_Local_Storage => Thread_Local_Storage : declare
20657            Id : Node_Id;
20658            E  : Entity_Id;
20659
20660         begin
20661            GNAT_Pragma;
20662            Check_Arg_Count (1);
20663            Check_Optional_Identifier (Arg1, Name_Entity);
20664            Check_Arg_Is_Library_Level_Local_Name (Arg1);
20665
20666            Id := Get_Pragma_Arg (Arg1);
20667            Analyze (Id);
20668
20669            if not Is_Entity_Name (Id)
20670              or else Ekind (Entity (Id)) /= E_Variable
20671            then
20672               Error_Pragma_Arg ("local variable name required", Arg1);
20673            end if;
20674
20675            E := Entity (Id);
20676
20677            if Rep_Item_Too_Early (E, N)
20678              or else Rep_Item_Too_Late (E, N)
20679            then
20680               raise Pragma_Exit;
20681            end if;
20682
20683            Set_Has_Pragma_Thread_Local_Storage (E);
20684            Set_Has_Gigi_Rep_Item (E);
20685         end Thread_Local_Storage;
20686
20687         ----------------
20688         -- Time_Slice --
20689         ----------------
20690
20691         --  pragma Time_Slice (static_duration_EXPRESSION);
20692
20693         when Pragma_Time_Slice => Time_Slice : declare
20694            Val : Ureal;
20695            Nod : Node_Id;
20696
20697         begin
20698            GNAT_Pragma;
20699            Check_Arg_Count (1);
20700            Check_No_Identifiers;
20701            Check_In_Main_Program;
20702            Check_Arg_Is_Static_Expression (Arg1, Standard_Duration);
20703
20704            if not Error_Posted (Arg1) then
20705               Nod := Next (N);
20706               while Present (Nod) loop
20707                  if Nkind (Nod) = N_Pragma
20708                    and then Pragma_Name (Nod) = Name_Time_Slice
20709                  then
20710                     Error_Msg_Name_1 := Pname;
20711                     Error_Msg_N ("duplicate pragma% not permitted", Nod);
20712                  end if;
20713
20714                  Next (Nod);
20715               end loop;
20716            end if;
20717
20718            --  Process only if in main unit
20719
20720            if Get_Source_Unit (Loc) = Main_Unit then
20721               Opt.Time_Slice_Set := True;
20722               Val := Expr_Value_R (Get_Pragma_Arg (Arg1));
20723
20724               if Val <= Ureal_0 then
20725                  Opt.Time_Slice_Value := 0;
20726
20727               elsif Val > UR_From_Uint (UI_From_Int (1000)) then
20728                  Opt.Time_Slice_Value := 1_000_000_000;
20729
20730               else
20731                  Opt.Time_Slice_Value :=
20732                    UI_To_Int (UR_To_Uint (Val * UI_From_Int (1_000_000)));
20733               end if;
20734            end if;
20735         end Time_Slice;
20736
20737         -----------
20738         -- Title --
20739         -----------
20740
20741         --  pragma Title (TITLING_OPTION [, TITLING OPTION]);
20742
20743         --   TITLING_OPTION ::=
20744         --     [Title =>] STRING_LITERAL
20745         --   | [Subtitle =>] STRING_LITERAL
20746
20747         when Pragma_Title => Title : declare
20748            Args  : Args_List (1 .. 2);
20749            Names : constant Name_List (1 .. 2) := (
20750                      Name_Title,
20751                      Name_Subtitle);
20752
20753         begin
20754            GNAT_Pragma;
20755            Gather_Associations (Names, Args);
20756            Store_Note (N);
20757
20758            for J in 1 .. 2 loop
20759               if Present (Args (J)) then
20760                  Check_Arg_Is_Static_Expression (Args (J), Standard_String);
20761               end if;
20762            end loop;
20763         end Title;
20764
20765         ----------------------------
20766         -- Type_Invariant[_Class] --
20767         ----------------------------
20768
20769         --  pragma Type_Invariant[_Class]
20770         --    ([Entity =>] type_LOCAL_NAME,
20771         --     [Check  =>] EXPRESSION);
20772
20773         when Pragma_Type_Invariant       |
20774              Pragma_Type_Invariant_Class =>
20775         Type_Invariant : declare
20776            I_Pragma : Node_Id;
20777
20778         begin
20779            Check_Arg_Count (2);
20780
20781            --  Rewrite Type_Invariant[_Class] pragma as an Invariant pragma,
20782            --  setting Class_Present for the Type_Invariant_Class case.
20783
20784            Set_Class_Present (N, Prag_Id = Pragma_Type_Invariant_Class);
20785            I_Pragma := New_Copy (N);
20786            Set_Pragma_Identifier
20787              (I_Pragma, Make_Identifier (Loc, Name_Invariant));
20788            Rewrite (N, I_Pragma);
20789            Set_Analyzed (N, False);
20790            Analyze (N);
20791         end Type_Invariant;
20792
20793         ---------------------
20794         -- Unchecked_Union --
20795         ---------------------
20796
20797         --  pragma Unchecked_Union (first_subtype_LOCAL_NAME)
20798
20799         when Pragma_Unchecked_Union => Unchecked_Union : declare
20800            Assoc   : constant Node_Id := Arg1;
20801            Type_Id : constant Node_Id := Get_Pragma_Arg (Assoc);
20802            Typ     : Entity_Id;
20803            Tdef    : Node_Id;
20804            Clist   : Node_Id;
20805            Vpart   : Node_Id;
20806            Comp    : Node_Id;
20807            Variant : Node_Id;
20808
20809         begin
20810            Ada_2005_Pragma;
20811            Check_No_Identifiers;
20812            Check_Arg_Count (1);
20813            Check_Arg_Is_Local_Name (Arg1);
20814
20815            Find_Type (Type_Id);
20816
20817            Typ := Entity (Type_Id);
20818
20819            if Typ = Any_Type
20820              or else Rep_Item_Too_Early (Typ, N)
20821            then
20822               return;
20823            else
20824               Typ := Underlying_Type (Typ);
20825            end if;
20826
20827            if Rep_Item_Too_Late (Typ, N) then
20828               return;
20829            end if;
20830
20831            Check_First_Subtype (Arg1);
20832
20833            --  Note remaining cases are references to a type in the current
20834            --  declarative part. If we find an error, we post the error on
20835            --  the relevant type declaration at an appropriate point.
20836
20837            if not Is_Record_Type (Typ) then
20838               Error_Msg_N ("unchecked union must be record type", Typ);
20839               return;
20840
20841            elsif Is_Tagged_Type (Typ) then
20842               Error_Msg_N ("unchecked union must not be tagged", Typ);
20843               return;
20844
20845            elsif not Has_Discriminants (Typ) then
20846               Error_Msg_N
20847                ("unchecked union must have one discriminant", Typ);
20848               return;
20849
20850            --  Note: in previous versions of GNAT we used to check for limited
20851            --  types and give an error, but in fact the standard does allow
20852            --  Unchecked_Union on limited types, so this check was removed.
20853
20854            --  Similarly, GNAT used to require that all discriminants have
20855            --  default values, but this is not mandated by the RM.
20856
20857            --  Proceed with basic error checks completed
20858
20859            else
20860               Tdef  := Type_Definition (Declaration_Node (Typ));
20861               Clist := Component_List (Tdef);
20862
20863               --  Check presence of component list and variant part
20864
20865               if No (Clist) or else No (Variant_Part (Clist)) then
20866                  Error_Msg_N
20867                    ("unchecked union must have variant part", Tdef);
20868                  return;
20869               end if;
20870
20871               --  Check components
20872
20873               Comp := First (Component_Items (Clist));
20874               while Present (Comp) loop
20875                  Check_Component (Comp, Typ);
20876                  Next (Comp);
20877               end loop;
20878
20879               --  Check variant part
20880
20881               Vpart := Variant_Part (Clist);
20882
20883               Variant := First (Variants (Vpart));
20884               while Present (Variant) loop
20885                  Check_Variant (Variant, Typ);
20886                  Next (Variant);
20887               end loop;
20888            end if;
20889
20890            Set_Is_Unchecked_Union  (Typ);
20891            Set_Convention (Typ, Convention_C);
20892            Set_Has_Unchecked_Union (Base_Type (Typ));
20893            Set_Is_Unchecked_Union  (Base_Type (Typ));
20894         end Unchecked_Union;
20895
20896         ------------------------
20897         -- Unimplemented_Unit --
20898         ------------------------
20899
20900         --  pragma Unimplemented_Unit;
20901
20902         --  Note: this only gives an error if we are generating code, or if
20903         --  we are in a generic library unit (where the pragma appears in the
20904         --  body, not in the spec).
20905
20906         when Pragma_Unimplemented_Unit => Unimplemented_Unit : declare
20907            Cunitent : constant Entity_Id :=
20908                         Cunit_Entity (Get_Source_Unit (Loc));
20909            Ent_Kind : constant Entity_Kind :=
20910                         Ekind (Cunitent);
20911
20912         begin
20913            GNAT_Pragma;
20914            Check_Arg_Count (0);
20915
20916            if Operating_Mode = Generate_Code
20917              or else Ent_Kind = E_Generic_Function
20918              or else Ent_Kind = E_Generic_Procedure
20919              or else Ent_Kind = E_Generic_Package
20920            then
20921               Get_Name_String (Chars (Cunitent));
20922               Set_Casing (Mixed_Case);
20923               Write_Str (Name_Buffer (1 .. Name_Len));
20924               Write_Str (" is not supported in this configuration");
20925               Write_Eol;
20926               raise Unrecoverable_Error;
20927            end if;
20928         end Unimplemented_Unit;
20929
20930         ------------------------
20931         -- Universal_Aliasing --
20932         ------------------------
20933
20934         --  pragma Universal_Aliasing [([Entity =>] type_LOCAL_NAME)];
20935
20936         when Pragma_Universal_Aliasing => Universal_Alias : declare
20937            E_Id : Entity_Id;
20938
20939         begin
20940            GNAT_Pragma;
20941            Check_Arg_Count (1);
20942            Check_Optional_Identifier (Arg2, Name_Entity);
20943            Check_Arg_Is_Local_Name (Arg1);
20944            E_Id := Entity (Get_Pragma_Arg (Arg1));
20945
20946            if E_Id = Any_Type then
20947               return;
20948            elsif No (E_Id) or else not Is_Type (E_Id) then
20949               Error_Pragma_Arg ("pragma% requires type", Arg1);
20950            end if;
20951
20952            Set_Universal_Aliasing (Implementation_Base_Type (E_Id));
20953            Record_Rep_Item (E_Id, N);
20954         end Universal_Alias;
20955
20956         --------------------
20957         -- Universal_Data --
20958         --------------------
20959
20960         --  pragma Universal_Data [(library_unit_NAME)];
20961
20962         when Pragma_Universal_Data =>
20963            GNAT_Pragma;
20964
20965            --  If this is a configuration pragma, then set the universal
20966            --  addressing option, otherwise confirm that the pragma satisfies
20967            --  the requirements of library unit pragma placement and leave it
20968            --  to the GNAAMP back end to detect the pragma (avoids transitive
20969            --  setting of the option due to withed units).
20970
20971            if Is_Configuration_Pragma then
20972               Universal_Addressing_On_AAMP := True;
20973            else
20974               Check_Valid_Library_Unit_Pragma;
20975            end if;
20976
20977            if not AAMP_On_Target then
20978               Error_Pragma ("??pragma% ignored (applies only to AAMP)");
20979            end if;
20980
20981         ----------------
20982         -- Unmodified --
20983         ----------------
20984
20985         --  pragma Unmodified (local_Name {, local_Name});
20986
20987         when Pragma_Unmodified => Unmodified : declare
20988            Arg_Node : Node_Id;
20989            Arg_Expr : Node_Id;
20990            Arg_Ent  : Entity_Id;
20991
20992         begin
20993            GNAT_Pragma;
20994            Check_At_Least_N_Arguments (1);
20995
20996            --  Loop through arguments
20997
20998            Arg_Node := Arg1;
20999            while Present (Arg_Node) loop
21000               Check_No_Identifier (Arg_Node);
21001
21002               --  Note: the analyze call done by Check_Arg_Is_Local_Name will
21003               --  in fact generate reference, so that the entity will have a
21004               --  reference, which will inhibit any warnings about it not
21005               --  being referenced, and also properly show up in the ali file
21006               --  as a reference. But this reference is recorded before the
21007               --  Has_Pragma_Unreferenced flag is set, so that no warning is
21008               --  generated for this reference.
21009
21010               Check_Arg_Is_Local_Name (Arg_Node);
21011               Arg_Expr := Get_Pragma_Arg (Arg_Node);
21012
21013               if Is_Entity_Name (Arg_Expr) then
21014                  Arg_Ent := Entity (Arg_Expr);
21015
21016                  if not Is_Assignable (Arg_Ent) then
21017                     Error_Pragma_Arg
21018                       ("pragma% can only be applied to a variable",
21019                        Arg_Expr);
21020                  else
21021                     Set_Has_Pragma_Unmodified (Arg_Ent);
21022                  end if;
21023               end if;
21024
21025               Next (Arg_Node);
21026            end loop;
21027         end Unmodified;
21028
21029         ------------------
21030         -- Unreferenced --
21031         ------------------
21032
21033         --  pragma Unreferenced (local_Name {, local_Name});
21034
21035         --    or when used in a context clause:
21036
21037         --  pragma Unreferenced (library_unit_NAME {, library_unit_NAME}
21038
21039         when Pragma_Unreferenced => Unreferenced : declare
21040            Arg_Node : Node_Id;
21041            Arg_Expr : Node_Id;
21042            Arg_Ent  : Entity_Id;
21043            Citem    : Node_Id;
21044
21045         begin
21046            GNAT_Pragma;
21047            Check_At_Least_N_Arguments (1);
21048
21049            --  Check case of appearing within context clause
21050
21051            if Is_In_Context_Clause then
21052
21053               --  The arguments must all be units mentioned in a with clause
21054               --  in the same context clause. Note we already checked (in
21055               --  Par.Prag) that the arguments are either identifiers or
21056               --  selected components.
21057
21058               Arg_Node := Arg1;
21059               while Present (Arg_Node) loop
21060                  Citem := First (List_Containing (N));
21061                  while Citem /= N loop
21062                     if Nkind (Citem) = N_With_Clause
21063                       and then
21064                         Same_Name (Name (Citem), Get_Pragma_Arg (Arg_Node))
21065                     then
21066                        Set_Has_Pragma_Unreferenced
21067                          (Cunit_Entity
21068                             (Get_Source_Unit
21069                                (Library_Unit (Citem))));
21070                        Set_Unit_Name
21071                          (Get_Pragma_Arg (Arg_Node), Name (Citem));
21072                        exit;
21073                     end if;
21074
21075                     Next (Citem);
21076                  end loop;
21077
21078                  if Citem = N then
21079                     Error_Pragma_Arg
21080                       ("argument of pragma% is not withed unit", Arg_Node);
21081                  end if;
21082
21083                  Next (Arg_Node);
21084               end loop;
21085
21086            --  Case of not in list of context items
21087
21088            else
21089               Arg_Node := Arg1;
21090               while Present (Arg_Node) loop
21091                  Check_No_Identifier (Arg_Node);
21092
21093                  --  Note: the analyze call done by Check_Arg_Is_Local_Name
21094                  --  will in fact generate reference, so that the entity will
21095                  --  have a reference, which will inhibit any warnings about
21096                  --  it not being referenced, and also properly show up in the
21097                  --  ali file as a reference. But this reference is recorded
21098                  --  before the Has_Pragma_Unreferenced flag is set, so that
21099                  --  no warning is generated for this reference.
21100
21101                  Check_Arg_Is_Local_Name (Arg_Node);
21102                  Arg_Expr := Get_Pragma_Arg (Arg_Node);
21103
21104                  if Is_Entity_Name (Arg_Expr) then
21105                     Arg_Ent := Entity (Arg_Expr);
21106
21107                     --  If the entity is overloaded, the pragma applies to the
21108                     --  most recent overloading, as documented. In this case,
21109                     --  name resolution does not generate a reference, so it
21110                     --  must be done here explicitly.
21111
21112                     if Is_Overloaded (Arg_Expr) then
21113                        Generate_Reference (Arg_Ent, N);
21114                     end if;
21115
21116                     Set_Has_Pragma_Unreferenced (Arg_Ent);
21117                  end if;
21118
21119                  Next (Arg_Node);
21120               end loop;
21121            end if;
21122         end Unreferenced;
21123
21124         --------------------------
21125         -- Unreferenced_Objects --
21126         --------------------------
21127
21128         --  pragma Unreferenced_Objects (local_Name {, local_Name});
21129
21130         when Pragma_Unreferenced_Objects => Unreferenced_Objects : declare
21131            Arg_Node : Node_Id;
21132            Arg_Expr : Node_Id;
21133
21134         begin
21135            GNAT_Pragma;
21136            Check_At_Least_N_Arguments (1);
21137
21138            Arg_Node := Arg1;
21139            while Present (Arg_Node) loop
21140               Check_No_Identifier (Arg_Node);
21141               Check_Arg_Is_Local_Name (Arg_Node);
21142               Arg_Expr := Get_Pragma_Arg (Arg_Node);
21143
21144               if not Is_Entity_Name (Arg_Expr)
21145                 or else not Is_Type (Entity (Arg_Expr))
21146               then
21147                  Error_Pragma_Arg
21148                    ("argument for pragma% must be type or subtype", Arg_Node);
21149               end if;
21150
21151               Set_Has_Pragma_Unreferenced_Objects (Entity (Arg_Expr));
21152               Next (Arg_Node);
21153            end loop;
21154         end Unreferenced_Objects;
21155
21156         ------------------------------
21157         -- Unreserve_All_Interrupts --
21158         ------------------------------
21159
21160         --  pragma Unreserve_All_Interrupts;
21161
21162         when Pragma_Unreserve_All_Interrupts =>
21163            GNAT_Pragma;
21164            Check_Arg_Count (0);
21165
21166            if In_Extended_Main_Code_Unit (Main_Unit_Entity) then
21167               Unreserve_All_Interrupts := True;
21168            end if;
21169
21170         ----------------
21171         -- Unsuppress --
21172         ----------------
21173
21174         --  pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
21175
21176         when Pragma_Unsuppress =>
21177            Ada_2005_Pragma;
21178            Process_Suppress_Unsuppress (False);
21179
21180         -------------------
21181         -- Use_VADS_Size --
21182         -------------------
21183
21184         --  pragma Use_VADS_Size;
21185
21186         when Pragma_Use_VADS_Size =>
21187            GNAT_Pragma;
21188            Check_Arg_Count (0);
21189            Check_Valid_Configuration_Pragma;
21190            Use_VADS_Size := True;
21191
21192         ---------------------
21193         -- Validity_Checks --
21194         ---------------------
21195
21196         --  pragma Validity_Checks (On | Off | ALL_CHECKS | STRING_LITERAL);
21197
21198         when Pragma_Validity_Checks => Validity_Checks : declare
21199            A  : constant Node_Id := Get_Pragma_Arg (Arg1);
21200            S  : String_Id;
21201            C  : Char_Code;
21202
21203         begin
21204            GNAT_Pragma;
21205            Check_Arg_Count (1);
21206            Check_No_Identifiers;
21207
21208            --  Pragma always active unless in CodePeer or GNATprove modes,
21209            --  which use a fixed configuration of validity checks.
21210
21211            if not (CodePeer_Mode or GNATprove_Mode) then
21212               if Nkind (A) = N_String_Literal then
21213                  S := Strval (A);
21214
21215                  declare
21216                     Slen    : constant Natural := Natural (String_Length (S));
21217                     Options : String (1 .. Slen);
21218                     J       : Natural;
21219
21220                  begin
21221                     --  Couldn't we use a for loop here over Options'Range???
21222
21223                     J := 1;
21224                     loop
21225                        C := Get_String_Char (S, Int (J));
21226
21227                        --  This is a weird test, it skips setting validity
21228                        --  checks entirely if any element of S is out of
21229                        --  range of Character, what is that about ???
21230
21231                        exit when not In_Character_Range (C);
21232                        Options (J) := Get_Character (C);
21233
21234                        if J = Slen then
21235                           Set_Validity_Check_Options (Options);
21236                           exit;
21237                        else
21238                           J := J + 1;
21239                        end if;
21240                     end loop;
21241                  end;
21242
21243               elsif Nkind (A) = N_Identifier then
21244                  if Chars (A) = Name_All_Checks then
21245                     Set_Validity_Check_Options ("a");
21246                  elsif Chars (A) = Name_On then
21247                     Validity_Checks_On := True;
21248                  elsif Chars (A) = Name_Off then
21249                     Validity_Checks_On := False;
21250                  end if;
21251               end if;
21252            end if;
21253         end Validity_Checks;
21254
21255         --------------
21256         -- Volatile --
21257         --------------
21258
21259         --  pragma Volatile (LOCAL_NAME);
21260
21261         when Pragma_Volatile =>
21262            Process_Atomic_Shared_Volatile;
21263
21264         -------------------------
21265         -- Volatile_Components --
21266         -------------------------
21267
21268         --  pragma Volatile_Components (array_LOCAL_NAME);
21269
21270         --  Volatile is handled by the same circuit as Atomic_Components
21271
21272         ----------------------
21273         -- Warning_As_Error --
21274         ----------------------
21275
21276         when Pragma_Warning_As_Error =>
21277            GNAT_Pragma;
21278            Check_Arg_Count (1);
21279            Check_No_Identifiers;
21280            Check_Valid_Configuration_Pragma;
21281
21282            if not Is_Static_String_Expression (Arg1) then
21283               Error_Pragma_Arg
21284                 ("argument of pragma% must be static string expression",
21285                  Arg1);
21286
21287            --  OK static string expression
21288
21289            else
21290               String_To_Name_Buffer
21291                 (Strval (Expr_Value_S (Get_Pragma_Arg (Arg1))));
21292               Warnings_As_Errors_Count := Warnings_As_Errors_Count + 1;
21293               Warnings_As_Errors (Warnings_As_Errors_Count) :=
21294                 new String'(Name_Buffer (1 .. Name_Len));
21295            end if;
21296
21297         --------------
21298         -- Warnings --
21299         --------------
21300
21301         --  pragma Warnings (On | Off [,REASON]);
21302         --  pragma Warnings (On | Off, LOCAL_NAME [,REASON]);
21303         --  pragma Warnings (static_string_EXPRESSION [,REASON]);
21304         --  pragma Warnings (On | Off, STRING_LITERAL [,REASON]);
21305
21306         --  REASON ::= Reason => Static_String_Expression
21307
21308         when Pragma_Warnings => Warnings : declare
21309            Reason : String_Id;
21310
21311         begin
21312            GNAT_Pragma;
21313            Check_At_Least_N_Arguments (1);
21314
21315            --  See if last argument is labeled Reason. If so, make sure we
21316            --  have a static string expression, and acquire the REASON string.
21317            --  Then remove the REASON argument by decreasing Num_Args by one;
21318            --  Remaining processing looks only at first Num_Args arguments).
21319
21320            declare
21321               Last_Arg : constant Node_Id :=
21322                            Last (Pragma_Argument_Associations (N));
21323            begin
21324               if Nkind (Last_Arg) = N_Pragma_Argument_Association
21325                 and then Chars (Last_Arg) = Name_Reason
21326               then
21327                  Start_String;
21328                  Get_Reason_String (Get_Pragma_Arg (Last_Arg));
21329                  Reason := End_String;
21330                  Arg_Count := Arg_Count - 1;
21331
21332                  --  Not allowed in compiler units (bootstrap issues)
21333
21334                  Check_Compiler_Unit (N);
21335
21336               --  No REASON string, set null string as reason
21337
21338               else
21339                  Reason := Null_String_Id;
21340               end if;
21341            end;
21342
21343            --  Now proceed with REASON taken care of and eliminated
21344
21345            Check_No_Identifiers;
21346
21347            --  If debug flag -gnatd.i is set, pragma is ignored
21348
21349            if Debug_Flag_Dot_I then
21350               return;
21351            end if;
21352
21353            --  Process various forms of the pragma
21354
21355            declare
21356               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
21357
21358            begin
21359               --  One argument case
21360
21361               if Arg_Count = 1 then
21362
21363                  --  On/Off one argument case was processed by parser
21364
21365                  if Nkind (Argx) = N_Identifier
21366                    and then Nam_In (Chars (Argx), Name_On, Name_Off)
21367                  then
21368                     null;
21369
21370                  --  One argument case must be ON/OFF or static string expr
21371
21372                  elsif not Is_Static_String_Expression (Arg1) then
21373                     Error_Pragma_Arg
21374                       ("argument of pragma% must be On/Off or static string "
21375                        & "expression", Arg1);
21376
21377                  --  One argument string expression case
21378
21379                  else
21380                     declare
21381                        Lit : constant Node_Id   := Expr_Value_S (Argx);
21382                        Str : constant String_Id := Strval (Lit);
21383                        Len : constant Nat       := String_Length (Str);
21384                        C   : Char_Code;
21385                        J   : Nat;
21386                        OK  : Boolean;
21387                        Chr : Character;
21388
21389                     begin
21390                        J := 1;
21391                        while J <= Len loop
21392                           C := Get_String_Char (Str, J);
21393                           OK := In_Character_Range (C);
21394
21395                           if OK then
21396                              Chr := Get_Character (C);
21397
21398                              --  Dash case: only -Wxxx is accepted
21399
21400                              if J = 1
21401                                and then J < Len
21402                                and then Chr = '-'
21403                              then
21404                                 J := J + 1;
21405                                 C := Get_String_Char (Str, J);
21406                                 Chr := Get_Character (C);
21407                                 exit when Chr = 'W';
21408                                 OK := False;
21409
21410                              --  Dot case
21411
21412                              elsif J < Len and then Chr = '.' then
21413                                 J := J + 1;
21414                                 C := Get_String_Char (Str, J);
21415                                 Chr := Get_Character (C);
21416
21417                                 if not Set_Dot_Warning_Switch (Chr) then
21418                                    Error_Pragma_Arg
21419                                      ("invalid warning switch character "
21420                                       & '.' & Chr, Arg1);
21421                                 end if;
21422
21423                              --  Non-Dot case
21424
21425                              else
21426                                 OK := Set_Warning_Switch (Chr);
21427                              end if;
21428                           end if;
21429
21430                           if not OK then
21431                              Error_Pragma_Arg
21432                                ("invalid warning switch character " & Chr,
21433                                 Arg1);
21434                           end if;
21435
21436                           J := J + 1;
21437                        end loop;
21438                     end;
21439                  end if;
21440
21441               --  Two or more arguments (must be two)
21442
21443               else
21444                  Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
21445                  Check_At_Most_N_Arguments (2);
21446
21447                  declare
21448                     E_Id : Node_Id;
21449                     E    : Entity_Id;
21450                     Err  : Boolean;
21451
21452                  begin
21453                     E_Id := Get_Pragma_Arg (Arg2);
21454                     Analyze (E_Id);
21455
21456                     --  In the expansion of an inlined body, a reference to
21457                     --  the formal may be wrapped in a conversion if the
21458                     --  actual is a conversion. Retrieve the real entity name.
21459
21460                     if (In_Instance_Body or In_Inlined_Body)
21461                       and then Nkind (E_Id) = N_Unchecked_Type_Conversion
21462                     then
21463                        E_Id := Expression (E_Id);
21464                     end if;
21465
21466                     --  Entity name case
21467
21468                     if Is_Entity_Name (E_Id) then
21469                        E := Entity (E_Id);
21470
21471                        if E = Any_Id then
21472                           return;
21473                        else
21474                           loop
21475                              Set_Warnings_Off
21476                                (E, (Chars (Get_Pragma_Arg (Arg1)) =
21477                                      Name_Off));
21478
21479                              --  For OFF case, make entry in warnings off
21480                              --  pragma table for later processing. But we do
21481                              --  not do that within an instance, since these
21482                              --  warnings are about what is needed in the
21483                              --  template, not an instance of it.
21484
21485                              if Chars (Get_Pragma_Arg (Arg1)) = Name_Off
21486                                and then Warn_On_Warnings_Off
21487                                and then not In_Instance
21488                              then
21489                                 Warnings_Off_Pragmas.Append ((N, E, Reason));
21490                              end if;
21491
21492                              if Is_Enumeration_Type (E) then
21493                                 declare
21494                                    Lit : Entity_Id;
21495                                 begin
21496                                    Lit := First_Literal (E);
21497                                    while Present (Lit) loop
21498                                       Set_Warnings_Off (Lit);
21499                                       Next_Literal (Lit);
21500                                    end loop;
21501                                 end;
21502                              end if;
21503
21504                              exit when No (Homonym (E));
21505                              E := Homonym (E);
21506                           end loop;
21507                        end if;
21508
21509                     --  Error if not entity or static string expression case
21510
21511                     elsif not Is_Static_String_Expression (Arg2) then
21512                        Error_Pragma_Arg
21513                          ("second argument of pragma% must be entity name "
21514                           & "or static string expression", Arg2);
21515
21516                     --  Static string expression case
21517
21518                     else
21519                        String_To_Name_Buffer
21520                          (Strval (Expr_Value_S (Get_Pragma_Arg (Arg2))));
21521
21522                        --  Note on configuration pragma case: If this is a
21523                        --  configuration pragma, then for an OFF pragma, we
21524                        --  just set Config True in the call, which is all
21525                        --  that needs to be done. For the case of ON, this
21526                        --  is normally an error, unless it is canceling the
21527                        --  effect of a previous OFF pragma in the same file.
21528                        --  In any other case, an error will be signalled (ON
21529                        --  with no matching OFF).
21530
21531                        --  Note: We set Used if we are inside a generic to
21532                        --  disable the test that the non-config case actually
21533                        --  cancels a warning. That's because we can't be sure
21534                        --  there isn't an instantiation in some other unit
21535                        --  where a warning is suppressed.
21536
21537                        --  We could do a little better here by checking if the
21538                        --  generic unit we are inside is public, but for now
21539                        --  we don't bother with that refinement.
21540
21541                        if Chars (Argx) = Name_Off then
21542                           Set_Specific_Warning_Off
21543                             (Loc, Name_Buffer (1 .. Name_Len), Reason,
21544                              Config => Is_Configuration_Pragma,
21545                              Used   => Inside_A_Generic or else In_Instance);
21546
21547                        elsif Chars (Argx) = Name_On then
21548                           Set_Specific_Warning_On
21549                             (Loc, Name_Buffer (1 .. Name_Len), Err);
21550
21551                           if Err then
21552                              Error_Msg
21553                                ("??pragma Warnings On with no matching "
21554                                 & "Warnings Off", Loc);
21555                           end if;
21556                        end if;
21557                     end if;
21558                  end;
21559               end if;
21560            end;
21561         end Warnings;
21562
21563         -------------------
21564         -- Weak_External --
21565         -------------------
21566
21567         --  pragma Weak_External ([Entity =>] LOCAL_NAME);
21568
21569         when Pragma_Weak_External => Weak_External : declare
21570            Ent : Entity_Id;
21571
21572         begin
21573            GNAT_Pragma;
21574            Check_Arg_Count (1);
21575            Check_Optional_Identifier (Arg1, Name_Entity);
21576            Check_Arg_Is_Library_Level_Local_Name (Arg1);
21577            Ent := Entity (Get_Pragma_Arg (Arg1));
21578
21579            if Rep_Item_Too_Early (Ent, N) then
21580               return;
21581            else
21582               Ent := Underlying_Type (Ent);
21583            end if;
21584
21585            --  The only processing required is to link this item on to the
21586            --  list of rep items for the given entity. This is accomplished
21587            --  by the call to Rep_Item_Too_Late (when no error is detected
21588            --  and False is returned).
21589
21590            if Rep_Item_Too_Late (Ent, N) then
21591               return;
21592            else
21593               Set_Has_Gigi_Rep_Item (Ent);
21594            end if;
21595         end Weak_External;
21596
21597         -----------------------------
21598         -- Wide_Character_Encoding --
21599         -----------------------------
21600
21601         --  pragma Wide_Character_Encoding (IDENTIFIER);
21602
21603         when Pragma_Wide_Character_Encoding =>
21604            GNAT_Pragma;
21605
21606            --  Nothing to do, handled in parser. Note that we do not enforce
21607            --  configuration pragma placement, this pragma can appear at any
21608            --  place in the source, allowing mixed encodings within a single
21609            --  source program.
21610
21611            null;
21612
21613         --------------------
21614         -- Unknown_Pragma --
21615         --------------------
21616
21617         --  Should be impossible, since the case of an unknown pragma is
21618         --  separately processed before the case statement is entered.
21619
21620         when Unknown_Pragma =>
21621            raise Program_Error;
21622      end case;
21623
21624      --  AI05-0144: detect dangerous order dependence. Disabled for now,
21625      --  until AI is formally approved.
21626
21627      --  Check_Order_Dependence;
21628
21629   exception
21630      when Pragma_Exit => null;
21631   end Analyze_Pragma;
21632
21633   ---------------------------------------------
21634   -- Analyze_Pre_Post_Condition_In_Decl_Part --
21635   ---------------------------------------------
21636
21637   procedure Analyze_Pre_Post_Condition_In_Decl_Part
21638     (Prag    : Node_Id;
21639      Subp_Id : Entity_Id)
21640   is
21641      Arg1 : constant Node_Id := First (Pragma_Argument_Associations (Prag));
21642      Nam  : constant Name_Id := Original_Aspect_Name (Prag);
21643      Expr : Node_Id;
21644
21645      Restore_Scope : Boolean := False;
21646      --  Gets set True if we do a Push_Scope needing a Pop_Scope on exit
21647
21648   begin
21649      --  Ensure that the subprogram and its formals are visible when analyzing
21650      --  the expression of the pragma.
21651
21652      if not In_Open_Scopes (Subp_Id) then
21653         Restore_Scope := True;
21654         Push_Scope (Subp_Id);
21655         Install_Formals (Subp_Id);
21656      end if;
21657
21658      --  Preanalyze the boolean expression, we treat this as a spec expression
21659      --  (i.e. similar to a default expression).
21660
21661      Expr := Get_Pragma_Arg (Arg1);
21662
21663      --  In ASIS mode, for a pragma generated from a source aspect, analyze
21664      --  the original aspect expression, which is shared with the generated
21665      --  pragma.
21666
21667      if ASIS_Mode and then Present (Corresponding_Aspect (Prag)) then
21668         Expr := Expression (Corresponding_Aspect (Prag));
21669      end if;
21670
21671      Preanalyze_Assert_Expression (Expr, Standard_Boolean);
21672
21673      --  For a class-wide condition, a reference to a controlling formal must
21674      --  be interpreted as having the class-wide type (or an access to such)
21675      --  so that the inherited condition can be properly applied to any
21676      --  overriding operation (see ARM12 6.6.1 (7)).
21677
21678      if Class_Present (Prag) then
21679         Class_Wide_Condition : declare
21680            T : constant Entity_Id := Find_Dispatching_Type (Subp_Id);
21681
21682            ACW : Entity_Id := Empty;
21683            --  Access to T'class, created if there is a controlling formal
21684            --  that is an access parameter.
21685
21686            function Get_ACW return Entity_Id;
21687            --  If the expression has a reference to an controlling access
21688            --  parameter, create an access to T'class for the necessary
21689            --  conversions if one does not exist.
21690
21691            function Process (N : Node_Id) return Traverse_Result;
21692            --  ARM 6.1.1: Within the expression for a Pre'Class or Post'Class
21693            --  aspect for a primitive subprogram of a tagged type T, a name
21694            --  that denotes a formal parameter of type T is interpreted as
21695            --  having type T'Class. Similarly, a name that denotes a formal
21696            --  accessparameter of type access-to-T is interpreted as having
21697            --  type access-to-T'Class. This ensures the expression is well-
21698            --  defined for a primitive subprogram of a type descended from T.
21699            --  Note that this replacement is not done for selector names in
21700            --  parameter associations. These carry an entity for reference
21701            --  purposes, but semantically they are just identifiers.
21702
21703            -------------
21704            -- Get_ACW --
21705            -------------
21706
21707            function Get_ACW return Entity_Id is
21708               Loc  : constant Source_Ptr := Sloc (Prag);
21709               Decl : Node_Id;
21710
21711            begin
21712               if No (ACW) then
21713                  Decl :=
21714                    Make_Full_Type_Declaration (Loc,
21715                      Defining_Identifier => Make_Temporary (Loc, 'T'),
21716                      Type_Definition     =>
21717                         Make_Access_To_Object_Definition (Loc,
21718                           Subtype_Indication =>
21719                             New_Occurrence_Of (Class_Wide_Type (T), Loc),
21720                           All_Present        => True));
21721
21722                  Insert_Before (Unit_Declaration_Node (Subp_Id), Decl);
21723                  Analyze (Decl);
21724                  ACW := Defining_Identifier (Decl);
21725                  Freeze_Before (Unit_Declaration_Node (Subp_Id), ACW);
21726               end if;
21727
21728               return ACW;
21729            end Get_ACW;
21730
21731            -------------
21732            -- Process --
21733            -------------
21734
21735            function Process (N : Node_Id) return Traverse_Result is
21736               Loc : constant Source_Ptr := Sloc (N);
21737               Typ : Entity_Id;
21738
21739            begin
21740               if Is_Entity_Name (N)
21741                 and then Present (Entity (N))
21742                 and then Is_Formal (Entity (N))
21743                 and then Nkind (Parent (N)) /= N_Type_Conversion
21744                 and then
21745                   (Nkind (Parent (N)) /= N_Parameter_Association
21746                     or else N /= Selector_Name (Parent (N)))
21747               then
21748                  if Etype (Entity (N)) = T then
21749                     Typ := Class_Wide_Type (T);
21750
21751                  elsif Is_Access_Type (Etype (Entity (N)))
21752                    and then Designated_Type (Etype (Entity (N))) = T
21753                  then
21754                     Typ := Get_ACW;
21755                  else
21756                     Typ := Empty;
21757                  end if;
21758
21759                  if Present (Typ) then
21760                     Rewrite (N,
21761                       Make_Type_Conversion (Loc,
21762                         Subtype_Mark =>
21763                           New_Occurrence_Of (Typ, Loc),
21764                         Expression  => New_Occurrence_Of (Entity (N), Loc)));
21765                     Set_Etype (N, Typ);
21766                  end if;
21767               end if;
21768
21769               return OK;
21770            end Process;
21771
21772            procedure Replace_Type is new Traverse_Proc (Process);
21773
21774         --  Start of processing for Class_Wide_Condition
21775
21776         begin
21777            if not Present (T) then
21778
21779               --  Pre'Class/Post'Class aspect cases
21780
21781               if From_Aspect_Specification (Prag) then
21782                  if Nam = Name_uPre then
21783                     Error_Msg_Name_1 := Name_Pre;
21784                  else
21785                     Error_Msg_Name_1 := Name_Post;
21786                  end if;
21787
21788                  Error_Msg_Name_2 := Name_Class;
21789
21790                  Error_Msg_N
21791                    ("aspect `%''%` can only be specified for a primitive "
21792                     & "operation of a tagged type",
21793                     Corresponding_Aspect (Prag));
21794
21795               --  Pre_Class, Post_Class pragma cases
21796
21797               else
21798                  if Nam = Name_uPre then
21799                     Error_Msg_Name_1 := Name_Pre_Class;
21800                  else
21801                     Error_Msg_Name_1 := Name_Post_Class;
21802                  end if;
21803
21804                  Error_Msg_N
21805                    ("pragma% can only be specified for a primitive "
21806                     & "operation of a tagged type",
21807                     Corresponding_Aspect (Prag));
21808               end if;
21809            end if;
21810
21811            Replace_Type (Get_Pragma_Arg (Arg1));
21812         end Class_Wide_Condition;
21813      end if;
21814
21815      --  Remove the subprogram from the scope stack now that the pre-analysis
21816      --  of the precondition/postcondition is done.
21817
21818      if Restore_Scope then
21819         End_Scope;
21820      end if;
21821   end Analyze_Pre_Post_Condition_In_Decl_Part;
21822
21823   ------------------------------------------
21824   -- Analyze_Refined_Depends_In_Decl_Part --
21825   ------------------------------------------
21826
21827   procedure Analyze_Refined_Depends_In_Decl_Part (N : Node_Id) is
21828      Dependencies : List_Id := No_List;
21829      Depends      : Node_Id;
21830      --  The corresponding Depends pragma along with its clauses
21831
21832      Refinements : List_Id := No_List;
21833      --  The clauses of pragma Refined_Depends
21834
21835      Spec_Id : Entity_Id;
21836      --  The entity of the subprogram subject to pragma Refined_Depends
21837
21838      procedure Check_Dependency_Clause (Dep_Clause : Node_Id);
21839      --  Verify the legality of a single clause
21840
21841      function Input_Match
21842        (Dep_Input   : Node_Id;
21843         Ref_Inputs  : List_Id;
21844         Post_Errors : Boolean) return Boolean;
21845      --  Determine whether input Dep_Input matches one of inputs found in list
21846      --  Ref_Inputs. If flag Post_Errors is set, the routine reports missed or
21847      --  extra input items.
21848
21849      function Inputs_Match
21850        (Dep_Clause  : Node_Id;
21851         Ref_Clause  : Node_Id;
21852         Post_Errors : Boolean) return Boolean;
21853      --  Determine whether the inputs of Depends clause Dep_Clause match those
21854      --  of refinement clause Ref_Clause. If flag Post_Errors is set, then the
21855      --  routine reports missed or extra input items.
21856
21857      function Is_Self_Referential (Item_Id : Entity_Id) return Boolean;
21858      --  Determine whether a formal parameter, variable or state denoted by
21859      --  Item_Id appears both as input and an output in a single clause of
21860      --  pragma Depends.
21861
21862      procedure Report_Extra_Clauses;
21863      --  Emit an error for each extra clause the appears in Refined_Depends
21864
21865      -----------------------------
21866      -- Check_Dependency_Clause --
21867      -----------------------------
21868
21869      procedure Check_Dependency_Clause (Dep_Clause : Node_Id) is
21870         Dep_Output      : constant Node_Id := First (Choices (Dep_Clause));
21871         Dep_Id          : Entity_Id;
21872         Matching_Clause : Node_Id := Empty;
21873         Next_Ref_Clause : Node_Id;
21874         Ref_Clause      : Node_Id;
21875         Ref_Id          : Entity_Id;
21876         Ref_Output      : Node_Id;
21877
21878         Has_Constituent : Boolean := False;
21879         --  Flag set when the refinement output list contains at least one
21880         --  constituent of the state denoted by Dep_Id.
21881
21882         Has_Null_State : Boolean := False;
21883         --  Flag set when the output of clause Dep_Clause is a state with a
21884         --  null refinement.
21885
21886         Has_Refined_State : Boolean := False;
21887         --  Flag set when the output of clause Dep_Clause is a state with
21888         --  visible refinement.
21889
21890      begin
21891         --  The analysis of pragma Depends should produce normalized clauses
21892         --  with exactly one output. This is important because output items
21893         --  are unique in the whole dependence relation and can be used as
21894         --  keys.
21895
21896         pragma Assert (No (Next (Dep_Output)));
21897
21898         --  Inspect all clauses of Refined_Depends and attempt to match the
21899         --  output of Dep_Clause against an output from the refinement clauses
21900         --  set.
21901
21902         Ref_Clause := First (Refinements);
21903         while Present (Ref_Clause) loop
21904            Matching_Clause := Empty;
21905
21906            --  Store the next clause now because a match will trim the list of
21907            --  refinement clauses and this side effect should not be visible
21908            --  in pragma Refined_Depends.
21909
21910            Next_Ref_Clause := Next (Ref_Clause);
21911
21912            --  The analysis of pragma Refined_Depends should produce
21913            --  normalized clauses with exactly one output.
21914
21915            Ref_Output := First (Choices (Ref_Clause));
21916            pragma Assert (No (Next (Ref_Output)));
21917
21918            --  Two null output lists match if their inputs match
21919
21920            if Nkind (Dep_Output) = N_Null
21921              and then Nkind (Ref_Output) = N_Null
21922            then
21923               Matching_Clause := Ref_Clause;
21924               exit;
21925
21926            --  Two function 'Result attributes match if their inputs match.
21927            --  Note that there is no need to compare the two prefixes because
21928            --  the attributes cannot denote anything but the related function.
21929
21930            elsif Is_Attribute_Result (Dep_Output)
21931              and then Is_Attribute_Result (Ref_Output)
21932            then
21933               Matching_Clause := Ref_Clause;
21934               exit;
21935
21936            --  The remaining cases are formal parameters, variables and states
21937
21938            elsif Is_Entity_Name (Dep_Output) then
21939
21940               --  Handle abstract views of states and variables generated for
21941               --  limited with clauses.
21942
21943               Dep_Id := Available_View (Entity_Of (Dep_Output));
21944
21945               if Ekind (Dep_Id) = E_Abstract_State then
21946
21947                  --  A state with a null refinement matches either a null
21948                  --  output list or nothing at all (no clause):
21949
21950                  --    Refined_State   => (State => null)
21951
21952                  --  No clause
21953
21954                  --    Depends         => (State => null)
21955                  --    Refined_Depends =>  null               --  OK
21956
21957                  --  Null output list
21958
21959                  --    Depends         => (State => <input>)
21960                  --    Refined_Depends => (null  => <input>)  --  OK
21961
21962                  if Has_Null_Refinement (Dep_Id) then
21963                     Has_Null_State := True;
21964
21965                     --  When a state with null refinement matches a null
21966                     --  output, compare their inputs.
21967
21968                     if Nkind (Ref_Output) = N_Null then
21969                        Matching_Clause := Ref_Clause;
21970                     end if;
21971
21972                     exit;
21973
21974                  --  The state has a non-null refinement in which case the
21975                  --  match is based on constituents and inputs. A state with
21976                  --  multiple output constituents may match multiple clauses:
21977
21978                  --    Refined_State   => (State => (C1, C2))
21979                  --    Depends         => (State => <input>)
21980                  --    Refined_Depends => ((C1, C2) => <input>)
21981
21982                  --  When normalized, the above becomes:
21983
21984                  --    Refined_Depends => (C1 => <input>,
21985                  --                        C2 => <input>)
21986
21987                  elsif Has_Non_Null_Refinement (Dep_Id) then
21988                     Has_Refined_State := True;
21989
21990                     --  Account for the case where a state with a non-null
21991                     --  refinement matches a null output list:
21992
21993                     --    Refined_State   => (State_1 => (C1, C2),
21994                     --                        State_2 => (C3, C4))
21995                     --    Depends         => (State_1 => State_2)
21996                     --    Refined_Depends => (null    => C3)
21997
21998                     if Nkind (Ref_Output) = N_Null
21999                       and then Inputs_Match
22000                                  (Dep_Clause  => Dep_Clause,
22001                                   Ref_Clause  => Ref_Clause,
22002                                   Post_Errors => False)
22003                     then
22004                        Has_Constituent := True;
22005
22006                        --  Note that the search continues after the clause is
22007                        --  removed from the pool of candidates because it may
22008                        --  have been normalized into multiple simple clauses.
22009
22010                        Remove (Ref_Clause);
22011
22012                     --  Otherwise the output of the refinement clause must be
22013                     --  a valid constituent of the state:
22014
22015                     --    Refined_State   => (State => (C1, C2))
22016                     --    Depends         => (State => <input>)
22017                     --    Refined_Depends => (C1    => <input>)
22018
22019                     elsif Is_Entity_Name (Ref_Output) then
22020                        Ref_Id := Entity_Of (Ref_Output);
22021
22022                        if Ekind_In (Ref_Id, E_Abstract_State, E_Variable)
22023                          and then Present (Encapsulating_State (Ref_Id))
22024                          and then Encapsulating_State (Ref_Id) = Dep_Id
22025                          and then Inputs_Match
22026                                     (Dep_Clause  => Dep_Clause,
22027                                      Ref_Clause  => Ref_Clause,
22028                                      Post_Errors => False)
22029                        then
22030                           Has_Constituent := True;
22031
22032                           --  Note that the search continues after the clause
22033                           --  is removed from the pool of candidates because
22034                           --  it may have been normalized into multiple simple
22035                           --  clauses.
22036
22037                           Remove (Ref_Clause);
22038                        end if;
22039                     end if;
22040
22041                  --  The abstract view of a state matches is corresponding
22042                  --  non-abstract view:
22043
22044                  --    Depends         => (Lim_Pack.State => <input>)
22045                  --    Refined_Depends => (State          => <input>)
22046
22047                  elsif Is_Entity_Name (Ref_Output)
22048                    and then Entity_Of (Ref_Output) = Dep_Id
22049                  then
22050                     Matching_Clause := Ref_Clause;
22051                     exit;
22052                  end if;
22053
22054               --  Formal parameters and variables match if their inputs match
22055
22056               elsif Is_Entity_Name (Ref_Output)
22057                 and then Entity_Of (Ref_Output) = Dep_Id
22058               then
22059                  Matching_Clause := Ref_Clause;
22060                  exit;
22061               end if;
22062            end if;
22063
22064            Ref_Clause := Next_Ref_Clause;
22065         end loop;
22066
22067         --  Handle the case where pragma Depends contains one or more clauses
22068         --  that only mention states with null refinements. In that case the
22069         --  corresponding pragma Refined_Depends may have a null relation.
22070
22071         --    Refined_State   => (State => null)
22072         --    Depends         => (State => null)
22073         --    Refined_Depends =>  null            --  OK
22074
22075         --  Another instance of the same scenario occurs when the list of
22076         --  refinements has been depleted while processing previous clauses.
22077
22078         if Is_Entity_Name (Dep_Output)
22079           and then (No (Refinements) or else Is_Empty_List (Refinements))
22080         then
22081            Dep_Id := Entity_Of (Dep_Output);
22082
22083            if Ekind (Dep_Id) = E_Abstract_State
22084              and then Has_Null_Refinement (Dep_Id)
22085            then
22086               Has_Null_State := True;
22087            end if;
22088         end if;
22089
22090         --  The above search produced a match based on unique output. Ensure
22091         --  that the inputs match as well and if they do, remove the clause
22092         --  from the pool of candidates.
22093
22094         if Present (Matching_Clause) then
22095            if Inputs_Match
22096                 (Ref_Clause  => Ref_Clause,
22097                  Dep_Clause  => Matching_Clause,
22098                  Post_Errors => True)
22099            then
22100               Remove (Matching_Clause);
22101            end if;
22102
22103         --  A state with a visible refinement was matched against one or
22104         --  more clauses containing appropriate constituents.
22105
22106         elsif Has_Constituent then
22107            null;
22108
22109         --  A state with a null refinement did not warrant a clause
22110
22111         elsif Has_Null_State then
22112            null;
22113
22114         --  The dependence relation of pragma Refined_Depends does not contain
22115         --  a matching clause, emit an error.
22116
22117         else
22118            Error_Msg_NE
22119              ("dependence clause of subprogram & has no matching refinement "
22120               & "in body", Ref_Clause, Spec_Id);
22121
22122            if Has_Refined_State then
22123               Error_Msg_N
22124                 ("\check the use of constituents in dependence refinement",
22125                  Ref_Clause);
22126            end if;
22127         end if;
22128      end Check_Dependency_Clause;
22129
22130      -----------------
22131      -- Input_Match --
22132      -----------------
22133
22134      function Input_Match
22135        (Dep_Input   : Node_Id;
22136         Ref_Inputs  : List_Id;
22137         Post_Errors : Boolean) return Boolean
22138      is
22139         procedure Match_Error (Msg : String; N : Node_Id);
22140         --  Emit a matching error if flag Post_Errors is set
22141
22142         -----------------
22143         -- Match_Error --
22144         -----------------
22145
22146         procedure Match_Error (Msg : String; N : Node_Id) is
22147         begin
22148            if Post_Errors then
22149               Error_Msg_N (Msg, N);
22150            end if;
22151         end Match_Error;
22152
22153         --  Local variables
22154
22155         Dep_Id         : Node_Id;
22156         Next_Ref_Input : Node_Id;
22157         Ref_Id         : Entity_Id;
22158         Ref_Input      : Node_Id;
22159
22160         Has_Constituent : Boolean := False;
22161         --  Flag set when the refinement input list contains at least one
22162         --  constituent of the state denoted by Dep_Id.
22163
22164         Has_Null_State : Boolean := False;
22165         --  Flag set when the dependency input is a state with a visible null
22166         --  refinement.
22167
22168         Has_Refined_State : Boolean := False;
22169         --  Flag set when the dependency input is a state with visible non-
22170         --  null refinement.
22171
22172      --  Start of processing for Input_Match
22173
22174      begin
22175         --  Match a null input with another null input
22176
22177         if Nkind (Dep_Input) = N_Null then
22178            Ref_Input := First (Ref_Inputs);
22179
22180            --  Remove the matching null from the pool of candidates
22181
22182            if Nkind (Ref_Input) = N_Null then
22183               Remove (Ref_Input);
22184               return True;
22185
22186            else
22187               Match_Error
22188                 ("null input cannot be matched in corresponding refinement "
22189                  & "clause", Dep_Input);
22190            end if;
22191
22192         --  Remaining cases are formal parameters, variables, and states
22193
22194         else
22195            --  Handle abstract views of states and variables generated for
22196            --  limited with clauses.
22197
22198            Dep_Id := Available_View (Entity_Of (Dep_Input));
22199
22200            --  Inspect all inputs of the refinement clause and attempt to
22201            --  match against the inputs of the dependence clause.
22202
22203            Ref_Input := First (Ref_Inputs);
22204            while Present (Ref_Input) loop
22205
22206               --  Store the next input now because a match will remove it from
22207               --  the list.
22208
22209               Next_Ref_Input := Next (Ref_Input);
22210
22211               if Ekind (Dep_Id) = E_Abstract_State then
22212
22213                  --  A state with a null refinement matches either a null
22214                  --  input list or nothing at all (no input):
22215
22216                  --    Refined_State   => (State => null)
22217
22218                  --  No input
22219
22220                  --    Depends         => (<output> => (State, Input))
22221                  --    Refined_Depends => (<output> => Input)  --  OK
22222
22223                  --  Null input list
22224
22225                  --    Depends         => (<output> => State)
22226                  --    Refined_Depends => (<output> => null)   --  OK
22227
22228                  if Has_Null_Refinement (Dep_Id) then
22229                     Has_Null_State := True;
22230
22231                     --  Remove the matching null from the pool of candidates
22232
22233                     if Nkind (Ref_Input) = N_Null then
22234                        Remove (Ref_Input);
22235                     end if;
22236
22237                     return True;
22238
22239                  --  The state has a non-null refinement in which case remove
22240                  --  all the matching constituents of the state:
22241
22242                  --    Refined_State   => (State    => (C1, C2))
22243                  --    Depends         => (<output> =>  State)
22244                  --    Refined_Depends => (<output> => (C1, C2))
22245
22246                  elsif Has_Non_Null_Refinement (Dep_Id) then
22247                     Has_Refined_State := True;
22248
22249                     --  A state with a visible non-null refinement may have a
22250                     --  null input_list only when it is self referential.
22251
22252                     --    Refined_State   => (State => (C1, C2))
22253                     --    Depends         => (State => State)
22254                     --    Refined_Depends => (C2 => null)  --  OK
22255
22256                     if Nkind (Ref_Input) = N_Null
22257                       and then Is_Self_Referential (Dep_Id)
22258                     then
22259                        --  Remove the null from the pool of candidates. Note
22260                        --  that the search continues because the state may be
22261                        --  represented by multiple constituents.
22262
22263                        Has_Constituent := True;
22264                        Remove (Ref_Input);
22265
22266                     --  Ref_Input is an entity name
22267
22268                     elsif Is_Entity_Name (Ref_Input) then
22269                        Ref_Id := Entity_Of (Ref_Input);
22270
22271                        --  The input of the refinement clause is a valid
22272                        --  constituent of the state. Remove the input from the
22273                        --  pool of candidates. Note that the search continues
22274                        --  because the state may be represented by multiple
22275                        --  constituents.
22276
22277                        if Ekind_In (Ref_Id, E_Abstract_State,
22278                                             E_Variable)
22279                          and then Present (Encapsulating_State (Ref_Id))
22280                          and then Encapsulating_State (Ref_Id) = Dep_Id
22281                        then
22282                           Has_Constituent := True;
22283                           Remove (Ref_Input);
22284                        end if;
22285                     end if;
22286
22287                  --  The abstract view of a state matches its corresponding
22288                  --  non-abstract view:
22289
22290                  --    Depends         => (<output> => Lim_Pack.State)
22291                  --    Refined_Depends => (<output> => State)
22292
22293                  elsif Is_Entity_Name (Ref_Input)
22294                    and then Entity_Of (Ref_Input) = Dep_Id
22295                  then
22296                     Remove (Ref_Input);
22297                     return True;
22298                  end if;
22299
22300               --  Formal parameters and variables are matched on entities. If
22301               --  this is the case, remove the input from the candidate list.
22302
22303               elsif Is_Entity_Name (Ref_Input)
22304                 and then Entity_Of (Ref_Input) = Dep_Id
22305               then
22306                  Remove (Ref_Input);
22307                  return True;
22308               end if;
22309
22310               Ref_Input := Next_Ref_Input;
22311            end loop;
22312
22313            --  When a state with a null refinement appears as the last input,
22314            --  it matches nothing:
22315
22316            --    Refined_State   => (State => null)
22317            --    Depends         => (<output> => (Input, State))
22318            --    Refined_Depends => (<output> => Input)  --  OK
22319
22320            if Ekind (Dep_Id) = E_Abstract_State
22321              and then Has_Null_Refinement (Dep_Id)
22322              and then No (Ref_Input)
22323            then
22324               Has_Null_State := True;
22325            end if;
22326         end if;
22327
22328         --  A state with visible refinement was matched against one or more of
22329         --  its constituents.
22330
22331         if Has_Constituent then
22332            return True;
22333
22334         --  A state with a null refinement matched null or nothing
22335
22336         elsif Has_Null_State then
22337            return True;
22338
22339         --  The input of a dependence clause does not have a matching input in
22340         --  the refinement clause, emit an error.
22341
22342         else
22343            Match_Error
22344              ("input cannot be matched in corresponding refinement clause",
22345               Dep_Input);
22346
22347            if Has_Refined_State then
22348               Match_Error
22349                 ("\check the use of constituents in dependence refinement",
22350                  Dep_Input);
22351            end if;
22352
22353            return False;
22354         end if;
22355      end Input_Match;
22356
22357      ------------------
22358      -- Inputs_Match --
22359      ------------------
22360
22361      function Inputs_Match
22362        (Dep_Clause  : Node_Id;
22363         Ref_Clause  : Node_Id;
22364         Post_Errors : Boolean) return Boolean
22365      is
22366         Ref_Inputs : List_Id;
22367         --  The input list of the refinement clause
22368
22369         procedure Report_Extra_Inputs;
22370         --  Emit errors for all extra inputs that appear in Ref_Inputs
22371
22372         -------------------------
22373         -- Report_Extra_Inputs --
22374         -------------------------
22375
22376         procedure Report_Extra_Inputs is
22377            Input : Node_Id;
22378
22379         begin
22380            if Present (Ref_Inputs) and then Post_Errors then
22381               Input := First (Ref_Inputs);
22382               while Present (Input) loop
22383                  Error_Msg_N
22384                    ("unmatched or extra input in refinement clause", Input);
22385
22386                  Next (Input);
22387               end loop;
22388            end if;
22389         end Report_Extra_Inputs;
22390
22391         --  Local variables
22392
22393         Dep_Inputs : constant Node_Id := Expression (Dep_Clause);
22394         Inputs     : constant Node_Id := Expression (Ref_Clause);
22395         Dep_Input  : Node_Id;
22396         Result     : Boolean;
22397
22398      --  Start of processing for Inputs_Match
22399
22400      begin
22401         --  Construct a list of all refinement inputs. Note that the input
22402         --  list is copied because the algorithm modifies its contents and
22403         --  this should not be visible in Refined_Depends. The same applies
22404         --  for a solitary input.
22405
22406         if Nkind (Inputs) = N_Aggregate then
22407            Ref_Inputs := New_Copy_List (Expressions (Inputs));
22408         else
22409            Ref_Inputs := New_List (New_Copy (Inputs));
22410         end if;
22411
22412         --  Depending on whether the original dependency clause mentions
22413         --  states with visible refinement, the corresponding refinement
22414         --  clause may differ greatly in structure and contents:
22415
22416         --  State with null refinement
22417
22418         --    Refined_State   => (State    => null)
22419         --    Depends         => (<output> => State)
22420         --    Refined_Depends => (<output> => null)
22421
22422         --    Depends         => (<output> => (State, Input))
22423         --    Refined_Depends => (<output> => Input)
22424
22425         --    Depends         => (<output> => (Input_1, State, Input_2))
22426         --    Refined_Depends => (<output> => (Input_1, Input_2))
22427
22428         --  State with non-null refinement
22429
22430         --    Refined_State   => (State_1 => (C1, C2))
22431         --    Depends         => (<output> => State)
22432         --    Refined_Depends => (<output> => C1)
22433         --  or
22434         --    Refined_Depends => (<output> => (C1, C2))
22435
22436         if Nkind (Dep_Inputs) = N_Aggregate then
22437            Dep_Input := First (Expressions (Dep_Inputs));
22438            while Present (Dep_Input) loop
22439               if not Input_Match
22440                        (Dep_Input   => Dep_Input,
22441                         Ref_Inputs  => Ref_Inputs,
22442                         Post_Errors => Post_Errors)
22443               then
22444                  Result := False;
22445               end if;
22446
22447               Next (Dep_Input);
22448            end loop;
22449
22450            Result := True;
22451
22452         --  Solitary input
22453
22454         else
22455            Result :=
22456              Input_Match
22457                (Dep_Input   => Dep_Inputs,
22458                 Ref_Inputs  => Ref_Inputs,
22459                 Post_Errors => Post_Errors);
22460         end if;
22461
22462         --  List all inputs that appear as extras
22463
22464         Report_Extra_Inputs;
22465
22466         return Result;
22467      end Inputs_Match;
22468
22469      -------------------------
22470      -- Is_Self_Referential --
22471      -------------------------
22472
22473      function Is_Self_Referential (Item_Id : Entity_Id) return Boolean is
22474         function Denotes_Item (N : Node_Id) return Boolean;
22475         --  Determine whether an arbitrary node N denotes item Item_Id
22476
22477         ------------------
22478         -- Denotes_Item --
22479         ------------------
22480
22481         function Denotes_Item (N : Node_Id) return Boolean is
22482         begin
22483            return
22484              Is_Entity_Name (N)
22485                and then Present (Entity (N))
22486                and then Entity (N) = Item_Id;
22487         end Denotes_Item;
22488
22489         --  Local variables
22490
22491         Clauses : constant Node_Id :=
22492                     Get_Pragma_Arg
22493                       (First (Pragma_Argument_Associations (Depends)));
22494         Clause  : Node_Id;
22495         Input   : Node_Id;
22496         Output  : Node_Id;
22497
22498      --  Start of processing for Is_Self_Referential
22499
22500      begin
22501         Clause := First (Component_Associations (Clauses));
22502         while Present (Clause) loop
22503
22504            --  Due to normalization, a dependence clause has exactly one
22505            --  output even if the original clause had multiple outputs.
22506
22507            Output := First (Choices (Clause));
22508
22509            --  Detect the following scenario:
22510            --
22511            --    Item_Id => [(...,] Item_Id [, ...)]
22512
22513            if Denotes_Item (Output) then
22514               Input := Expression (Clause);
22515
22516               --  Multiple inputs appear as an aggregate
22517
22518               if Nkind (Input) = N_Aggregate then
22519                  Input := First (Expressions (Input));
22520
22521                  if Denotes_Item (Input) then
22522                     return True;
22523                  end if;
22524
22525                  Next (Input);
22526
22527               --  Solitary input
22528
22529               elsif Denotes_Item (Input) then
22530                  return True;
22531               end if;
22532            end if;
22533
22534            Next (Clause);
22535         end loop;
22536
22537         return False;
22538      end Is_Self_Referential;
22539
22540      --------------------------
22541      -- Report_Extra_Clauses --
22542      --------------------------
22543
22544      procedure Report_Extra_Clauses is
22545         Clause : Node_Id;
22546
22547      begin
22548         if Present (Refinements) then
22549            Clause := First (Refinements);
22550            while Present (Clause) loop
22551
22552               --  Do not complain about a null input refinement, since a null
22553               --  input legitimately matches anything.
22554
22555               if Nkind (Clause) /= N_Component_Association
22556                 or else Nkind (Expression (Clause)) /= N_Null
22557               then
22558                  Error_Msg_N
22559                    ("unmatched or extra clause in dependence refinement",
22560                     Clause);
22561               end if;
22562
22563               Next (Clause);
22564            end loop;
22565         end if;
22566      end Report_Extra_Clauses;
22567
22568      --  Local variables
22569
22570      Body_Decl : constant Node_Id := Parent (N);
22571      Errors    : constant Nat     := Serious_Errors_Detected;
22572      Refs      : constant Node_Id :=
22573                    Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
22574      Clause    : Node_Id;
22575      Deps      : Node_Id;
22576
22577   --  Start of processing for Analyze_Refined_Depends_In_Decl_Part
22578
22579   begin
22580      --  Verify the syntax of pragma Refined_Depends when SPARK checks are
22581      --  suppressed. Semantic analysis is disabled in this mode.
22582
22583      if SPARK_Mode = Off then
22584         Check_Dependence_List_Syntax (Refs);
22585         return;
22586      end if;
22587
22588      Spec_Id := Corresponding_Spec (Body_Decl);
22589      Depends := Get_Pragma (Spec_Id, Pragma_Depends);
22590
22591      --  Subprogram declarations lacks pragma Depends. Refined_Depends is
22592      --  rendered useless as there is nothing to refine (SPARK RM 7.2.5(2)).
22593
22594      if No (Depends) then
22595         Error_Msg_NE
22596           ("useless refinement, declaration of subprogram & lacks aspect or "
22597            & "pragma Depends", N, Spec_Id);
22598         return;
22599      end if;
22600
22601      Deps := Get_Pragma_Arg (First (Pragma_Argument_Associations (Depends)));
22602
22603      --  A null dependency relation renders the refinement useless because it
22604      --  cannot possibly mention abstract states with visible refinement. Note
22605      --  that the inverse is not true as states may be refined to null
22606      --  (SPARK RM 7.2.5(2)).
22607
22608      if Nkind (Deps) = N_Null then
22609         Error_Msg_NE
22610           ("useless refinement, subprogram & does not depend on abstract "
22611            & "state with visible refinement",
22612            N, Spec_Id);
22613         return;
22614      end if;
22615
22616      --  Multiple dependency clauses appear as component associations of an
22617      --  aggregate.
22618
22619      pragma Assert (Nkind (Deps) = N_Aggregate);
22620      Dependencies := Component_Associations (Deps);
22621
22622      --  Analyze Refined_Depends as if it behaved as a regular pragma Depends.
22623      --  This ensures that the categorization of all refined dependency items
22624      --  is consistent with their role.
22625
22626      Analyze_Depends_In_Decl_Part (N);
22627
22628      if Serious_Errors_Detected = Errors then
22629         if Nkind (Refs) = N_Null then
22630            Refinements := No_List;
22631
22632         --  Multiple dependency clauses appear as component associations of an
22633         --  aggregate. Note that the clauses are copied because the algorithm
22634         --  modifies them and this should not be visible in Refined_Depends.
22635
22636         else pragma Assert (Nkind (Refs) = N_Aggregate);
22637            Refinements := New_Copy_List (Component_Associations (Refs));
22638         end if;
22639
22640         --  Inspect all the clauses of pragma Depends looking for a matching
22641         --  clause in pragma Refined_Depends. The approach is to use the
22642         --  sole output of a clause as a key. Output items are unique in a
22643         --  dependence relation. Clause normalization also ensured that all
22644         --  clauses have exactly one output. Depending on what the key is, one
22645         --  or more refinement clauses may satisfy the dependency clause. Each
22646         --  time a dependency clause is matched, its related refinement clause
22647         --  is consumed. In the end, two things may happen:
22648
22649         --    1) A clause of pragma Depends was not matched in which case
22650         --       Check_Dependency_Clause reports the error.
22651
22652         --    2) Refined_Depends has an extra clause in which case the error
22653         --       is reported by Report_Extra_Clauses.
22654
22655         Clause := First (Dependencies);
22656         while Present (Clause) loop
22657            Check_Dependency_Clause (Clause);
22658            Next (Clause);
22659         end loop;
22660      end if;
22661
22662      if Serious_Errors_Detected = Errors then
22663         Report_Extra_Clauses;
22664      end if;
22665   end Analyze_Refined_Depends_In_Decl_Part;
22666
22667   -----------------------------------------
22668   -- Analyze_Refined_Global_In_Decl_Part --
22669   -----------------------------------------
22670
22671   procedure Analyze_Refined_Global_In_Decl_Part (N : Node_Id) is
22672      Global : Node_Id;
22673      --  The corresponding Global pragma
22674
22675      Has_In_State       : Boolean := False;
22676      Has_In_Out_State   : Boolean := False;
22677      Has_Out_State      : Boolean := False;
22678      Has_Proof_In_State : Boolean := False;
22679      --  These flags are set when the corresponding Global pragma has a state
22680      --  of mode Input, In_Out, Output or Proof_In respectively with a visible
22681      --  refinement.
22682
22683      Has_Null_State : Boolean := False;
22684      --  This flag is set when the corresponding Global pragma has at least
22685      --  one state with a null refinement.
22686
22687      In_Constits       : Elist_Id := No_Elist;
22688      In_Out_Constits   : Elist_Id := No_Elist;
22689      Out_Constits      : Elist_Id := No_Elist;
22690      Proof_In_Constits : Elist_Id := No_Elist;
22691      --  These lists contain the entities of all Input, In_Out, Output and
22692      --  Proof_In constituents that appear in Refined_Global and participate
22693      --  in state refinement.
22694
22695      In_Items       : Elist_Id := No_Elist;
22696      In_Out_Items   : Elist_Id := No_Elist;
22697      Out_Items      : Elist_Id := No_Elist;
22698      Proof_In_Items : Elist_Id := No_Elist;
22699      --  These list contain the entities of all Input, In_Out, Output and
22700      --  Proof_In items defined in the corresponding Global pragma.
22701
22702      procedure Check_In_Out_States;
22703      --  Determine whether the corresponding Global pragma mentions In_Out
22704      --  states with visible refinement and if so, ensure that one of the
22705      --  following completions apply to the constituents of the state:
22706      --    1) there is at least one constituent of mode In_Out
22707      --    2) there is at least one Input and one Output constituent
22708      --    3) not all constituents are present and one of them is of mode
22709      --       Output.
22710      --  This routine may remove elements from In_Constits, In_Out_Constits,
22711      --  Out_Constits and Proof_In_Constits.
22712
22713      procedure Check_Input_States;
22714      --  Determine whether the corresponding Global pragma mentions Input
22715      --  states with visible refinement and if so, ensure that at least one of
22716      --  its constituents appears as an Input item in Refined_Global.
22717      --  This routine may remove elements from In_Constits, In_Out_Constits,
22718      --  Out_Constits and Proof_In_Constits.
22719
22720      procedure Check_Output_States;
22721      --  Determine whether the corresponding Global pragma mentions Output
22722      --  states with visible refinement and if so, ensure that all of its
22723      --  constituents appear as Output items in Refined_Global.
22724      --  This routine may remove elements from In_Constits, In_Out_Constits,
22725      --  Out_Constits and Proof_In_Constits.
22726
22727      procedure Check_Proof_In_States;
22728      --  Determine whether the corresponding Global pragma mentions Proof_In
22729      --  states with visible refinement and if so, ensure that at least one of
22730      --  its constituents appears as a Proof_In item in Refined_Global.
22731      --  This routine may remove elements from In_Constits, In_Out_Constits,
22732      --  Out_Constits and Proof_In_Constits.
22733
22734      procedure Check_Refined_Global_List
22735        (List        : Node_Id;
22736         Global_Mode : Name_Id := Name_Input);
22737      --  Verify the legality of a single global list declaration. Global_Mode
22738      --  denotes the current mode in effect.
22739
22740      function Present_Then_Remove
22741        (List : Elist_Id;
22742         Item : Entity_Id) return Boolean;
22743      --  Search List for a particular entity Item. If Item has been found,
22744      --  remove it from List. This routine is used to strip lists In_Constits,
22745      --  In_Out_Constits and Out_Constits of valid constituents.
22746
22747      procedure Report_Extra_Constituents;
22748      --  Emit an error for each constituent found in lists In_Constits,
22749      --  In_Out_Constits and Out_Constits.
22750
22751      -------------------------
22752      -- Check_In_Out_States --
22753      -------------------------
22754
22755      procedure Check_In_Out_States is
22756         procedure Check_Constituent_Usage (State_Id : Entity_Id);
22757         --  Determine whether one of the following coverage scenarios is in
22758         --  effect:
22759         --    1) there is at least one constituent of mode In_Out
22760         --    2) there is at least one Input and one Output constituent
22761         --    3) not all constituents are present and one of them is of mode
22762         --       Output.
22763         --  If this is not the case, emit an error.
22764
22765         -----------------------------
22766         -- Check_Constituent_Usage --
22767         -----------------------------
22768
22769         procedure Check_Constituent_Usage (State_Id : Entity_Id) is
22770            Constit_Elmt : Elmt_Id;
22771            Constit_Id   : Entity_Id;
22772            Has_Missing  : Boolean := False;
22773            In_Out_Seen  : Boolean := False;
22774            In_Seen      : Boolean := False;
22775            Out_Seen     : Boolean := False;
22776
22777         begin
22778            --  Process all the constituents of the state and note their modes
22779            --  within the global refinement.
22780
22781            Constit_Elmt := First_Elmt (Refinement_Constituents (State_Id));
22782            while Present (Constit_Elmt) loop
22783               Constit_Id := Node (Constit_Elmt);
22784
22785               if Present_Then_Remove (In_Constits, Constit_Id) then
22786                  In_Seen := True;
22787
22788               elsif Present_Then_Remove (In_Out_Constits, Constit_Id) then
22789                  In_Out_Seen := True;
22790
22791               elsif Present_Then_Remove (Out_Constits, Constit_Id) then
22792                  Out_Seen := True;
22793
22794               --  A Proof_In constituent cannot participate in the completion
22795               --  of an Output state (SPARK RM 7.2.4(5)).
22796
22797               elsif Present_Then_Remove (Proof_In_Constits, Constit_Id) then
22798                  Error_Msg_Name_1 := Chars (State_Id);
22799                  Error_Msg_NE
22800                    ("constituent & of state % must have mode Input, In_Out "
22801                     & "or Output in global refinement",
22802                     N, Constit_Id);
22803
22804               else
22805                  Has_Missing := True;
22806               end if;
22807
22808               Next_Elmt (Constit_Elmt);
22809            end loop;
22810
22811            --  A single In_Out constituent is a valid completion
22812
22813            if In_Out_Seen then
22814               null;
22815
22816            --  A pair of one Input and one Output constituent is a valid
22817            --  completion.
22818
22819            elsif In_Seen and then Out_Seen then
22820               null;
22821
22822            --  A single Output constituent is a valid completion only when
22823            --  some of the other constituents are missing (SPARK RM 7.2.4(5)).
22824
22825            elsif Has_Missing and then Out_Seen then
22826               null;
22827
22828            else
22829               Error_Msg_NE
22830                 ("global refinement of state & redefines the mode of its "
22831                  & "constituents", N, State_Id);
22832            end if;
22833         end Check_Constituent_Usage;
22834
22835         --  Local variables
22836
22837         Item_Elmt : Elmt_Id;
22838         Item_Id   : Entity_Id;
22839
22840      --  Start of processing for Check_In_Out_States
22841
22842      begin
22843         --  Inspect the In_Out items of the corresponding Global pragma
22844         --  looking for a state with a visible refinement.
22845
22846         if Has_In_Out_State and then Present (In_Out_Items) then
22847            Item_Elmt := First_Elmt (In_Out_Items);
22848            while Present (Item_Elmt) loop
22849               Item_Id := Node (Item_Elmt);
22850
22851               --  Ensure that one of the three coverage variants is satisfied
22852
22853               if Ekind (Item_Id) = E_Abstract_State
22854                 and then Has_Non_Null_Refinement (Item_Id)
22855               then
22856                  Check_Constituent_Usage (Item_Id);
22857               end if;
22858
22859               Next_Elmt (Item_Elmt);
22860            end loop;
22861         end if;
22862      end Check_In_Out_States;
22863
22864      ------------------------
22865      -- Check_Input_States --
22866      ------------------------
22867
22868      procedure Check_Input_States is
22869         procedure Check_Constituent_Usage (State_Id : Entity_Id);
22870         --  Determine whether at least one constituent of state State_Id with
22871         --  visible refinement is used and has mode Input. Ensure that the
22872         --  remaining constituents do not have In_Out, Output or Proof_In
22873         --  modes.
22874
22875         -----------------------------
22876         -- Check_Constituent_Usage --
22877         -----------------------------
22878
22879         procedure Check_Constituent_Usage (State_Id : Entity_Id) is
22880            Constit_Elmt : Elmt_Id;
22881            Constit_Id   : Entity_Id;
22882            In_Seen      : Boolean := False;
22883
22884         begin
22885            Constit_Elmt := First_Elmt (Refinement_Constituents (State_Id));
22886            while Present (Constit_Elmt) loop
22887               Constit_Id := Node (Constit_Elmt);
22888
22889               --  At least one of the constituents appears as an Input
22890
22891               if Present_Then_Remove (In_Constits, Constit_Id) then
22892                  In_Seen := True;
22893
22894               --  The constituent appears in the global refinement, but has
22895               --  mode In_Out, Output or Proof_In (SPARK RM 7.2.4(5)).
22896
22897               elsif Present_Then_Remove (In_Out_Constits, Constit_Id)
22898                 or else Present_Then_Remove (Out_Constits, Constit_Id)
22899                 or else Present_Then_Remove (Proof_In_Constits, Constit_Id)
22900               then
22901                  Error_Msg_Name_1 := Chars (State_Id);
22902                  Error_Msg_NE
22903                    ("constituent & of state % must have mode Input in global "
22904                     & "refinement", N, Constit_Id);
22905               end if;
22906
22907               Next_Elmt (Constit_Elmt);
22908            end loop;
22909
22910            --  Not one of the constituents appeared as Input
22911
22912            if not In_Seen then
22913               Error_Msg_NE
22914                 ("global refinement of state & must include at least one "
22915                  & "constituent of mode Input", N, State_Id);
22916            end if;
22917         end Check_Constituent_Usage;
22918
22919         --  Local variables
22920
22921         Item_Elmt : Elmt_Id;
22922         Item_Id   : Entity_Id;
22923
22924      --  Start of processing for Check_Input_States
22925
22926      begin
22927         --  Inspect the Input items of the corresponding Global pragma
22928         --  looking for a state with a visible refinement.
22929
22930         if Has_In_State and then Present (In_Items) then
22931            Item_Elmt := First_Elmt (In_Items);
22932            while Present (Item_Elmt) loop
22933               Item_Id := Node (Item_Elmt);
22934
22935               --  Ensure that at least one of the constituents is utilized and
22936               --  is of mode Input.
22937
22938               if Ekind (Item_Id) = E_Abstract_State
22939                 and then Has_Non_Null_Refinement (Item_Id)
22940               then
22941                  Check_Constituent_Usage (Item_Id);
22942               end if;
22943
22944               Next_Elmt (Item_Elmt);
22945            end loop;
22946         end if;
22947      end Check_Input_States;
22948
22949      -------------------------
22950      -- Check_Output_States --
22951      -------------------------
22952
22953      procedure Check_Output_States is
22954         procedure Check_Constituent_Usage (State_Id : Entity_Id);
22955         --  Determine whether all constituents of state State_Id with visible
22956         --  refinement are used and have mode Output. Emit an error if this is
22957         --  not the case.
22958
22959         -----------------------------
22960         -- Check_Constituent_Usage --
22961         -----------------------------
22962
22963         procedure Check_Constituent_Usage (State_Id : Entity_Id) is
22964            Constit_Elmt : Elmt_Id;
22965            Constit_Id   : Entity_Id;
22966            Posted       : Boolean := False;
22967
22968         begin
22969            Constit_Elmt := First_Elmt (Refinement_Constituents (State_Id));
22970            while Present (Constit_Elmt) loop
22971               Constit_Id := Node (Constit_Elmt);
22972
22973               if Present_Then_Remove (Out_Constits, Constit_Id) then
22974                  null;
22975
22976               --  The constituent appears in the global refinement, but has
22977               --  mode Input, In_Out or Proof_In (SPARK RM 7.2.4(5)).
22978
22979               elsif Present_Then_Remove (In_Constits, Constit_Id)
22980                 or else Present_Then_Remove (In_Out_Constits, Constit_Id)
22981                 or else Present_Then_Remove (Proof_In_Constits, Constit_Id)
22982               then
22983                  Error_Msg_Name_1 := Chars (State_Id);
22984                  Error_Msg_NE
22985                    ("constituent & of state % must have mode Output in "
22986                     & "global refinement", N, Constit_Id);
22987
22988               --  The constituent is altogether missing (SPARK RM 7.2.5(3))
22989
22990               else
22991                  if not Posted then
22992                     Posted := True;
22993                     Error_Msg_NE
22994                       ("output state & must be replaced by all its "
22995                        & "constituents in global refinement", N, State_Id);
22996                  end if;
22997
22998                  Error_Msg_NE
22999                    ("\constituent & is missing in output list",
23000                     N, Constit_Id);
23001               end if;
23002
23003               Next_Elmt (Constit_Elmt);
23004            end loop;
23005         end Check_Constituent_Usage;
23006
23007         --  Local variables
23008
23009         Item_Elmt : Elmt_Id;
23010         Item_Id   : Entity_Id;
23011
23012      --  Start of processing for Check_Output_States
23013
23014      begin
23015         --  Inspect the Output items of the corresponding Global pragma
23016         --  looking for a state with a visible refinement.
23017
23018         if Has_Out_State and then Present (Out_Items) then
23019            Item_Elmt := First_Elmt (Out_Items);
23020            while Present (Item_Elmt) loop
23021               Item_Id := Node (Item_Elmt);
23022
23023               --  Ensure that all of the constituents are utilized and they
23024               --  have mode Output.
23025
23026               if Ekind (Item_Id) = E_Abstract_State
23027                 and then Has_Non_Null_Refinement (Item_Id)
23028               then
23029                  Check_Constituent_Usage (Item_Id);
23030               end if;
23031
23032               Next_Elmt (Item_Elmt);
23033            end loop;
23034         end if;
23035      end Check_Output_States;
23036
23037      ---------------------------
23038      -- Check_Proof_In_States --
23039      ---------------------------
23040
23041      procedure Check_Proof_In_States is
23042         procedure Check_Constituent_Usage (State_Id : Entity_Id);
23043         --  Determine whether at least one constituent of state State_Id with
23044         --  visible refinement is used and has mode Proof_In. Ensure that the
23045         --  remaining constituents do not have Input, In_Out or Output modes.
23046
23047         -----------------------------
23048         -- Check_Constituent_Usage --
23049         -----------------------------
23050
23051         procedure Check_Constituent_Usage (State_Id : Entity_Id) is
23052            Constit_Elmt  : Elmt_Id;
23053            Constit_Id    : Entity_Id;
23054            Proof_In_Seen : Boolean := False;
23055
23056         begin
23057            Constit_Elmt := First_Elmt (Refinement_Constituents (State_Id));
23058            while Present (Constit_Elmt) loop
23059               Constit_Id := Node (Constit_Elmt);
23060
23061               --  At least one of the constituents appears as Proof_In
23062
23063               if Present_Then_Remove (Proof_In_Constits, Constit_Id) then
23064                  Proof_In_Seen := True;
23065
23066               --  The constituent appears in the global refinement, but has
23067               --  mode Input, In_Out or Output (SPARK RM 7.2.4(5)).
23068
23069               elsif Present_Then_Remove (In_Constits, Constit_Id)
23070                 or else Present_Then_Remove (In_Out_Constits, Constit_Id)
23071                 or else Present_Then_Remove (Out_Constits, Constit_Id)
23072               then
23073                  Error_Msg_Name_1 := Chars (State_Id);
23074                  Error_Msg_NE
23075                    ("constituent & of state % must have mode Proof_In in "
23076                     & "global refinement", N, Constit_Id);
23077               end if;
23078
23079               Next_Elmt (Constit_Elmt);
23080            end loop;
23081
23082            --  Not one of the constituents appeared as Proof_In
23083
23084            if not Proof_In_Seen then
23085               Error_Msg_NE
23086                 ("global refinement of state & must include at least one "
23087                  & "constituent of mode Proof_In", N, State_Id);
23088            end if;
23089         end Check_Constituent_Usage;
23090
23091         --  Local variables
23092
23093         Item_Elmt : Elmt_Id;
23094         Item_Id   : Entity_Id;
23095
23096      --  Start of processing for Check_Proof_In_States
23097
23098      begin
23099         --  Inspect the Proof_In items of the corresponding Global pragma
23100         --  looking for a state with a visible refinement.
23101
23102         if Has_Proof_In_State and then Present (Proof_In_Items) then
23103            Item_Elmt := First_Elmt (Proof_In_Items);
23104            while Present (Item_Elmt) loop
23105               Item_Id := Node (Item_Elmt);
23106
23107               --  Ensure that at least one of the constituents is utilized and
23108               --  is of mode Proof_In
23109
23110               if Ekind (Item_Id) = E_Abstract_State
23111                 and then Has_Non_Null_Refinement (Item_Id)
23112               then
23113                  Check_Constituent_Usage (Item_Id);
23114               end if;
23115
23116               Next_Elmt (Item_Elmt);
23117            end loop;
23118         end if;
23119      end Check_Proof_In_States;
23120
23121      -------------------------------
23122      -- Check_Refined_Global_List --
23123      -------------------------------
23124
23125      procedure Check_Refined_Global_List
23126        (List        : Node_Id;
23127         Global_Mode : Name_Id := Name_Input)
23128      is
23129         procedure Check_Refined_Global_Item
23130           (Item        : Node_Id;
23131            Global_Mode : Name_Id);
23132         --  Verify the legality of a single global item declaration. Parameter
23133         --  Global_Mode denotes the current mode in effect.
23134
23135         -------------------------------
23136         -- Check_Refined_Global_Item --
23137         -------------------------------
23138
23139         procedure Check_Refined_Global_Item
23140           (Item        : Node_Id;
23141            Global_Mode : Name_Id)
23142         is
23143            Item_Id : constant Entity_Id := Entity_Of (Item);
23144
23145            procedure Inconsistent_Mode_Error (Expect : Name_Id);
23146            --  Issue a common error message for all mode mismatches. Expect
23147            --  denotes the expected mode.
23148
23149            -----------------------------
23150            -- Inconsistent_Mode_Error --
23151            -----------------------------
23152
23153            procedure Inconsistent_Mode_Error (Expect : Name_Id) is
23154            begin
23155               Error_Msg_NE
23156                 ("global item & has inconsistent modes", Item, Item_Id);
23157
23158               Error_Msg_Name_1 := Global_Mode;
23159               Error_Msg_Name_2 := Expect;
23160               Error_Msg_N ("\expected mode %, found mode %", Item);
23161            end Inconsistent_Mode_Error;
23162
23163         --  Start of processing for Check_Refined_Global_Item
23164
23165         begin
23166            --  When the state or variable acts as a constituent of another
23167            --  state with a visible refinement, collect it for the state
23168            --  completeness checks performed later on.
23169
23170            if Present (Encapsulating_State (Item_Id))
23171             and then Has_Visible_Refinement (Encapsulating_State (Item_Id))
23172            then
23173               if Global_Mode = Name_Input then
23174                  Add_Item (Item_Id, In_Constits);
23175
23176               elsif Global_Mode = Name_In_Out then
23177                  Add_Item (Item_Id, In_Out_Constits);
23178
23179               elsif Global_Mode = Name_Output then
23180                  Add_Item (Item_Id, Out_Constits);
23181
23182               elsif Global_Mode = Name_Proof_In then
23183                  Add_Item (Item_Id, Proof_In_Constits);
23184               end if;
23185
23186            --  When not a constituent, ensure that both occurrences of the
23187            --  item in pragmas Global and Refined_Global match.
23188
23189            elsif Contains (In_Items, Item_Id) then
23190               if Global_Mode /= Name_Input then
23191                  Inconsistent_Mode_Error (Name_Input);
23192               end if;
23193
23194            elsif Contains (In_Out_Items, Item_Id) then
23195               if Global_Mode /= Name_In_Out then
23196                  Inconsistent_Mode_Error (Name_In_Out);
23197               end if;
23198
23199            elsif Contains (Out_Items, Item_Id) then
23200               if Global_Mode /= Name_Output then
23201                  Inconsistent_Mode_Error (Name_Output);
23202               end if;
23203
23204            elsif Contains (Proof_In_Items, Item_Id) then
23205               null;
23206
23207            --  The item does not appear in the corresponding Global pragma,
23208            --  it must be an extra (SPARK RM 7.2.4(3)).
23209
23210            else
23211               Error_Msg_NE ("extra global item &", Item, Item_Id);
23212            end if;
23213         end Check_Refined_Global_Item;
23214
23215         --  Local variables
23216
23217         Item : Node_Id;
23218
23219      --  Start of processing for Check_Refined_Global_List
23220
23221      begin
23222         if Nkind (List) = N_Null then
23223            null;
23224
23225         --  Single global item declaration
23226
23227         elsif Nkind_In (List, N_Expanded_Name,
23228                               N_Identifier,
23229                               N_Selected_Component)
23230         then
23231            Check_Refined_Global_Item (List, Global_Mode);
23232
23233         --  Simple global list or moded global list declaration
23234
23235         elsif Nkind (List) = N_Aggregate then
23236
23237            --  The declaration of a simple global list appear as a collection
23238            --  of expressions.
23239
23240            if Present (Expressions (List)) then
23241               Item := First (Expressions (List));
23242               while Present (Item) loop
23243                  Check_Refined_Global_Item (Item, Global_Mode);
23244
23245                  Next (Item);
23246               end loop;
23247
23248            --  The declaration of a moded global list appears as a collection
23249            --  of component associations where individual choices denote
23250            --  modes.
23251
23252            elsif Present (Component_Associations (List)) then
23253               Item := First (Component_Associations (List));
23254               while Present (Item) loop
23255                  Check_Refined_Global_List
23256                    (List        => Expression (Item),
23257                     Global_Mode => Chars (First (Choices (Item))));
23258
23259                  Next (Item);
23260               end loop;
23261
23262            --  Invalid tree
23263
23264            else
23265               raise Program_Error;
23266            end if;
23267
23268         --  Invalid list
23269
23270         else
23271            raise Program_Error;
23272         end if;
23273      end Check_Refined_Global_List;
23274
23275      -------------------------
23276      -- Present_Then_Remove --
23277      -------------------------
23278
23279      function Present_Then_Remove
23280        (List : Elist_Id;
23281         Item : Entity_Id) return Boolean
23282      is
23283         Elmt : Elmt_Id;
23284
23285      begin
23286         if Present (List) then
23287            Elmt := First_Elmt (List);
23288            while Present (Elmt) loop
23289               if Node (Elmt) = Item then
23290                  Remove_Elmt (List, Elmt);
23291                  return True;
23292               end if;
23293
23294               Next_Elmt (Elmt);
23295            end loop;
23296         end if;
23297
23298         return False;
23299      end Present_Then_Remove;
23300
23301      -------------------------------
23302      -- Report_Extra_Constituents --
23303      -------------------------------
23304
23305      procedure Report_Extra_Constituents is
23306         procedure Report_Extra_Constituents_In_List (List : Elist_Id);
23307         --  Emit an error for every element of List
23308
23309         ---------------------------------------
23310         -- Report_Extra_Constituents_In_List --
23311         ---------------------------------------
23312
23313         procedure Report_Extra_Constituents_In_List (List : Elist_Id) is
23314            Constit_Elmt : Elmt_Id;
23315
23316         begin
23317            if Present (List) then
23318               Constit_Elmt := First_Elmt (List);
23319               while Present (Constit_Elmt) loop
23320                  Error_Msg_NE ("extra constituent &", N, Node (Constit_Elmt));
23321                  Next_Elmt (Constit_Elmt);
23322               end loop;
23323            end if;
23324         end Report_Extra_Constituents_In_List;
23325
23326      --  Start of processing for Report_Extra_Constituents
23327
23328      begin
23329         Report_Extra_Constituents_In_List (In_Constits);
23330         Report_Extra_Constituents_In_List (In_Out_Constits);
23331         Report_Extra_Constituents_In_List (Out_Constits);
23332         Report_Extra_Constituents_In_List (Proof_In_Constits);
23333      end Report_Extra_Constituents;
23334
23335      --  Local variables
23336
23337      Body_Decl : constant Node_Id := Parent (N);
23338      Errors    : constant Nat     := Serious_Errors_Detected;
23339      Items     : constant Node_Id :=
23340                    Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
23341      Spec_Id   : constant Entity_Id := Corresponding_Spec (Body_Decl);
23342
23343   --  Start of processing for Analyze_Refined_Global_In_Decl_Part
23344
23345   begin
23346      --  Verify the syntax of pragma Refined_Global when SPARK checks are
23347      --  suppressed. Semantic analysis is disabled in this mode.
23348
23349      if SPARK_Mode = Off then
23350         Check_Global_List_Syntax (Items);
23351         return;
23352      end if;
23353
23354      Global := Get_Pragma (Spec_Id, Pragma_Global);
23355
23356      --  The subprogram declaration lacks pragma Global. This renders
23357      --  Refined_Global useless as there is nothing to refine.
23358
23359      if No (Global) then
23360         Error_Msg_NE
23361           ("useless refinement, declaration of subprogram & lacks aspect or "
23362            & "pragma Global", N, Spec_Id);
23363         return;
23364      end if;
23365
23366      --  Extract all relevant items from the corresponding Global pragma
23367
23368      Collect_Global_Items
23369        (Prag               => Global,
23370         In_Items           => In_Items,
23371         In_Out_Items       => In_Out_Items,
23372         Out_Items          => Out_Items,
23373         Proof_In_Items     => Proof_In_Items,
23374         Has_In_State       => Has_In_State,
23375         Has_In_Out_State   => Has_In_Out_State,
23376         Has_Out_State      => Has_Out_State,
23377         Has_Proof_In_State => Has_Proof_In_State,
23378         Has_Null_State     => Has_Null_State);
23379
23380      --  Corresponding Global pragma must mention at least one state witha
23381      --  visible refinement at the point Refined_Global is processed. States
23382      --  with null refinements need Refined_Global pragma (SPARK RM 7.2.4(2)).
23383
23384      if not Has_In_State
23385        and then not Has_In_Out_State
23386        and then not Has_Out_State
23387        and then not Has_Proof_In_State
23388        and then not Has_Null_State
23389      then
23390         Error_Msg_NE
23391           ("useless refinement, subprogram & does not depend on abstract "
23392            & "state with visible refinement", N, Spec_Id);
23393         return;
23394      end if;
23395
23396      --  The global refinement of inputs and outputs cannot be null when the
23397      --  corresponding Global pragma contains at least one item except in the
23398      --  case where we have states with null refinements.
23399
23400      if Nkind (Items) = N_Null
23401        and then
23402          (Present (In_Items)
23403            or else Present (In_Out_Items)
23404            or else Present (Out_Items)
23405            or else Present (Proof_In_Items))
23406        and then not Has_Null_State
23407      then
23408         Error_Msg_NE
23409           ("refinement cannot be null, subprogram & has global items",
23410            N, Spec_Id);
23411         return;
23412      end if;
23413
23414      --  Analyze Refined_Global as if it behaved as a regular pragma Global.
23415      --  This ensures that the categorization of all refined global items is
23416      --  consistent with their role.
23417
23418      Analyze_Global_In_Decl_Part (N);
23419
23420      --  Perform all refinement checks with respect to completeness and mode
23421      --  matching.
23422
23423      if Serious_Errors_Detected = Errors then
23424         Check_Refined_Global_List (Items);
23425      end if;
23426
23427      --  For Input states with visible refinement, at least one constituent
23428      --  must be used as an Input in the global refinement.
23429
23430      if Serious_Errors_Detected = Errors then
23431         Check_Input_States;
23432      end if;
23433
23434      --  Verify all possible completion variants for In_Out states with
23435      --  visible refinement.
23436
23437      if Serious_Errors_Detected = Errors then
23438         Check_In_Out_States;
23439      end if;
23440
23441      --  For Output states with visible refinement, all constituents must be
23442      --  used as Outputs in the global refinement.
23443
23444      if Serious_Errors_Detected = Errors then
23445         Check_Output_States;
23446      end if;
23447
23448      --  For Proof_In states with visible refinement, at least one constituent
23449      --  must be used as Proof_In in the global refinement.
23450
23451      if Serious_Errors_Detected = Errors then
23452         Check_Proof_In_States;
23453      end if;
23454
23455      --  Emit errors for all constituents that belong to other states with
23456      --  visible refinement that do not appear in Global.
23457
23458      if Serious_Errors_Detected = Errors then
23459         Report_Extra_Constituents;
23460      end if;
23461   end Analyze_Refined_Global_In_Decl_Part;
23462
23463   ----------------------------------------
23464   -- Analyze_Refined_State_In_Decl_Part --
23465   ----------------------------------------
23466
23467   procedure Analyze_Refined_State_In_Decl_Part (N : Node_Id) is
23468      Available_States : Elist_Id := No_Elist;
23469      --  A list of all abstract states defined in the package declaration that
23470      --  are available for refinement. The list is used to report unrefined
23471      --  states.
23472
23473      Body_Id : Entity_Id;
23474      --  The body entity of the package subject to pragma Refined_State
23475
23476      Body_States : Elist_Id := No_Elist;
23477      --  A list of all hidden states that appear in the body of the related
23478      --  package. The list is used to report unused hidden states.
23479
23480      Constituents_Seen : Elist_Id := No_Elist;
23481      --  A list that contains all constituents processed so far. The list is
23482      --  used to detect multiple uses of the same constituent.
23483
23484      Refined_States_Seen : Elist_Id := No_Elist;
23485      --  A list that contains all refined states processed so far. The list is
23486      --  used to detect duplicate refinements.
23487
23488      Spec_Id : Entity_Id;
23489      --  The spec entity of the package subject to pragma Refined_State
23490
23491      procedure Analyze_Refinement_Clause (Clause : Node_Id);
23492      --  Perform full analysis of a single refinement clause
23493
23494      procedure Check_Refinement_List_Syntax (List : Node_Id);
23495      --  Verify the syntax of refinement clause list List
23496
23497      function Collect_Body_States (Pack_Id : Entity_Id) return Elist_Id;
23498      --  Gather the entities of all abstract states and variables declared in
23499      --  the body state space of package Pack_Id.
23500
23501      procedure Report_Unrefined_States (States : Elist_Id);
23502      --  Emit errors for all unrefined abstract states found in list States
23503
23504      procedure Report_Unused_States (States : Elist_Id);
23505      --  Emit errors for all unused states found in list States
23506
23507      -------------------------------
23508      -- Analyze_Refinement_Clause --
23509      -------------------------------
23510
23511      procedure Analyze_Refinement_Clause (Clause : Node_Id) is
23512         AR_Constit : Entity_Id := Empty;
23513         AW_Constit : Entity_Id := Empty;
23514         ER_Constit : Entity_Id := Empty;
23515         EW_Constit : Entity_Id := Empty;
23516         --  The entities of external constituents that contain one of the
23517         --  following enabled properties: Async_Readers, Async_Writers,
23518         --  Effective_Reads and Effective_Writes.
23519
23520         External_Constit_Seen : Boolean := False;
23521         --  Flag used to mark when at least one external constituent is part
23522         --  of the state refinement.
23523
23524         Non_Null_Seen : Boolean := False;
23525         Null_Seen     : Boolean := False;
23526         --  Flags used to detect multiple uses of null in a single clause or a
23527         --  mixture of null and non-null constituents.
23528
23529         Part_Of_Constits : Elist_Id := No_Elist;
23530         --  A list of all candidate constituents subject to indicator Part_Of
23531         --  where the encapsulating state is the current state.
23532
23533         State    : Node_Id;
23534         State_Id : Entity_Id;
23535         --  The current state being refined
23536
23537         procedure Analyze_Constituent (Constit : Node_Id);
23538         --  Perform full analysis of a single constituent
23539
23540         procedure Check_External_Property
23541           (Prop_Nam : Name_Id;
23542            Enabled  : Boolean;
23543            Constit  : Entity_Id);
23544         --  Determine whether a property denoted by name Prop_Nam is present
23545         --  in both the refined state and constituent Constit. Flag Enabled
23546         --  should be set when the property applies to the refined state. If
23547         --  this is not the case, emit an error message.
23548
23549         procedure Check_Matching_State;
23550         --  Determine whether the state being refined appears in list
23551         --  Available_States. Emit an error when attempting to re-refine the
23552         --  state or when the state is not defined in the package declaration,
23553         --  otherwise remove the state from Available_States.
23554
23555         procedure Report_Unused_Constituents (Constits : Elist_Id);
23556         --  Emit errors for all unused Part_Of constituents in list Constits
23557
23558         -------------------------
23559         -- Analyze_Constituent --
23560         -------------------------
23561
23562         procedure Analyze_Constituent (Constit : Node_Id) is
23563            procedure Check_Matching_Constituent (Constit_Id : Entity_Id);
23564            --  Determine whether constituent Constit denoted by its entity
23565            --  Constit_Id appears in Hidden_States. Emit an error when the
23566            --  constituent is not a valid hidden state of the related package
23567            --  or when it is used more than once. Otherwise remove the
23568            --  constituent from Hidden_States.
23569
23570            --------------------------------
23571            -- Check_Matching_Constituent --
23572            --------------------------------
23573
23574            procedure Check_Matching_Constituent (Constit_Id : Entity_Id) is
23575               procedure Collect_Constituent;
23576               --  Add constituent Constit_Id to the refinements of State_Id
23577
23578               -------------------------
23579               -- Collect_Constituent --
23580               -------------------------
23581
23582               procedure Collect_Constituent is
23583               begin
23584                  --  Add the constituent to the list of processed items to aid
23585                  --  with the detection of duplicates.
23586
23587                  Add_Item (Constit_Id, Constituents_Seen);
23588
23589                  --  Collect the constituent in the list of refinement items
23590                  --  and establish a relation between the refined state and
23591                  --  the item.
23592
23593                  Append_Elmt (Constit_Id, Refinement_Constituents (State_Id));
23594                  Set_Encapsulating_State (Constit_Id, State_Id);
23595
23596                  --  The state has at least one legal constituent, mark the
23597                  --  start of the refinement region. The region ends when the
23598                  --  body declarations end (see routine Analyze_Declarations).
23599
23600                  Set_Has_Visible_Refinement (State_Id);
23601
23602                  --  When the constituent is external, save its relevant
23603                  --  property for further checks.
23604
23605                  if Async_Readers_Enabled (Constit_Id) then
23606                     AR_Constit := Constit_Id;
23607                     External_Constit_Seen := True;
23608                  end if;
23609
23610                  if Async_Writers_Enabled (Constit_Id) then
23611                     AW_Constit := Constit_Id;
23612                     External_Constit_Seen := True;
23613                  end if;
23614
23615                  if Effective_Reads_Enabled (Constit_Id) then
23616                     ER_Constit := Constit_Id;
23617                     External_Constit_Seen := True;
23618                  end if;
23619
23620                  if Effective_Writes_Enabled (Constit_Id) then
23621                     EW_Constit := Constit_Id;
23622                     External_Constit_Seen := True;
23623                  end if;
23624               end Collect_Constituent;
23625
23626               --  Local variables
23627
23628               State_Elmt : Elmt_Id;
23629
23630            --  Start of processing for Check_Matching_Constituent
23631
23632            begin
23633               --  Detect a duplicate use of a constituent
23634
23635               if Contains (Constituents_Seen, Constit_Id) then
23636                  Error_Msg_NE
23637                    ("duplicate use of constituent &", Constit, Constit_Id);
23638                  return;
23639               end if;
23640
23641               --  The constituent is subject to a Part_Of indicator
23642
23643               if Present (Encapsulating_State (Constit_Id)) then
23644                  if Encapsulating_State (Constit_Id) = State_Id then
23645                     Remove (Part_Of_Constits, Constit_Id);
23646                     Collect_Constituent;
23647
23648                  --  The constituent is part of another state and is used
23649                  --  incorrectly in the refinement of the current state.
23650
23651                  else
23652                     Error_Msg_Name_1 := Chars (State_Id);
23653                     Error_Msg_NE
23654                       ("& cannot act as constituent of state %",
23655                        Constit, Constit_Id);
23656                     Error_Msg_NE
23657                       ("\Part_Of indicator specifies & as encapsulating "
23658                        & "state", Constit, Encapsulating_State (Constit_Id));
23659                  end if;
23660
23661               --  The only other source of legal constituents is the body
23662               --  state space of the related package.
23663
23664               else
23665                  if Present (Body_States) then
23666                     State_Elmt := First_Elmt (Body_States);
23667                     while Present (State_Elmt) loop
23668
23669                        --  Consume a valid constituent to signal that it has
23670                        --  been encountered.
23671
23672                        if Node (State_Elmt) = Constit_Id then
23673                           Remove_Elmt (Body_States, State_Elmt);
23674                           Collect_Constituent;
23675                           return;
23676                        end if;
23677
23678                        Next_Elmt (State_Elmt);
23679                     end loop;
23680                  end if;
23681
23682                  --  If we get here, then the constituent is not a hidden
23683                  --  state of the related package and may not be used in a
23684                  --  refinement (SPARK RM 7.2.2(9)).
23685
23686                  Error_Msg_Name_1 := Chars (Spec_Id);
23687                  Error_Msg_NE
23688                    ("cannot use & in refinement, constituent is not a hidden "
23689                     & "state of package %", Constit, Constit_Id);
23690               end if;
23691            end Check_Matching_Constituent;
23692
23693            --  Local variables
23694
23695            Constit_Id : Entity_Id;
23696
23697         --  Start of processing for Analyze_Constituent
23698
23699         begin
23700            --  Detect multiple uses of null in a single refinement clause or a
23701            --  mixture of null and non-null constituents.
23702
23703            if Nkind (Constit) = N_Null then
23704               if Null_Seen then
23705                  Error_Msg_N
23706                    ("multiple null constituents not allowed", Constit);
23707
23708               elsif Non_Null_Seen then
23709                  Error_Msg_N
23710                    ("cannot mix null and non-null constituents", Constit);
23711
23712               else
23713                  Null_Seen := True;
23714
23715                  --  Collect the constituent in the list of refinement items
23716
23717                  Append_Elmt (Constit, Refinement_Constituents (State_Id));
23718
23719                  --  The state has at least one legal constituent, mark the
23720                  --  start of the refinement region. The region ends when the
23721                  --  body declarations end (see Analyze_Declarations).
23722
23723                  Set_Has_Visible_Refinement (State_Id);
23724               end if;
23725
23726            --  Non-null constituents
23727
23728            else
23729               Non_Null_Seen := True;
23730
23731               if Null_Seen then
23732                  Error_Msg_N
23733                    ("cannot mix null and non-null constituents", Constit);
23734               end if;
23735
23736               Analyze       (Constit);
23737               Resolve_State (Constit);
23738
23739               --  Ensure that the constituent denotes a valid state or a
23740               --  whole variable.
23741
23742               if Is_Entity_Name (Constit) then
23743                  Constit_Id := Entity_Of (Constit);
23744
23745                  if Ekind_In (Constit_Id, E_Abstract_State, E_Variable) then
23746                     Check_Matching_Constituent (Constit_Id);
23747
23748                  else
23749                     Error_Msg_NE
23750                       ("constituent & must denote a variable or state (SPARK "
23751                        & "RM 7.2.2(5))", Constit, Constit_Id);
23752                  end if;
23753
23754               --  The constituent is illegal
23755
23756               else
23757                  Error_Msg_N ("malformed constituent", Constit);
23758               end if;
23759            end if;
23760         end Analyze_Constituent;
23761
23762         -----------------------------
23763         -- Check_External_Property --
23764         -----------------------------
23765
23766         procedure Check_External_Property
23767           (Prop_Nam : Name_Id;
23768            Enabled  : Boolean;
23769            Constit  : Entity_Id)
23770         is
23771         begin
23772            Error_Msg_Name_1 := Prop_Nam;
23773
23774            --  The property is enabled in the related Abstract_State pragma
23775            --  that defines the state (SPARK RM 7.2.8(3)).
23776
23777            if Enabled then
23778               if No (Constit) then
23779                  Error_Msg_NE
23780                    ("external state & requires at least one constituent with "
23781                     & "property %", State, State_Id);
23782               end if;
23783
23784            --  The property is missing in the declaration of the state, but
23785            --  a constituent is introducing it in the state refinement
23786            --  (SPARK RM 7.2.8(3)).
23787
23788            elsif Present (Constit) then
23789               Error_Msg_Name_2 := Chars (Constit);
23790               Error_Msg_NE
23791                 ("external state & lacks property % set by constituent %",
23792                  State, State_Id);
23793            end if;
23794         end Check_External_Property;
23795
23796         --------------------------
23797         -- Check_Matching_State --
23798         --------------------------
23799
23800         procedure Check_Matching_State is
23801            State_Elmt : Elmt_Id;
23802
23803         begin
23804            --  Detect a duplicate refinement of a state (SPARK RM 7.2.2(8))
23805
23806            if Contains (Refined_States_Seen, State_Id) then
23807               Error_Msg_NE
23808                 ("duplicate refinement of state &", State, State_Id);
23809               return;
23810            end if;
23811
23812            --  Inspect the abstract states defined in the package declaration
23813            --  looking for a match.
23814
23815            State_Elmt := First_Elmt (Available_States);
23816            while Present (State_Elmt) loop
23817
23818               --  A valid abstract state is being refined in the body. Add
23819               --  the state to the list of processed refined states to aid
23820               --  with the detection of duplicate refinements. Remove the
23821               --  state from Available_States to signal that it has already
23822               --  been refined.
23823
23824               if Node (State_Elmt) = State_Id then
23825                  Add_Item (State_Id, Refined_States_Seen);
23826                  Remove_Elmt (Available_States, State_Elmt);
23827                  return;
23828               end if;
23829
23830               Next_Elmt (State_Elmt);
23831            end loop;
23832
23833            --  If we get here, we are refining a state that is not defined in
23834            --  the package declaration.
23835
23836            Error_Msg_Name_1 := Chars (Spec_Id);
23837            Error_Msg_NE
23838              ("cannot refine state, & is not defined in package %",
23839               State, State_Id);
23840         end Check_Matching_State;
23841
23842         --------------------------------
23843         -- Report_Unused_Constituents --
23844         --------------------------------
23845
23846         procedure Report_Unused_Constituents (Constits : Elist_Id) is
23847            Constit_Elmt : Elmt_Id;
23848            Constit_Id   : Entity_Id;
23849            Posted       : Boolean := False;
23850
23851         begin
23852            if Present (Constits) then
23853               Constit_Elmt := First_Elmt (Constits);
23854               while Present (Constit_Elmt) loop
23855                  Constit_Id := Node (Constit_Elmt);
23856
23857                  --  Generate an error message of the form:
23858
23859                  --    state ... has unused Part_Of constituents
23860                  --      abstract state ... defined at ...
23861                  --      variable ... defined at ...
23862
23863                  if not Posted then
23864                     Posted := True;
23865                     Error_Msg_NE
23866                       ("state & has unused Part_Of constituents",
23867                        State, State_Id);
23868                  end if;
23869
23870                  Error_Msg_Sloc := Sloc (Constit_Id);
23871
23872                  if Ekind (Constit_Id) = E_Abstract_State then
23873                     Error_Msg_NE
23874                       ("\abstract state & defined #", State, Constit_Id);
23875                  else
23876                     Error_Msg_NE
23877                       ("\variable & defined #", State, Constit_Id);
23878                  end if;
23879
23880                  Next_Elmt (Constit_Elmt);
23881               end loop;
23882            end if;
23883         end Report_Unused_Constituents;
23884
23885         --  Local declarations
23886
23887         Body_Ref      : Node_Id;
23888         Body_Ref_Elmt : Elmt_Id;
23889         Constit       : Node_Id;
23890         Extra_State   : Node_Id;
23891
23892      --  Start of processing for Analyze_Refinement_Clause
23893
23894      begin
23895         --  A refinement clause appears as a component association where the
23896         --  sole choice is the state and the expressions are the constituents.
23897
23898         if Nkind (Clause) /= N_Component_Association then
23899            Error_Msg_N ("malformed state refinement clause", Clause);
23900            return;
23901         end if;
23902
23903         --  Analyze the state name of a refinement clause
23904
23905         State := First (Choices (Clause));
23906
23907         Analyze       (State);
23908         Resolve_State (State);
23909
23910         --  Ensure that the state name denotes a valid abstract state that is
23911         --  defined in the spec of the related package.
23912
23913         if Is_Entity_Name (State) then
23914            State_Id := Entity_Of (State);
23915
23916            --  Catch any attempts to re-refine a state or refine a state that
23917            --  is not defined in the package declaration.
23918
23919            if Ekind (State_Id) = E_Abstract_State then
23920               Check_Matching_State;
23921            else
23922               Error_Msg_NE
23923                 ("& must denote an abstract state", State, State_Id);
23924               return;
23925            end if;
23926
23927            --  References to a state with visible refinement are illegal.
23928            --  When nested packages are involved, detecting such references is
23929            --  tricky because pragma Refined_State is analyzed later than the
23930            --  offending pragma Depends or Global. References that occur in
23931            --  such nested context are stored in a list. Emit errors for all
23932            --  references found in Body_References (SPARK RM 6.1.4(8)).
23933
23934            if Present (Body_References (State_Id)) then
23935               Body_Ref_Elmt := First_Elmt (Body_References (State_Id));
23936               while Present (Body_Ref_Elmt) loop
23937                  Body_Ref := Node (Body_Ref_Elmt);
23938
23939                  Error_Msg_N ("reference to & not allowed", Body_Ref);
23940                  Error_Msg_Sloc := Sloc (State);
23941                  Error_Msg_N ("\refinement of & is visible#", Body_Ref);
23942
23943                  Next_Elmt (Body_Ref_Elmt);
23944               end loop;
23945            end if;
23946
23947         --  The state name is illegal
23948
23949         else
23950            Error_Msg_N ("malformed state name in refinement clause", State);
23951            return;
23952         end if;
23953
23954         --  A refinement clause may only refine one state at a time
23955
23956         Extra_State := Next (State);
23957
23958         if Present (Extra_State) then
23959            Error_Msg_N
23960              ("refinement clause cannot cover multiple states", Extra_State);
23961         end if;
23962
23963         --  Replicate the Part_Of constituents of the refined state because
23964         --  the algorithm will consume items.
23965
23966         Part_Of_Constits := New_Copy_Elist (Part_Of_Constituents (State_Id));
23967
23968         --  Analyze all constituents of the refinement. Multiple constituents
23969         --  appear as an aggregate.
23970
23971         Constit := Expression (Clause);
23972
23973         if Nkind (Constit) = N_Aggregate then
23974            if Present (Component_Associations (Constit)) then
23975               Error_Msg_N
23976                 ("constituents of refinement clause must appear in "
23977                  & "positional form", Constit);
23978
23979            else pragma Assert (Present (Expressions (Constit)));
23980               Constit := First (Expressions (Constit));
23981               while Present (Constit) loop
23982                  Analyze_Constituent (Constit);
23983
23984                  Next (Constit);
23985               end loop;
23986            end if;
23987
23988         --  Various forms of a single constituent. Note that these may include
23989         --  malformed constituents.
23990
23991         else
23992            Analyze_Constituent (Constit);
23993         end if;
23994
23995         --  A refined external state is subject to special rules with respect
23996         --  to its properties and constituents.
23997
23998         if Is_External_State (State_Id) then
23999
24000            --  The set of properties that all external constituents yield must
24001            --  match that of the refined state. There are two cases to detect:
24002            --  the refined state lacks a property or has an extra property.
24003
24004            if External_Constit_Seen then
24005               Check_External_Property
24006                 (Prop_Nam => Name_Async_Readers,
24007                  Enabled  => Async_Readers_Enabled (State_Id),
24008                  Constit  => AR_Constit);
24009
24010               Check_External_Property
24011                 (Prop_Nam => Name_Async_Writers,
24012                  Enabled  => Async_Writers_Enabled (State_Id),
24013                  Constit  => AW_Constit);
24014
24015               Check_External_Property
24016                 (Prop_Nam => Name_Effective_Reads,
24017                  Enabled  => Effective_Reads_Enabled (State_Id),
24018                  Constit  => ER_Constit);
24019
24020               Check_External_Property
24021                 (Prop_Nam => Name_Effective_Writes,
24022                  Enabled  => Effective_Writes_Enabled (State_Id),
24023                  Constit  => EW_Constit);
24024
24025            --  An external state may be refined to null (SPARK RM 7.2.8(2))
24026
24027            elsif Null_Seen then
24028               null;
24029
24030            --  The external state has constituents, but none of them are
24031            --  external (SPARK RM 7.2.8(2)).
24032
24033            else
24034               Error_Msg_NE
24035                 ("external state & requires at least one external "
24036                  & "constituent or null refinement", State, State_Id);
24037            end if;
24038
24039         --  When a refined state is not external, it should not have external
24040         --  constituents (SPARK RM 7.2.8(1)).
24041
24042         elsif External_Constit_Seen then
24043            Error_Msg_NE
24044              ("non-external state & cannot contain external constituents in "
24045               & "refinement", State, State_Id);
24046         end if;
24047
24048         --  Ensure that all Part_Of candidate constituents have been mentioned
24049         --  in the refinement clause.
24050
24051         Report_Unused_Constituents (Part_Of_Constits);
24052      end Analyze_Refinement_Clause;
24053
24054      ----------------------------------
24055      -- Check_Refinement_List_Syntax --
24056      ----------------------------------
24057
24058      procedure Check_Refinement_List_Syntax (List : Node_Id) is
24059         procedure Check_Clause_Syntax (Clause : Node_Id);
24060         --  Verify the syntax of state refinement clause Clause
24061
24062         -------------------------
24063         -- Check_Clause_Syntax --
24064         -------------------------
24065
24066         procedure Check_Clause_Syntax (Clause : Node_Id) is
24067            Constits : constant Node_Id := Expression (Clause);
24068            Constit  : Node_Id;
24069
24070         begin
24071            --  State to be refined
24072
24073            Check_Item_Syntax (First (Choices (Clause)));
24074
24075            --  Multiple constituents
24076
24077            if Nkind (Constits) = N_Aggregate
24078              and then Present (Expressions (Constits))
24079            then
24080               Constit := First (Expressions (Constits));
24081               while Present (Constit) loop
24082                  Check_Item_Syntax (Constit);
24083                  Next (Constit);
24084               end loop;
24085
24086            --  Single constituent
24087
24088            else
24089               Check_Item_Syntax (Constits);
24090            end if;
24091         end Check_Clause_Syntax;
24092
24093         --  Local variables
24094
24095         Clause : Node_Id;
24096
24097      --  Start of processing for Check_Refinement_List_Syntax
24098
24099      begin
24100         --  Multiple state refinement clauses
24101
24102         if Nkind (List) = N_Aggregate
24103           and then Present (Component_Associations (List))
24104         then
24105            Clause := First (Component_Associations (List));
24106            while Present (Clause) loop
24107               Check_Clause_Syntax (Clause);
24108               Next (Clause);
24109            end loop;
24110
24111         --  Single state refinement clause
24112
24113         else
24114            Check_Clause_Syntax (List);
24115         end if;
24116      end Check_Refinement_List_Syntax;
24117
24118      -------------------------
24119      -- Collect_Body_States --
24120      -------------------------
24121
24122      function Collect_Body_States (Pack_Id : Entity_Id) return Elist_Id is
24123         Result : Elist_Id := No_Elist;
24124         --  A list containing all body states of Pack_Id
24125
24126         procedure Collect_Visible_States (Pack_Id : Entity_Id);
24127         --  Gather the entities of all abstract states and variables declared
24128         --  in the visible state space of package Pack_Id.
24129
24130         ----------------------------
24131         -- Collect_Visible_States --
24132         ----------------------------
24133
24134         procedure Collect_Visible_States (Pack_Id : Entity_Id) is
24135            Item_Id : Entity_Id;
24136
24137         begin
24138            --  Traverse the entity chain of the package and inspect all
24139            --  visible items.
24140
24141            Item_Id := First_Entity (Pack_Id);
24142            while Present (Item_Id) and then not In_Private_Part (Item_Id) loop
24143
24144               --  Do not consider internally generated items as those cannot
24145               --  be named and participate in refinement.
24146
24147               if not Comes_From_Source (Item_Id) then
24148                  null;
24149
24150               elsif Ekind_In (Item_Id, E_Abstract_State, E_Variable) then
24151                  Add_Item (Item_Id, Result);
24152
24153               --  Recursively gather the visible states of a nested package
24154
24155               elsif Ekind (Item_Id) = E_Package then
24156                  Collect_Visible_States (Item_Id);
24157               end if;
24158
24159               Next_Entity (Item_Id);
24160            end loop;
24161         end Collect_Visible_States;
24162
24163         --  Local variables
24164
24165         Pack_Body : constant Node_Id :=
24166                       Declaration_Node (Body_Entity (Pack_Id));
24167         Decl      : Node_Id;
24168         Item_Id   : Entity_Id;
24169
24170      --  Start of processing for Collect_Body_States
24171
24172      begin
24173         --  Inspect the declarations of the body looking for source variables,
24174         --  packages and package instantiations.
24175
24176         Decl := First (Declarations (Pack_Body));
24177         while Present (Decl) loop
24178            if Nkind (Decl) = N_Object_Declaration then
24179               Item_Id := Defining_Entity (Decl);
24180
24181               --  Capture source variables only as internally generated
24182               --  temporaries cannot be named and participate in refinement.
24183
24184               if Ekind (Item_Id) = E_Variable
24185                 and then Comes_From_Source (Item_Id)
24186               then
24187                  Add_Item (Item_Id, Result);
24188               end if;
24189
24190            elsif Nkind (Decl) = N_Package_Declaration then
24191               Item_Id := Defining_Entity (Decl);
24192
24193               --  Capture the visible abstract states and variables of a
24194               --  source package [instantiation].
24195
24196               if Comes_From_Source (Item_Id) then
24197                  Collect_Visible_States (Item_Id);
24198               end if;
24199            end if;
24200
24201            Next (Decl);
24202         end loop;
24203
24204         return Result;
24205      end Collect_Body_States;
24206
24207      -----------------------------
24208      -- Report_Unrefined_States --
24209      -----------------------------
24210
24211      procedure Report_Unrefined_States (States : Elist_Id) is
24212         State_Elmt : Elmt_Id;
24213
24214      begin
24215         if Present (States) then
24216            State_Elmt := First_Elmt (States);
24217            while Present (State_Elmt) loop
24218               Error_Msg_N
24219                 ("abstract state & must be refined", Node (State_Elmt));
24220
24221               Next_Elmt (State_Elmt);
24222            end loop;
24223         end if;
24224      end Report_Unrefined_States;
24225
24226      --------------------------
24227      -- Report_Unused_States --
24228      --------------------------
24229
24230      procedure Report_Unused_States (States : Elist_Id) is
24231         Posted     : Boolean := False;
24232         State_Elmt : Elmt_Id;
24233         State_Id   : Entity_Id;
24234
24235      begin
24236         if Present (States) then
24237            State_Elmt := First_Elmt (States);
24238            while Present (State_Elmt) loop
24239               State_Id := Node (State_Elmt);
24240
24241               --  Generate an error message of the form:
24242
24243               --    body of package ... has unused hidden states
24244               --      abstract state ... defined at ...
24245               --      variable ... defined at ...
24246
24247               if not Posted then
24248                  Posted := True;
24249                  Error_Msg_N
24250                    ("body of package & has unused hidden states", Body_Id);
24251               end if;
24252
24253               Error_Msg_Sloc := Sloc (State_Id);
24254
24255               if Ekind (State_Id) = E_Abstract_State then
24256                  Error_Msg_NE
24257                    ("\abstract state & defined #", Body_Id, State_Id);
24258               else
24259                  Error_Msg_NE
24260                    ("\variable & defined #", Body_Id, State_Id);
24261               end if;
24262
24263               Next_Elmt (State_Elmt);
24264            end loop;
24265         end if;
24266      end Report_Unused_States;
24267
24268      --  Local declarations
24269
24270      Body_Decl : constant Node_Id := Parent (N);
24271      Clauses   : constant Node_Id :=
24272                    Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
24273      Clause    : Node_Id;
24274
24275   --  Start of processing for Analyze_Refined_State_In_Decl_Part
24276
24277   begin
24278      Set_Analyzed (N);
24279
24280      --  Verify the syntax of pragma Refined_State when SPARK checks are
24281      --  suppressed. Semantic analysis is disabled in this mode.
24282
24283      if SPARK_Mode = Off then
24284         Check_Refinement_List_Syntax (Clauses);
24285         return;
24286      end if;
24287
24288      Body_Id := Defining_Entity (Body_Decl);
24289      Spec_Id := Corresponding_Spec (Body_Decl);
24290
24291      --  Replicate the abstract states declared by the package because the
24292      --  matching algorithm will consume states.
24293
24294      Available_States := New_Copy_Elist (Abstract_States (Spec_Id));
24295
24296      --  Gather all abstract states and variables declared in the visible
24297      --  state space of the package body. These items must be utilized as
24298      --  constituents in a state refinement.
24299
24300      Body_States := Collect_Body_States (Spec_Id);
24301
24302      --  Multiple non-null state refinements appear as an aggregate
24303
24304      if Nkind (Clauses) = N_Aggregate then
24305         if Present (Expressions (Clauses)) then
24306            Error_Msg_N
24307              ("state refinements must appear as component associations",
24308               Clauses);
24309
24310         else pragma Assert (Present (Component_Associations (Clauses)));
24311            Clause := First (Component_Associations (Clauses));
24312            while Present (Clause) loop
24313               Analyze_Refinement_Clause (Clause);
24314
24315               Next (Clause);
24316            end loop;
24317         end if;
24318
24319      --  Various forms of a single state refinement. Note that these may
24320      --  include malformed refinements.
24321
24322      else
24323         Analyze_Refinement_Clause (Clauses);
24324      end if;
24325
24326      --  List all abstract states that were left unrefined
24327
24328      Report_Unrefined_States (Available_States);
24329
24330      --  Ensure that all abstract states and variables declared in the body
24331      --  state space of the related package are utilized as constituents.
24332
24333      Report_Unused_States (Body_States);
24334   end Analyze_Refined_State_In_Decl_Part;
24335
24336   ------------------------------------
24337   -- Analyze_Test_Case_In_Decl_Part --
24338   ------------------------------------
24339
24340   procedure Analyze_Test_Case_In_Decl_Part (N : Node_Id; S : Entity_Id) is
24341   begin
24342      --  Install formals and push subprogram spec onto scope stack so that we
24343      --  can see the formals from the pragma.
24344
24345      Push_Scope (S);
24346      Install_Formals (S);
24347
24348      --  Preanalyze the boolean expressions, we treat these as spec
24349      --  expressions (i.e. similar to a default expression).
24350
24351      if Pragma_Name (N) = Name_Test_Case then
24352         Preanalyze_CTC_Args
24353           (N,
24354            Get_Requires_From_CTC_Pragma (N),
24355            Get_Ensures_From_CTC_Pragma (N));
24356      end if;
24357
24358      --  Remove the subprogram from the scope stack now that the pre-analysis
24359      --  of the expressions in the contract case or test case is done.
24360
24361      End_Scope;
24362   end Analyze_Test_Case_In_Decl_Part;
24363
24364   ----------------
24365   -- Appears_In --
24366   ----------------
24367
24368   function Appears_In (List : Elist_Id; Item_Id : Entity_Id) return Boolean is
24369      Elmt : Elmt_Id;
24370      Id   : Entity_Id;
24371
24372   begin
24373      if Present (List) then
24374         Elmt := First_Elmt (List);
24375         while Present (Elmt) loop
24376            if Nkind (Node (Elmt)) = N_Defining_Identifier then
24377               Id := Node (Elmt);
24378            else
24379               Id := Entity_Of (Node (Elmt));
24380            end if;
24381
24382            if Id = Item_Id then
24383               return True;
24384            end if;
24385
24386            Next_Elmt (Elmt);
24387         end loop;
24388      end if;
24389
24390      return False;
24391   end Appears_In;
24392
24393   -----------------------------
24394   -- Check_Applicable_Policy --
24395   -----------------------------
24396
24397   procedure Check_Applicable_Policy (N : Node_Id) is
24398      PP     : Node_Id;
24399      Policy : Name_Id;
24400
24401      Ename : constant Name_Id := Original_Aspect_Name (N);
24402
24403   begin
24404      --  No effect if not valid assertion kind name
24405
24406      if not Is_Valid_Assertion_Kind (Ename) then
24407         return;
24408      end if;
24409
24410      --  Loop through entries in check policy list
24411
24412      PP := Opt.Check_Policy_List;
24413      while Present (PP) loop
24414         declare
24415            PPA : constant List_Id := Pragma_Argument_Associations (PP);
24416            Pnm : constant Name_Id := Chars (Get_Pragma_Arg (First (PPA)));
24417
24418         begin
24419            if Ename = Pnm
24420              or else Pnm = Name_Assertion
24421              or else (Pnm = Name_Statement_Assertions
24422                        and then Nam_In (Ename, Name_Assert,
24423                                                Name_Assert_And_Cut,
24424                                                Name_Assume,
24425                                                Name_Loop_Invariant,
24426                                                Name_Loop_Variant))
24427            then
24428               Policy := Chars (Get_Pragma_Arg (Last (PPA)));
24429
24430               case Policy is
24431                  when Name_Off | Name_Ignore =>
24432                     Set_Is_Ignored (N, True);
24433                     Set_Is_Checked (N, False);
24434
24435                  when Name_On | Name_Check =>
24436                     Set_Is_Checked (N, True);
24437                     Set_Is_Ignored (N, False);
24438
24439                  when Name_Disable =>
24440                     Set_Is_Ignored  (N, True);
24441                     Set_Is_Checked  (N, False);
24442                     Set_Is_Disabled (N, True);
24443
24444                  --  That should be exhaustive, the null here is a defence
24445                  --  against a malformed tree from previous errors.
24446
24447                  when others =>
24448                     null;
24449               end case;
24450
24451               return;
24452            end if;
24453
24454            PP := Next_Pragma (PP);
24455         end;
24456      end loop;
24457
24458      --  If there are no specific entries that matched, then we let the
24459      --  setting of assertions govern. Note that this provides the needed
24460      --  compatibility with the RM for the cases of assertion, invariant,
24461      --  precondition, predicate, and postcondition.
24462
24463      if Assertions_Enabled then
24464         Set_Is_Checked (N, True);
24465         Set_Is_Ignored (N, False);
24466      else
24467         Set_Is_Checked (N, False);
24468         Set_Is_Ignored (N, True);
24469      end if;
24470   end Check_Applicable_Policy;
24471
24472   ----------------------------------
24473   -- Check_Dependence_List_Syntax --
24474   ----------------------------------
24475
24476   procedure Check_Dependence_List_Syntax (List : Node_Id) is
24477      procedure Check_Clause_Syntax (Clause : Node_Id);
24478      --  Verify the syntax of a dependency clause Clause
24479
24480      -------------------------
24481      -- Check_Clause_Syntax --
24482      -------------------------
24483
24484      procedure Check_Clause_Syntax (Clause : Node_Id) is
24485         Input  : Node_Id;
24486         Inputs : Node_Id;
24487         Output : Node_Id;
24488
24489      begin
24490         --  Output items
24491
24492         Output := First (Choices (Clause));
24493         while Present (Output) loop
24494            Check_Item_Syntax (Output);
24495            Next (Output);
24496         end loop;
24497
24498         Inputs := Expression (Clause);
24499
24500         --  A self-dependency appears as operator "+"
24501
24502         if Nkind (Inputs) = N_Op_Plus then
24503            Inputs := Right_Opnd (Inputs);
24504         end if;
24505
24506         --  Input items
24507
24508         if Nkind (Inputs) = N_Aggregate then
24509            if Present (Expressions (Inputs)) then
24510               Input := First (Expressions (Inputs));
24511               while Present (Input) loop
24512                  Check_Item_Syntax (Input);
24513                  Next (Input);
24514               end loop;
24515
24516            else
24517               Error_Msg_N ("malformed input dependency list", Inputs);
24518            end if;
24519
24520         --  Single input item
24521
24522         else
24523            Check_Item_Syntax (Inputs);
24524         end if;
24525      end Check_Clause_Syntax;
24526
24527      --  Local variables
24528
24529      Clause : Node_Id;
24530
24531   --  Start of processing for Check_Dependence_List_Syntax
24532
24533   begin
24534      --  Null dependency relation
24535
24536      if Nkind (List) = N_Null then
24537         null;
24538
24539      --  Verify the syntax of a single or multiple dependency clauses
24540
24541      elsif Nkind (List) = N_Aggregate
24542        and then Present (Component_Associations (List))
24543      then
24544         Clause := First (Component_Associations (List));
24545         while Present (Clause) loop
24546            if Has_Extra_Parentheses (Clause) then
24547               null;
24548            else
24549               Check_Clause_Syntax (Clause);
24550            end if;
24551
24552            Next (Clause);
24553         end loop;
24554
24555      else
24556         Error_Msg_N ("malformed dependency relation", List);
24557      end if;
24558   end Check_Dependence_List_Syntax;
24559
24560   -------------------------------
24561   -- Check_External_Properties --
24562   -------------------------------
24563
24564   procedure Check_External_Properties
24565     (Item : Node_Id;
24566      AR   : Boolean;
24567      AW   : Boolean;
24568      ER   : Boolean;
24569      EW   : Boolean)
24570   is
24571   begin
24572      --  All properties enabled
24573
24574      if AR and AW and ER and EW then
24575         null;
24576
24577      --  Async_Readers + Effective_Writes
24578      --  Async_Readers + Async_Writers + Effective_Writes
24579
24580      elsif AR and EW and not ER then
24581         null;
24582
24583      --  Async_Writers + Effective_Reads
24584      --  Async_Readers + Async_Writers + Effective_Reads
24585
24586      elsif AW and ER and not EW then
24587         null;
24588
24589      --  Async_Readers + Async_Writers
24590
24591      elsif AR and AW and not ER and not EW then
24592         null;
24593
24594      --  Async_Readers
24595
24596      elsif AR and not AW and not ER and not EW then
24597         null;
24598
24599      --  Async_Writers
24600
24601      elsif AW and not AR and not ER and not EW then
24602         null;
24603
24604      else
24605         Error_Msg_N
24606           ("illegal combination of external properties (SPARK RM 7.1.2(6))",
24607            Item);
24608      end if;
24609   end Check_External_Properties;
24610
24611   ------------------------------
24612   -- Check_Global_List_Syntax --
24613   ------------------------------
24614
24615   procedure Check_Global_List_Syntax (List : Node_Id) is
24616      Assoc : Node_Id;
24617      Item  : Node_Id;
24618
24619   begin
24620      --  Null global list
24621
24622      if Nkind (List) = N_Null then
24623         null;
24624
24625      --  Single global item
24626
24627      elsif Nkind_In (List, N_Expanded_Name,
24628                            N_Identifier,
24629                            N_Selected_Component)
24630      then
24631         null;
24632
24633      elsif Nkind (List) = N_Aggregate then
24634
24635         --  Items in a simple global list
24636
24637         if Present (Expressions (List)) then
24638            Item := First (Expressions (List));
24639            while Present (Item) loop
24640               Check_Item_Syntax (Item);
24641               Next (Item);
24642            end loop;
24643
24644         --  Items in a moded global list
24645
24646         elsif Present (Component_Associations (List)) then
24647            Assoc := First (Component_Associations (List));
24648            while Present (Assoc) loop
24649               Check_Item_Syntax (First (Choices (Assoc)));
24650               Check_Global_List_Syntax (Expression (Assoc));
24651
24652               Next (Assoc);
24653            end loop;
24654         end if;
24655
24656      --  Anything else is an error
24657
24658      else
24659         Error_Msg_N ("malformed global list", List);
24660      end if;
24661   end Check_Global_List_Syntax;
24662
24663   -----------------------
24664   -- Check_Item_Syntax --
24665   -----------------------
24666
24667   procedure Check_Item_Syntax (Item : Node_Id) is
24668   begin
24669      --  Null can appear in various annotation lists to denote a missing or
24670      --  optional relation.
24671
24672      if Nkind (Item) = N_Null then
24673         null;
24674
24675      --  Formal parameter, state or variable nodes
24676
24677      elsif Nkind_In (Item, N_Expanded_Name,
24678                            N_Identifier,
24679                            N_Selected_Component)
24680      then
24681         null;
24682
24683      --  Attribute 'Result can appear in annotations to denote the outcome of
24684      --  a function call.
24685
24686      elsif Is_Attribute_Result (Item) then
24687         null;
24688
24689      --  Any other node cannot possibly denote a legal SPARK item
24690
24691      else
24692         Error_Msg_N ("malformed item", Item);
24693      end if;
24694   end Check_Item_Syntax;
24695
24696   ----------------
24697   -- Check_Kind --
24698   ----------------
24699
24700   function Check_Kind (Nam : Name_Id) return Name_Id is
24701      PP : Node_Id;
24702
24703   begin
24704      --  Loop through entries in check policy list
24705
24706      PP := Opt.Check_Policy_List;
24707      while Present (PP) loop
24708         declare
24709            PPA : constant List_Id := Pragma_Argument_Associations (PP);
24710            Pnm : constant Name_Id := Chars (Get_Pragma_Arg (First (PPA)));
24711
24712         begin
24713            if Nam = Pnm
24714              or else (Pnm = Name_Assertion
24715                        and then Is_Valid_Assertion_Kind (Nam))
24716              or else (Pnm = Name_Statement_Assertions
24717                        and then Nam_In (Nam, Name_Assert,
24718                                              Name_Assert_And_Cut,
24719                                              Name_Assume,
24720                                              Name_Loop_Invariant,
24721                                              Name_Loop_Variant))
24722            then
24723               case (Chars (Get_Pragma_Arg (Last (PPA)))) is
24724                  when Name_On | Name_Check =>
24725                     return Name_Check;
24726                  when Name_Off | Name_Ignore =>
24727                     return Name_Ignore;
24728                  when Name_Disable =>
24729                     return Name_Disable;
24730                  when others =>
24731                     raise Program_Error;
24732               end case;
24733
24734            else
24735               PP := Next_Pragma (PP);
24736            end if;
24737         end;
24738      end loop;
24739
24740      --  If there are no specific entries that matched, then we let the
24741      --  setting of assertions govern. Note that this provides the needed
24742      --  compatibility with the RM for the cases of assertion, invariant,
24743      --  precondition, predicate, and postcondition.
24744
24745      if Assertions_Enabled then
24746         return Name_Check;
24747      else
24748         return Name_Ignore;
24749      end if;
24750   end Check_Kind;
24751
24752   ---------------------------
24753   -- Check_Missing_Part_Of --
24754   ---------------------------
24755
24756   procedure Check_Missing_Part_Of (Item_Id : Entity_Id) is
24757      function Has_Visible_State (Pack_Id : Entity_Id) return Boolean;
24758      --  Determine whether a package denoted by Pack_Id declares at least one
24759      --  visible state.
24760
24761      -----------------------
24762      -- Has_Visible_State --
24763      -----------------------
24764
24765      function Has_Visible_State (Pack_Id : Entity_Id) return Boolean is
24766         Item_Id : Entity_Id;
24767
24768      begin
24769         --  Traverse the entity chain of the package trying to find at least
24770         --  one visible abstract state, variable or a package [instantiation]
24771         --  that declares a visible state.
24772
24773         Item_Id := First_Entity (Pack_Id);
24774         while Present (Item_Id)
24775           and then not In_Private_Part (Item_Id)
24776         loop
24777            --  Do not consider internally generated items
24778
24779            if not Comes_From_Source (Item_Id) then
24780               null;
24781
24782            --  A visible state has been found
24783
24784            elsif Ekind_In (Item_Id, E_Abstract_State, E_Variable) then
24785               return True;
24786
24787            --  Recursively peek into nested packages and instantiations
24788
24789            elsif Ekind (Item_Id) = E_Package
24790              and then Has_Visible_State (Item_Id)
24791            then
24792               return True;
24793            end if;
24794
24795            Next_Entity (Item_Id);
24796         end loop;
24797
24798         return False;
24799      end Has_Visible_State;
24800
24801      --  Local variables
24802
24803      Pack_Id   : Entity_Id;
24804      Placement : State_Space_Kind;
24805
24806   --  Start of processing for Check_Missing_Part_Of
24807
24808   begin
24809      --  Do not consider internally generated entities as these can never
24810      --  have a Part_Of indicator.
24811
24812      if not Comes_From_Source (Item_Id) then
24813         return;
24814
24815      --  Perform these checks only when SPARK_Mode is enabled as they will
24816      --  interfere with standard Ada rules and produce false positives.
24817
24818      elsif SPARK_Mode /= On then
24819         return;
24820      end if;
24821
24822      --  Find where the abstract state, variable or package instantiation
24823      --  lives with respect to the state space.
24824
24825      Find_Placement_In_State_Space
24826        (Item_Id   => Item_Id,
24827         Placement => Placement,
24828         Pack_Id   => Pack_Id);
24829
24830      --  Items that appear in a non-package construct (subprogram, block, etc)
24831      --  do not require a Part_Of indicator because they can never act as a
24832      --  hidden state.
24833
24834      if Placement = Not_In_Package then
24835         null;
24836
24837      --  An item declared in the body state space of a package always act as a
24838      --  constituent and does not need explicit Part_Of indicator.
24839
24840      elsif Placement = Body_State_Space then
24841         null;
24842
24843      --  In general an item declared in the visible state space of a package
24844      --  does not require a Part_Of indicator. The only exception is when the
24845      --  related package is a private child unit in which case Part_Of must
24846      --  denote a state in the parent unit or in one of its descendants.
24847
24848      elsif Placement = Visible_State_Space then
24849         if Is_Child_Unit (Pack_Id)
24850           and then Is_Private_Descendant (Pack_Id)
24851         then
24852            --  A package instantiation does not need a Part_Of indicator when
24853            --  the related generic template has no visible state.
24854
24855            if Ekind (Item_Id) = E_Package
24856              and then Is_Generic_Instance (Item_Id)
24857              and then not Has_Visible_State (Item_Id)
24858            then
24859               null;
24860
24861            --  All other cases require Part_Of
24862
24863            else
24864               Error_Msg_N
24865                 ("indicator Part_Of is required in this context "
24866                  & "(SPARK RM 7.2.6(3))", Item_Id);
24867               Error_Msg_Name_1 := Chars (Pack_Id);
24868               Error_Msg_N
24869                 ("\& is declared in the visible part of private child "
24870                  & "unit %", Item_Id);
24871            end if;
24872         end if;
24873
24874      --  When the item appears in the private state space of a packge, it must
24875      --  be a part of some state declared by the said package.
24876
24877      else pragma Assert (Placement = Private_State_Space);
24878
24879         --  The related package does not declare a state, the item cannot act
24880         --  as a Part_Of constituent.
24881
24882         if No (Get_Pragma (Pack_Id, Pragma_Abstract_State)) then
24883            null;
24884
24885         --  A package instantiation does not need a Part_Of indicator when the
24886         --  related generic template has no visible state.
24887
24888         elsif Ekind (Pack_Id) = E_Package
24889           and then Is_Generic_Instance (Pack_Id)
24890           and then not Has_Visible_State (Pack_Id)
24891         then
24892            null;
24893
24894         --  All other cases require Part_Of
24895
24896         else
24897            Error_Msg_N
24898              ("indicator Part_Of is required in this context "
24899               & "(SPARK RM 7.2.6(2))", Item_Id);
24900            Error_Msg_Name_1 := Chars (Pack_Id);
24901            Error_Msg_N
24902              ("\& is declared in the private part of package %", Item_Id);
24903         end if;
24904      end if;
24905   end Check_Missing_Part_Of;
24906
24907   ---------------------------------
24908   -- Check_SPARK_Aspect_For_ASIS --
24909   ---------------------------------
24910
24911   procedure Check_SPARK_Aspect_For_ASIS (N : Node_Id) is
24912      Expr : Node_Id;
24913
24914   begin
24915      if ASIS_Mode and then From_Aspect_Specification (N) then
24916         Expr := Expression (Corresponding_Aspect (N));
24917         if Nkind (Expr) /= N_Aggregate then
24918            Preanalyze_And_Resolve (Expr);
24919
24920         else
24921            declare
24922               Comps : constant List_Id := Component_Associations (Expr);
24923               Exprs : constant List_Id := Expressions (Expr);
24924               C     : Node_Id;
24925               E     : Node_Id;
24926
24927            begin
24928               E := First (Exprs);
24929               while Present (E) loop
24930                  Analyze (E);
24931                  Next (E);
24932               end loop;
24933
24934               C := First (Comps);
24935               while Present (C) loop
24936                  Analyze (Expression (C));
24937                  Next (C);
24938               end loop;
24939            end;
24940         end if;
24941      end if;
24942   end Check_SPARK_Aspect_For_ASIS;
24943
24944   -------------------------------------
24945   -- Check_State_And_Constituent_Use --
24946   -------------------------------------
24947
24948   procedure Check_State_And_Constituent_Use
24949     (States   : Elist_Id;
24950      Constits : Elist_Id;
24951      Context  : Node_Id)
24952   is
24953      function Find_Encapsulating_State
24954        (Constit_Id : Entity_Id) return Entity_Id;
24955      --  Given the entity of a constituent, try to find a corresponding
24956      --  encapsulating state that appears in the same context. The routine
24957      --  returns Empty is no such state is found.
24958
24959      ------------------------------
24960      -- Find_Encapsulating_State --
24961      ------------------------------
24962
24963      function Find_Encapsulating_State
24964        (Constit_Id : Entity_Id) return Entity_Id
24965      is
24966         State_Id : Entity_Id;
24967
24968      begin
24969         --  Since a constituent may be part of a larger constituent set, climb
24970         --  the encapsulated state chain looking for a state that appears in
24971         --  the same context.
24972
24973         State_Id := Encapsulating_State (Constit_Id);
24974         while Present (State_Id) loop
24975            if Contains (States, State_Id) then
24976               return State_Id;
24977            end if;
24978
24979            State_Id := Encapsulating_State (State_Id);
24980         end loop;
24981
24982         return Empty;
24983      end Find_Encapsulating_State;
24984
24985      --  Local variables
24986
24987      Constit_Elmt : Elmt_Id;
24988      Constit_Id   : Entity_Id;
24989      State_Id     : Entity_Id;
24990
24991   --  Start of processing for Check_State_And_Constituent_Use
24992
24993   begin
24994      --  Nothing to do if there are no states or constituents
24995
24996      if No (States) or else No (Constits) then
24997         return;
24998      end if;
24999
25000      --  Inspect the list of constituents and try to determine whether its
25001      --  encapsulating state is in list States.
25002
25003      Constit_Elmt := First_Elmt (Constits);
25004      while Present (Constit_Elmt) loop
25005         Constit_Id := Node (Constit_Elmt);
25006
25007         --  Determine whether the constituent is part of an encapsulating
25008         --  state that appears in the same context and if this is the case,
25009         --  emit an error (SPARK RM 7.2.6(7)).
25010
25011         State_Id := Find_Encapsulating_State (Constit_Id);
25012
25013         if Present (State_Id) then
25014            Error_Msg_Name_1 := Chars (Constit_Id);
25015            Error_Msg_NE
25016              ("cannot mention state & and its constituent % in the same "
25017               & "context", Context, State_Id);
25018            exit;
25019         end if;
25020
25021         Next_Elmt (Constit_Elmt);
25022      end loop;
25023   end Check_State_And_Constituent_Use;
25024
25025   --------------------------
25026   -- Collect_Global_Items --
25027   --------------------------
25028
25029   procedure Collect_Global_Items
25030     (Prag               : Node_Id;
25031      In_Items           : in out Elist_Id;
25032      In_Out_Items       : in out Elist_Id;
25033      Out_Items          : in out Elist_Id;
25034      Proof_In_Items     : in out Elist_Id;
25035      Has_In_State       : out Boolean;
25036      Has_In_Out_State   : out Boolean;
25037      Has_Out_State      : out Boolean;
25038      Has_Proof_In_State : out Boolean;
25039      Has_Null_State     : out Boolean)
25040   is
25041      procedure Process_Global_List
25042        (List : Node_Id;
25043         Mode : Name_Id := Name_Input);
25044      --  Collect all items housed in a global list. Formal Mode denotes the
25045      --  current mode in effect.
25046
25047      -------------------------
25048      -- Process_Global_List --
25049      -------------------------
25050
25051      procedure Process_Global_List
25052        (List : Node_Id;
25053         Mode : Name_Id := Name_Input)
25054      is
25055         procedure Process_Global_Item (Item : Node_Id; Mode : Name_Id);
25056         --  Add a single item to the appropriate list. Formal Mode denotes the
25057         --  current mode in effect.
25058
25059         -------------------------
25060         -- Process_Global_Item --
25061         -------------------------
25062
25063         procedure Process_Global_Item (Item : Node_Id; Mode : Name_Id) is
25064            Item_Id : constant Entity_Id := Available_View (Entity_Of (Item));
25065            --  The above handles abstract views of variables and states built
25066            --  for limited with clauses.
25067
25068         begin
25069            --  Signal that the global list contains at least one abstract
25070            --  state with a visible refinement. Note that the refinement may
25071            --  be null in which case there are no constituents.
25072
25073            if Ekind (Item_Id) = E_Abstract_State then
25074               if Has_Null_Refinement (Item_Id) then
25075                  Has_Null_State := True;
25076
25077               elsif Has_Non_Null_Refinement (Item_Id) then
25078                  if Mode = Name_Input then
25079                     Has_In_State := True;
25080                  elsif Mode = Name_In_Out then
25081                     Has_In_Out_State := True;
25082                  elsif Mode = Name_Output then
25083                     Has_Out_State := True;
25084                  elsif Mode = Name_Proof_In then
25085                     Has_Proof_In_State := True;
25086                  end if;
25087               end if;
25088            end if;
25089
25090            --  Add the item to the proper list
25091
25092            if Mode = Name_Input then
25093               Add_Item (Item_Id, In_Items);
25094            elsif Mode = Name_In_Out then
25095               Add_Item (Item_Id, In_Out_Items);
25096            elsif Mode = Name_Output then
25097               Add_Item (Item_Id, Out_Items);
25098            elsif Mode = Name_Proof_In then
25099               Add_Item (Item_Id, Proof_In_Items);
25100            end if;
25101         end Process_Global_Item;
25102
25103         --  Local variables
25104
25105         Item : Node_Id;
25106
25107      --  Start of processing for Process_Global_List
25108
25109      begin
25110         if Nkind (List) = N_Null then
25111            null;
25112
25113         --  Single global item declaration
25114
25115         elsif Nkind_In (List, N_Expanded_Name,
25116                               N_Identifier,
25117                               N_Selected_Component)
25118         then
25119            Process_Global_Item (List, Mode);
25120
25121         --  Single global list or moded global list declaration
25122
25123         elsif Nkind (List) = N_Aggregate then
25124
25125            --  The declaration of a simple global list appear as a collection
25126            --  of expressions.
25127
25128            if Present (Expressions (List)) then
25129               Item := First (Expressions (List));
25130               while Present (Item) loop
25131                  Process_Global_Item (Item, Mode);
25132
25133                  Next (Item);
25134               end loop;
25135
25136            --  The declaration of a moded global list appears as a collection
25137            --  of component associations where individual choices denote mode.
25138
25139            elsif Present (Component_Associations (List)) then
25140               Item := First (Component_Associations (List));
25141               while Present (Item) loop
25142                  Process_Global_List
25143                    (List => Expression (Item),
25144                     Mode => Chars (First (Choices (Item))));
25145
25146                  Next (Item);
25147               end loop;
25148
25149            --  Invalid tree
25150
25151            else
25152               raise Program_Error;
25153            end if;
25154
25155         --  Invalid list
25156
25157         else
25158            raise Program_Error;
25159         end if;
25160      end Process_Global_List;
25161
25162      --  Local variables
25163
25164      Items : constant Node_Id :=
25165                Get_Pragma_Arg (First (Pragma_Argument_Associations (Prag)));
25166
25167   --  Start of processing for Collect_Global_Items
25168
25169   begin
25170      --  Assume that no states have been encountered
25171
25172      Has_In_State       := False;
25173      Has_In_Out_State   := False;
25174      Has_Out_State      := False;
25175      Has_Proof_In_State := False;
25176      Has_Null_State     := False;
25177
25178      Process_Global_List (Items);
25179   end Collect_Global_Items;
25180
25181   ---------------------------------------
25182   -- Collect_Subprogram_Inputs_Outputs --
25183   ---------------------------------------
25184
25185   procedure Collect_Subprogram_Inputs_Outputs
25186     (Subp_Id      : Entity_Id;
25187      Subp_Inputs  : in out Elist_Id;
25188      Subp_Outputs : in out Elist_Id;
25189      Global_Seen  : out Boolean)
25190   is
25191      procedure Collect_Global_List
25192        (List : Node_Id;
25193         Mode : Name_Id := Name_Input);
25194      --  Collect all relevant items from a global list
25195
25196      -------------------------
25197      -- Collect_Global_List --
25198      -------------------------
25199
25200      procedure Collect_Global_List
25201        (List : Node_Id;
25202         Mode : Name_Id := Name_Input)
25203      is
25204         procedure Collect_Global_Item (Item : Node_Id; Mode : Name_Id);
25205         --  Add an item to the proper subprogram input or output collection
25206
25207         -------------------------
25208         -- Collect_Global_Item --
25209         -------------------------
25210
25211         procedure Collect_Global_Item (Item : Node_Id; Mode : Name_Id) is
25212         begin
25213            if Nam_In (Mode, Name_In_Out, Name_Input) then
25214               Add_Item (Item, Subp_Inputs);
25215            end if;
25216
25217            if Nam_In (Mode, Name_In_Out, Name_Output) then
25218               Add_Item (Item, Subp_Outputs);
25219            end if;
25220         end Collect_Global_Item;
25221
25222         --  Local variables
25223
25224         Assoc : Node_Id;
25225         Item  : Node_Id;
25226
25227      --  Start of processing for Collect_Global_List
25228
25229      begin
25230         if Nkind (List) = N_Null then
25231            null;
25232
25233         --  Single global item declaration
25234
25235         elsif Nkind_In (List, N_Expanded_Name,
25236                               N_Identifier,
25237                               N_Selected_Component)
25238         then
25239            Collect_Global_Item (List, Mode);
25240
25241         --  Simple global list or moded global list declaration
25242
25243         elsif Nkind (List) = N_Aggregate then
25244            if Present (Expressions (List)) then
25245               Item := First (Expressions (List));
25246               while Present (Item) loop
25247                  Collect_Global_Item (Item, Mode);
25248                  Next (Item);
25249               end loop;
25250
25251            else
25252               Assoc := First (Component_Associations (List));
25253               while Present (Assoc) loop
25254                  Collect_Global_List
25255                    (List => Expression (Assoc),
25256                     Mode => Chars (First (Choices (Assoc))));
25257                  Next (Assoc);
25258               end loop;
25259            end if;
25260
25261         --  Invalid list
25262
25263         else
25264            raise Program_Error;
25265         end if;
25266      end Collect_Global_List;
25267
25268      --  Local variables
25269
25270      Formal  : Entity_Id;
25271      Global  : Node_Id;
25272      List    : Node_Id;
25273      Spec_Id : Entity_Id;
25274
25275   --  Start of processing for Collect_Subprogram_Inputs_Outputs
25276
25277   begin
25278      Global_Seen := False;
25279
25280      --  Find the entity of the corresponding spec when processing a body
25281
25282      if Ekind (Subp_Id) = E_Subprogram_Body then
25283         Spec_Id := Corresponding_Spec (Parent (Parent (Subp_Id)));
25284      else
25285         Spec_Id := Subp_Id;
25286      end if;
25287
25288      --  Process all formal parameters
25289
25290      Formal := First_Formal (Spec_Id);
25291      while Present (Formal) loop
25292         if Ekind_In (Formal, E_In_Out_Parameter, E_In_Parameter) then
25293            Add_Item (Formal, Subp_Inputs);
25294         end if;
25295
25296         if Ekind_In (Formal, E_In_Out_Parameter, E_Out_Parameter) then
25297            Add_Item (Formal, Subp_Outputs);
25298
25299            --  Out parameters can act as inputs when the related type is
25300            --  tagged, unconstrained array, unconstrained record or record
25301            --  with unconstrained components.
25302
25303            if Ekind (Formal) = E_Out_Parameter
25304              and then Is_Unconstrained_Or_Tagged_Item (Formal)
25305            then
25306               Add_Item (Formal, Subp_Inputs);
25307            end if;
25308         end if;
25309
25310         Next_Formal (Formal);
25311      end loop;
25312
25313      --  When processing a subprogram body, look for pragma Refined_Global as
25314      --  it provides finer granularity of inputs and outputs.
25315
25316      if Ekind (Subp_Id) = E_Subprogram_Body then
25317         Global := Get_Pragma (Subp_Id, Pragma_Refined_Global);
25318
25319      --  Subprogram declaration case, look for pragma Global
25320
25321      else
25322         Global := Get_Pragma (Spec_Id, Pragma_Global);
25323      end if;
25324
25325      if Present (Global) then
25326         Global_Seen := True;
25327         List := Expression (First (Pragma_Argument_Associations (Global)));
25328
25329         --  The pragma may not have been analyzed because of the arbitrary
25330         --  declaration order of aspects. Make sure that it is analyzed for
25331         --  the purposes of item extraction.
25332
25333         if not Analyzed (List) then
25334            if Pragma_Name (Global) = Name_Refined_Global then
25335               Analyze_Refined_Global_In_Decl_Part (Global);
25336            else
25337               Analyze_Global_In_Decl_Part (Global);
25338            end if;
25339         end if;
25340
25341         --  Nothing to be done for a null global list
25342
25343         if Nkind (List) /= N_Null then
25344            Collect_Global_List (List);
25345         end if;
25346      end if;
25347   end Collect_Subprogram_Inputs_Outputs;
25348
25349   ---------------------------------
25350   -- Delay_Config_Pragma_Analyze --
25351   ---------------------------------
25352
25353   function Delay_Config_Pragma_Analyze (N : Node_Id) return Boolean is
25354   begin
25355      return Nam_In (Pragma_Name (N), Name_Interrupt_State,
25356                                      Name_Priority_Specific_Dispatching);
25357   end Delay_Config_Pragma_Analyze;
25358
25359   -------------------------------------
25360   -- Find_Related_Subprogram_Or_Body --
25361   -------------------------------------
25362
25363   function Find_Related_Subprogram_Or_Body
25364     (Prag      : Node_Id;
25365      Do_Checks : Boolean := False) return Node_Id
25366   is
25367      Context : constant Node_Id := Parent (Prag);
25368      Nam     : constant Name_Id := Pragma_Name (Prag);
25369      Stmt    : Node_Id;
25370
25371      Look_For_Body : constant Boolean :=
25372                        Nam_In (Nam, Name_Refined_Depends,
25373                                     Name_Refined_Global,
25374                                     Name_Refined_Post);
25375      --  Refinement pragmas must be associated with a subprogram body [stub]
25376
25377   begin
25378      pragma Assert (Nkind (Prag) = N_Pragma);
25379
25380      --  If the pragma is a byproduct of aspect expansion, return the related
25381      --  context of the original aspect.
25382
25383      if Present (Corresponding_Aspect (Prag)) then
25384         return Parent (Corresponding_Aspect (Prag));
25385      end if;
25386
25387      --  Otherwise the pragma is a source construct, most likely part of a
25388      --  declarative list. Skip preceding declarations while looking for a
25389      --  proper subprogram declaration.
25390
25391      pragma Assert (Is_List_Member (Prag));
25392
25393      Stmt := Prev (Prag);
25394      while Present (Stmt) loop
25395
25396         --  Skip prior pragmas, but check for duplicates
25397
25398         if Nkind (Stmt) = N_Pragma then
25399            if Do_Checks and then Pragma_Name (Stmt) = Nam then
25400               Error_Msg_Name_1 := Nam;
25401               Error_Msg_Sloc   := Sloc (Stmt);
25402               Error_Msg_N ("pragma % duplicates pragma declared #", Prag);
25403            end if;
25404
25405         --  Emit an error when a refinement pragma appears on an expression
25406         --  function without a completion.
25407
25408         elsif Do_Checks
25409           and then Look_For_Body
25410           and then Nkind (Stmt) = N_Subprogram_Declaration
25411           and then Nkind (Original_Node (Stmt)) = N_Expression_Function
25412           and then not Has_Completion (Defining_Entity (Stmt))
25413         then
25414            Error_Msg_Name_1 := Nam;
25415            Error_Msg_N
25416              ("pragma % cannot apply to a stand alone expression function",
25417               Prag);
25418
25419            return Empty;
25420
25421         --  The refinement pragma applies to a subprogram body stub
25422
25423         elsif Look_For_Body
25424           and then Nkind (Stmt) = N_Subprogram_Body_Stub
25425         then
25426            return Stmt;
25427
25428         --  Skip internally generated code
25429
25430         elsif not Comes_From_Source (Stmt) then
25431            null;
25432
25433         --  Return the current construct which is either a subprogram body,
25434         --  a subprogram declaration or is illegal.
25435
25436         else
25437            return Stmt;
25438         end if;
25439
25440         Prev (Stmt);
25441      end loop;
25442
25443      --  If we fall through, then the pragma was either the first declaration
25444      --  or it was preceded by other pragmas and no source constructs.
25445
25446      --  The pragma is associated with a library-level subprogram
25447
25448      if Nkind (Context) = N_Compilation_Unit_Aux then
25449         return Unit (Parent (Context));
25450
25451      --  The pragma appears inside the declarative part of a subprogram body
25452
25453      elsif Nkind (Context) = N_Subprogram_Body then
25454         return Context;
25455
25456      --  No candidate subprogram [body] found
25457
25458      else
25459         return Empty;
25460      end if;
25461   end Find_Related_Subprogram_Or_Body;
25462
25463   -------------------------
25464   -- Get_Base_Subprogram --
25465   -------------------------
25466
25467   function Get_Base_Subprogram (Def_Id : Entity_Id) return Entity_Id is
25468      Result : Entity_Id;
25469
25470   begin
25471      --  Follow subprogram renaming chain
25472
25473      Result := Def_Id;
25474
25475      if Is_Subprogram (Result)
25476        and then
25477          Nkind (Parent (Declaration_Node (Result))) =
25478                                         N_Subprogram_Renaming_Declaration
25479        and then Present (Alias (Result))
25480      then
25481         Result := Alias (Result);
25482      end if;
25483
25484      return Result;
25485   end Get_Base_Subprogram;
25486
25487   -----------------------
25488   -- Get_SPARK_Mode_Type --
25489   -----------------------
25490
25491   function Get_SPARK_Mode_Type (N : Name_Id) return SPARK_Mode_Type is
25492   begin
25493      if N = Name_On then
25494         return On;
25495      elsif N = Name_Off then
25496         return Off;
25497
25498      --  Any other argument is erroneous
25499
25500      else
25501         raise Program_Error;
25502      end if;
25503   end Get_SPARK_Mode_Type;
25504
25505   --------------------------------
25506   -- Get_SPARK_Mode_From_Pragma --
25507   --------------------------------
25508
25509   function Get_SPARK_Mode_From_Pragma (N : Node_Id) return SPARK_Mode_Type is
25510      Args : List_Id;
25511      Mode : Node_Id;
25512
25513   begin
25514      pragma Assert (Nkind (N) = N_Pragma);
25515      Args := Pragma_Argument_Associations (N);
25516
25517      --  Extract the mode from the argument list
25518
25519      if Present (Args) then
25520         Mode := First (Pragma_Argument_Associations (N));
25521         return Get_SPARK_Mode_Type (Chars (Get_Pragma_Arg (Mode)));
25522
25523      --  If SPARK_Mode pragma has no argument, default is ON
25524
25525      else
25526         return On;
25527      end if;
25528   end Get_SPARK_Mode_From_Pragma;
25529
25530   ---------------------------
25531   -- Has_Extra_Parentheses --
25532   ---------------------------
25533
25534   function Has_Extra_Parentheses (Clause : Node_Id) return Boolean is
25535      Expr : Node_Id;
25536
25537   begin
25538      --  The aggregate should not have an expression list because a clause
25539      --  is always interpreted as a component association. The only way an
25540      --  expression list can sneak in is by adding extra parentheses around
25541      --  the individual clauses:
25542
25543      --    Depends  (Output => Input)   --  proper form
25544      --    Depends ((Output => Input))  --  extra parentheses
25545
25546      --  Since the extra parentheses are not allowed by the syntax of the
25547      --  pragma, flag them now to avoid emitting misleading errors down the
25548      --  line.
25549
25550      if Nkind (Clause) = N_Aggregate
25551        and then Present (Expressions (Clause))
25552      then
25553         Expr := First (Expressions (Clause));
25554         while Present (Expr) loop
25555
25556            --  A dependency clause surrounded by extra parentheses appears
25557            --  as an aggregate of component associations with an optional
25558            --  Paren_Count set.
25559
25560            if Nkind (Expr) = N_Aggregate
25561              and then Present (Component_Associations (Expr))
25562            then
25563               Error_Msg_N
25564                 ("dependency clause contains extra parentheses", Expr);
25565
25566            --  Otherwise the expression is a malformed construct
25567
25568            else
25569               Error_Msg_N ("malformed dependency clause", Expr);
25570            end if;
25571
25572            Next (Expr);
25573         end loop;
25574
25575         return True;
25576      end if;
25577
25578      return False;
25579   end Has_Extra_Parentheses;
25580
25581   ----------------
25582   -- Initialize --
25583   ----------------
25584
25585   procedure Initialize is
25586   begin
25587      Externals.Init;
25588   end Initialize;
25589
25590   -----------------------------
25591   -- Is_Config_Static_String --
25592   -----------------------------
25593
25594   function Is_Config_Static_String (Arg : Node_Id) return Boolean is
25595
25596      function Add_Config_Static_String (Arg : Node_Id) return Boolean;
25597      --  This is an internal recursive function that is just like the outer
25598      --  function except that it adds the string to the name buffer rather
25599      --  than placing the string in the name buffer.
25600
25601      ------------------------------
25602      -- Add_Config_Static_String --
25603      ------------------------------
25604
25605      function Add_Config_Static_String (Arg : Node_Id) return Boolean is
25606         N : Node_Id;
25607         C : Char_Code;
25608
25609      begin
25610         N := Arg;
25611
25612         if Nkind (N) = N_Op_Concat then
25613            if Add_Config_Static_String (Left_Opnd (N)) then
25614               N := Right_Opnd (N);
25615            else
25616               return False;
25617            end if;
25618         end if;
25619
25620         if Nkind (N) /= N_String_Literal then
25621            Error_Msg_N ("string literal expected for pragma argument", N);
25622            return False;
25623
25624         else
25625            for J in 1 .. String_Length (Strval (N)) loop
25626               C := Get_String_Char (Strval (N), J);
25627
25628               if not In_Character_Range (C) then
25629                  Error_Msg
25630                    ("string literal contains invalid wide character",
25631                     Sloc (N) + 1 + Source_Ptr (J));
25632                  return False;
25633               end if;
25634
25635               Add_Char_To_Name_Buffer (Get_Character (C));
25636            end loop;
25637         end if;
25638
25639         return True;
25640      end Add_Config_Static_String;
25641
25642   --  Start of processing for Is_Config_Static_String
25643
25644   begin
25645      Name_Len := 0;
25646
25647      return Add_Config_Static_String (Arg);
25648   end Is_Config_Static_String;
25649
25650   -------------------------------
25651   -- Is_Elaboration_SPARK_Mode --
25652   -------------------------------
25653
25654   function Is_Elaboration_SPARK_Mode (N : Node_Id) return Boolean is
25655   begin
25656      pragma Assert
25657        (Nkind (N) = N_Pragma
25658          and then Pragma_Name (N) = Name_SPARK_Mode
25659          and then Is_List_Member (N));
25660
25661      --  Pragma SPARK_Mode affects the elaboration of a package body when it
25662      --  appears in the statement part of the body.
25663
25664      return
25665         Present (Parent (N))
25666           and then Nkind (Parent (N)) = N_Handled_Sequence_Of_Statements
25667           and then List_Containing (N) = Statements (Parent (N))
25668           and then Present (Parent (Parent (N)))
25669           and then Nkind (Parent (Parent (N))) = N_Package_Body;
25670   end Is_Elaboration_SPARK_Mode;
25671
25672   -----------------------------------------
25673   -- Is_Non_Significant_Pragma_Reference --
25674   -----------------------------------------
25675
25676   --  This function makes use of the following static table which indicates
25677   --  whether appearance of some name in a given pragma is to be considered
25678   --  as a reference for the purposes of warnings about unreferenced objects.
25679
25680   --  -1  indicates that references in any argument position are significant
25681   --  0   indicates that appearance in any argument is not significant
25682   --  +n  indicates that appearance as argument n is significant, but all
25683   --      other arguments are not significant
25684   --  99  special processing required (e.g. for pragma Check)
25685
25686   Sig_Flags : constant array (Pragma_Id) of Int :=
25687     (Pragma_AST_Entry                      => -1,
25688      Pragma_Abort_Defer                    => -1,
25689      Pragma_Abstract_State                 => -1,
25690      Pragma_Ada_83                         => -1,
25691      Pragma_Ada_95                         => -1,
25692      Pragma_Ada_05                         => -1,
25693      Pragma_Ada_2005                       => -1,
25694      Pragma_Ada_12                         => -1,
25695      Pragma_Ada_2012                       => -1,
25696      Pragma_All_Calls_Remote               => -1,
25697      Pragma_Allow_Integer_Address          =>  0,
25698      Pragma_Annotate                       => -1,
25699      Pragma_Assert                         => -1,
25700      Pragma_Assert_And_Cut                 => -1,
25701      Pragma_Assertion_Policy               =>  0,
25702      Pragma_Assume                         => -1,
25703      Pragma_Assume_No_Invalid_Values       =>  0,
25704      Pragma_Async_Readers                  =>  0,
25705      Pragma_Async_Writers                  =>  0,
25706      Pragma_Asynchronous                   => -1,
25707      Pragma_Atomic                         =>  0,
25708      Pragma_Atomic_Components              =>  0,
25709      Pragma_Attach_Handler                 => -1,
25710      Pragma_Attribute_Definition           => +3,
25711      Pragma_Check                          => 99,
25712      Pragma_Check_Float_Overflow           =>  0,
25713      Pragma_Check_Name                     =>  0,
25714      Pragma_Check_Policy                   =>  0,
25715      Pragma_CIL_Constructor                => -1,
25716      Pragma_CPP_Class                      =>  0,
25717      Pragma_CPP_Constructor                =>  0,
25718      Pragma_CPP_Virtual                    =>  0,
25719      Pragma_CPP_Vtable                     =>  0,
25720      Pragma_CPU                            => -1,
25721      Pragma_C_Pass_By_Copy                 =>  0,
25722      Pragma_Comment                        =>  0,
25723      Pragma_Common_Object                  => -1,
25724      Pragma_Compile_Time_Error             => -1,
25725      Pragma_Compile_Time_Warning           => -1,
25726      Pragma_Compiler_Unit                  =>  0,
25727      Pragma_Compiler_Unit_Warning          =>  0,
25728      Pragma_Complete_Representation        =>  0,
25729      Pragma_Complex_Representation         =>  0,
25730      Pragma_Component_Alignment            => -1,
25731      Pragma_Contract_Cases                 => -1,
25732      Pragma_Controlled                     =>  0,
25733      Pragma_Convention                     =>  0,
25734      Pragma_Convention_Identifier          =>  0,
25735      Pragma_Debug                          => -1,
25736      Pragma_Debug_Policy                   =>  0,
25737      Pragma_Detect_Blocking                => -1,
25738      Pragma_Default_Storage_Pool           => -1,
25739      Pragma_Depends                        => -1,
25740      Pragma_Disable_Atomic_Synchronization => -1,
25741      Pragma_Discard_Names                  =>  0,
25742      Pragma_Dispatching_Domain             => -1,
25743      Pragma_Effective_Reads                =>  0,
25744      Pragma_Effective_Writes               =>  0,
25745      Pragma_Elaborate                      => -1,
25746      Pragma_Elaborate_All                  => -1,
25747      Pragma_Elaborate_Body                 => -1,
25748      Pragma_Elaboration_Checks             => -1,
25749      Pragma_Eliminate                      => -1,
25750      Pragma_Enable_Atomic_Synchronization  => -1,
25751      Pragma_Export                         => -1,
25752      Pragma_Export_Exception               => -1,
25753      Pragma_Export_Function                => -1,
25754      Pragma_Export_Object                  => -1,
25755      Pragma_Export_Procedure               => -1,
25756      Pragma_Export_Value                   => -1,
25757      Pragma_Export_Valued_Procedure        => -1,
25758      Pragma_Extend_System                  => -1,
25759      Pragma_Extensions_Allowed             => -1,
25760      Pragma_External                       => -1,
25761      Pragma_Favor_Top_Level                => -1,
25762      Pragma_External_Name_Casing           => -1,
25763      Pragma_Fast_Math                      => -1,
25764      Pragma_Finalize_Storage_Only          =>  0,
25765      Pragma_Float_Representation           =>  0,
25766      Pragma_Global                         => -1,
25767      Pragma_Ident                          => -1,
25768      Pragma_Implementation_Defined         => -1,
25769      Pragma_Implemented                    => -1,
25770      Pragma_Implicit_Packing               =>  0,
25771      Pragma_Import                         => +2,
25772      Pragma_Import_Exception               =>  0,
25773      Pragma_Import_Function                =>  0,
25774      Pragma_Import_Object                  =>  0,
25775      Pragma_Import_Procedure               =>  0,
25776      Pragma_Import_Valued_Procedure        =>  0,
25777      Pragma_Independent                    =>  0,
25778      Pragma_Independent_Components         =>  0,
25779      Pragma_Initial_Condition              => -1,
25780      Pragma_Initialize_Scalars             => -1,
25781      Pragma_Initializes                    => -1,
25782      Pragma_Inline                         =>  0,
25783      Pragma_Inline_Always                  =>  0,
25784      Pragma_Inline_Generic                 =>  0,
25785      Pragma_Inspection_Point               => -1,
25786      Pragma_Interface                      => +2,
25787      Pragma_Interface_Name                 => +2,
25788      Pragma_Interrupt_Handler              => -1,
25789      Pragma_Interrupt_Priority             => -1,
25790      Pragma_Interrupt_State                => -1,
25791      Pragma_Invariant                      => -1,
25792      Pragma_Java_Constructor               => -1,
25793      Pragma_Java_Interface                 => -1,
25794      Pragma_Keep_Names                     =>  0,
25795      Pragma_License                        => -1,
25796      Pragma_Link_With                      => -1,
25797      Pragma_Linker_Alias                   => -1,
25798      Pragma_Linker_Constructor             => -1,
25799      Pragma_Linker_Destructor              => -1,
25800      Pragma_Linker_Options                 => -1,
25801      Pragma_Linker_Section                 => -1,
25802      Pragma_List                           => -1,
25803      Pragma_Lock_Free                      => -1,
25804      Pragma_Locking_Policy                 => -1,
25805      Pragma_Long_Float                     => -1,
25806      Pragma_Loop_Invariant                 => -1,
25807      Pragma_Loop_Optimize                  => -1,
25808      Pragma_Loop_Variant                   => -1,
25809      Pragma_Machine_Attribute              => -1,
25810      Pragma_Main                           => -1,
25811      Pragma_Main_Storage                   => -1,
25812      Pragma_Memory_Size                    => -1,
25813      Pragma_No_Return                      =>  0,
25814      Pragma_No_Body                        =>  0,
25815      Pragma_No_Inline                      =>  0,
25816      Pragma_No_Run_Time                    => -1,
25817      Pragma_No_Strict_Aliasing             => -1,
25818      Pragma_Normalize_Scalars              => -1,
25819      Pragma_Obsolescent                    =>  0,
25820      Pragma_Optimize                       => -1,
25821      Pragma_Optimize_Alignment             => -1,
25822      Pragma_Overflow_Mode                  =>  0,
25823      Pragma_Overriding_Renamings           =>  0,
25824      Pragma_Ordered                        =>  0,
25825      Pragma_Pack                           =>  0,
25826      Pragma_Page                           => -1,
25827      Pragma_Part_Of                        => -1,
25828      Pragma_Partition_Elaboration_Policy   => -1,
25829      Pragma_Passive                        => -1,
25830      Pragma_Persistent_BSS                 =>  0,
25831      Pragma_Polling                        => -1,
25832      Pragma_Post                           => -1,
25833      Pragma_Postcondition                  => -1,
25834      Pragma_Post_Class                     => -1,
25835      Pragma_Pre                            => -1,
25836      Pragma_Precondition                   => -1,
25837      Pragma_Predicate                      => -1,
25838      Pragma_Preelaborable_Initialization   => -1,
25839      Pragma_Preelaborate                   => -1,
25840      Pragma_Preelaborate_05                => -1,
25841      Pragma_Pre_Class                      => -1,
25842      Pragma_Priority                       => -1,
25843      Pragma_Priority_Specific_Dispatching  => -1,
25844      Pragma_Profile                        =>  0,
25845      Pragma_Profile_Warnings               =>  0,
25846      Pragma_Propagate_Exceptions           => -1,
25847      Pragma_Provide_Shift_Operators        => -1,
25848      Pragma_Psect_Object                   => -1,
25849      Pragma_Pure                           => -1,
25850      Pragma_Pure_05                        => -1,
25851      Pragma_Pure_12                        => -1,
25852      Pragma_Pure_Function                  => -1,
25853      Pragma_Queuing_Policy                 => -1,
25854      Pragma_Rational                       => -1,
25855      Pragma_Ravenscar                      => -1,
25856      Pragma_Refined_Depends                => -1,
25857      Pragma_Refined_Global                 => -1,
25858      Pragma_Refined_Post                   => -1,
25859      Pragma_Refined_State                  => -1,
25860      Pragma_Relative_Deadline              => -1,
25861      Pragma_Remote_Access_Type             => -1,
25862      Pragma_Remote_Call_Interface          => -1,
25863      Pragma_Remote_Types                   => -1,
25864      Pragma_Restricted_Run_Time            => -1,
25865      Pragma_Restriction_Warnings           => -1,
25866      Pragma_Restrictions                   => -1,
25867      Pragma_Reviewable                     => -1,
25868      Pragma_Short_Circuit_And_Or           => -1,
25869      Pragma_Share_Generic                  => -1,
25870      Pragma_Shared                         => -1,
25871      Pragma_Shared_Passive                 => -1,
25872      Pragma_Short_Descriptors              =>  0,
25873      Pragma_Simple_Storage_Pool_Type       =>  0,
25874      Pragma_Source_File_Name               => -1,
25875      Pragma_Source_File_Name_Project       => -1,
25876      Pragma_Source_Reference               => -1,
25877      Pragma_SPARK_Mode                     =>  0,
25878      Pragma_Storage_Size                   => -1,
25879      Pragma_Storage_Unit                   => -1,
25880      Pragma_Static_Elaboration_Desired     => -1,
25881      Pragma_Stream_Convert                 => -1,
25882      Pragma_Style_Checks                   => -1,
25883      Pragma_Subtitle                       => -1,
25884      Pragma_Suppress                       =>  0,
25885      Pragma_Suppress_Exception_Locations   =>  0,
25886      Pragma_Suppress_All                   => -1,
25887      Pragma_Suppress_Debug_Info            =>  0,
25888      Pragma_Suppress_Initialization        =>  0,
25889      Pragma_System_Name                    => -1,
25890      Pragma_Task_Dispatching_Policy        => -1,
25891      Pragma_Task_Info                      => -1,
25892      Pragma_Task_Name                      => -1,
25893      Pragma_Task_Storage                   =>  0,
25894      Pragma_Test_Case                      => -1,
25895      Pragma_Thread_Local_Storage           =>  0,
25896      Pragma_Time_Slice                     => -1,
25897      Pragma_Title                          => -1,
25898      Pragma_Type_Invariant                 => -1,
25899      Pragma_Type_Invariant_Class           => -1,
25900      Pragma_Unchecked_Union                =>  0,
25901      Pragma_Unimplemented_Unit             => -1,
25902      Pragma_Universal_Aliasing             => -1,
25903      Pragma_Universal_Data                 => -1,
25904      Pragma_Unmodified                     => -1,
25905      Pragma_Unreferenced                   => -1,
25906      Pragma_Unreferenced_Objects           => -1,
25907      Pragma_Unreserve_All_Interrupts       => -1,
25908      Pragma_Unsuppress                     =>  0,
25909      Pragma_Use_VADS_Size                  => -1,
25910      Pragma_Validity_Checks                => -1,
25911      Pragma_Volatile                       =>  0,
25912      Pragma_Volatile_Components            =>  0,
25913      Pragma_Warning_As_Error               => -1,
25914      Pragma_Warnings                       => -1,
25915      Pragma_Weak_External                  => -1,
25916      Pragma_Wide_Character_Encoding        =>  0,
25917      Unknown_Pragma                        =>  0);
25918
25919   function Is_Non_Significant_Pragma_Reference (N : Node_Id) return Boolean is
25920      Id : Pragma_Id;
25921      P  : Node_Id;
25922      C  : Int;
25923      A  : Node_Id;
25924
25925   begin
25926      P := Parent (N);
25927
25928      if Nkind (P) /= N_Pragma_Argument_Association then
25929         return False;
25930
25931      else
25932         Id := Get_Pragma_Id (Parent (P));
25933         C := Sig_Flags (Id);
25934
25935         case C is
25936            when -1 =>
25937               return False;
25938
25939            when 0 =>
25940               return True;
25941
25942            when 99 =>
25943               case Id is
25944
25945                  --  For pragma Check, the first argument is not significant,
25946                  --  the second and the third (if present) arguments are
25947                  --  significant.
25948
25949                  when Pragma_Check =>
25950                     return
25951                       P = First (Pragma_Argument_Associations (Parent (P)));
25952
25953                  when others =>
25954                     raise Program_Error;
25955               end case;
25956
25957            when others =>
25958               A := First (Pragma_Argument_Associations (Parent (P)));
25959               for J in 1 .. C - 1 loop
25960                  if No (A) then
25961                     return False;
25962                  end if;
25963
25964                  Next (A);
25965               end loop;
25966
25967               return A = P; -- is this wrong way round ???
25968         end case;
25969      end if;
25970   end Is_Non_Significant_Pragma_Reference;
25971
25972   ------------------------------
25973   -- Is_Pragma_String_Literal --
25974   ------------------------------
25975
25976   --  This function returns true if the corresponding pragma argument is a
25977   --  static string expression. These are the only cases in which string
25978   --  literals can appear as pragma arguments. We also allow a string literal
25979   --  as the first argument to pragma Assert (although it will of course
25980   --  always generate a type error).
25981
25982   function Is_Pragma_String_Literal (Par : Node_Id) return Boolean is
25983      Pragn : constant Node_Id := Parent (Par);
25984      Assoc : constant List_Id := Pragma_Argument_Associations (Pragn);
25985      Pname : constant Name_Id := Pragma_Name (Pragn);
25986      Argn  : Natural;
25987      N     : Node_Id;
25988
25989   begin
25990      Argn := 1;
25991      N := First (Assoc);
25992      loop
25993         exit when N = Par;
25994         Argn := Argn + 1;
25995         Next (N);
25996      end loop;
25997
25998      if Pname = Name_Assert then
25999         return True;
26000
26001      elsif Pname = Name_Export then
26002         return Argn > 2;
26003
26004      elsif Pname = Name_Ident then
26005         return Argn = 1;
26006
26007      elsif Pname = Name_Import then
26008         return Argn > 2;
26009
26010      elsif Pname = Name_Interface_Name then
26011         return Argn > 1;
26012
26013      elsif Pname = Name_Linker_Alias then
26014         return Argn = 2;
26015
26016      elsif Pname = Name_Linker_Section then
26017         return Argn = 2;
26018
26019      elsif Pname = Name_Machine_Attribute then
26020         return Argn = 2;
26021
26022      elsif Pname = Name_Source_File_Name then
26023         return True;
26024
26025      elsif Pname = Name_Source_Reference then
26026         return Argn = 2;
26027
26028      elsif Pname = Name_Title then
26029         return True;
26030
26031      elsif Pname = Name_Subtitle then
26032         return True;
26033
26034      else
26035         return False;
26036      end if;
26037   end Is_Pragma_String_Literal;
26038
26039   ---------------------------
26040   -- Is_Private_SPARK_Mode --
26041   ---------------------------
26042
26043   function Is_Private_SPARK_Mode (N : Node_Id) return Boolean is
26044   begin
26045      pragma Assert
26046        (Nkind (N) = N_Pragma
26047          and then Pragma_Name (N) = Name_SPARK_Mode
26048          and then Is_List_Member (N));
26049
26050      --  For pragma SPARK_Mode to be private, it has to appear in the private
26051      --  declarations of a package.
26052
26053      return
26054        Present (Parent (N))
26055          and then Nkind (Parent (N)) = N_Package_Specification
26056          and then List_Containing (N) = Private_Declarations (Parent (N));
26057   end Is_Private_SPARK_Mode;
26058
26059   -------------------------------------
26060   -- Is_Unconstrained_Or_Tagged_Item --
26061   -------------------------------------
26062
26063   function Is_Unconstrained_Or_Tagged_Item
26064     (Item : Entity_Id) return Boolean
26065   is
26066      function Has_Unconstrained_Component (Typ : Entity_Id) return Boolean;
26067      --  Determine whether record type Typ has at least one unconstrained
26068      --  component.
26069
26070      ---------------------------------
26071      -- Has_Unconstrained_Component --
26072      ---------------------------------
26073
26074      function Has_Unconstrained_Component (Typ : Entity_Id) return Boolean is
26075         Comp : Entity_Id;
26076
26077      begin
26078         Comp := First_Component (Typ);
26079         while Present (Comp) loop
26080            if Is_Unconstrained_Or_Tagged_Item (Comp) then
26081               return True;
26082            end if;
26083
26084            Next_Component (Comp);
26085         end loop;
26086
26087         return False;
26088      end Has_Unconstrained_Component;
26089
26090      --  Local variables
26091
26092      Typ : constant Entity_Id := Etype (Item);
26093
26094   --  Start of processing for Is_Unconstrained_Or_Tagged_Item
26095
26096   begin
26097      if Is_Tagged_Type (Typ) then
26098         return True;
26099
26100      elsif Is_Array_Type (Typ) and then not Is_Constrained (Typ) then
26101         return True;
26102
26103      elsif Is_Record_Type (Typ) then
26104         if Has_Discriminants (Typ) and then not Is_Constrained (Typ) then
26105            return True;
26106         else
26107            return Has_Unconstrained_Component (Typ);
26108         end if;
26109
26110      else
26111         return False;
26112      end if;
26113   end Is_Unconstrained_Or_Tagged_Item;
26114
26115   -----------------------------
26116   -- Is_Valid_Assertion_Kind --
26117   -----------------------------
26118
26119   function Is_Valid_Assertion_Kind (Nam : Name_Id) return Boolean is
26120   begin
26121      case Nam is
26122         when
26123            --  RM defined
26124
26125            Name_Assert               |
26126            Name_Static_Predicate     |
26127            Name_Dynamic_Predicate    |
26128            Name_Pre                  |
26129            Name_uPre                 |
26130            Name_Post                 |
26131            Name_uPost                |
26132            Name_Type_Invariant       |
26133            Name_uType_Invariant      |
26134
26135            --  Impl defined
26136
26137            Name_Assert_And_Cut       |
26138            Name_Assume               |
26139            Name_Contract_Cases       |
26140            Name_Debug                |
26141            Name_Initial_Condition    |
26142            Name_Invariant            |
26143            Name_uInvariant           |
26144            Name_Loop_Invariant       |
26145            Name_Loop_Variant         |
26146            Name_Postcondition        |
26147            Name_Precondition         |
26148            Name_Predicate            |
26149            Name_Refined_Post         |
26150            Name_Statement_Assertions => return True;
26151
26152         when others                  => return False;
26153      end case;
26154   end Is_Valid_Assertion_Kind;
26155
26156   -----------------------------------------
26157   -- Make_Aspect_For_PPC_In_Gen_Sub_Decl --
26158   -----------------------------------------
26159
26160   procedure Make_Aspect_For_PPC_In_Gen_Sub_Decl (Decl : Node_Id) is
26161      Aspects : constant List_Id := New_List;
26162      Loc     : constant Source_Ptr := Sloc (Decl);
26163      Or_Decl : constant Node_Id := Original_Node (Decl);
26164
26165      Original_Aspects : List_Id;
26166      --  To capture global references, a copy of the created aspects must be
26167      --  inserted in the original tree.
26168
26169      Prag         : Node_Id;
26170      Prag_Arg_Ass : Node_Id;
26171      Prag_Id      : Pragma_Id;
26172
26173   begin
26174      --  Check for any PPC pragmas that appear within Decl
26175
26176      Prag := Next (Decl);
26177      while Nkind (Prag) = N_Pragma loop
26178         Prag_Id := Get_Pragma_Id (Chars (Pragma_Identifier (Prag)));
26179
26180         case Prag_Id is
26181            when Pragma_Postcondition | Pragma_Precondition =>
26182               Prag_Arg_Ass := First (Pragma_Argument_Associations (Prag));
26183
26184               --  Make an aspect from any PPC pragma
26185
26186               Append_To (Aspects,
26187                 Make_Aspect_Specification (Loc,
26188                   Identifier =>
26189                     Make_Identifier (Loc, Chars (Pragma_Identifier (Prag))),
26190                   Expression =>
26191                     Copy_Separate_Tree (Expression (Prag_Arg_Ass))));
26192
26193               --  Generate the analysis information in the pragma expression
26194               --  and then set the pragma node analyzed to avoid any further
26195               --  analysis.
26196
26197               Analyze (Expression (Prag_Arg_Ass));
26198               Set_Analyzed (Prag, True);
26199
26200            when others => null;
26201         end case;
26202
26203         Next (Prag);
26204      end loop;
26205
26206      --  Set all new aspects into the generic declaration node
26207
26208      if Is_Non_Empty_List (Aspects) then
26209
26210         --  Create the list of aspects to be inserted in the original tree
26211
26212         Original_Aspects := Copy_Separate_List (Aspects);
26213
26214         --  Check if Decl already has aspects
26215
26216         --  Attach the new lists of aspects to both the generic copy and the
26217         --  original tree.
26218
26219         if Has_Aspects (Decl) then
26220            Append_List (Aspects, Aspect_Specifications (Decl));
26221            Append_List (Original_Aspects, Aspect_Specifications (Or_Decl));
26222
26223         else
26224            Set_Parent (Aspects, Decl);
26225            Set_Aspect_Specifications (Decl, Aspects);
26226            Set_Parent (Original_Aspects, Or_Decl);
26227            Set_Aspect_Specifications (Or_Decl, Original_Aspects);
26228         end if;
26229      end if;
26230   end Make_Aspect_For_PPC_In_Gen_Sub_Decl;
26231
26232   -------------------------
26233   -- Preanalyze_CTC_Args --
26234   -------------------------
26235
26236   procedure Preanalyze_CTC_Args (N, Arg_Req, Arg_Ens : Node_Id) is
26237   begin
26238      --  Preanalyze the boolean expressions, we treat these as spec
26239      --  expressions (i.e. similar to a default expression).
26240
26241      if Present (Arg_Req) then
26242         Preanalyze_Assert_Expression
26243           (Get_Pragma_Arg (Arg_Req), Standard_Boolean);
26244
26245         --  In ASIS mode, for a pragma generated from a source aspect, also
26246         --  analyze the original aspect expression.
26247
26248         if ASIS_Mode and then Present (Corresponding_Aspect (N)) then
26249            Preanalyze_Assert_Expression
26250              (Original_Node (Get_Pragma_Arg (Arg_Req)), Standard_Boolean);
26251         end if;
26252      end if;
26253
26254      if Present (Arg_Ens) then
26255         Preanalyze_Assert_Expression
26256           (Get_Pragma_Arg (Arg_Ens), Standard_Boolean);
26257
26258         --  In ASIS mode, for a pragma generated from a source aspect, also
26259         --  analyze the original aspect expression.
26260
26261         if ASIS_Mode and then Present (Corresponding_Aspect (N)) then
26262            Preanalyze_Assert_Expression
26263              (Original_Node (Get_Pragma_Arg (Arg_Ens)), Standard_Boolean);
26264         end if;
26265      end if;
26266   end Preanalyze_CTC_Args;
26267
26268   --------------------------------------
26269   -- Process_Compilation_Unit_Pragmas --
26270   --------------------------------------
26271
26272   procedure Process_Compilation_Unit_Pragmas (N : Node_Id) is
26273   begin
26274      --  A special check for pragma Suppress_All, a very strange DEC pragma,
26275      --  strange because it comes at the end of the unit. Rational has the
26276      --  same name for a pragma, but treats it as a program unit pragma, In
26277      --  GNAT we just decide to allow it anywhere at all. If it appeared then
26278      --  the flag Has_Pragma_Suppress_All was set on the compilation unit
26279      --  node, and we insert a pragma Suppress (All_Checks) at the start of
26280      --  the context clause to ensure the correct processing.
26281
26282      if Has_Pragma_Suppress_All (N) then
26283         Prepend_To (Context_Items (N),
26284           Make_Pragma (Sloc (N),
26285             Chars                        => Name_Suppress,
26286             Pragma_Argument_Associations => New_List (
26287               Make_Pragma_Argument_Association (Sloc (N),
26288                 Expression => Make_Identifier (Sloc (N), Name_All_Checks)))));
26289      end if;
26290
26291      --  Nothing else to do at the current time
26292
26293   end Process_Compilation_Unit_Pragmas;
26294
26295   ------------------------------------
26296   -- Record_Possible_Body_Reference --
26297   ------------------------------------
26298
26299   procedure Record_Possible_Body_Reference
26300     (State_Id : Entity_Id;
26301      Ref      : Node_Id)
26302   is
26303      Context : Node_Id;
26304      Spec_Id : Entity_Id;
26305
26306   begin
26307      --  Ensure that we are dealing with a reference to a state
26308
26309      pragma Assert (Ekind (State_Id) = E_Abstract_State);
26310
26311      --  Climb the tree starting from the reference looking for a package body
26312      --  whose spec declares the referenced state. This criteria automatically
26313      --  excludes references in package specs which are legal. Note that it is
26314      --  not wise to emit an error now as the package body may lack pragma
26315      --  Refined_State or the referenced state may not be mentioned in the
26316      --  refinement. This approach avoids the generation of misleading errors.
26317
26318      Context := Ref;
26319      while Present (Context) loop
26320         if Nkind (Context) = N_Package_Body then
26321            Spec_Id := Corresponding_Spec (Context);
26322
26323            if Present (Abstract_States (Spec_Id))
26324              and then Contains (Abstract_States (Spec_Id), State_Id)
26325            then
26326               if No (Body_References (State_Id)) then
26327                  Set_Body_References (State_Id, New_Elmt_List);
26328               end if;
26329
26330               Append_Elmt (Ref, Body_References (State_Id));
26331               exit;
26332            end if;
26333         end if;
26334
26335         Context := Parent (Context);
26336      end loop;
26337   end Record_Possible_Body_Reference;
26338
26339   ------------------------------
26340   -- Relocate_Pragmas_To_Body --
26341   ------------------------------
26342
26343   procedure Relocate_Pragmas_To_Body
26344     (Subp_Body   : Node_Id;
26345      Target_Body : Node_Id := Empty)
26346   is
26347      procedure Relocate_Pragma (Prag : Node_Id);
26348      --  Remove a single pragma from its current list and add it to the
26349      --  declarations of the proper body (either Subp_Body or Target_Body).
26350
26351      ---------------------
26352      -- Relocate_Pragma --
26353      ---------------------
26354
26355      procedure Relocate_Pragma (Prag : Node_Id) is
26356         Decls  : List_Id;
26357         Target : Node_Id;
26358
26359      begin
26360         --  When subprogram stubs or expression functions are involves, the
26361         --  destination declaration list belongs to the proper body.
26362
26363         if Present (Target_Body) then
26364            Target := Target_Body;
26365         else
26366            Target := Subp_Body;
26367         end if;
26368
26369         Decls := Declarations (Target);
26370
26371         if No (Decls) then
26372            Decls := New_List;
26373            Set_Declarations (Target, Decls);
26374         end if;
26375
26376         --  Unhook the pragma from its current list
26377
26378         Remove  (Prag);
26379         Prepend (Prag, Decls);
26380      end Relocate_Pragma;
26381
26382      --  Local variables
26383
26384      Body_Id   : constant Entity_Id :=
26385                    Defining_Unit_Name (Specification (Subp_Body));
26386      Next_Stmt : Node_Id;
26387      Stmt      : Node_Id;
26388
26389   --  Start of processing for Relocate_Pragmas_To_Body
26390
26391   begin
26392      --  Do not process a body that comes from a separate unit as no construct
26393      --  can possibly follow it.
26394
26395      if not Is_List_Member (Subp_Body) then
26396         return;
26397
26398      --  Do not relocate pragmas that follow a stub if the stub does not have
26399      --  a proper body.
26400
26401      elsif Nkind (Subp_Body) = N_Subprogram_Body_Stub
26402        and then No (Target_Body)
26403      then
26404         return;
26405
26406      --  Do not process internally generated routine _Postconditions
26407
26408      elsif Ekind (Body_Id) = E_Procedure
26409        and then Chars (Body_Id) = Name_uPostconditions
26410      then
26411         return;
26412      end if;
26413
26414      --  Look at what is following the body. We are interested in certain kind
26415      --  of pragmas (either from source or byproducts of expansion) that can
26416      --  apply to a body [stub].
26417
26418      Stmt := Next (Subp_Body);
26419      while Present (Stmt) loop
26420
26421         --  Preserve the following statement for iteration purposes due to a
26422         --  possible relocation of a pragma.
26423
26424         Next_Stmt := Next (Stmt);
26425
26426         --  Move a candidate pragma following the body to the declarations of
26427         --  the body.
26428
26429         if Nkind (Stmt) = N_Pragma
26430           and then Pragma_On_Body_Or_Stub_OK (Get_Pragma_Id (Stmt))
26431         then
26432            Relocate_Pragma (Stmt);
26433
26434         --  Skip internally generated code
26435
26436         elsif not Comes_From_Source (Stmt) then
26437            null;
26438
26439         --  No candidate pragmas are available for relocation
26440
26441         else
26442            exit;
26443         end if;
26444
26445         Stmt := Next_Stmt;
26446      end loop;
26447   end Relocate_Pragmas_To_Body;
26448
26449   -------------------
26450   -- Resolve_State --
26451   -------------------
26452
26453   procedure Resolve_State (N : Node_Id) is
26454      Func  : Entity_Id;
26455      State : Entity_Id;
26456
26457   begin
26458      if Is_Entity_Name (N) and then Present (Entity (N)) then
26459         Func := Entity (N);
26460
26461         --  Handle overloading of state names by functions. Traverse the
26462         --  homonym chain looking for an abstract state.
26463
26464         if Ekind (Func) = E_Function and then Has_Homonym (Func) then
26465            State := Homonym (Func);
26466            while Present (State) loop
26467
26468               --  Resolve the overloading by setting the proper entity of the
26469               --  reference to that of the state.
26470
26471               if Ekind (State) = E_Abstract_State then
26472                  Set_Etype           (N, Standard_Void_Type);
26473                  Set_Entity          (N, State);
26474                  Set_Associated_Node (N, State);
26475                  return;
26476               end if;
26477
26478               State := Homonym (State);
26479            end loop;
26480
26481            --  A function can never act as a state. If the homonym chain does
26482            --  not contain a corresponding state, then something went wrong in
26483            --  the overloading mechanism.
26484
26485            raise Program_Error;
26486         end if;
26487      end if;
26488   end Resolve_State;
26489
26490   ----------------------------
26491   -- Rewrite_Assertion_Kind --
26492   ----------------------------
26493
26494   procedure Rewrite_Assertion_Kind (N : Node_Id) is
26495      Nam : Name_Id;
26496
26497   begin
26498      if Nkind (N) = N_Attribute_Reference
26499        and then Attribute_Name (N) = Name_Class
26500        and then Nkind (Prefix (N)) = N_Identifier
26501      then
26502         case Chars (Prefix (N)) is
26503            when Name_Pre =>
26504               Nam := Name_uPre;
26505            when Name_Post =>
26506               Nam := Name_uPost;
26507            when Name_Type_Invariant =>
26508               Nam := Name_uType_Invariant;
26509            when Name_Invariant =>
26510               Nam := Name_uInvariant;
26511            when others =>
26512               return;
26513         end case;
26514
26515         Rewrite (N, Make_Identifier (Sloc (N), Chars => Nam));
26516      end if;
26517   end Rewrite_Assertion_Kind;
26518
26519   --------
26520   -- rv --
26521   --------
26522
26523   procedure rv is
26524   begin
26525      null;
26526   end rv;
26527
26528   --------------------------------
26529   -- Set_Encoded_Interface_Name --
26530   --------------------------------
26531
26532   procedure Set_Encoded_Interface_Name (E : Entity_Id; S : Node_Id) is
26533      Str : constant String_Id := Strval (S);
26534      Len : constant Int       := String_Length (Str);
26535      CC  : Char_Code;
26536      C   : Character;
26537      J   : Int;
26538
26539      Hex : constant array (0 .. 15) of Character := "0123456789abcdef";
26540
26541      procedure Encode;
26542      --  Stores encoded value of character code CC. The encoding we use an
26543      --  underscore followed by four lower case hex digits.
26544
26545      ------------
26546      -- Encode --
26547      ------------
26548
26549      procedure Encode is
26550      begin
26551         Store_String_Char (Get_Char_Code ('_'));
26552         Store_String_Char
26553           (Get_Char_Code (Hex (Integer (CC / 2 ** 12))));
26554         Store_String_Char
26555           (Get_Char_Code (Hex (Integer (CC / 2 ** 8 and 16#0F#))));
26556         Store_String_Char
26557           (Get_Char_Code (Hex (Integer (CC / 2 ** 4 and 16#0F#))));
26558         Store_String_Char
26559           (Get_Char_Code (Hex (Integer (CC and 16#0F#))));
26560      end Encode;
26561
26562   --  Start of processing for Set_Encoded_Interface_Name
26563
26564   begin
26565      --  If first character is asterisk, this is a link name, and we leave it
26566      --  completely unmodified. We also ignore null strings (the latter case
26567      --  happens only in error cases) and no encoding should occur for Java or
26568      --  AAMP interface names.
26569
26570      if Len = 0
26571        or else Get_String_Char (Str, 1) = Get_Char_Code ('*')
26572        or else VM_Target /= No_VM
26573        or else AAMP_On_Target
26574      then
26575         Set_Interface_Name (E, S);
26576
26577      else
26578         J := 1;
26579         loop
26580            CC := Get_String_Char (Str, J);
26581
26582            exit when not In_Character_Range (CC);
26583
26584            C := Get_Character (CC);
26585
26586            exit when C /= '_' and then C /= '$'
26587              and then C not in '0' .. '9'
26588              and then C not in 'a' .. 'z'
26589              and then C not in 'A' .. 'Z';
26590
26591            if J = Len then
26592               Set_Interface_Name (E, S);
26593               return;
26594
26595            else
26596               J := J + 1;
26597            end if;
26598         end loop;
26599
26600         --  Here we need to encode. The encoding we use as follows:
26601         --     three underscores  + four hex digits (lower case)
26602
26603         Start_String;
26604
26605         for J in 1 .. String_Length (Str) loop
26606            CC := Get_String_Char (Str, J);
26607
26608            if not In_Character_Range (CC) then
26609               Encode;
26610            else
26611               C := Get_Character (CC);
26612
26613               if C = '_' or else C = '$'
26614                 or else C in '0' .. '9'
26615                 or else C in 'a' .. 'z'
26616                 or else C in 'A' .. 'Z'
26617               then
26618                  Store_String_Char (CC);
26619               else
26620                  Encode;
26621               end if;
26622            end if;
26623         end loop;
26624
26625         Set_Interface_Name (E,
26626           Make_String_Literal (Sloc (S),
26627             Strval => End_String));
26628      end if;
26629   end Set_Encoded_Interface_Name;
26630
26631   -------------------
26632   -- Set_Unit_Name --
26633   -------------------
26634
26635   procedure Set_Unit_Name (N : Node_Id; With_Item : Node_Id) is
26636      Pref : Node_Id;
26637      Scop : Entity_Id;
26638
26639   begin
26640      if Nkind (N) = N_Identifier
26641        and then Nkind (With_Item) = N_Identifier
26642      then
26643         Set_Entity (N, Entity (With_Item));
26644
26645      elsif Nkind (N) = N_Selected_Component then
26646         Change_Selected_Component_To_Expanded_Name (N);
26647         Set_Entity (N, Entity (With_Item));
26648         Set_Entity (Selector_Name (N), Entity (N));
26649
26650         Pref := Prefix (N);
26651         Scop := Scope (Entity (N));
26652         while Nkind (Pref) = N_Selected_Component loop
26653            Change_Selected_Component_To_Expanded_Name (Pref);
26654            Set_Entity (Selector_Name (Pref), Scop);
26655            Set_Entity (Pref, Scop);
26656            Pref := Prefix (Pref);
26657            Scop := Scope (Scop);
26658         end loop;
26659
26660         Set_Entity (Pref, Scop);
26661      end if;
26662   end Set_Unit_Name;
26663
26664end Sem_Prag;
26665