OSDN Git Service

2010-10-05 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_elab.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ E L A B                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1997-2010, 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 with Atree;    use Atree;
27 with Checks;   use Checks;
28 with Debug;    use Debug;
29 with Einfo;    use Einfo;
30 with Elists;   use Elists;
31 with Errout;   use Errout;
32 with Exp_Tss;  use Exp_Tss;
33 with Exp_Util; use Exp_Util;
34 with Expander; use Expander;
35 with Fname;    use Fname;
36 with Lib;      use Lib;
37 with Lib.Load; use Lib.Load;
38 with Namet;    use Namet;
39 with Nlists;   use Nlists;
40 with Nmake;    use Nmake;
41 with Opt;      use Opt;
42 with Output;   use Output;
43 with Restrict; use Restrict;
44 with Rident;   use Rident;
45 with Sem;      use Sem;
46 with Sem_Cat;  use Sem_Cat;
47 with Sem_Ch7;  use Sem_Ch7;
48 with Sem_Ch8;  use Sem_Ch8;
49 with Sem_Res;  use Sem_Res;
50 with Sem_Type; use Sem_Type;
51 with Sem_Util; use Sem_Util;
52 with Sinfo;    use Sinfo;
53 with Sinput;   use Sinput;
54 with Snames;   use Snames;
55 with Stand;    use Stand;
56 with Table;
57 with Tbuild;   use Tbuild;
58 with Uname;    use Uname;
59
60 package body Sem_Elab is
61
62    --  The following table records the recursive call chain for output in the
63    --  Output routine. Each entry records the call node and the entity of the
64    --  called routine. The number of entries in the table (i.e. the value of
65    --  Elab_Call.Last) indicates the current depth of recursion and is used to
66    --  identify the outer level.
67
68    type Elab_Call_Entry is record
69       Cloc : Source_Ptr;
70       Ent  : Entity_Id;
71    end record;
72
73    package Elab_Call is new Table.Table (
74      Table_Component_Type => Elab_Call_Entry,
75      Table_Index_Type     => Int,
76      Table_Low_Bound      => 1,
77      Table_Initial        => 50,
78      Table_Increment      => 100,
79      Table_Name           => "Elab_Call");
80
81    --  This table is initialized at the start of each outer level call. It
82    --  holds the entities for all subprograms that have been examined for this
83    --  particular outer level call, and is used to prevent both infinite
84    --  recursion, and useless reanalysis of bodies already seen
85
86    package Elab_Visited is new Table.Table (
87      Table_Component_Type => Entity_Id,
88      Table_Index_Type     => Int,
89      Table_Low_Bound      => 1,
90      Table_Initial        => 200,
91      Table_Increment      => 100,
92      Table_Name           => "Elab_Visited");
93
94    --  This table stores calls to Check_Internal_Call that are delayed
95    --  until all generics are instantiated, and in particular that all
96    --  generic bodies have been inserted. We need to delay, because we
97    --  need to be able to look through the inserted bodies.
98
99    type Delay_Element is record
100       N : Node_Id;
101       --  The parameter N from the call to Check_Internal_Call. Note that
102       --  this node may get rewritten over the delay period by expansion
103       --  in the call case (but not in the instantiation case).
104
105       E : Entity_Id;
106       --  The parameter E from the call to Check_Internal_Call
107
108       Orig_Ent : Entity_Id;
109       --  The parameter Orig_Ent from the call to Check_Internal_Call
110
111       Curscop : Entity_Id;
112       --  The current scope of the call. This is restored when we complete
113       --  the delayed call, so that we do this in the right scope.
114
115       From_Elab_Code : Boolean;
116       --  Save indication of whether this call is from elaboration code
117
118       Outer_Scope : Entity_Id;
119       --  Save scope of outer level call
120    end record;
121
122    package Delay_Check is new Table.Table (
123      Table_Component_Type => Delay_Element,
124      Table_Index_Type     => Int,
125      Table_Low_Bound      => 1,
126      Table_Initial        => 1000,
127      Table_Increment      => 100,
128      Table_Name           => "Delay_Check");
129
130    C_Scope : Entity_Id;
131    --  Top level scope of current scope. Compute this only once at the outer
132    --  level, i.e. for a call to Check_Elab_Call from outside this unit.
133
134    Outer_Level_Sloc : Source_Ptr;
135    --  Save Sloc value for outer level call node for comparisons of source
136    --  locations. A body is too late if it appears after the *outer* level
137    --  call, not the particular call that is being analyzed.
138
139    From_Elab_Code : Boolean;
140    --  This flag shows whether the outer level call currently being examined
141    --  is or is not in elaboration code. We are only interested in calls to
142    --  routines in other units if this flag is True.
143
144    In_Task_Activation : Boolean := False;
145    --  This flag indicates whether we are performing elaboration checks on
146    --  task procedures, at the point of activation. If true, we do not trace
147    --  internal calls in these procedures, because all local bodies are known
148    --  to be elaborated.
149
150    Delaying_Elab_Checks : Boolean := True;
151    --  This is set True till the compilation is complete, including the
152    --  insertion of all instance bodies. Then when Check_Elab_Calls is called,
153    --  the delay table is used to make the delayed calls and this flag is reset
154    --  to False, so that the calls are processed
155
156    -----------------------
157    -- Local Subprograms --
158    -----------------------
159
160    --  Note: Outer_Scope in all following specs represents the scope of
161    --  interest of the outer level call. If it is set to Standard_Standard,
162    --  then it means the outer level call was at elaboration level, and that
163    --  thus all calls are of interest. If it was set to some other scope,
164    --  then the original call was an inner call, and we are not interested
165    --  in calls that go outside this scope.
166
167    procedure Activate_Elaborate_All_Desirable (N : Node_Id; U : Entity_Id);
168    --  Analysis of construct N shows that we should set Elaborate_All_Desirable
169    --  for the WITH clause for unit U (which will always be present). A special
170    --  case is when N is a function or procedure instantiation, in which case
171    --  it is sufficient to set Elaborate_Desirable, since in this case there is
172    --  no possibility of transitive elaboration issues.
173
174    procedure Check_A_Call
175      (N                 : Node_Id;
176       E                 : Entity_Id;
177       Outer_Scope       : Entity_Id;
178       Inter_Unit_Only   : Boolean;
179       Generate_Warnings : Boolean := True);
180    --  This is the internal recursive routine that is called to check for a
181    --  possible elaboration error. The argument N is a subprogram call or
182    --  generic instantiation to be checked, and E is the entity of the called
183    --  subprogram, or instantiated generic unit. The flag Outer_Scope is the
184    --  outer level scope for the original call. Inter_Unit_Only is set if the
185    --  call is only to be checked in the case where it is to another unit (and
186    --  skipped if within a unit). Generate_Warnings is set to False to suppress
187    --  warning messages about missing pragma Elaborate_All's. These messages
188    --  are not wanted for inner calls in the dynamic model.
189
190    procedure Check_Bad_Instantiation (N : Node_Id);
191    --  N is a node for an instantiation (if called with any other node kind,
192    --  Check_Bad_Instantiation ignores the call). This subprogram checks for
193    --  the special case of a generic instantiation of a generic spec in the
194    --  same declarative part as the instantiation where a body is present and
195    --  has not yet been seen. This is an obvious error, but needs to be checked
196    --  specially at the time of the instantiation, since it is a case where we
197    --  cannot insert the body anywhere. If this case is detected, warnings are
198    --  generated, and a raise of Program_Error is inserted. In addition any
199    --  subprograms in the generic spec are stubbed, and the Bad_Instantiation
200    --  flag is set on the instantiation node. The caller in Sem_Ch12 uses this
201    --  flag as an indication that no attempt should be made to insert an
202    --  instance body.
203
204    procedure Check_Internal_Call
205      (N           : Node_Id;
206       E           : Entity_Id;
207       Outer_Scope : Entity_Id;
208       Orig_Ent    : Entity_Id);
209    --  N is a function call or procedure statement call node and E is the
210    --  entity of the called function, which is within the current compilation
211    --  unit (where subunits count as part of the parent). This call checks if
212    --  this call, or any call within any accessed body could cause an ABE, and
213    --  if so, outputs a warning. Orig_Ent differs from E only in the case of
214    --  renamings, and points to the original name of the entity. This is used
215    --  for error messages. Outer_Scope is the outer level scope for the
216    --  original call.
217
218    procedure Check_Internal_Call_Continue
219      (N           : Node_Id;
220       E           : Entity_Id;
221       Outer_Scope : Entity_Id;
222       Orig_Ent    : Entity_Id);
223    --  The processing for Check_Internal_Call is divided up into two phases,
224    --  and this represents the second phase. The second phase is delayed if
225    --  Delaying_Elab_Calls is set to True. In this delayed case, the first
226    --  phase makes an entry in the Delay_Check table, which is processed when
227    --  Check_Elab_Calls is called. N, E and Orig_Ent are as for the call to
228    --  Check_Internal_Call. Outer_Scope is the outer level scope for the
229    --  original call.
230
231    procedure Set_Elaboration_Constraint
232     (Call : Node_Id;
233      Subp : Entity_Id;
234      Scop : Entity_Id);
235    --  The current unit U may depend semantically on some unit P which is not
236    --  in the current context. If there is an elaboration call that reaches P,
237    --  we need to indicate that P requires an Elaborate_All, but this is not
238    --  effective in U's ali file, if there is no with_clause for P. In this
239    --  case we add the Elaborate_All on the unit Q that directly or indirectly
240    --  makes P available. This can happen in two cases:
241    --
242    --    a) Q declares a subtype of a type declared in P, and the call is an
243    --    initialization call for an object of that subtype.
244    --
245    --    b) Q declares an object of some tagged type whose root type is
246    --    declared in P, and the initialization call uses object notation on
247    --    that object to reach a primitive operation or a classwide operation
248    --    declared in P.
249    --
250    --  If P appears in the context of U, the current processing is correct.
251    --  Otherwise we must identify these two cases to retrieve Q and place the
252    --  Elaborate_All_Desirable on it.
253
254    function Has_Generic_Body (N : Node_Id) return Boolean;
255    --  N is a generic package instantiation node, and this routine determines
256    --  if this package spec does in fact have a generic body. If so, then
257    --  True is returned, otherwise False. Note that this is not at all the
258    --  same as checking if the unit requires a body, since it deals with
259    --  the case of optional bodies accurately (i.e. if a body is optional,
260    --  then it looks to see if a body is actually present). Note: this
261    --  function can only do a fully correct job if in generating code mode
262    --  where all bodies have to be present. If we are operating in semantics
263    --  check only mode, then in some cases of optional bodies, a result of
264    --  False may incorrectly be given. In practice this simply means that
265    --  some cases of warnings for incorrect order of elaboration will only
266    --  be given when generating code, which is not a big problem (and is
267    --  inevitable, given the optional body semantics of Ada).
268
269    procedure Insert_Elab_Check (N : Node_Id; C : Node_Id := Empty);
270    --  Given code for an elaboration check (or unconditional raise if the check
271    --  is not needed), inserts the code in the appropriate place. N is the call
272    --  or instantiation node for which the check code is required. C is the
273    --  test whose failure triggers the raise.
274
275    procedure Output_Calls (N : Node_Id);
276    --  Outputs chain of calls stored in the Elab_Call table. The caller has
277    --  already generated the main warning message, so the warnings generated
278    --  are all continuation messages. The argument is the call node at which
279    --  the messages are to be placed.
280
281    function Same_Elaboration_Scope (Scop1, Scop2 : Entity_Id) return Boolean;
282    --  Given two scopes, determine whether they are the same scope from an
283    --  elaboration point of view, i.e. packages and blocks are ignored.
284
285    procedure Set_C_Scope;
286    --  On entry C_Scope is set to some scope. On return, C_Scope is reset
287    --  to be the enclosing compilation unit of this scope.
288
289    function Spec_Entity (E : Entity_Id) return Entity_Id;
290    --  Given a compilation unit entity, if it is a spec entity, it is returned
291    --  unchanged. If it is a body entity, then the spec for the corresponding
292    --  spec is returned
293
294    procedure Supply_Bodies (N : Node_Id);
295    --  Given a node, N, that is either a subprogram declaration or a package
296    --  declaration, this procedure supplies dummy bodies for the subprogram
297    --  or for all subprograms in the package. If the given node is not one
298    --  of these two possibilities, then Supply_Bodies does nothing. The
299    --  dummy body contains a single Raise statement.
300
301    procedure Supply_Bodies (L : List_Id);
302    --  Calls Supply_Bodies for all elements of the given list L
303
304    function Within (E1, E2 : Entity_Id) return Boolean;
305    --  Given two scopes E1 and E2, returns True if E1 is equal to E2, or is one
306    --  of its contained scopes, False otherwise.
307
308    function Within_Elaborate_All (E : Entity_Id) return Boolean;
309    --  Before emitting a warning on a scope E for a missing elaborate_all,
310    --  check whether E may be in the context of a directly visible unit U to
311    --  which the pragma applies. This prevents spurious warnings when the
312    --  called entity is renamed within U.
313
314    --------------------------------------
315    -- Activate_Elaborate_All_Desirable --
316    --------------------------------------
317
318    procedure Activate_Elaborate_All_Desirable (N : Node_Id; U : Entity_Id) is
319       UN  : constant Unit_Number_Type := Get_Code_Unit (N);
320       CU  : constant Node_Id          := Cunit (UN);
321       UE  : constant Entity_Id        := Cunit_Entity (UN);
322       Unm : constant Unit_Name_Type   := Unit_Name (UN);
323       CI  : constant List_Id          := Context_Items (CU);
324       Itm : Node_Id;
325       Ent : Entity_Id;
326
327       procedure Add_To_Context_And_Mark (Itm : Node_Id);
328       --  This procedure is called when the elaborate indication must be
329       --  applied to a unit not in the context of the referencing unit. The
330       --  unit gets added to the context as an implicit with.
331
332       function In_Withs_Of (UEs : Entity_Id) return Boolean;
333       --  UEs is the spec entity of a unit. If the unit to be marked is
334       --  in the context item list of this unit spec, then the call returns
335       --  True and Itm is left set to point to the relevant N_With_Clause node.
336
337       procedure Set_Elab_Flag (Itm : Node_Id);
338       --  Sets Elaborate_[All_]Desirable as appropriate on Itm
339
340       -----------------------------
341       -- Add_To_Context_And_Mark --
342       -----------------------------
343
344       procedure Add_To_Context_And_Mark (Itm : Node_Id) is
345          CW : constant Node_Id :=
346                 Make_With_Clause (Sloc (Itm),
347                   Name => Name (Itm));
348
349       begin
350          Set_Library_Unit  (CW, Library_Unit (Itm));
351          Set_Implicit_With (CW, True);
352
353          --  Set elaborate all desirable on copy and then append the copy to
354          --  the list of body with's and we are done.
355
356          Set_Elab_Flag (CW);
357          Append_To (CI, CW);
358       end Add_To_Context_And_Mark;
359
360       -----------------
361       -- In_Withs_Of --
362       -----------------
363
364       function In_Withs_Of (UEs : Entity_Id) return Boolean is
365          UNs : constant Unit_Number_Type := Get_Source_Unit (UEs);
366          CUs : constant Node_Id          := Cunit (UNs);
367          CIs : constant List_Id          := Context_Items (CUs);
368
369       begin
370          Itm := First (CIs);
371          while Present (Itm) loop
372             if Nkind (Itm) = N_With_Clause then
373                Ent :=
374                  Cunit_Entity (Get_Cunit_Unit_Number (Library_Unit (Itm)));
375
376                if U = Ent then
377                   return True;
378                end if;
379             end if;
380
381             Next (Itm);
382          end loop;
383
384          return False;
385       end In_Withs_Of;
386
387       -------------------
388       -- Set_Elab_Flag --
389       -------------------
390
391       procedure Set_Elab_Flag (Itm : Node_Id) is
392       begin
393          if Nkind (N) in N_Subprogram_Instantiation then
394             Set_Elaborate_Desirable (Itm);
395          else
396             Set_Elaborate_All_Desirable (Itm);
397          end if;
398       end Set_Elab_Flag;
399
400    --  Start of processing for Activate_Elaborate_All_Desirable
401
402    begin
403       --  Do not set binder indication if expansion is disabled, as when
404       --  compiling a generic unit.
405
406       if not Expander_Active then
407          return;
408       end if;
409
410       Itm := First (CI);
411       while Present (Itm) loop
412          if Nkind (Itm) = N_With_Clause then
413             Ent := Cunit_Entity (Get_Cunit_Unit_Number (Library_Unit (Itm)));
414
415             --  If we find it, then mark elaborate all desirable and return
416
417             if U = Ent then
418                Set_Elab_Flag (Itm);
419                return;
420             end if;
421          end if;
422
423          Next (Itm);
424       end loop;
425
426       --  If we fall through then the with clause is not present in the
427       --  current unit. One legitimate possibility is that the with clause
428       --  is present in the spec when we are a body.
429
430       if Is_Body_Name (Unm)
431         and then In_Withs_Of (Spec_Entity (UE))
432       then
433          Add_To_Context_And_Mark (Itm);
434          return;
435       end if;
436
437       --  Similarly, we may be in the spec or body of a child unit, where
438       --  the unit in question is with'ed by some ancestor of the child unit.
439
440       if Is_Child_Name (Unm) then
441          declare
442             Pkg : Entity_Id;
443
444          begin
445             Pkg := UE;
446             loop
447                Pkg := Scope (Pkg);
448                exit when Pkg = Standard_Standard;
449
450                if In_Withs_Of (Pkg) then
451                   Add_To_Context_And_Mark (Itm);
452                   return;
453                end if;
454             end loop;
455          end;
456       end if;
457
458       --  Here if we do not find with clause on spec or body. We just ignore
459       --  this case, it means that the elaboration involves some other unit
460       --  than the unit being compiled, and will be caught elsewhere.
461
462       null;
463    end Activate_Elaborate_All_Desirable;
464
465    ------------------
466    -- Check_A_Call --
467    ------------------
468
469    procedure Check_A_Call
470      (N                 : Node_Id;
471       E                 : Entity_Id;
472       Outer_Scope       : Entity_Id;
473       Inter_Unit_Only   : Boolean;
474       Generate_Warnings : Boolean := True)
475    is
476       Loc  : constant Source_Ptr := Sloc (N);
477       Ent  : Entity_Id;
478       Decl : Node_Id;
479
480       E_Scope : Entity_Id;
481       --  Top level scope of entity for called subprogram. This value includes
482       --  following renamings and derivations, so this scope can be in a
483       --  non-visible unit. This is the scope that is to be investigated to
484       --  see whether an elaboration check is required.
485
486       W_Scope : Entity_Id;
487       --  Top level scope of directly called entity for subprogram. This
488       --  differs from E_Scope in the case where renamings or derivations
489       --  are involved, since it does not follow these links. W_Scope is
490       --  generally in a visible unit, and it is this scope that may require
491       --  an Elaborate_All. However, there are some cases (initialization
492       --  calls and calls involving object notation) where W_Scope might not
493       --  be in the context of the current unit, and there is an intermediate
494       --  package that is, in which case the Elaborate_All has to be placed
495       --  on this intermediate package. These special cases are handled in
496       --  Set_Elaboration_Constraint.
497
498       Body_Acts_As_Spec : Boolean;
499       --  Set to true if call is to body acting as spec (no separate spec)
500
501       Inst_Case : constant Boolean := Nkind (N) in N_Generic_Instantiation;
502       --  Indicates if we have instantiation case
503
504       Caller_Unit_Internal : Boolean;
505       Callee_Unit_Internal : Boolean;
506
507       Inst_Caller : Source_Ptr;
508       Inst_Callee : Source_Ptr;
509
510       Unit_Caller : Unit_Number_Type;
511       Unit_Callee : Unit_Number_Type;
512
513       Cunit_SC : Boolean := False;
514       --  Set to suppress dynamic elaboration checks where one of the
515       --  enclosing scopes has Elaboration_Checks_Suppressed set, or else
516       --  if a pragma Elaborate (_All) applies to that scope, in which case
517       --  warnings on the scope are also suppressed. For the internal case,
518       --  we ignore this flag.
519
520    begin
521       --  If the call is known to be within a local Suppress Elaboration
522       --  pragma, nothing to check. This can happen in task bodies.
523
524       if (Nkind (N) = N_Function_Call
525            or else Nkind (N) = N_Procedure_Call_Statement)
526         and then No_Elaboration_Check (N)
527       then
528          return;
529       end if;
530
531       --  Go to parent for derived subprogram, or to original subprogram in the
532       --  case of a renaming (Alias covers both these cases).
533
534       Ent := E;
535       loop
536          if (Suppress_Elaboration_Warnings (Ent)
537               or else Elaboration_Checks_Suppressed (Ent))
538            and then (Inst_Case or else No (Alias (Ent)))
539          then
540             return;
541          end if;
542
543          --  Nothing to do for imported entities
544
545          if Is_Imported (Ent) then
546             return;
547          end if;
548
549          exit when Inst_Case or else No (Alias (Ent));
550          Ent := Alias (Ent);
551       end loop;
552
553       Decl := Unit_Declaration_Node (Ent);
554
555       if Nkind (Decl) = N_Subprogram_Body then
556          Body_Acts_As_Spec := True;
557
558       elsif Nkind (Decl) = N_Subprogram_Declaration
559         or else Nkind (Decl) = N_Subprogram_Body_Stub
560         or else Inst_Case
561       then
562          Body_Acts_As_Spec := False;
563
564       --  If we have none of an instantiation, subprogram body or
565       --  subprogram declaration, then it is not a case that we want
566       --  to check. (One case is a call to a generic formal subprogram,
567       --  where we do not want the check in the template).
568
569       else
570          return;
571       end if;
572
573       E_Scope := Ent;
574       loop
575          if Elaboration_Checks_Suppressed (E_Scope)
576            or else Suppress_Elaboration_Warnings (E_Scope)
577          then
578             Cunit_SC := True;
579          end if;
580
581          --  Exit when we get to compilation unit, not counting subunits
582
583          exit when Is_Compilation_Unit (E_Scope)
584            and then (Is_Child_Unit (E_Scope)
585                        or else Scope (E_Scope) = Standard_Standard);
586
587          --  If we did not find a compilation unit, other than standard,
588          --  then nothing to check (happens in some instantiation cases)
589
590          if E_Scope = Standard_Standard then
591             return;
592
593          --  Otherwise move up a scope looking for compilation unit
594
595          else
596             E_Scope := Scope (E_Scope);
597          end if;
598       end loop;
599
600       --  No checks needed for pure or preelaborated compilation units
601
602       if Is_Pure (E_Scope) or else Is_Preelaborated (E_Scope) then
603          return;
604       end if;
605
606       --  If the generic entity is within a deeper instance than we are, then
607       --  either the instantiation to which we refer itself caused an ABE, in
608       --  which case that will be handled separately, or else we know that the
609       --  body we need appears as needed at the point of the instantiation.
610       --  However, this assumption is only valid if we are in static mode.
611
612       if not Dynamic_Elaboration_Checks
613         and then Instantiation_Depth (Sloc (Ent)) >
614                  Instantiation_Depth (Sloc (N))
615       then
616          return;
617       end if;
618
619       --  Do not give a warning for a package with no body
620
621       if Ekind (Ent) = E_Generic_Package
622         and then not Has_Generic_Body (N)
623       then
624          return;
625       end if;
626
627       --  Case of entity is not in current unit (i.e. with'ed unit case)
628
629       if E_Scope /= C_Scope then
630
631          --  We are only interested in such calls if the outer call was from
632          --  elaboration code, or if we are in Dynamic_Elaboration_Checks mode.
633
634          if not From_Elab_Code and then not Dynamic_Elaboration_Checks then
635             return;
636          end if;
637
638          --  Nothing to do if some scope said that no checks were required
639
640          if Cunit_SC then
641             return;
642          end if;
643
644          --  Nothing to do for a generic instance, because in this case the
645          --  checking was at the point of instantiation of the generic However,
646          --  this shortcut is only applicable in static mode.
647
648          if Is_Generic_Instance (Ent) and not Dynamic_Elaboration_Checks then
649             return;
650          end if;
651
652          --  Nothing to do if subprogram with no separate spec. However, a
653          --  call to Deep_Initialize may result in a call to a user-defined
654          --  Initialize procedure, which imposes a body dependency. This
655          --  happens only if the type is controlled and the Initialize
656          --  procedure is not inherited.
657
658          if Body_Acts_As_Spec then
659             if Is_TSS (Ent, TSS_Deep_Initialize) then
660                declare
661                   Typ  : Entity_Id;
662                   Init : Entity_Id;
663                begin
664                   Typ  := Etype (Next_Formal (First_Formal (Ent)));
665
666                   if not Is_Controlled (Typ) then
667                      return;
668                   else
669                      Init := Find_Prim_Op (Typ, Name_Initialize);
670
671                      if Comes_From_Source (Init) then
672                         Ent := Init;
673                      else
674                         return;
675                      end if;
676                   end if;
677                end;
678
679             else
680                return;
681             end if;
682          end if;
683
684          --  Check cases of internal units
685
686          Callee_Unit_Internal :=
687            Is_Internal_File_Name
688              (Unit_File_Name (Get_Source_Unit (E_Scope)));
689
690          --  Do not give a warning if the with'ed unit is internal
691          --  and this is the generic instantiation case (this saves a
692          --  lot of hassle dealing with the Text_IO special child units)
693
694          if Callee_Unit_Internal and Inst_Case then
695             return;
696          end if;
697
698          if C_Scope = Standard_Standard then
699             Caller_Unit_Internal := False;
700          else
701             Caller_Unit_Internal :=
702               Is_Internal_File_Name
703                 (Unit_File_Name (Get_Source_Unit (C_Scope)));
704          end if;
705
706          --  Do not give a warning if the with'ed unit is internal
707          --  and the caller is not internal (since the binder always
708          --  elaborates internal units first).
709
710          if Callee_Unit_Internal and (not Caller_Unit_Internal) then
711             return;
712          end if;
713
714          --  For now, if debug flag -gnatdE is not set, do no checking for
715          --  one internal unit withing another. This fixes the problem with
716          --  the sgi build and storage errors. To be resolved later ???
717
718          if (Callee_Unit_Internal and Caller_Unit_Internal)
719             and then not Debug_Flag_EE
720          then
721             return;
722          end if;
723
724          if Is_TSS (E, TSS_Deep_Initialize) then
725             Ent := E;
726          end if;
727
728          --  If the call is in an instance, and the called entity is not
729          --  defined in the same instance, then the elaboration issue
730          --  focuses around the unit containing the template, it is
731          --  this unit which requires an Elaborate_All.
732
733          --  However, if we are doing dynamic elaboration, we need to
734          --  chase the call in the usual manner.
735
736          --  We do not handle the case of calling a generic formal correctly
737          --  in the static case. See test 4703-004 to explore this gap ???
738
739          Inst_Caller := Instantiation (Get_Source_File_Index (Sloc (N)));
740          Inst_Callee := Instantiation (Get_Source_File_Index (Sloc (Ent)));
741
742          if Inst_Caller = No_Location then
743             Unit_Caller := No_Unit;
744          else
745             Unit_Caller := Get_Source_Unit (N);
746          end if;
747
748          if Inst_Callee = No_Location then
749             Unit_Callee := No_Unit;
750          else
751             Unit_Callee := Get_Source_Unit (Ent);
752          end if;
753
754          if Unit_Caller /= No_Unit
755            and then Unit_Callee /= Unit_Caller
756            and then not Dynamic_Elaboration_Checks
757          then
758             E_Scope := Spec_Entity (Cunit_Entity (Unit_Caller));
759
760             --  If we don't get a spec entity, just ignore call. Not quite
761             --  clear why this check is necessary. ???
762
763             if No (E_Scope) then
764                return;
765             end if;
766
767             --  Otherwise step to enclosing compilation unit
768
769             while not Is_Compilation_Unit (E_Scope) loop
770                E_Scope := Scope (E_Scope);
771             end loop;
772
773          --  For the case N is not an instance, or a call within instance, we
774          --  recompute E_Scope for the error message, since we do NOT want to
775          --  go to the unit which has the ultimate declaration in the case of
776          --  renaming and derivation and we also want to go to the generic unit
777          --  in the case of an instance, and no further.
778
779          else
780             --  Loop to carefully follow renamings and derivations one step
781             --  outside the current unit, but not further.
782
783             if not Inst_Case
784               and then Present (Alias (Ent))
785             then
786                E_Scope := Alias (Ent);
787             else
788                E_Scope := Ent;
789             end if;
790
791             loop
792                while not Is_Compilation_Unit (E_Scope) loop
793                   E_Scope := Scope (E_Scope);
794                end loop;
795
796                --  If E_Scope is the same as C_Scope, it means that there
797                --  definitely was a local renaming or derivation, and we
798                --  are not yet out of the current unit.
799
800                exit when E_Scope /= C_Scope;
801                Ent := Alias (Ent);
802                E_Scope := Ent;
803
804                --  If no alias, there is a previous error
805
806                if No (Ent) then
807                   return;
808                end if;
809             end loop;
810          end if;
811
812          if Within_Elaborate_All (E_Scope) then
813             return;
814          end if;
815
816          --  Find top level scope for called entity (not following renamings
817          --  or derivations). This is where the Elaborate_All will go if it
818          --  is needed. We start with the called entity, except in the case
819          --  of an initialization procedure outside the current package, where
820          --  the init proc is in the root package, and we start from the entity
821          --  of the name in the call.
822
823          if Is_Entity_Name (Name (N))
824            and then Is_Init_Proc (Entity (Name (N)))
825            and then not In_Same_Extended_Unit (N, Entity (Name (N)))
826          then
827             W_Scope := Scope (Entity (Name (N)));
828          else
829             W_Scope := E;
830          end if;
831
832          while not Is_Compilation_Unit (W_Scope) loop
833             W_Scope := Scope (W_Scope);
834          end loop;
835
836          --  Now check if an elaborate_all (or dynamic check) is needed
837
838          if not Suppress_Elaboration_Warnings (Ent)
839            and then not Elaboration_Checks_Suppressed (Ent)
840            and then not Suppress_Elaboration_Warnings (E_Scope)
841            and then not Elaboration_Checks_Suppressed (E_Scope)
842            and then Elab_Warnings
843            and then Generate_Warnings
844          then
845             Generate_Elab_Warnings : declare
846                procedure Elab_Warning
847                  (Msg_D : String;
848                   Msg_S : String;
849                   Ent   : Node_Or_Entity_Id);
850                --  Generate a call to Error_Msg_NE with parameters Msg_D or
851                --  Msg_S (for dynamic or static elaboration model), N and Ent.
852
853                ------------------
854                -- Elab_Warning --
855                ------------------
856
857                procedure Elab_Warning
858                  (Msg_D : String;
859                   Msg_S : String;
860                   Ent   : Node_Or_Entity_Id)
861                is
862                begin
863                   if Dynamic_Elaboration_Checks then
864                      Error_Msg_NE (Msg_D, N, Ent);
865                   else
866                      Error_Msg_NE (Msg_S, N, Ent);
867                   end if;
868                end Elab_Warning;
869
870             --  Start of processing for Generate_Elab_Warnings
871
872             begin
873                if Inst_Case then
874                   Elab_Warning
875                     ("instantiation of& may raise Program_Error?",
876                      "info: instantiation of& during elaboration?", Ent);
877
878                else
879                   if Nkind (Name (N)) in N_Has_Entity
880                     and then Is_Init_Proc (Entity (Name (N)))
881                     and then Comes_From_Source (Ent)
882                   then
883                      Elab_Warning
884                        ("implicit call to & may raise Program_Error?",
885                         "info: implicit call to & during elaboration?",
886                         Ent);
887
888                   else
889                      Elab_Warning
890                        ("call to & may raise Program_Error?",
891                         "info: call to & during elaboration?",
892                         Ent);
893                   end if;
894                end if;
895
896                Error_Msg_Qual_Level := Nat'Last;
897
898                if Nkind (N) in N_Subprogram_Instantiation then
899                   Elab_Warning
900                     ("\missing pragma Elaborate for&?",
901                      "\info: implicit pragma Elaborate for& generated?",
902                      W_Scope);
903                else
904                   Elab_Warning
905                     ("\missing pragma Elaborate_All for&?",
906                      "\info: implicit pragma Elaborate_All for & generated?",
907                      W_Scope);
908                end if;
909             end Generate_Elab_Warnings;
910
911             Error_Msg_Qual_Level := 0;
912             Output_Calls (N);
913
914             --  Set flag to prevent further warnings for same unit unless in
915             --  All_Errors_Mode.
916
917             if not All_Errors_Mode and not Dynamic_Elaboration_Checks then
918                Set_Suppress_Elaboration_Warnings (W_Scope, True);
919             end if;
920          end if;
921
922          --  Check for runtime elaboration check required
923
924          if Dynamic_Elaboration_Checks then
925             if not Elaboration_Checks_Suppressed (Ent)
926               and then not Elaboration_Checks_Suppressed (W_Scope)
927               and then not Elaboration_Checks_Suppressed (E_Scope)
928               and then not Cunit_SC
929             then
930                --  Runtime elaboration check required. Generate check of the
931                --  elaboration Boolean for the unit containing the entity.
932
933                --  Note that for this case, we do check the real unit (the one
934                --  from following renamings, since that is the issue!)
935
936                --  Could this possibly miss a useless but required PE???
937
938                Insert_Elab_Check (N,
939                  Make_Attribute_Reference (Loc,
940                    Attribute_Name => Name_Elaborated,
941                    Prefix => New_Occurrence_Of (Spec_Entity (E_Scope), Loc)));
942             end if;
943
944          --  Case of static elaboration model
945
946          else
947             --  Do not do anything if elaboration checks suppressed. Note that
948             --  we check Ent here, not E, since we want the real entity for the
949             --  body to see if checks are suppressed for it, not the dummy
950             --  entry for renamings or derivations.
951
952             if Elaboration_Checks_Suppressed (Ent)
953               or else Elaboration_Checks_Suppressed (E_Scope)
954               or else Elaboration_Checks_Suppressed (W_Scope)
955             then
956                null;
957
958             --  Here we need to generate an implicit elaborate all
959
960             else
961                --  Generate elaborate_all warning unless suppressed
962
963                if (Elab_Warnings and Generate_Warnings and not Inst_Case)
964                  and then not Suppress_Elaboration_Warnings (Ent)
965                  and then not Suppress_Elaboration_Warnings (E_Scope)
966                  and then not Suppress_Elaboration_Warnings (W_Scope)
967                then
968                   Error_Msg_Node_2 := W_Scope;
969                   Error_Msg_NE
970                     ("call to& in elaboration code " &
971                      "requires pragma Elaborate_All on&?", N, E);
972                end if;
973
974                --  Set indication for binder to generate Elaborate_All
975
976                Set_Elaboration_Constraint (N, E, W_Scope);
977             end if;
978          end if;
979
980       --  Case of entity is in same unit as call or instantiation
981
982       elsif not Inter_Unit_Only then
983          Check_Internal_Call (N, Ent, Outer_Scope, E);
984       end if;
985    end Check_A_Call;
986
987    -----------------------------
988    -- Check_Bad_Instantiation --
989    -----------------------------
990
991    procedure Check_Bad_Instantiation (N : Node_Id) is
992       Ent : Entity_Id;
993
994    begin
995       --  Nothing to do if we do not have an instantiation (happens in some
996       --  error cases, and also in the formal package declaration case)
997
998       if Nkind (N) not in N_Generic_Instantiation then
999          return;
1000
1001       --  Nothing to do if serious errors detected (avoid cascaded errors)
1002
1003       elsif Serious_Errors_Detected /= 0 then
1004          return;
1005
1006       --  Nothing to do if not in full analysis mode
1007
1008       elsif not Full_Analysis then
1009          return;
1010
1011       --  Nothing to do if inside a generic template
1012
1013       elsif Inside_A_Generic then
1014          return;
1015
1016       --  Nothing to do if a library level instantiation
1017
1018       elsif Nkind (Parent (N)) = N_Compilation_Unit then
1019          return;
1020
1021       --  Nothing to do if we are compiling a proper body for semantic
1022       --  purposes only. The generic body may be in another proper body.
1023
1024       elsif
1025         Nkind (Parent (Unit_Declaration_Node (Main_Unit_Entity))) = N_Subunit
1026       then
1027          return;
1028       end if;
1029
1030       Ent := Get_Generic_Entity (N);
1031
1032       --  The case we are interested in is when the generic spec is in the
1033       --  current declarative part
1034
1035       if not Same_Elaboration_Scope (Current_Scope, Scope (Ent))
1036         or else not In_Same_Extended_Unit (N, Ent)
1037       then
1038          return;
1039       end if;
1040
1041       --  If the generic entity is within a deeper instance than we are, then
1042       --  either the instantiation to which we refer itself caused an ABE, in
1043       --  which case that will be handled separately. Otherwise, we know that
1044       --  the body we need appears as needed at the point of the instantiation.
1045       --  If they are both at the same level but not within the same instance
1046       --  then the body of the generic will be in the earlier instance.
1047
1048       declare
1049          D1 : constant Int := Instantiation_Depth (Sloc (Ent));
1050          D2 : constant Int := Instantiation_Depth (Sloc (N));
1051
1052       begin
1053          if D1 > D2 then
1054             return;
1055
1056          elsif D1 = D2
1057            and then Is_Generic_Instance (Scope (Ent))
1058            and then not In_Open_Scopes (Scope (Ent))
1059          then
1060             return;
1061          end if;
1062       end;
1063
1064       --  Now we can proceed, if the entity being called has a completion,
1065       --  then we are definitely OK, since we have already seen the body.
1066
1067       if Has_Completion (Ent) then
1068          return;
1069       end if;
1070
1071       --  If there is no body, then nothing to do
1072
1073       if not Has_Generic_Body (N) then
1074          return;
1075       end if;
1076
1077       --  Here we definitely have a bad instantiation
1078
1079       Error_Msg_NE
1080         ("?cannot instantiate& before body seen", N, Ent);
1081
1082       if Present (Instance_Spec (N)) then
1083          Supply_Bodies (Instance_Spec (N));
1084       end if;
1085
1086       Error_Msg_N
1087         ("\?Program_Error will be raised at run time", N);
1088       Insert_Elab_Check (N);
1089       Set_ABE_Is_Certain (N);
1090    end Check_Bad_Instantiation;
1091
1092    ---------------------
1093    -- Check_Elab_Call --
1094    ---------------------
1095
1096    procedure Check_Elab_Call
1097      (N           : Node_Id;
1098       Outer_Scope : Entity_Id := Empty)
1099    is
1100       Ent : Entity_Id;
1101       P   : Node_Id;
1102
1103       function Get_Called_Ent return Entity_Id;
1104       --  Retrieve called entity. If this is a call to a protected subprogram,
1105       --  entity is a selected component. The callable entity may be absent,
1106       --  in which case there is no check to perform. This happens with
1107       --  non-analyzed calls in nested generics.
1108
1109       --------------------
1110       -- Get_Called_Ent --
1111       --------------------
1112
1113       function Get_Called_Ent return Entity_Id is
1114          Nam : Node_Id;
1115
1116       begin
1117          Nam := Name (N);
1118
1119          if No (Nam) then
1120             return Empty;
1121
1122          elsif Nkind (Nam) = N_Selected_Component then
1123             return Entity (Selector_Name (Nam));
1124
1125          elsif not Is_Entity_Name (Nam) then
1126             return Empty;
1127
1128          else
1129             return Entity (Nam);
1130          end if;
1131       end Get_Called_Ent;
1132
1133    --  Start of processing for Check_Elab_Call
1134
1135    begin
1136       --  If the call does not come from the main unit, there is nothing to
1137       --  check. Elaboration call from units in the context of the main unit
1138       --  will lead to semantic dependencies when those units are compiled.
1139
1140       if not In_Extended_Main_Code_Unit (N) then
1141          return;
1142       end if;
1143
1144       --  For an entry call, check relevant restriction
1145
1146       if Nkind (N) = N_Entry_Call_Statement
1147          and then not In_Subprogram_Or_Concurrent_Unit
1148       then
1149          Check_Restriction (No_Entry_Calls_In_Elaboration_Code, N);
1150
1151       --  Nothing to do if this is not a call (happens in some error
1152       --  conditions, and in some cases where rewriting occurs).
1153
1154       elsif Nkind (N) /= N_Function_Call
1155         and then Nkind (N) /= N_Procedure_Call_Statement
1156       then
1157          return;
1158
1159       --  Nothing to do if this is a call already rewritten for elab checking
1160
1161       elsif Nkind (Parent (N)) = N_Conditional_Expression then
1162          return;
1163
1164       --  Nothing to do if inside a generic template
1165
1166       elsif Inside_A_Generic
1167         and then No (Enclosing_Generic_Body (N))
1168       then
1169          return;
1170       end if;
1171
1172       --  Here we have a call at elaboration time which must be checked
1173
1174       if Debug_Flag_LL then
1175          Write_Str ("  Check_Elab_Call: ");
1176
1177          if No (Name (N))
1178            or else not Is_Entity_Name (Name (N))
1179          then
1180             Write_Str ("<<not entity name>> ");
1181          else
1182             Write_Name (Chars (Entity (Name (N))));
1183          end if;
1184
1185          Write_Str ("  call at ");
1186          Write_Location (Sloc (N));
1187          Write_Eol;
1188       end if;
1189
1190       --  Climb up the tree to make sure we are not inside default expression
1191       --  of a parameter specification or a record component, since in both
1192       --  these cases, we will be doing the actual call later, not now, and it
1193       --  is at the time of the actual call (statically speaking) that we must
1194       --  do our static check, not at the time of its initial analysis).
1195
1196       --  However, we have to check calls within component definitions (e.g.
1197       --  a function call that determines an array component bound), so we
1198       --  terminate the loop in that case.
1199
1200       P := Parent (N);
1201       while Present (P) loop
1202          if Nkind (P) = N_Parameter_Specification
1203               or else
1204             Nkind (P) = N_Component_Declaration
1205          then
1206             return;
1207
1208          --  The call occurs within the constraint of a component,
1209          --  so it must be checked.
1210
1211          elsif Nkind (P) = N_Component_Definition then
1212             exit;
1213
1214          else
1215             P := Parent (P);
1216          end if;
1217       end loop;
1218
1219       --  Stuff that happens only at the outer level
1220
1221       if No (Outer_Scope) then
1222          Elab_Visited.Set_Last (0);
1223
1224          --  Nothing to do if current scope is Standard (this is a bit odd, but
1225          --  it happens in the case of generic instantiations).
1226
1227          C_Scope := Current_Scope;
1228
1229          if C_Scope = Standard_Standard then
1230             return;
1231          end if;
1232
1233          --  First case, we are in elaboration code
1234
1235          From_Elab_Code := not In_Subprogram_Or_Concurrent_Unit;
1236          if From_Elab_Code then
1237
1238             --  Complain if call that comes from source in preelaborated unit
1239             --  and we are not inside a subprogram (i.e. we are in elab code).
1240
1241             if Comes_From_Source (N)
1242               and then In_Preelaborated_Unit
1243               and then not In_Inlined_Body
1244             then
1245                --  This is a warning in GNAT mode allowing such calls to be
1246                --  used in the predefined library with appropriate care.
1247
1248                Error_Msg_Warn := GNAT_Mode;
1249                Error_Msg_N
1250                  ("<non-static call not allowed in preelaborated unit", N);
1251                return;
1252             end if;
1253
1254          --  Second case, we are inside a subprogram or concurrent unit, which
1255          --  means we are not in elaboration code.
1256
1257          else
1258             --  In this case, the issue is whether we are inside the
1259             --  declarative part of the unit in which we live, or inside its
1260             --  statements. In the latter case, there is no issue of ABE calls
1261             --  at this level (a call from outside to the unit in which we live
1262             --  might cause an ABE, but that will be detected when we analyze
1263             --  that outer level call, as it recurses into the called unit).
1264
1265             --  Climb up the tree, doing this test, and also testing for being
1266             --  inside a default expression, which, as discussed above, is not
1267             --  checked at this stage.
1268
1269             declare
1270                P : Node_Id;
1271                L : List_Id;
1272
1273             begin
1274                P := N;
1275                loop
1276                   --  If we find a parentless subtree, it seems safe to assume
1277                   --  that we are not in a declarative part and that no
1278                   --  checking is required.
1279
1280                   if No (P) then
1281                      return;
1282                   end if;
1283
1284                   if Is_List_Member (P) then
1285                      L := List_Containing (P);
1286                      P := Parent (L);
1287                   else
1288                      L := No_List;
1289                      P := Parent (P);
1290                   end if;
1291
1292                   exit when Nkind (P) = N_Subunit;
1293
1294                   --  Filter out case of default expressions, where we do not
1295                   --  do the check at this stage.
1296
1297                   if Nkind (P) = N_Parameter_Specification
1298                        or else
1299                      Nkind (P) = N_Component_Declaration
1300                   then
1301                      return;
1302                   end if;
1303
1304                   --  A protected body has no elaboration code and contains
1305                   --  only other bodies.
1306
1307                   if Nkind (P) = N_Protected_Body then
1308                      return;
1309
1310                   elsif Nkind (P) = N_Subprogram_Body
1311                        or else
1312                      Nkind (P) = N_Task_Body
1313                        or else
1314                      Nkind (P) = N_Block_Statement
1315                        or else
1316                      Nkind (P) = N_Entry_Body
1317                   then
1318                      if L = Declarations (P) then
1319                         exit;
1320
1321                      --  We are not in elaboration code, but we are doing
1322                      --  dynamic elaboration checks, in this case, we still
1323                      --  need to do the call, since the subprogram we are in
1324                      --  could be called from another unit, also in dynamic
1325                      --  elaboration check mode, at elaboration time.
1326
1327                      elsif Dynamic_Elaboration_Checks then
1328
1329                         --  This is a rather new check, going into version
1330                         --  3.14a1 for the first time (V1.80 of this unit), so
1331                         --  we provide a debug flag to enable it. That way we
1332                         --  have an easy work around for regressions that are
1333                         --  caused by this new check. This debug flag can be
1334                         --  removed later.
1335
1336                         if Debug_Flag_DD then
1337                            return;
1338                         end if;
1339
1340                         --  Do the check in this case
1341
1342                         exit;
1343
1344                      elsif Nkind (P) = N_Task_Body then
1345
1346                         --  The check is deferred until Check_Task_Activation
1347                         --  but we need to capture local suppress pragmas
1348                         --  that may inhibit checks on this call.
1349
1350                         Ent := Get_Called_Ent;
1351
1352                         if No (Ent) then
1353                            return;
1354
1355                         elsif Elaboration_Checks_Suppressed (Current_Scope)
1356                           or else Elaboration_Checks_Suppressed (Ent)
1357                           or else Elaboration_Checks_Suppressed (Scope (Ent))
1358                         then
1359                            Set_No_Elaboration_Check (N);
1360                         end if;
1361
1362                         return;
1363
1364                      --  Static model, call is not in elaboration code, we
1365                      --  never need to worry, because in the static model the
1366                      --  top level caller always takes care of things.
1367
1368                      else
1369                         return;
1370                      end if;
1371                   end if;
1372                end loop;
1373             end;
1374          end if;
1375       end if;
1376
1377       Ent := Get_Called_Ent;
1378
1379       if No (Ent) then
1380          return;
1381       end if;
1382
1383       --  Nothing to do if this is a recursive call (i.e. a call to
1384       --  an entity that is already in the Elab_Call stack)
1385
1386       for J in 1 .. Elab_Visited.Last loop
1387          if Ent = Elab_Visited.Table (J) then
1388             return;
1389          end if;
1390       end loop;
1391
1392       --  See if we need to analyze this call. We analyze it if either of
1393       --  the following conditions is met:
1394
1395       --    It is an inner level call (since in this case it was triggered
1396       --    by an outer level call from elaboration code), but only if the
1397       --    call is within the scope of the original outer level call.
1398
1399       --    It is an outer level call from elaboration code, or the called
1400       --    entity is in the same elaboration scope.
1401
1402       --  And in these cases, we will check both inter-unit calls and
1403       --  intra-unit (within a single unit) calls.
1404
1405       C_Scope := Current_Scope;
1406
1407       --  If not outer level call, then we follow it if it is within
1408       --  the original scope of the outer call.
1409
1410       if Present (Outer_Scope)
1411         and then Within (Scope (Ent), Outer_Scope)
1412       then
1413          Set_C_Scope;
1414          Check_A_Call (N, Ent, Outer_Scope, Inter_Unit_Only => False);
1415
1416       elsif Elaboration_Checks_Suppressed (Current_Scope) then
1417          null;
1418
1419       elsif From_Elab_Code then
1420          Set_C_Scope;
1421          Check_A_Call (N, Ent, Standard_Standard, Inter_Unit_Only => False);
1422
1423       elsif Same_Elaboration_Scope (C_Scope, Scope (Ent)) then
1424          Set_C_Scope;
1425          Check_A_Call (N, Ent, Scope (Ent), Inter_Unit_Only => False);
1426
1427       --  If none of those cases holds, but Dynamic_Elaboration_Checks mode
1428       --  is set, then we will do the check, but only in the inter-unit case
1429       --  (this is to accommodate unguarded elaboration calls from other units
1430       --  in which this same mode is set). We don't want warnings in this case,
1431       --  it would generate warnings having nothing to do with elaboration.
1432
1433       elsif Dynamic_Elaboration_Checks then
1434          Set_C_Scope;
1435          Check_A_Call
1436            (N,
1437             Ent,
1438             Standard_Standard,
1439             Inter_Unit_Only => True,
1440             Generate_Warnings => False);
1441
1442       --  Otherwise nothing to do
1443
1444       else
1445          return;
1446       end if;
1447
1448       --  A call to an Init_Proc in elaboration code may bring additional
1449       --  dependencies, if some of the record components thereof have
1450       --  initializations that are function calls that come from source. We
1451       --  treat the current node as a call to each of these functions, to check
1452       --  their elaboration impact.
1453
1454       if Is_Init_Proc (Ent)
1455         and then From_Elab_Code
1456       then
1457          Process_Init_Proc : declare
1458             Unit_Decl : constant Node_Id := Unit_Declaration_Node (Ent);
1459
1460             function Check_Init_Call (Nod : Node_Id) return Traverse_Result;
1461             --  Find subprogram calls within body of Init_Proc for Traverse
1462             --  instantiation below.
1463
1464             procedure Traverse_Body is new Traverse_Proc (Check_Init_Call);
1465             --  Traversal procedure to find all calls with body of Init_Proc
1466
1467             ---------------------
1468             -- Check_Init_Call --
1469             ---------------------
1470
1471             function Check_Init_Call (Nod : Node_Id) return Traverse_Result is
1472                Func : Entity_Id;
1473
1474             begin
1475                if (Nkind (Nod) = N_Function_Call
1476                     or else Nkind (Nod) = N_Procedure_Call_Statement)
1477                  and then Is_Entity_Name (Name (Nod))
1478                then
1479                   Func := Entity (Name (Nod));
1480
1481                   if Comes_From_Source (Func) then
1482                      Check_A_Call
1483                        (N, Func, Standard_Standard, Inter_Unit_Only => True);
1484                   end if;
1485
1486                   return OK;
1487
1488                else
1489                   return OK;
1490                end if;
1491             end Check_Init_Call;
1492
1493          --  Start of processing for Process_Init_Proc
1494
1495          begin
1496             if Nkind (Unit_Decl) = N_Subprogram_Body then
1497                Traverse_Body (Handled_Statement_Sequence (Unit_Decl));
1498             end if;
1499          end Process_Init_Proc;
1500       end if;
1501    end Check_Elab_Call;
1502
1503    -----------------------
1504    -- Check_Elab_Assign --
1505    -----------------------
1506
1507    procedure Check_Elab_Assign (N : Node_Id) is
1508       Ent  : Entity_Id;
1509       Scop : Entity_Id;
1510
1511       Pkg_Spec : Entity_Id;
1512       Pkg_Body : Entity_Id;
1513
1514    begin
1515       --  For record or array component, check prefix. If it is an access type,
1516       --  then there is nothing to do (we do not know what is being assigned),
1517       --  but otherwise this is an assignment to the prefix.
1518
1519       if Nkind (N) = N_Indexed_Component
1520            or else
1521          Nkind (N) = N_Selected_Component
1522            or else
1523          Nkind (N) = N_Slice
1524       then
1525          if not Is_Access_Type (Etype (Prefix (N))) then
1526             Check_Elab_Assign (Prefix (N));
1527          end if;
1528
1529          return;
1530       end if;
1531
1532       --  For type conversion, check expression
1533
1534       if Nkind (N) = N_Type_Conversion then
1535          Check_Elab_Assign (Expression (N));
1536          return;
1537       end if;
1538
1539       --  Nothing to do if this is not an entity reference otherwise get entity
1540
1541       if Is_Entity_Name (N) then
1542          Ent := Entity (N);
1543       else
1544          return;
1545       end if;
1546
1547       --  What we are looking for is a reference in the body of a package that
1548       --  modifies a variable declared in the visible part of the package spec.
1549
1550       if Present (Ent)
1551         and then Comes_From_Source (N)
1552         and then not Suppress_Elaboration_Warnings (Ent)
1553         and then Ekind (Ent) = E_Variable
1554         and then not In_Private_Part (Ent)
1555         and then Is_Library_Level_Entity (Ent)
1556       then
1557          Scop := Current_Scope;
1558          loop
1559             if No (Scop) or else Scop = Standard_Standard then
1560                return;
1561             elsif Ekind (Scop) = E_Package
1562               and then Is_Compilation_Unit (Scop)
1563             then
1564                exit;
1565             else
1566                Scop := Scope (Scop);
1567             end if;
1568          end loop;
1569
1570          --  Here Scop points to the containing library package
1571
1572          Pkg_Spec := Scop;
1573          Pkg_Body := Body_Entity (Pkg_Spec);
1574
1575          --  All OK if the package has an Elaborate_Body pragma
1576
1577          if Has_Pragma_Elaborate_Body (Scop) then
1578             return;
1579          end if;
1580
1581          --  OK if entity being modified is not in containing package spec
1582
1583          if not In_Same_Source_Unit (Scop, Ent) then
1584             return;
1585          end if;
1586
1587          --  All OK if entity appears in generic package or generic instance.
1588          --  We just get too messed up trying to give proper warnings in the
1589          --  presence of generics. Better no message than a junk one.
1590
1591          Scop := Scope (Ent);
1592          while Present (Scop) and then Scop /= Pkg_Spec loop
1593             if Ekind (Scop) = E_Generic_Package then
1594                return;
1595             elsif Ekind (Scop) = E_Package
1596               and then Is_Generic_Instance (Scop)
1597             then
1598                return;
1599             end if;
1600
1601             Scop := Scope (Scop);
1602          end loop;
1603
1604          --  All OK if in task, don't issue warnings there
1605
1606          if In_Task_Activation then
1607             return;
1608          end if;
1609
1610          --  OK if no package body
1611
1612          if No (Pkg_Body) then
1613             return;
1614          end if;
1615
1616          --  OK if reference is not in package body
1617
1618          if not In_Same_Source_Unit (Pkg_Body, N) then
1619             return;
1620          end if;
1621
1622          --  OK if package body has no handled statement sequence
1623
1624          declare
1625             HSS : constant Node_Id :=
1626                     Handled_Statement_Sequence (Declaration_Node (Pkg_Body));
1627          begin
1628             if No (HSS) or else not Comes_From_Source (HSS) then
1629                return;
1630             end if;
1631          end;
1632
1633          --  We definitely have a case of a modification of an entity in
1634          --  the package spec from the elaboration code of the package body.
1635          --  We may not give the warning (because there are some additional
1636          --  checks to avoid too many false positives), but it would be a good
1637          --  idea for the binder to try to keep the body elaboration close to
1638          --  the spec elaboration.
1639
1640          Set_Elaborate_Body_Desirable (Pkg_Spec);
1641
1642          --  All OK in gnat mode (we know what we are doing)
1643
1644          if GNAT_Mode then
1645             return;
1646          end if;
1647
1648          --  All OK if all warnings suppressed
1649
1650          if Warning_Mode = Suppress then
1651             return;
1652          end if;
1653
1654          --  All OK if elaboration checks suppressed for entity
1655
1656          if Checks_May_Be_Suppressed (Ent)
1657            and then Is_Check_Suppressed (Ent, Elaboration_Check)
1658          then
1659             return;
1660          end if;
1661
1662          --  OK if the entity is initialized. Note that the No_Initialization
1663          --  flag usually means that the initialization has been rewritten into
1664          --  assignments, but that still counts for us.
1665
1666          declare
1667             Decl : constant Node_Id := Declaration_Node (Ent);
1668          begin
1669             if Nkind (Decl) = N_Object_Declaration
1670               and then (Present (Expression (Decl))
1671                           or else No_Initialization (Decl))
1672             then
1673                return;
1674             end if;
1675          end;
1676
1677          --  Here is where we give the warning
1678
1679          --  All OK if warnings suppressed on the entity
1680
1681          if not Has_Warnings_Off (Ent) then
1682             Error_Msg_Sloc := Sloc (Ent);
1683
1684             Error_Msg_NE
1685               ("?elaboration code may access& before it is initialized",
1686                N, Ent);
1687             Error_Msg_NE
1688               ("\?suggest adding pragma Elaborate_Body to spec of &",
1689                N, Scop);
1690             Error_Msg_N
1691               ("\?or an explicit initialization could be added #", N);
1692          end if;
1693
1694          if not All_Errors_Mode then
1695             Set_Suppress_Elaboration_Warnings (Ent);
1696          end if;
1697       end if;
1698    end Check_Elab_Assign;
1699
1700    ----------------------
1701    -- Check_Elab_Calls --
1702    ----------------------
1703
1704    procedure Check_Elab_Calls is
1705    begin
1706       --  If expansion is disabled, do not generate any checks. Also skip
1707       --  checks if any subunits are missing because in either case we lack the
1708       --  full information that we need, and no object file will be created in
1709       --  any case.
1710
1711       if not Expander_Active
1712         or else Is_Generic_Unit (Cunit_Entity (Main_Unit))
1713         or else Subunits_Missing
1714       then
1715          return;
1716       end if;
1717
1718       --  Skip delayed calls if we had any errors
1719
1720       if Serious_Errors_Detected = 0 then
1721          Delaying_Elab_Checks := False;
1722          Expander_Mode_Save_And_Set (True);
1723
1724          for J in Delay_Check.First .. Delay_Check.Last loop
1725             Push_Scope (Delay_Check.Table (J).Curscop);
1726             From_Elab_Code := Delay_Check.Table (J).From_Elab_Code;
1727
1728             Check_Internal_Call_Continue (
1729               N           => Delay_Check.Table (J).N,
1730               E           => Delay_Check.Table (J).E,
1731               Outer_Scope => Delay_Check.Table (J).Outer_Scope,
1732               Orig_Ent    => Delay_Check.Table (J).Orig_Ent);
1733
1734             Pop_Scope;
1735          end loop;
1736
1737          --  Set Delaying_Elab_Checks back on for next main compilation
1738
1739          Expander_Mode_Restore;
1740          Delaying_Elab_Checks := True;
1741       end if;
1742    end Check_Elab_Calls;
1743
1744    ------------------------------
1745    -- Check_Elab_Instantiation --
1746    ------------------------------
1747
1748    procedure Check_Elab_Instantiation
1749      (N           : Node_Id;
1750       Outer_Scope : Entity_Id := Empty)
1751    is
1752       Ent : Entity_Id;
1753
1754    begin
1755       --  Check for and deal with bad instantiation case. There is some
1756       --  duplicated code here, but we will worry about this later ???
1757
1758       Check_Bad_Instantiation (N);
1759
1760       if ABE_Is_Certain (N) then
1761          return;
1762       end if;
1763
1764       --  Nothing to do if we do not have an instantiation (happens in some
1765       --  error cases, and also in the formal package declaration case)
1766
1767       if Nkind (N) not in N_Generic_Instantiation then
1768          return;
1769       end if;
1770
1771       --  Nothing to do if inside a generic template
1772
1773       if Inside_A_Generic then
1774          return;
1775       end if;
1776
1777       --  Nothing to do if the instantiation is not in the main unit
1778
1779       if not In_Extended_Main_Code_Unit (N) then
1780          return;
1781       end if;
1782
1783       Ent := Get_Generic_Entity (N);
1784       From_Elab_Code := not In_Subprogram_Or_Concurrent_Unit;
1785
1786       --  See if we need to analyze this instantiation. We analyze it if
1787       --  either of the following conditions is met:
1788
1789       --    It is an inner level instantiation (since in this case it was
1790       --    triggered by an outer level call from elaboration code), but
1791       --    only if the instantiation is within the scope of the original
1792       --    outer level call.
1793
1794       --    It is an outer level instantiation from elaboration code, or the
1795       --    instantiated entity is in the same elaboration scope.
1796
1797       --  And in these cases, we will check both the inter-unit case and
1798       --  the intra-unit (within a single unit) case.
1799
1800       C_Scope := Current_Scope;
1801
1802       if Present (Outer_Scope)
1803         and then Within (Scope (Ent), Outer_Scope)
1804       then
1805          Set_C_Scope;
1806          Check_A_Call (N, Ent, Outer_Scope, Inter_Unit_Only => False);
1807
1808       elsif From_Elab_Code then
1809          Set_C_Scope;
1810          Check_A_Call (N, Ent, Standard_Standard, Inter_Unit_Only => False);
1811
1812       elsif Same_Elaboration_Scope (C_Scope, Scope (Ent)) then
1813          Set_C_Scope;
1814          Check_A_Call (N, Ent, Scope (Ent), Inter_Unit_Only => False);
1815
1816       --  If none of those cases holds, but Dynamic_Elaboration_Checks mode is
1817       --  set, then we will do the check, but only in the inter-unit case (this
1818       --  is to accommodate unguarded elaboration calls from other units in
1819       --  which this same mode is set). We inhibit warnings in this case, since
1820       --  this instantiation is not occurring in elaboration code.
1821
1822       elsif Dynamic_Elaboration_Checks then
1823          Set_C_Scope;
1824          Check_A_Call
1825            (N,
1826             Ent,
1827             Standard_Standard,
1828             Inter_Unit_Only => True,
1829             Generate_Warnings => False);
1830
1831       else
1832          return;
1833       end if;
1834    end Check_Elab_Instantiation;
1835
1836    -------------------------
1837    -- Check_Internal_Call --
1838    -------------------------
1839
1840    procedure Check_Internal_Call
1841      (N           : Node_Id;
1842       E           : Entity_Id;
1843       Outer_Scope : Entity_Id;
1844       Orig_Ent    : Entity_Id)
1845    is
1846       Inst_Case : constant Boolean := Nkind (N) in N_Generic_Instantiation;
1847
1848    begin
1849       --  If not function or procedure call or instantiation, then ignore
1850       --  call (this happens in some error case and rewriting cases)
1851
1852       if Nkind (N) /= N_Function_Call
1853            and then
1854          Nkind (N) /= N_Procedure_Call_Statement
1855            and then
1856          not Inst_Case
1857       then
1858          return;
1859
1860       --  Nothing to do if this is a call or instantiation that has
1861       --  already been found to be a sure ABE
1862
1863       elsif ABE_Is_Certain (N) then
1864          return;
1865
1866       --  Nothing to do if errors already detected (avoid cascaded errors)
1867
1868       elsif Serious_Errors_Detected /= 0 then
1869          return;
1870
1871       --  Nothing to do if not in full analysis mode
1872
1873       elsif not Full_Analysis then
1874          return;
1875
1876       --  Nothing to do if analyzing in special spec-expression mode, since the
1877       --  call is not actually being made at this time.
1878
1879       elsif In_Spec_Expression then
1880          return;
1881
1882       --  Nothing to do for call to intrinsic subprogram
1883
1884       elsif Is_Intrinsic_Subprogram (E) then
1885          return;
1886
1887       --  No need to trace local calls if checking task activation, because
1888       --  other local bodies are elaborated already.
1889
1890       elsif In_Task_Activation then
1891          return;
1892
1893       --  Nothing to do if call is within a generic unit
1894
1895       elsif Inside_A_Generic then
1896          return;
1897       end if;
1898
1899       --  Delay this call if we are still delaying calls
1900
1901       if Delaying_Elab_Checks then
1902          Delay_Check.Append (
1903            (N              => N,
1904             E              => E,
1905             Orig_Ent       => Orig_Ent,
1906             Curscop        => Current_Scope,
1907             Outer_Scope    => Outer_Scope,
1908             From_Elab_Code => From_Elab_Code));
1909          return;
1910
1911       --  Otherwise, call phase 2 continuation right now
1912
1913       else
1914          Check_Internal_Call_Continue (N, E, Outer_Scope, Orig_Ent);
1915       end if;
1916    end Check_Internal_Call;
1917
1918    ----------------------------------
1919    -- Check_Internal_Call_Continue --
1920    ----------------------------------
1921
1922    procedure Check_Internal_Call_Continue
1923      (N           : Node_Id;
1924       E           : Entity_Id;
1925       Outer_Scope : Entity_Id;
1926       Orig_Ent    : Entity_Id)
1927    is
1928       Loc       : constant Source_Ptr := Sloc (N);
1929       Inst_Case : constant Boolean := Is_Generic_Unit (E);
1930
1931       Sbody : Node_Id;
1932       Ebody : Entity_Id;
1933
1934       function Find_Elab_Reference (N : Node_Id) return Traverse_Result;
1935       --  Function applied to each node as we traverse the body. Checks for
1936       --  call or entity reference that needs checking, and if so checks it.
1937       --  Always returns OK, so entire tree is traversed, except that as
1938       --  described below subprogram bodies are skipped for now.
1939
1940       procedure Traverse is new Atree.Traverse_Proc (Find_Elab_Reference);
1941       --  Traverse procedure using above Find_Elab_Reference function
1942
1943       -------------------------
1944       -- Find_Elab_Reference --
1945       -------------------------
1946
1947       function Find_Elab_Reference (N : Node_Id) return Traverse_Result is
1948          Actual : Node_Id;
1949
1950       begin
1951          --  If user has specified that there are no entry calls in elaboration
1952          --  code, do not trace past an accept statement, because the rendez-
1953          --  vous will happen after elaboration.
1954
1955          if (Nkind (Original_Node (N)) = N_Accept_Statement
1956               or else Nkind (Original_Node (N)) = N_Selective_Accept)
1957            and then Restriction_Active (No_Entry_Calls_In_Elaboration_Code)
1958          then
1959             return Abandon;
1960
1961             --  If we have a function call, check it
1962
1963          elsif Nkind (N) = N_Function_Call then
1964             Check_Elab_Call (N, Outer_Scope);
1965             return OK;
1966
1967          --  If we have a procedure call, check the call, and also check
1968          --  arguments that are assignments (OUT or IN OUT mode formals).
1969
1970          elsif Nkind (N) = N_Procedure_Call_Statement then
1971             Check_Elab_Call (N, Outer_Scope);
1972
1973             Actual := First_Actual (N);
1974             while Present (Actual) loop
1975                if Known_To_Be_Assigned (Actual) then
1976                   Check_Elab_Assign (Actual);
1977                end if;
1978
1979                Next_Actual (Actual);
1980             end loop;
1981
1982             return OK;
1983
1984          --  If we have a generic instantiation, check it
1985
1986          elsif Nkind (N) in N_Generic_Instantiation then
1987             Check_Elab_Instantiation (N, Outer_Scope);
1988             return OK;
1989
1990          --  Skip subprogram bodies that come from source (wait for call to
1991          --  analyze these). The reason for the come from source test is to
1992          --  avoid catching task bodies.
1993
1994          --  For task bodies, we should really avoid these too, waiting for the
1995          --  task activation, but that's too much trouble to catch for now, so
1996          --  we go in unconditionally. This is not so terrible, it means the
1997          --  error backtrace is not quite complete, and we are too eager to
1998          --  scan bodies of tasks that are unused, but this is hardly very
1999          --  significant!
2000
2001          elsif Nkind (N) = N_Subprogram_Body
2002            and then Comes_From_Source (N)
2003          then
2004             return Skip;
2005
2006          elsif Nkind (N) = N_Assignment_Statement
2007            and then Comes_From_Source (N)
2008          then
2009             Check_Elab_Assign (Name (N));
2010             return OK;
2011
2012          else
2013             return OK;
2014          end if;
2015       end Find_Elab_Reference;
2016
2017    --  Start of processing for Check_Internal_Call_Continue
2018
2019    begin
2020       --  Save outer level call if at outer level
2021
2022       if Elab_Call.Last = 0 then
2023          Outer_Level_Sloc := Loc;
2024       end if;
2025
2026       Elab_Visited.Append (E);
2027
2028       --  If the call is to a function that renames a literal, no check
2029       --  is needed.
2030
2031       if Ekind (E) = E_Enumeration_Literal then
2032          return;
2033       end if;
2034
2035       Sbody := Unit_Declaration_Node (E);
2036
2037       if Nkind (Sbody) /= N_Subprogram_Body
2038            and then
2039          Nkind (Sbody) /= N_Package_Body
2040       then
2041          Ebody := Corresponding_Body (Sbody);
2042
2043          if No (Ebody) then
2044             return;
2045          else
2046             Sbody := Unit_Declaration_Node (Ebody);
2047          end if;
2048       end if;
2049
2050       --  If the body appears after the outer level call or instantiation then
2051       --  we have an error case handled below.
2052
2053       if Earlier_In_Extended_Unit (Outer_Level_Sloc, Sloc (Sbody))
2054         and then not In_Task_Activation
2055       then
2056          null;
2057
2058       --  If we have the instantiation case we are done, since we now
2059       --  know that the body of the generic appeared earlier.
2060
2061       elsif Inst_Case then
2062          return;
2063
2064       --  Otherwise we have a call, so we trace through the called body to see
2065       --  if it has any problems.
2066
2067       else
2068          pragma Assert (Nkind (Sbody) = N_Subprogram_Body);
2069
2070          Elab_Call.Append ((Cloc => Loc, Ent => E));
2071
2072          if Debug_Flag_LL then
2073             Write_Str ("Elab_Call.Last = ");
2074             Write_Int (Int (Elab_Call.Last));
2075             Write_Str ("   Ent = ");
2076             Write_Name (Chars (E));
2077             Write_Str ("   at ");
2078             Write_Location (Sloc (N));
2079             Write_Eol;
2080          end if;
2081
2082          --  Now traverse declarations and statements of subprogram body. Note
2083          --  that we cannot simply Traverse (Sbody), since traverse does not
2084          --  normally visit subprogram bodies.
2085
2086          declare
2087             Decl : Node_Id;
2088          begin
2089             Decl := First (Declarations (Sbody));
2090             while Present (Decl) loop
2091                Traverse (Decl);
2092                Next (Decl);
2093             end loop;
2094          end;
2095
2096          Traverse (Handled_Statement_Sequence (Sbody));
2097
2098          Elab_Call.Decrement_Last;
2099          return;
2100       end if;
2101
2102       --  Here is the case of calling a subprogram where the body has not yet
2103       --  been encountered, a warning message is needed.
2104
2105       --  If we have nothing in the call stack, then this is at the outer
2106       --  level, and the ABE is bound to occur.
2107
2108       if Elab_Call.Last = 0 then
2109          if Inst_Case then
2110             Error_Msg_NE
2111               ("?cannot instantiate& before body seen", N, Orig_Ent);
2112          else
2113             Error_Msg_NE
2114               ("?cannot call& before body seen", N, Orig_Ent);
2115          end if;
2116
2117          Error_Msg_N
2118            ("\?Program_Error will be raised at run time", N);
2119          Insert_Elab_Check (N);
2120
2121       --  Call is not at outer level
2122
2123       else
2124          --  Deal with dynamic elaboration check
2125
2126          if not Elaboration_Checks_Suppressed (E) then
2127             Set_Elaboration_Entity_Required (E);
2128
2129             --  Case of no elaboration entity allocated yet
2130
2131             if No (Elaboration_Entity (E)) then
2132
2133                --  Create object declaration for elaboration entity, and put it
2134                --  just in front of the spec of the subprogram or generic unit,
2135                --  in the same scope as this unit.
2136
2137                declare
2138                   Loce : constant Source_Ptr := Sloc (E);
2139                   Ent  : constant Entity_Id  :=
2140                            Make_Defining_Identifier (Loc,
2141                              Chars => New_External_Name (Chars (E), 'E'));
2142
2143                begin
2144                   Set_Elaboration_Entity (E, Ent);
2145                   Push_Scope (Scope (E));
2146
2147                   Insert_Action (Declaration_Node (E),
2148                     Make_Object_Declaration (Loce,
2149                       Defining_Identifier => Ent,
2150                       Object_Definition =>
2151                         New_Occurrence_Of (Standard_Boolean, Loce),
2152                       Expression => New_Occurrence_Of (Standard_False, Loce)));
2153
2154                   --  Set elaboration flag at the point of the body
2155
2156                   Set_Elaboration_Flag (Sbody, E);
2157
2158                   --  Kill current value indication. This is necessary because
2159                   --  the tests of this flag are inserted out of sequence and
2160                   --  must not pick up bogus indications of the wrong constant
2161                   --  value. Also, this is never a true constant, since one way
2162                   --  or another, it gets reset.
2163
2164                   Set_Current_Value    (Ent, Empty);
2165                   Set_Last_Assignment  (Ent, Empty);
2166                   Set_Is_True_Constant (Ent, False);
2167                   Pop_Scope;
2168                end;
2169             end if;
2170
2171             --  Generate check of the elaboration Boolean
2172
2173             Insert_Elab_Check (N,
2174               New_Occurrence_Of (Elaboration_Entity (E), Loc));
2175          end if;
2176
2177          --  Generate the warning
2178
2179          if not Suppress_Elaboration_Warnings (E)
2180            and then not Elaboration_Checks_Suppressed (E)
2181          then
2182             if Inst_Case then
2183                Error_Msg_NE
2184                  ("instantiation of& may occur before body is seen?",
2185                   N, Orig_Ent);
2186             else
2187                Error_Msg_NE
2188                  ("call to& may occur before body is seen?", N, Orig_Ent);
2189             end if;
2190
2191             Error_Msg_N
2192               ("\Program_Error may be raised at run time?", N);
2193
2194             Output_Calls (N);
2195          end if;
2196       end if;
2197
2198       --  Set flag to suppress further warnings on same subprogram
2199       --  unless in all errors mode
2200
2201       if not All_Errors_Mode then
2202          Set_Suppress_Elaboration_Warnings (E);
2203       end if;
2204    end Check_Internal_Call_Continue;
2205
2206    ---------------------------
2207    -- Check_Task_Activation --
2208    ---------------------------
2209
2210    procedure Check_Task_Activation (N : Node_Id) is
2211       Loc         : constant Source_Ptr := Sloc (N);
2212       Inter_Procs : constant Elist_Id   := New_Elmt_List;
2213       Intra_Procs : constant Elist_Id   := New_Elmt_List;
2214       Ent         : Entity_Id;
2215       P           : Entity_Id;
2216       Task_Scope  : Entity_Id;
2217       Cunit_SC    : Boolean := False;
2218       Decl        : Node_Id;
2219       Elmt        : Elmt_Id;
2220       Enclosing   : Entity_Id;
2221
2222       procedure Add_Task_Proc (Typ : Entity_Id);
2223       --  Add to Task_Procs the task body procedure(s) of task types in Typ.
2224       --  For record types, this procedure recurses over component types.
2225
2226       procedure Collect_Tasks (Decls : List_Id);
2227       --  Collect the types of the tasks that are to be activated in the given
2228       --  list of declarations, in order to perform elaboration checks on the
2229       --  corresponding task procedures which are called implicitly here.
2230
2231       function Outer_Unit (E : Entity_Id) return Entity_Id;
2232       --  find enclosing compilation unit of Entity, ignoring subunits, or
2233       --  else enclosing subprogram. If E is not a package, there is no need
2234       --  for inter-unit elaboration checks.
2235
2236       -------------------
2237       -- Add_Task_Proc --
2238       -------------------
2239
2240       procedure Add_Task_Proc (Typ : Entity_Id) is
2241          Comp : Entity_Id;
2242          Proc : Entity_Id := Empty;
2243
2244       begin
2245          if Is_Task_Type (Typ) then
2246             Proc := Get_Task_Body_Procedure (Typ);
2247
2248          elsif Is_Array_Type (Typ)
2249            and then Has_Task (Base_Type (Typ))
2250          then
2251             Add_Task_Proc (Component_Type (Typ));
2252
2253          elsif Is_Record_Type (Typ)
2254            and then Has_Task (Base_Type (Typ))
2255          then
2256             Comp := First_Component (Typ);
2257             while Present (Comp) loop
2258                Add_Task_Proc (Etype (Comp));
2259                Comp := Next_Component (Comp);
2260             end loop;
2261          end if;
2262
2263          --  If the task type is another unit, we will perform the usual
2264          --  elaboration check on its enclosing unit. If the type is in the
2265          --  same unit, we can trace the task body as for an internal call,
2266          --  but we only need to examine other external calls, because at
2267          --  the point the task is activated, internal subprogram bodies
2268          --  will have been elaborated already. We keep separate lists for
2269          --  each kind of task.
2270
2271          --  Skip this test if errors have occurred, since in this case
2272          --  we can get false indications.
2273
2274          if Serious_Errors_Detected /= 0 then
2275             return;
2276          end if;
2277
2278          if Present (Proc) then
2279             if Outer_Unit (Scope (Proc)) = Enclosing then
2280
2281                if No (Corresponding_Body (Unit_Declaration_Node (Proc)))
2282                  and then
2283                    (not Is_Generic_Instance (Scope (Proc))
2284                       or else
2285                     Scope (Proc) = Scope (Defining_Identifier (Decl)))
2286                then
2287                   Error_Msg_N
2288                     ("task will be activated before elaboration of its body?",
2289                       Decl);
2290                   Error_Msg_N
2291                     ("\Program_Error will be raised at run time?", Decl);
2292
2293                elsif
2294                  Present (Corresponding_Body (Unit_Declaration_Node (Proc)))
2295                then
2296                   Append_Elmt (Proc, Intra_Procs);
2297                end if;
2298
2299             else
2300                --  No need for multiple entries of the same type
2301
2302                Elmt := First_Elmt (Inter_Procs);
2303                while Present (Elmt) loop
2304                   if Node (Elmt) = Proc then
2305                      return;
2306                   end if;
2307
2308                   Next_Elmt (Elmt);
2309                end loop;
2310
2311                Append_Elmt (Proc, Inter_Procs);
2312             end if;
2313          end if;
2314       end Add_Task_Proc;
2315
2316       -------------------
2317       -- Collect_Tasks --
2318       -------------------
2319
2320       procedure Collect_Tasks (Decls : List_Id) is
2321       begin
2322          if Present (Decls) then
2323             Decl := First (Decls);
2324             while Present (Decl) loop
2325                if Nkind (Decl) = N_Object_Declaration
2326                  and then Has_Task (Etype (Defining_Identifier (Decl)))
2327                then
2328                   Add_Task_Proc (Etype (Defining_Identifier (Decl)));
2329                end if;
2330
2331                Next (Decl);
2332             end loop;
2333          end if;
2334       end Collect_Tasks;
2335
2336       ----------------
2337       -- Outer_Unit --
2338       ----------------
2339
2340       function Outer_Unit (E : Entity_Id) return Entity_Id is
2341          Outer : Entity_Id;
2342
2343       begin
2344          Outer := E;
2345          while Present (Outer) loop
2346             if Elaboration_Checks_Suppressed (Outer) then
2347                Cunit_SC := True;
2348             end if;
2349
2350             exit when Is_Child_Unit (Outer)
2351               or else Scope (Outer) = Standard_Standard
2352               or else Ekind (Outer) /= E_Package;
2353             Outer := Scope (Outer);
2354          end loop;
2355
2356          return Outer;
2357       end Outer_Unit;
2358
2359    --  Start of processing for Check_Task_Activation
2360
2361    begin
2362       Enclosing := Outer_Unit (Current_Scope);
2363
2364       --  Find all tasks declared in the current unit
2365
2366       if Nkind (N) = N_Package_Body then
2367          P := Unit_Declaration_Node (Corresponding_Spec (N));
2368
2369          Collect_Tasks (Declarations (N));
2370          Collect_Tasks (Visible_Declarations (Specification (P)));
2371          Collect_Tasks (Private_Declarations (Specification (P)));
2372
2373       elsif Nkind (N) = N_Package_Declaration then
2374          Collect_Tasks (Visible_Declarations (Specification (N)));
2375          Collect_Tasks (Private_Declarations (Specification (N)));
2376
2377       else
2378          Collect_Tasks (Declarations (N));
2379       end if;
2380
2381       --  We only perform detailed checks in all tasks are library level
2382       --  entities. If the master is a subprogram or task, activation will
2383       --  depend on the activation of the master itself.
2384
2385       --  Should dynamic checks be added in the more general case???
2386
2387       if Ekind (Enclosing) /= E_Package then
2388          return;
2389       end if;
2390
2391       --  For task types defined in other units, we want the unit containing
2392       --  the task body to be elaborated before the current one.
2393
2394       Elmt := First_Elmt (Inter_Procs);
2395       while Present (Elmt) loop
2396          Ent := Node (Elmt);
2397          Task_Scope := Outer_Unit (Scope (Ent));
2398
2399          if not Is_Compilation_Unit (Task_Scope) then
2400             null;
2401
2402          elsif Suppress_Elaboration_Warnings (Task_Scope)
2403            or else Elaboration_Checks_Suppressed (Task_Scope)
2404          then
2405             null;
2406
2407          elsif Dynamic_Elaboration_Checks then
2408             if not Elaboration_Checks_Suppressed (Ent)
2409               and then not Cunit_SC
2410               and then
2411                 not Restriction_Active (No_Entry_Calls_In_Elaboration_Code)
2412             then
2413                --  Runtime elaboration check required. Generate check of the
2414                --  elaboration Boolean for the unit containing the entity.
2415
2416                Insert_Elab_Check (N,
2417                  Make_Attribute_Reference (Loc,
2418                    Attribute_Name => Name_Elaborated,
2419                    Prefix =>
2420                      New_Occurrence_Of (Spec_Entity (Task_Scope), Loc)));
2421             end if;
2422
2423          else
2424             --  Force the binder to elaborate other unit first
2425
2426             if not Suppress_Elaboration_Warnings (Ent)
2427               and then not Elaboration_Checks_Suppressed (Ent)
2428               and then Elab_Warnings
2429               and then not Suppress_Elaboration_Warnings (Task_Scope)
2430               and then not Elaboration_Checks_Suppressed (Task_Scope)
2431             then
2432                Error_Msg_Node_2 := Task_Scope;
2433                Error_Msg_NE
2434                  ("activation of an instance of task type&" &
2435                   " requires pragma Elaborate_All on &?", N, Ent);
2436             end if;
2437
2438             Activate_Elaborate_All_Desirable (N, Task_Scope);
2439             Set_Suppress_Elaboration_Warnings (Task_Scope);
2440          end if;
2441
2442          Next_Elmt (Elmt);
2443       end loop;
2444
2445       --  For tasks declared in the current unit, trace other calls within
2446       --  the task procedure bodies, which are available.
2447
2448       In_Task_Activation := True;
2449
2450       Elmt := First_Elmt (Intra_Procs);
2451       while Present (Elmt) loop
2452          Ent := Node (Elmt);
2453          Check_Internal_Call_Continue (N, Ent, Enclosing, Ent);
2454          Next_Elmt (Elmt);
2455       end loop;
2456
2457       In_Task_Activation := False;
2458    end Check_Task_Activation;
2459
2460    --------------------------------
2461    -- Set_Elaboration_Constraint --
2462    --------------------------------
2463
2464    procedure Set_Elaboration_Constraint
2465     (Call : Node_Id;
2466      Subp : Entity_Id;
2467      Scop : Entity_Id)
2468    is
2469       Elab_Unit  : Entity_Id;
2470       Init_Call  : constant Boolean :=
2471                      Chars (Subp) = Name_Initialize
2472                        and then Comes_From_Source (Subp)
2473                        and then Present (Parameter_Associations (Call))
2474                        and then Is_Controlled (Etype (First_Actual (Call)));
2475    begin
2476       --  If the unit is mentioned in a with_clause of the current unit, it is
2477       --  visible, and we can set the elaboration flag.
2478
2479       if Is_Immediately_Visible (Scop)
2480         or else (Is_Child_Unit (Scop) and then Is_Visible_Child_Unit (Scop))
2481       then
2482          Activate_Elaborate_All_Desirable (Call, Scop);
2483          Set_Suppress_Elaboration_Warnings (Scop, True);
2484          return;
2485       end if;
2486
2487       --  If this is not an initialization call or a call using object notation
2488       --  we know that the unit of the called entity is in the context, and
2489       --  we can set the flag as well. The unit need not be visible if the call
2490       --  occurs within an instantiation.
2491
2492       if Is_Init_Proc (Subp)
2493         or else Init_Call
2494         or else Nkind (Original_Node (Call)) = N_Selected_Component
2495       then
2496          null;  --  detailed processing follows.
2497
2498       else
2499          Activate_Elaborate_All_Desirable (Call, Scop);
2500          Set_Suppress_Elaboration_Warnings (Scop, True);
2501          return;
2502       end if;
2503
2504       --  If the unit is not in the context, there must be an intermediate unit
2505       --  that is, on which we need to place to elaboration flag. This happens
2506       --  with init proc calls.
2507
2508       if Is_Init_Proc (Subp)
2509         or else Init_Call
2510       then
2511          --  The initialization call is on an object whose type is not declared
2512          --  in the same scope as the subprogram. The type of the object must
2513          --  be a subtype of the type of operation. This object is the first
2514          --  actual in the call.
2515
2516          declare
2517             Typ : constant Entity_Id :=
2518                     Etype (First (Parameter_Associations (Call)));
2519          begin
2520             Elab_Unit := Scope (Typ);
2521             while (Present (Elab_Unit))
2522               and then not Is_Compilation_Unit (Elab_Unit)
2523             loop
2524                Elab_Unit := Scope (Elab_Unit);
2525             end loop;
2526          end;
2527
2528       --  If original node uses selected component notation, the prefix is
2529       --  visible and determines the scope that must be elaborated. After
2530       --  rewriting, the prefix is the first actual in the call.
2531
2532       elsif Nkind (Original_Node (Call)) = N_Selected_Component then
2533          Elab_Unit := Scope (Etype (First (Parameter_Associations (Call))));
2534
2535       --  Not one of special cases above
2536
2537       else
2538          --  Using previously computed scope. If the elaboration check is
2539          --  done after analysis, the scope is not visible any longer, but
2540          --  must still be in the context.
2541
2542          Elab_Unit := Scop;
2543       end if;
2544
2545       Activate_Elaborate_All_Desirable (Call, Elab_Unit);
2546       Set_Suppress_Elaboration_Warnings (Elab_Unit, True);
2547    end Set_Elaboration_Constraint;
2548
2549    ----------------------
2550    -- Has_Generic_Body --
2551    ----------------------
2552
2553    function Has_Generic_Body (N : Node_Id) return Boolean is
2554       Ent  : constant Entity_Id := Get_Generic_Entity (N);
2555       Decl : constant Node_Id   := Unit_Declaration_Node (Ent);
2556       Scop : Entity_Id;
2557
2558       function Find_Body_In (E : Entity_Id; N : Node_Id) return Node_Id;
2559       --  Determine if the list of nodes headed by N and linked by Next
2560       --  contains a package body for the package spec entity E, and if so
2561       --  return the package body. If not, then returns Empty.
2562
2563       function Load_Package_Body (Nam : Unit_Name_Type) return Node_Id;
2564       --  This procedure is called load the unit whose name is given by Nam.
2565       --  This unit is being loaded to see whether it contains an optional
2566       --  generic body. The returned value is the loaded unit, which is always
2567       --  a package body (only package bodies can contain other entities in the
2568       --  sense in which Has_Generic_Body is interested). We only attempt to
2569       --  load bodies if we are generating code. If we are in semantics check
2570       --  only mode, then it would be wrong to load bodies that are not
2571       --  required from a semantic point of view, so in this case we return
2572       --  Empty. The result is that the caller may incorrectly decide that a
2573       --  generic spec does not have a body when in fact it does, but the only
2574       --  harm in this is that some warnings on elaboration problems may be
2575       --  lost in semantic checks only mode, which is not big loss. We also
2576       --  return Empty if we go for a body and it is not there.
2577
2578       function Locate_Corresponding_Body (PE : Entity_Id) return Node_Id;
2579       --  PE is the entity for a package spec. This function locates the
2580       --  corresponding package body, returning Empty if none is found. The
2581       --  package body returned is fully parsed but may not yet be analyzed,
2582       --  so only syntactic fields should be referenced.
2583
2584       ------------------
2585       -- Find_Body_In --
2586       ------------------
2587
2588       function Find_Body_In (E : Entity_Id; N : Node_Id) return Node_Id is
2589          Nod : Node_Id;
2590
2591       begin
2592          Nod := N;
2593          while Present (Nod) loop
2594
2595             --  If we found the package body we are looking for, return it
2596
2597             if Nkind (Nod) = N_Package_Body
2598               and then Chars (Defining_Unit_Name (Nod)) = Chars (E)
2599             then
2600                return Nod;
2601
2602             --  If we found the stub for the body, go after the subunit,
2603             --  loading it if necessary.
2604
2605             elsif Nkind (Nod) = N_Package_Body_Stub
2606               and then Chars (Defining_Identifier (Nod)) = Chars (E)
2607             then
2608                if Present (Library_Unit (Nod)) then
2609                   return Unit (Library_Unit (Nod));
2610
2611                else
2612                   return Load_Package_Body (Get_Unit_Name (Nod));
2613                end if;
2614
2615             --  If neither package body nor stub, keep looking on chain
2616
2617             else
2618                Next (Nod);
2619             end if;
2620          end loop;
2621
2622          return Empty;
2623       end Find_Body_In;
2624
2625       -----------------------
2626       -- Load_Package_Body --
2627       -----------------------
2628
2629       function Load_Package_Body (Nam : Unit_Name_Type) return Node_Id is
2630          U : Unit_Number_Type;
2631
2632       begin
2633          if Operating_Mode /= Generate_Code then
2634             return Empty;
2635          else
2636             U :=
2637               Load_Unit
2638                 (Load_Name  => Nam,
2639                  Required   => False,
2640                  Subunit    => False,
2641                  Error_Node => N);
2642
2643             if U = No_Unit then
2644                return Empty;
2645             else
2646                return Unit (Cunit (U));
2647             end if;
2648          end if;
2649       end Load_Package_Body;
2650
2651       -------------------------------
2652       -- Locate_Corresponding_Body --
2653       -------------------------------
2654
2655       function Locate_Corresponding_Body (PE : Entity_Id) return Node_Id is
2656          Spec  : constant Node_Id   := Declaration_Node (PE);
2657          Decl  : constant Node_Id   := Parent (Spec);
2658          Scop  : constant Entity_Id := Scope (PE);
2659          PBody : Node_Id;
2660
2661       begin
2662          if Is_Library_Level_Entity (PE) then
2663
2664             --  If package is a library unit that requires a body, we have no
2665             --  choice but to go after that body because it might contain an
2666             --  optional body for the original generic package.
2667
2668             if Unit_Requires_Body (PE) then
2669
2670                --  Load the body. Note that we are a little careful here to use
2671                --  Spec to get the unit number, rather than PE or Decl, since
2672                --  in the case where the package is itself a library level
2673                --  instantiation, Spec will properly reference the generic
2674                --  template, which is what we really want.
2675
2676                return
2677                  Load_Package_Body
2678                    (Get_Body_Name (Unit_Name (Get_Source_Unit (Spec))));
2679
2680             --  But if the package is a library unit that does NOT require
2681             --  a body, then no body is permitted, so we are sure that there
2682             --  is no body for the original generic package.
2683
2684             else
2685                return Empty;
2686             end if;
2687
2688          --  Otherwise look and see if we are embedded in a further package
2689
2690          elsif Is_Package_Or_Generic_Package (Scop) then
2691
2692             --  If so, get the body of the enclosing package, and look in
2693             --  its package body for the package body we are looking for.
2694
2695             PBody := Locate_Corresponding_Body (Scop);
2696
2697             if No (PBody) then
2698                return Empty;
2699             else
2700                return Find_Body_In (PE, First (Declarations (PBody)));
2701             end if;
2702
2703          --  If we are not embedded in a further package, then the body
2704          --  must be in the same declarative part as we are.
2705
2706          else
2707             return Find_Body_In (PE, Next (Decl));
2708          end if;
2709       end Locate_Corresponding_Body;
2710
2711    --  Start of processing for Has_Generic_Body
2712
2713    begin
2714       if Present (Corresponding_Body (Decl)) then
2715          return True;
2716
2717       elsif Unit_Requires_Body (Ent) then
2718          return True;
2719
2720       --  Compilation units cannot have optional bodies
2721
2722       elsif Is_Compilation_Unit (Ent) then
2723          return False;
2724
2725       --  Otherwise look at what scope we are in
2726
2727       else
2728          Scop := Scope (Ent);
2729
2730          --  Case of entity is in other than a package spec, in this case
2731          --  the body, if present, must be in the same declarative part.
2732
2733          if not Is_Package_Or_Generic_Package (Scop) then
2734             declare
2735                P : Node_Id;
2736
2737             begin
2738                --  Declaration node may get us a spec, so if so, go to
2739                --  the parent declaration.
2740
2741                P := Declaration_Node (Ent);
2742                while not Is_List_Member (P) loop
2743                   P := Parent (P);
2744                end loop;
2745
2746                return Present (Find_Body_In (Ent, Next (P)));
2747             end;
2748
2749          --  If the entity is in a package spec, then we have to locate
2750          --  the corresponding package body, and look there.
2751
2752          else
2753             declare
2754                PBody : constant Node_Id := Locate_Corresponding_Body (Scop);
2755
2756             begin
2757                if No (PBody) then
2758                   return False;
2759                else
2760                   return
2761                     Present
2762                       (Find_Body_In (Ent, (First (Declarations (PBody)))));
2763                end if;
2764             end;
2765          end if;
2766       end if;
2767    end Has_Generic_Body;
2768
2769    -----------------------
2770    -- Insert_Elab_Check --
2771    -----------------------
2772
2773    procedure Insert_Elab_Check (N : Node_Id; C : Node_Id := Empty) is
2774       Nod : Node_Id;
2775       Loc : constant Source_Ptr := Sloc (N);
2776
2777    begin
2778       --  If expansion is disabled, do not generate any checks. Also
2779       --  skip checks if any subunits are missing because in either
2780       --  case we lack the full information that we need, and no object
2781       --  file will be created in any case.
2782
2783       if not Expander_Active or else Subunits_Missing then
2784          return;
2785       end if;
2786
2787       --  If we have a generic instantiation, where Instance_Spec is set,
2788       --  then this field points to a generic instance spec that has
2789       --  been inserted before the instantiation node itself, so that
2790       --  is where we want to insert a check.
2791
2792       if Nkind (N) in N_Generic_Instantiation
2793         and then Present (Instance_Spec (N))
2794       then
2795          Nod := Instance_Spec (N);
2796       else
2797          Nod := N;
2798       end if;
2799
2800       --  If we are inserting at the top level, insert in Aux_Decls
2801
2802       if Nkind (Parent (Nod)) = N_Compilation_Unit then
2803          declare
2804             ADN : constant Node_Id := Aux_Decls_Node (Parent (Nod));
2805             R   : Node_Id;
2806
2807          begin
2808             if No (C) then
2809                R :=
2810                  Make_Raise_Program_Error (Loc,
2811                    Reason => PE_Access_Before_Elaboration);
2812             else
2813                R :=
2814                  Make_Raise_Program_Error (Loc,
2815                    Condition => Make_Op_Not (Loc, C),
2816                    Reason    => PE_Access_Before_Elaboration);
2817             end if;
2818
2819             if No (Declarations (ADN)) then
2820                Set_Declarations (ADN, New_List (R));
2821             else
2822                Append_To (Declarations (ADN), R);
2823             end if;
2824
2825             Analyze (R);
2826          end;
2827
2828       --  Otherwise just insert before the node in question. However, if
2829       --  the context of the call has already been analyzed, an insertion
2830       --  will not work if it depends on subsequent expansion (e.g. a call in
2831       --  a branch of a short-circuit). In that case we replace the call with
2832       --  a conditional expression, or with a Raise if it is unconditional.
2833       --  Unfortunately this does not work if the call has a dynamic size,
2834       --  because gigi regards it as a dynamic-sized temporary. If such a call
2835       --  appears in a short-circuit expression, the elaboration check will be
2836       --  missed (rare enough ???). Otherwise, the code below inserts the check
2837       --  at the appropriate place before the call. Same applies in the even
2838       --  rarer case the return type has a known size but is unconstrained.
2839
2840       else
2841          if Nkind (N) = N_Function_Call
2842            and then Analyzed (Parent (N))
2843            and then Size_Known_At_Compile_Time (Etype (N))
2844            and then
2845             (not Has_Discriminants (Etype (N))
2846               or else Is_Constrained (Etype (N)))
2847
2848          then
2849             declare
2850                Typ : constant Entity_Id := Etype (N);
2851                Chk : constant Boolean   := Do_Range_Check (N);
2852
2853                R  : constant Node_Id :=
2854                       Make_Raise_Program_Error (Loc,
2855                          Reason => PE_Access_Before_Elaboration);
2856
2857                Reloc_N : Node_Id;
2858
2859             begin
2860                Set_Etype (R, Typ);
2861
2862                if No (C) then
2863                   Rewrite (N, R);
2864
2865                else
2866                   Reloc_N := Relocate_Node (N);
2867                   Save_Interps (N, Reloc_N);
2868                   Rewrite (N,
2869                     Make_Conditional_Expression (Loc,
2870                       Expressions => New_List (C, Reloc_N, R)));
2871                end if;
2872
2873                Analyze_And_Resolve (N, Typ);
2874
2875                --  If the original call requires a range check, so does the
2876                --  conditional expression.
2877
2878                if Chk then
2879                   Enable_Range_Check (N);
2880                else
2881                   Set_Do_Range_Check (N, False);
2882                end if;
2883             end;
2884
2885          else
2886             if No (C) then
2887                Insert_Action (Nod,
2888                   Make_Raise_Program_Error (Loc,
2889                     Reason => PE_Access_Before_Elaboration));
2890             else
2891                Insert_Action (Nod,
2892                   Make_Raise_Program_Error (Loc,
2893                     Condition =>
2894                       Make_Op_Not (Loc,
2895                         Right_Opnd => C),
2896                     Reason => PE_Access_Before_Elaboration));
2897             end if;
2898          end if;
2899       end if;
2900    end Insert_Elab_Check;
2901
2902    ------------------
2903    -- Output_Calls --
2904    ------------------
2905
2906    procedure Output_Calls (N : Node_Id) is
2907       Ent : Entity_Id;
2908
2909       function Is_Printable_Error_Name (Nm : Name_Id) return Boolean;
2910       --  An internal function, used to determine if a name, Nm, is either
2911       --  a non-internal name, or is an internal name that is printable
2912       --  by the error message circuits (i.e. it has a single upper
2913       --  case letter at the end).
2914
2915       function Is_Printable_Error_Name (Nm : Name_Id) return Boolean is
2916       begin
2917          if not Is_Internal_Name (Nm) then
2918             return True;
2919
2920          elsif Name_Len = 1 then
2921             return False;
2922
2923          else
2924             Name_Len := Name_Len - 1;
2925             return not Is_Internal_Name;
2926          end if;
2927       end Is_Printable_Error_Name;
2928
2929    --  Start of processing for Output_Calls
2930
2931    begin
2932       for J in reverse 1 .. Elab_Call.Last loop
2933          Error_Msg_Sloc := Elab_Call.Table (J).Cloc;
2934
2935          Ent := Elab_Call.Table (J).Ent;
2936
2937          if Is_Generic_Unit (Ent) then
2938             Error_Msg_NE ("\?& instantiated #", N, Ent);
2939
2940          elsif Is_Init_Proc (Ent) then
2941             Error_Msg_N ("\?initialization procedure called #", N);
2942
2943          elsif Is_Printable_Error_Name (Chars (Ent)) then
2944             Error_Msg_NE ("\?& called #", N, Ent);
2945
2946          else
2947             Error_Msg_N ("\? called #", N);
2948          end if;
2949       end loop;
2950    end Output_Calls;
2951
2952    ----------------------------
2953    -- Same_Elaboration_Scope --
2954    ----------------------------
2955
2956    function Same_Elaboration_Scope (Scop1, Scop2 : Entity_Id) return Boolean is
2957       S1 : Entity_Id;
2958       S2 : Entity_Id;
2959
2960    begin
2961       --  Find elaboration scope for Scop1
2962       --  This is either a subprogram or a compilation unit.
2963
2964       S1 := Scop1;
2965       while S1 /= Standard_Standard
2966         and then not Is_Compilation_Unit (S1)
2967         and then (Ekind (S1) = E_Package
2968                     or else
2969                   Ekind (S1) = E_Protected_Type
2970                     or else
2971                   Ekind (S1) = E_Block)
2972       loop
2973          S1 := Scope (S1);
2974       end loop;
2975
2976       --  Find elaboration scope for Scop2
2977
2978       S2 := Scop2;
2979       while S2 /= Standard_Standard
2980         and then not Is_Compilation_Unit (S2)
2981         and then (Ekind (S2) = E_Package
2982                     or else
2983                   Ekind (S2) = E_Protected_Type
2984                     or else
2985                   Ekind (S2) = E_Block)
2986       loop
2987          S2 := Scope (S2);
2988       end loop;
2989
2990       return S1 = S2;
2991    end Same_Elaboration_Scope;
2992
2993    -----------------
2994    -- Set_C_Scope --
2995    -----------------
2996
2997    procedure Set_C_Scope is
2998    begin
2999       while not Is_Compilation_Unit (C_Scope) loop
3000          C_Scope := Scope (C_Scope);
3001       end loop;
3002    end Set_C_Scope;
3003
3004    -----------------
3005    -- Spec_Entity --
3006    -----------------
3007
3008    function Spec_Entity (E : Entity_Id) return Entity_Id is
3009       Decl : Node_Id;
3010
3011    begin
3012       --  Check for case of body entity
3013       --  Why is the check for E_Void needed???
3014
3015       if Ekind_In (E, E_Void, E_Subprogram_Body, E_Package_Body) then
3016          Decl := E;
3017
3018          loop
3019             Decl := Parent (Decl);
3020             exit when Nkind (Decl) in N_Proper_Body;
3021          end loop;
3022
3023          return Corresponding_Spec (Decl);
3024
3025       else
3026          return E;
3027       end if;
3028    end Spec_Entity;
3029
3030    -------------------
3031    -- Supply_Bodies --
3032    -------------------
3033
3034    procedure Supply_Bodies (N : Node_Id) is
3035    begin
3036       if Nkind (N) = N_Subprogram_Declaration then
3037          declare
3038             Ent : constant Entity_Id := Defining_Unit_Name (Specification (N));
3039          begin
3040
3041             --  Internal subprograms will already have a generated body, so
3042             --  there is no need to provide a stub for them.
3043
3044             if No (Corresponding_Body (N)) then
3045                declare
3046                   Loc     : constant Source_Ptr := Sloc (N);
3047                   B       : Node_Id;
3048                   Formals : constant List_Id := Copy_Parameter_List (Ent);
3049                   Nam     : constant Entity_Id :=
3050                               Make_Defining_Identifier (Loc, Chars (Ent));
3051                   Spec    : Node_Id;
3052                   Stats   : constant List_Id :=
3053                               New_List
3054                                (Make_Raise_Program_Error (Loc,
3055                                   Reason => PE_Access_Before_Elaboration));
3056
3057                begin
3058                   if Ekind (Ent) = E_Function then
3059                      Spec :=
3060                         Make_Function_Specification (Loc,
3061                           Defining_Unit_Name => Nam,
3062                           Parameter_Specifications => Formals,
3063                           Result_Definition =>
3064                             New_Copy_Tree
3065                               (Result_Definition (Specification (N))));
3066
3067                      --  We cannot reliably make a return statement for this
3068                      --  body, but none is needed because the call raises
3069                      --  program error.
3070
3071                      Set_Return_Present (Ent);
3072
3073                   else
3074                      Spec :=
3075                         Make_Procedure_Specification (Loc,
3076                           Defining_Unit_Name => Nam,
3077                           Parameter_Specifications => Formals);
3078                   end if;
3079
3080                   B := Make_Subprogram_Body (Loc,
3081                           Specification => Spec,
3082                           Declarations => New_List,
3083                           Handled_Statement_Sequence =>
3084                             Make_Handled_Sequence_Of_Statements (Loc,  Stats));
3085                   Insert_After (N, B);
3086                   Analyze (B);
3087                end;
3088             end if;
3089          end;
3090
3091       elsif Nkind (N) = N_Package_Declaration then
3092          declare
3093             Spec : constant Node_Id := Specification (N);
3094          begin
3095             Push_Scope (Defining_Unit_Name (Spec));
3096             Supply_Bodies (Visible_Declarations (Spec));
3097             Supply_Bodies (Private_Declarations (Spec));
3098             Pop_Scope;
3099          end;
3100       end if;
3101    end Supply_Bodies;
3102
3103    procedure Supply_Bodies (L : List_Id) is
3104       Elmt : Node_Id;
3105    begin
3106       if Present (L) then
3107          Elmt := First (L);
3108          while Present (Elmt) loop
3109             Supply_Bodies (Elmt);
3110             Next (Elmt);
3111          end loop;
3112       end if;
3113    end Supply_Bodies;
3114
3115    ------------
3116    -- Within --
3117    ------------
3118
3119    function Within (E1, E2 : Entity_Id) return Boolean is
3120       Scop : Entity_Id;
3121    begin
3122       Scop := E1;
3123       loop
3124          if Scop = E2 then
3125             return True;
3126          elsif Scop = Standard_Standard then
3127             return False;
3128          else
3129             Scop := Scope (Scop);
3130          end if;
3131       end loop;
3132    end Within;
3133
3134    --------------------------
3135    -- Within_Elaborate_All --
3136    --------------------------
3137
3138    function Within_Elaborate_All (E : Entity_Id) return Boolean is
3139       Item    : Node_Id;
3140       Item2   : Node_Id;
3141       Elab_Id : Entity_Id;
3142       Par     : Node_Id;
3143
3144    begin
3145       Item := First (Context_Items (Cunit (Current_Sem_Unit)));
3146       while Present (Item) loop
3147          if Nkind (Item) = N_Pragma
3148            and then Pragma_Name (Item) = Name_Elaborate_All
3149          then
3150             --  Return if some previous error on the pragma itself
3151
3152             if Error_Posted (Item) then
3153                return False;
3154             end if;
3155
3156             Elab_Id :=
3157               Entity
3158                 (Expression (First (Pragma_Argument_Associations (Item))));
3159
3160             Par := Parent (Unit_Declaration_Node (Elab_Id));
3161
3162             Item2 := First (Context_Items (Par));
3163             while Present (Item2) loop
3164                if Nkind (Item2) = N_With_Clause
3165                  and then Entity (Name (Item2)) = E
3166                then
3167                   return True;
3168                end if;
3169
3170                Next (Item2);
3171             end loop;
3172          end if;
3173
3174          Next (Item);
3175       end loop;
3176
3177       return False;
3178    end Within_Elaborate_All;
3179
3180 end Sem_Elab;