OSDN Git Service

* gfortran.dg/ishft.f90: Remove kind suffix from BOZ constant
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_ch10.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ C H 1 0                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2005 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 2,  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 COPYING.  If not, write --
19 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, USA.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Atree;    use Atree;
28 with Debug;    use Debug;
29 with Einfo;    use Einfo;
30 with Errout;   use Errout;
31 with Exp_Util; use Exp_Util;
32 with Fname;    use Fname;
33 with Fname.UF; use Fname.UF;
34 with Freeze;   use Freeze;
35 with Impunit;  use Impunit;
36 with Inline;   use Inline;
37 with Lib;      use Lib;
38 with Lib.Load; use Lib.Load;
39 with Lib.Xref; use Lib.Xref;
40 with Namet;    use Namet;
41 with Nlists;   use Nlists;
42 with Nmake;    use Nmake;
43 with Opt;      use Opt;
44 with Output;   use Output;
45 with Restrict; use Restrict;
46 with Rtsfind;  use Rtsfind;
47 with Sem;      use Sem;
48 with Sem_Ch6;  use Sem_Ch6;
49 with Sem_Ch7;  use Sem_Ch7;
50 with Sem_Ch8;  use Sem_Ch8;
51 with Sem_Dist; use Sem_Dist;
52 with Sem_Prag; use Sem_Prag;
53 with Sem_Util; use Sem_Util;
54 with Sem_Warn; use Sem_Warn;
55 with Stand;    use Stand;
56 with Sinfo;    use Sinfo;
57 with Sinfo.CN; use Sinfo.CN;
58 with Sinput;   use Sinput;
59 with Snames;   use Snames;
60 with Style;    use Style;
61 with Stylesw;  use Stylesw;
62 with Tbuild;   use Tbuild;
63 with Ttypes;   use Ttypes;
64 with Uname;    use Uname;
65
66 package body Sem_Ch10 is
67
68    -----------------------
69    -- Local Subprograms --
70    -----------------------
71
72    procedure Analyze_Context (N : Node_Id);
73    --  Analyzes items in the context clause of compilation unit
74
75    procedure Build_Limited_Views (N : Node_Id);
76    --  Build and decorate the list of shadow entities for a package mentioned
77    --  in a limited_with clause. If the package was not previously analyzed
78    --  then it also performs a basic decoration of the real entities; this
79    --  is required to do not pass non-decorated entities to the back-end.
80    --  Implements Ada 2005 (AI-50217).
81
82    procedure Check_Body_Needed_For_SAL (Unit_Name : Entity_Id);
83    --  Check whether the source for the body of a compilation unit must
84    --  be included in a standalone library.
85
86    procedure Check_With_Type_Clauses (N : Node_Id);
87    --  If N is a body, verify that any with_type clauses on the spec, or
88    --  on the spec of any parent, have a matching with_clause.
89
90    procedure Check_Private_Child_Unit (N : Node_Id);
91    --  If a with_clause mentions a private child unit, the compilation
92    --  unit must be a member of the same family, as described in 10.1.2 (8).
93
94    procedure Check_Stub_Level (N : Node_Id);
95    --  Verify that a stub is declared immediately within a compilation unit,
96    --  and not in an inner frame.
97
98    procedure Expand_Limited_With_Clause (Nam : Node_Id; N : Node_Id);
99    --  If a child unit appears in a limited_with clause, there are implicit
100    --  limited_with clauses on all parents that are not already visible
101    --  through a regular with clause. This procedure creates the implicit
102    --  limited with_clauses for the parents and loads the corresponding units.
103    --  The shadow entities are created when the inserted clause is analyzed.
104    --  Implements Ada 2005 (AI-50217).
105
106    procedure Expand_With_Clause (Nam : Node_Id; N : Node_Id);
107    --  When a child unit appears in a context clause, the implicit withs on
108    --  parents are made explicit, and with clauses are inserted in the context
109    --  clause before the one for the child. If a parent in the with_clause
110    --  is a renaming, the implicit with_clause is on the renaming whose name
111    --  is mentioned in the with_clause, and not on the package it renames.
112    --  N is the compilation unit whose list of context items receives the
113    --  implicit with_clauses.
114
115    function Get_Parent_Entity (Unit : Node_Id) return Entity_Id;
116    --  Get defining entity of parent unit of a child unit. In most cases this
117    --  is the defining entity of the unit, but for a child instance whose
118    --  parent needs a body for inlining, the instantiation node of the parent
119    --  has not yet been rewritten as a package declaration, and the entity has
120    --  to be retrieved from the Instance_Spec of the unit.
121
122    procedure Implicit_With_On_Parent (Child_Unit : Node_Id; N : Node_Id);
123    --  If the main unit is a child unit, implicit withs are also added for
124    --  all its ancestors.
125
126    procedure Install_Context_Clauses (N : Node_Id);
127    --  Subsidiary to previous one. Process only with_ and use_clauses for
128    --  current unit and its library unit if any.
129
130    procedure Install_Limited_Context_Clauses (N : Node_Id);
131    --  Subsidiary to Install_Context. Process only limited with_clauses
132    --  for current unit. Implements Ada 2005 (AI-50217).
133
134    procedure Install_Limited_Withed_Unit (N : Node_Id);
135    --  Place shadow entities for a limited_with package in the visibility
136    --  structures for the current compilation. Implements Ada 2005 (AI-50217).
137
138    procedure Install_Withed_Unit
139      (With_Clause     : Node_Id;
140       Private_With_OK : Boolean := False);
141
142    --  If the unit is not a child unit, make unit immediately visible.
143    --  The caller ensures that the unit is not already currently installed.
144    --  The flag Private_With_OK is set true in Install_Private_With_Clauses,
145    --  which is called when compiling the private part of a package, or
146    --  installing the private declarations of a parent unit.
147
148    procedure Install_Parents (Lib_Unit : Node_Id; Is_Private : Boolean);
149    --  This procedure establishes the context for the compilation of a child
150    --  unit. If Lib_Unit is a child library spec then the context of the parent
151    --  is installed, and the parent itself made immediately visible, so that
152    --  the child unit is processed in the declarative region of the parent.
153    --  Install_Parents makes a recursive call to itself to ensure that all
154    --  parents are loaded in the nested case. If Lib_Unit is a library body,
155    --  the only effect of Install_Parents is to install the private decls of
156    --  the parents, because the visible parent declarations will have been
157    --  installed as part of the context of the corresponding spec.
158
159    procedure Install_Siblings (U_Name : Entity_Id; N : Node_Id);
160    --  In the compilation of a child unit, a child of any of the  ancestor
161    --  units is directly visible if it is visible, because the parent is in
162    --  an enclosing scope. Iterate over context to find child units of U_Name
163    --  or of some ancestor of it.
164
165    function Is_Child_Spec (Lib_Unit : Node_Id) return Boolean;
166    --  Lib_Unit is a library unit which may be a spec or a body. Is_Child_Spec
167    --  returns True if Lib_Unit is a library spec which is a child spec, i.e.
168    --  a library spec that has a parent. If the call to Is_Child_Spec returns
169    --  True, then Parent_Spec (Lib_Unit) is non-Empty and points to the
170    --  compilation unit for the parent spec.
171    --
172    --  Lib_Unit can also be a subprogram body that acts as its own spec. If
173    --  the Parent_Spec is  non-empty, this is also a child unit.
174
175    procedure Remove_With_Type_Clause (Name : Node_Id);
176    --  Remove imported type and its enclosing package from visibility, and
177    --  remove attributes of imported type so they don't interfere with its
178    --  analysis (should it appear otherwise in the context).
179
180    procedure Remove_Context_Clauses (N : Node_Id);
181    --  Subsidiary of previous one. Remove use_ and with_clauses
182
183    procedure Remove_Limited_With_Clause (N : Node_Id);
184    --  Remove from visibility the shadow entities introduced for a package
185    --  mentioned in a limited_with clause. Implements Ada 2005 (AI-50217).
186
187    procedure Remove_Parents (Lib_Unit : Node_Id);
188    --  Remove_Parents checks if Lib_Unit is a child spec. If so then the parent
189    --  contexts established by the corresponding call to Install_Parents are
190    --  removed. Remove_Parents contains a recursive call to itself to ensure
191    --  that all parents are removed in the nested case.
192
193    procedure Remove_Unit_From_Visibility (Unit_Name : Entity_Id);
194    --  Reset all visibility flags on unit after compiling it, either as a
195    --  main unit or as a unit in the context.
196
197    procedure Unchain (E : Entity_Id);
198    --  Remove single entity from visibility list
199
200    procedure Analyze_Proper_Body (N : Node_Id; Nam : Entity_Id);
201    --  Common processing for all stubs (subprograms, tasks, packages, and
202    --  protected cases). N is the stub to be analyzed. Once the subunit
203    --  name is established, load and analyze. Nam is the non-overloadable
204    --  entity for which the proper body provides a completion. Subprogram
205    --  stubs are handled differently because they can be declarations.
206
207    --------------------------
208    -- Limited_With_Clauses --
209    --------------------------
210
211    --  Limited_With clauses are the mechanism chosen for Ada05 to support
212    --  mutually recursive types declared in different units. A limited_with
213    --  clause that names package P in the context of unit U makes the types
214    --  declared in the visible part of P available within U, but with the
215    --  restriction that these types can only be used as incomplete types.
216    --  The limited_with clause does not impose a semantic dependence on P,
217    --  and it is possible for two packages to have limited_with_clauses on
218    --  each other without creating an elaboration circularity.
219
220    --  To support this feature, the analysis of a limited_with clause must
221    --  create an abbreviated view of the package, without performing any
222    --  semantic analysis on it. This "package abstract" contains shadow
223    --  types that are in one-one correspondence with the real types in the
224    --  package, and that have the properties of incomplete types.
225
226    --  The implementation creates two element lists: one to chain the shadow
227    --  entities, and one to chain the corresponding type entities in the tree
228    --  of the package. Links between corresponding entities in both chains
229    --  allow the compiler to select the proper view of a given type, depending
230    --  on the context. Note that in contrast with the handling of private
231    --  types, the limited view and the non-limited view of a type are treated
232    --  as separate entities, and no entity exchange needs to take place, which
233    --  makes the implementation must simpler than could be feared.
234
235    ------------------------------
236    -- Analyze_Compilation_Unit --
237    ------------------------------
238
239    procedure Analyze_Compilation_Unit (N : Node_Id) is
240       Unit_Node     : constant Node_Id := Unit (N);
241       Lib_Unit      : Node_Id          := Library_Unit (N);
242       Spec_Id       : Node_Id;
243       Main_Cunit    : constant Node_Id := Cunit (Main_Unit);
244       Par_Spec_Name : Unit_Name_Type;
245       Unum          : Unit_Number_Type;
246
247       procedure Generate_Parent_References (N : Node_Id; P_Id : Entity_Id);
248       --  Generate cross-reference information for the parents of child units.
249       --  N is a defining_program_unit_name, and P_Id is the immediate parent.
250
251       --------------------------------
252       -- Generate_Parent_References --
253       --------------------------------
254
255       procedure Generate_Parent_References (N : Node_Id; P_Id : Entity_Id) is
256          Pref   : Node_Id;
257          P_Name : Entity_Id := P_Id;
258
259       begin
260          Pref   := Name (Parent (Defining_Entity (N)));
261
262          if Nkind (Pref) = N_Expanded_Name then
263
264             --  Done already, if the unit has been compiled indirectly as
265             --  part of the closure of its context because of inlining.
266
267             return;
268          end if;
269
270          while Nkind (Pref) = N_Selected_Component loop
271             Change_Selected_Component_To_Expanded_Name (Pref);
272             Set_Entity (Pref, P_Name);
273             Set_Etype (Pref, Etype (P_Name));
274             Generate_Reference (P_Name, Pref, 'r');
275             Pref   := Prefix (Pref);
276             P_Name := Scope (P_Name);
277          end loop;
278
279          --  The guard here on P_Name is to handle the error condition where
280          --  the parent unit is missing because the file was not found.
281
282          if Present (P_Name) then
283             Set_Entity (Pref, P_Name);
284             Set_Etype (Pref, Etype (P_Name));
285             Generate_Reference (P_Name, Pref, 'r');
286             Style.Check_Identifier (Pref, P_Name);
287          end if;
288       end Generate_Parent_References;
289
290    --  Start of processing for Analyze_Compilation_Unit
291
292    begin
293       Process_Compilation_Unit_Pragmas (N);
294
295       --  If the unit is a subunit whose parent has not been analyzed (which
296       --  indicates that the main unit is a subunit, either the current one or
297       --  one of its descendents) then the subunit is compiled as part of the
298       --  analysis of the parent, which we proceed to do. Basically this gets
299       --  handled from the top down and we don't want to do anything at this
300       --  level (i.e. this subunit will be handled on the way down from the
301       --  parent), so at this level we immediately return. If the subunit
302       --  ends up not analyzed, it means that the parent did not contain a
303       --  stub for it, or that there errors were dectected in some ancestor.
304
305       if Nkind (Unit_Node) = N_Subunit
306         and then not Analyzed (Lib_Unit)
307       then
308          Semantics (Lib_Unit);
309
310          if not Analyzed (Proper_Body (Unit_Node)) then
311             if Serious_Errors_Detected > 0 then
312                Error_Msg_N ("subunit not analyzed (errors in parent unit)", N);
313             else
314                Error_Msg_N ("missing stub for subunit", N);
315             end if;
316          end if;
317
318          return;
319       end if;
320
321       --  Analyze context (this will call Sem recursively for with'ed units)
322
323       Analyze_Context (N);
324
325       --  If the unit is a package body, the spec is already loaded and must
326       --  be analyzed first, before we analyze the body.
327
328       if Nkind (Unit_Node) = N_Package_Body then
329
330          --  If no Lib_Unit, then there was a serious previous error, so
331          --  just ignore the entire analysis effort
332
333          if No (Lib_Unit) then
334             return;
335
336          else
337             Semantics (Lib_Unit);
338             Check_Unused_Withs (Get_Cunit_Unit_Number (Lib_Unit));
339
340             --  Verify that the library unit is a package declaration
341
342             if Nkind (Unit (Lib_Unit)) /= N_Package_Declaration
343                  and then
344                Nkind (Unit (Lib_Unit)) /= N_Generic_Package_Declaration
345             then
346                Error_Msg_N
347                  ("no legal package declaration for package body", N);
348                return;
349
350             --  Otherwise, the entity in the declaration is visible. Update
351             --  the version to reflect dependence of this body on the spec.
352
353             else
354                Spec_Id := Defining_Entity (Unit (Lib_Unit));
355                Set_Is_Immediately_Visible (Spec_Id, True);
356                Version_Update (N, Lib_Unit);
357
358                if Nkind (Defining_Unit_Name (Unit_Node))
359                  = N_Defining_Program_Unit_Name
360                then
361                   Generate_Parent_References (Unit_Node, Scope (Spec_Id));
362                end if;
363             end if;
364          end if;
365
366       --  If the unit is a subprogram body, then we similarly need to analyze
367       --  its spec. However, things are a little simpler in this case, because
368       --  here, this analysis is done only for error checking and consistency
369       --  purposes, so there's nothing else to be done.
370
371       elsif Nkind (Unit_Node) = N_Subprogram_Body then
372          if Acts_As_Spec (N) then
373
374             --  If the subprogram body is a child unit, we must create a
375             --  declaration for it, in order to properly load the parent(s).
376             --  After this, the original unit does not acts as a spec, because
377             --  there is an explicit one. If this  unit appears in a context
378             --  clause, then an implicit with on the parent will be added when
379             --  installing the context. If this is the main unit, there is no
380             --  Unit_Table entry for the declaration, (It has the unit number
381             --  of the main unit) and code generation is unaffected.
382
383             Unum := Get_Cunit_Unit_Number (N);
384             Par_Spec_Name := Get_Parent_Spec_Name (Unit_Name (Unum));
385
386             if Par_Spec_Name /= No_Name then
387                Unum :=
388                  Load_Unit
389                    (Load_Name  => Par_Spec_Name,
390                     Required   => True,
391                     Subunit    => False,
392                     Error_Node => N);
393
394                if Unum /= No_Unit then
395
396                   --  Build subprogram declaration and attach parent unit to it
397                   --  This subprogram declaration does not come from source,
398                   --  Nevertheless the backend must generate debugging info for
399                   --  it, and this must be indicated explicitly.
400
401                   declare
402                      Loc : constant Source_Ptr := Sloc (N);
403                      SCS : constant Boolean :=
404                              Get_Comes_From_Source_Default;
405
406                   begin
407                      Set_Comes_From_Source_Default (False);
408                      Lib_Unit :=
409                        Make_Compilation_Unit (Loc,
410                          Context_Items => New_Copy_List (Context_Items (N)),
411                          Unit =>
412                            Make_Subprogram_Declaration (Sloc (N),
413                              Specification =>
414                                Copy_Separate_Tree
415                                  (Specification (Unit_Node))),
416                          Aux_Decls_Node =>
417                            Make_Compilation_Unit_Aux (Loc));
418
419                      Set_Library_Unit (N, Lib_Unit);
420                      Set_Parent_Spec (Unit (Lib_Unit), Cunit (Unum));
421                      Semantics (Lib_Unit);
422                      Set_Acts_As_Spec (N, False);
423                      Set_Needs_Debug_Info (Defining_Entity (Unit (Lib_Unit)));
424                      Set_Comes_From_Source_Default (SCS);
425                   end;
426                end if;
427             end if;
428
429          --  Here for subprogram with separate declaration
430
431          else
432             Semantics (Lib_Unit);
433             Check_Unused_Withs (Get_Cunit_Unit_Number (Lib_Unit));
434             Version_Update (N, Lib_Unit);
435          end if;
436
437          if Nkind (Defining_Unit_Name (Specification (Unit_Node))) =
438                                              N_Defining_Program_Unit_Name
439          then
440             Generate_Parent_References (
441               Specification (Unit_Node),
442                 Scope (Defining_Entity (Unit (Lib_Unit))));
443          end if;
444       end if;
445
446       --  If it is a child unit, the parent must be elaborated first
447       --  and we update version, since we are dependent on our parent.
448
449       if Is_Child_Spec (Unit_Node) then
450
451          --  The analysis of the parent is done with style checks off
452
453          declare
454             Save_Style_Check : constant Boolean := Style_Check;
455             Save_C_Restrict  : constant Save_Cunit_Boolean_Restrictions :=
456                                  Cunit_Boolean_Restrictions_Save;
457
458          begin
459             if not GNAT_Mode then
460                Style_Check := False;
461             end if;
462
463             Semantics (Parent_Spec (Unit_Node));
464             Version_Update (N, Parent_Spec (Unit_Node));
465             Style_Check := Save_Style_Check;
466             Cunit_Boolean_Restrictions_Restore (Save_C_Restrict);
467          end;
468       end if;
469
470       --  With the analysis done, install the context. Note that we can't
471       --  install the context from the with clauses as we analyze them,
472       --  because each with clause must be analyzed in a clean visibility
473       --  context, so we have to wait and install them all at once.
474
475       Install_Context (N);
476
477       if Is_Child_Spec (Unit_Node) then
478
479          --  Set the entities of all parents in the program_unit_name
480
481          Generate_Parent_References (
482            Unit_Node, Get_Parent_Entity (Unit (Parent_Spec (Unit_Node))));
483       end if;
484
485       --  All components of the context: with-clauses, library unit, ancestors
486       --  if any, (and their context)  are analyzed and installed. Now analyze
487       --  the unit itself, which is either a package, subprogram spec or body.
488
489       Analyze (Unit_Node);
490
491       --  The above call might have made Unit_Node an N_Subprogram_Body
492       --  from something else, so propagate any Acts_As_Spec flag.
493
494       if Nkind (Unit_Node) = N_Subprogram_Body
495         and then Acts_As_Spec (Unit_Node)
496       then
497          Set_Acts_As_Spec (N);
498       end if;
499
500       --  Register predefined units in Rtsfind
501
502       declare
503          Unum : constant Unit_Number_Type := Get_Source_Unit (Sloc (N));
504       begin
505          if Is_Predefined_File_Name (Unit_File_Name (Unum)) then
506             Set_RTU_Loaded (Unit_Node);
507          end if;
508       end;
509
510       --  Treat compilation unit pragmas that appear after the library unit
511
512       if Present (Pragmas_After (Aux_Decls_Node (N))) then
513          declare
514             Prag_Node : Node_Id := First (Pragmas_After (Aux_Decls_Node (N)));
515
516          begin
517             while Present (Prag_Node) loop
518                Analyze (Prag_Node);
519                Next (Prag_Node);
520             end loop;
521          end;
522       end if;
523
524       --  Generate distribution stubs if requested and no error
525
526       if N = Main_Cunit
527         and then (Distribution_Stub_Mode = Generate_Receiver_Stub_Body
528                     or else
529                   Distribution_Stub_Mode = Generate_Caller_Stub_Body)
530         and then not Fatal_Error (Main_Unit)
531       then
532          if Is_RCI_Pkg_Spec_Or_Body (N) then
533
534             --  Regular RCI package
535
536             Add_Stub_Constructs (N);
537
538          elsif (Nkind (Unit_Node) = N_Package_Declaration
539                  and then Is_Shared_Passive (Defining_Entity
540                                               (Specification (Unit_Node))))
541            or else (Nkind (Unit_Node) = N_Package_Body
542                      and then
543                        Is_Shared_Passive (Corresponding_Spec (Unit_Node)))
544          then
545             --  Shared passive package
546
547             Add_Stub_Constructs (N);
548
549          elsif Nkind (Unit_Node) = N_Package_Instantiation
550            and then
551              Is_Remote_Call_Interface
552                (Defining_Entity (Specification (Instance_Spec (Unit_Node))))
553          then
554             --  Instantiation of a RCI generic package
555
556             Add_Stub_Constructs (N);
557          end if;
558
559       end if;
560
561       if Nkind (Unit_Node) = N_Package_Declaration
562         or else Nkind (Unit_Node) in N_Generic_Declaration
563         or else Nkind (Unit_Node) = N_Package_Renaming_Declaration
564         or else Nkind (Unit_Node) = N_Subprogram_Declaration
565       then
566          Remove_Unit_From_Visibility (Defining_Entity (Unit_Node));
567
568       --  If the unit is an instantiation whose body will be elaborated
569       --  for inlining purposes, use the the proper entity of the instance.
570
571       elsif Nkind (Unit_Node) = N_Package_Instantiation
572         and then not Error_Posted (Unit_Node)
573       then
574          Remove_Unit_From_Visibility
575            (Defining_Entity (Instance_Spec (Unit_Node)));
576
577       elsif Nkind (Unit_Node) = N_Package_Body
578         or else (Nkind (Unit_Node) = N_Subprogram_Body
579                   and then not Acts_As_Spec (Unit_Node))
580       then
581          --  Bodies that are not the main unit are compiled if they
582          --  are generic or contain generic or inlined units. Their
583          --  analysis brings in the context of the corresponding spec
584          --  (unit declaration) which must be removed as well, to
585          --  return the compilation environment to its proper state.
586
587          Remove_Context (Lib_Unit);
588          Set_Is_Immediately_Visible (Defining_Entity (Unit (Lib_Unit)), False);
589       end if;
590
591       --  Last step is to deinstall the context we just installed
592       --  as well as the unit just compiled.
593
594       Remove_Context (N);
595
596       --  If this is the main unit and we are generating code, we must
597       --  check that all generic units in the context have a body if they
598       --  need it, even if they have not been instantiated. In the absence
599       --  of .ali files for generic units, we must force the load of the body,
600       --  just to produce the proper error if the body is absent. We skip this
601       --  verification if the main unit itself is generic.
602
603       if Get_Cunit_Unit_Number (N) = Main_Unit
604         and then Operating_Mode = Generate_Code
605         and then Expander_Active
606       then
607          --  Check whether the source for the body of the unit must be
608          --  included in a standalone library.
609
610          Check_Body_Needed_For_SAL (Cunit_Entity (Main_Unit));
611
612          --  Indicate that the main unit is now analyzed, to catch possible
613          --  circularities between it and generic bodies. Remove main unit
614          --  from visibility. This might seem superfluous, but the main unit
615          --  must not be visible in the generic body expansions that follow.
616
617          Set_Analyzed (N, True);
618          Set_Is_Immediately_Visible (Cunit_Entity (Main_Unit), False);
619
620          declare
621             Item  : Node_Id;
622             Nam   : Entity_Id;
623             Un    : Unit_Number_Type;
624
625             Save_Style_Check : constant Boolean := Style_Check;
626             Save_C_Restrict  : constant Save_Cunit_Boolean_Restrictions :=
627                                  Cunit_Boolean_Restrictions_Save;
628
629          begin
630             Item := First (Context_Items (N));
631             while Present (Item) loop
632
633                --  Ada 2005 (AI-50217): Do not consider limited-withed units
634
635                if Nkind (Item) = N_With_Clause
636                   and then not Implicit_With (Item)
637                   and then not Limited_Present (Item)
638                then
639                   Nam := Entity (Name (Item));
640
641                   if (Is_Generic_Subprogram (Nam)
642                        and then not Is_Intrinsic_Subprogram (Nam))
643                     or else (Ekind (Nam) = E_Generic_Package
644                               and then Unit_Requires_Body (Nam))
645                   then
646                      Style_Check := False;
647
648                      if Present (Renamed_Object (Nam)) then
649                         Un :=
650                            Load_Unit
651                              (Load_Name  => Get_Body_Name
652                                               (Get_Unit_Name
653                                                 (Unit_Declaration_Node
654                                                   (Renamed_Object (Nam)))),
655                               Required   => False,
656                               Subunit    => False,
657                               Error_Node => N,
658                               Renamings  => True);
659                      else
660                         Un :=
661                           Load_Unit
662                             (Load_Name  => Get_Body_Name
663                                              (Get_Unit_Name (Item)),
664                              Required   => False,
665                              Subunit    => False,
666                              Error_Node => N,
667                              Renamings  => True);
668                      end if;
669
670                      if Un = No_Unit then
671                         Error_Msg_NE
672                           ("body of generic unit& not found", Item, Nam);
673                         exit;
674
675                      elsif not Analyzed (Cunit (Un))
676                        and then Un /= Main_Unit
677                        and then not Fatal_Error (Un)
678                      then
679                         Style_Check := False;
680                         Semantics (Cunit (Un));
681                      end if;
682                   end if;
683                end if;
684
685                Next (Item);
686             end loop;
687
688             Style_Check := Save_Style_Check;
689             Cunit_Boolean_Restrictions_Restore (Save_C_Restrict);
690          end;
691       end if;
692
693       --  Deal with creating elaboration Boolean if needed. We create an
694       --  elaboration boolean only for units that come from source since
695       --  units manufactured by the compiler never need elab checks.
696
697       if Comes_From_Source (N)
698         and then
699           (Nkind (Unit (N)) =  N_Package_Declaration         or else
700            Nkind (Unit (N)) =  N_Generic_Package_Declaration or else
701            Nkind (Unit (N)) =  N_Subprogram_Declaration      or else
702            Nkind (Unit (N)) =  N_Generic_Subprogram_Declaration)
703       then
704          declare
705             Loc  : constant Source_Ptr := Sloc (N);
706             Unum : constant Unit_Number_Type := Get_Source_Unit (Loc);
707
708          begin
709             Spec_Id := Defining_Entity (Unit (N));
710             Generate_Definition (Spec_Id);
711
712             --  See if an elaboration entity is required for possible
713             --  access before elaboration checking. Note that we must
714             --  allow for this even if -gnatE is not set, since a client
715             --  may be compiled in -gnatE mode and reference the entity.
716
717             --  Case of units which do not require elaboration checks
718
719             if
720                --  Pure units do not need checks
721
722                  Is_Pure (Spec_Id)
723
724                --  Preelaborated units do not need checks
725
726                  or else Is_Preelaborated (Spec_Id)
727
728                --  No checks needed if pagma Elaborate_Body present
729
730                  or else Has_Pragma_Elaborate_Body (Spec_Id)
731
732                --  No checks needed if unit does not require a body
733
734                  or else not Unit_Requires_Body (Spec_Id)
735
736                --  No checks needed for predefined files
737
738                  or else Is_Predefined_File_Name (Unit_File_Name (Unum))
739
740                --  No checks required if no separate spec
741
742                  or else Acts_As_Spec (N)
743             then
744                --  This is a case where we only need the entity for
745                --  checking to prevent multiple elaboration checks.
746
747                Set_Elaboration_Entity_Required (Spec_Id, False);
748
749             --  Case of elaboration entity is required for access before
750             --  elaboration checking (so certainly we must build it!)
751
752             else
753                Set_Elaboration_Entity_Required (Spec_Id, True);
754             end if;
755
756             Build_Elaboration_Entity (N, Spec_Id);
757          end;
758       end if;
759
760       --  Finally, freeze the compilation unit entity. This for sure is needed
761       --  because of some warnings that can be output (see Freeze_Subprogram),
762       --  but may in general be required. If freezing actions result, place
763       --  them in the compilation unit actions list, and analyze them.
764
765       declare
766          Loc : constant Source_Ptr := Sloc (N);
767          L   : constant List_Id :=
768                  Freeze_Entity (Cunit_Entity (Current_Sem_Unit), Loc);
769
770       begin
771          while Is_Non_Empty_List (L) loop
772             Insert_Library_Level_Action (Remove_Head (L));
773          end loop;
774       end;
775
776       Set_Analyzed (N);
777
778       if Nkind (Unit_Node) = N_Package_Declaration
779         and then Get_Cunit_Unit_Number (N) /= Main_Unit
780         and then Expander_Active
781       then
782          declare
783             Save_Style_Check : constant Boolean := Style_Check;
784             Save_Warning     : constant Warning_Mode_Type := Warning_Mode;
785             Options : Style_Check_Options;
786
787          begin
788             Save_Style_Check_Options (Options);
789             Reset_Style_Check_Options;
790             Opt.Warning_Mode := Suppress;
791             Check_Body_For_Inlining (N, Defining_Entity (Unit_Node));
792
793             Reset_Style_Check_Options;
794             Set_Style_Check_Options (Options);
795             Style_Check := Save_Style_Check;
796             Warning_Mode := Save_Warning;
797          end;
798       end if;
799    end Analyze_Compilation_Unit;
800
801    ---------------------
802    -- Analyze_Context --
803    ---------------------
804
805    procedure Analyze_Context (N : Node_Id) is
806       Item  : Node_Id;
807
808    begin
809       --  Loop through context items. This is done is three passes:
810       --  a) The first pass analyze non-limited with-clauses.
811       --  b) The second pass add implicit limited_with clauses for
812       --     the parents of child units (Ada 2005: AI-50217)
813       --  c) The third pass analyzes limited_with clauses (Ada 2005: AI-50217)
814
815       Item := First (Context_Items (N));
816       while Present (Item) loop
817
818          --  For with clause, analyze the with clause, and then update
819          --  the version, since we are dependent on a unit that we with.
820
821          if Nkind (Item) = N_With_Clause
822            and then not Limited_Present (Item)
823          then
824
825             --  Skip analyzing with clause if no unit, nothing to do (this
826             --  happens for a with that references a non-existant unit)
827
828             if Present (Library_Unit (Item)) then
829                Analyze (Item);
830             end if;
831
832             if not Implicit_With (Item) then
833                Version_Update (N, Library_Unit (Item));
834             end if;
835
836          --  But skip use clauses at this stage, since we don't want to do
837          --  any installing of potentially use visible entities until we
838          --  we actually install the complete context (in Install_Context).
839          --  Otherwise things can get installed in the wrong context.
840          --  Similarly, pragmas are analyzed in Install_Context, after all
841          --  the implicit with's on parent units are generated.
842
843          else
844             null;
845          end if;
846
847          Next (Item);
848       end loop;
849
850       --  Second pass: add implicit limited_with_clauses for parents of
851       --  child units mentioned in limited_with clauses.
852
853       Item := First (Context_Items (N));
854
855       while Present (Item) loop
856          if Nkind (Item) = N_With_Clause
857            and then Limited_Present (Item)
858            and then  Nkind (Name (Item)) = N_Selected_Component
859          then
860             Expand_Limited_With_Clause
861               (Nam => Prefix (Name (Item)), N  => Item);
862          end if;
863
864          Next (Item);
865       end loop;
866
867       --  Third pass: examine all limited_with clauses
868
869       Item := First (Context_Items (N));
870
871       while Present (Item) loop
872          if Nkind (Item) = N_With_Clause
873            and then Limited_Present (Item)
874          then
875
876             if Nkind (Unit (N)) /= N_Package_Declaration then
877                Error_Msg_N ("limited with_clause only allowed in"
878                             & " package specification", Item);
879             end if;
880
881             --  Skip analyzing with clause if no unit, see above
882
883             if Present (Library_Unit (Item)) then
884                Analyze (Item);
885             end if;
886
887             --  A limited_with does not impose an elaboration order, but
888             --  there is a semantic dependency for recompilation purposes.
889
890             if not Implicit_With (Item) then
891                Version_Update (N, Library_Unit (Item));
892             end if;
893          end if;
894
895          Next (Item);
896       end loop;
897    end Analyze_Context;
898
899    -------------------------------
900    -- Analyze_Package_Body_Stub --
901    -------------------------------
902
903    procedure Analyze_Package_Body_Stub (N : Node_Id) is
904       Id   : constant Entity_Id := Defining_Identifier (N);
905       Nam  : Entity_Id;
906
907    begin
908       --  The package declaration must be in the current declarative part
909
910       Check_Stub_Level (N);
911       Nam := Current_Entity_In_Scope (Id);
912
913       if No (Nam) or else not Is_Package (Nam) then
914          Error_Msg_N ("missing specification for package stub", N);
915
916       elsif Has_Completion (Nam)
917         and then Present (Corresponding_Body (Unit_Declaration_Node (Nam)))
918       then
919          Error_Msg_N ("duplicate or redundant stub for package", N);
920
921       else
922          --  Indicate that the body of the package exists. If we are doing
923          --  only semantic analysis, the stub stands for the body. If we are
924          --  generating code, the existence of the body will be confirmed
925          --  when we load the proper body.
926
927          Set_Has_Completion (Nam);
928          Set_Scope (Defining_Entity (N), Current_Scope);
929          Generate_Reference (Nam, Id, 'b');
930          Analyze_Proper_Body (N, Nam);
931       end if;
932    end Analyze_Package_Body_Stub;
933
934    -------------------------
935    -- Analyze_Proper_Body --
936    -------------------------
937
938    procedure Analyze_Proper_Body (N : Node_Id; Nam : Entity_Id) is
939       Subunit_Name      : constant Unit_Name_Type := Get_Unit_Name (N);
940       Unum              : Unit_Number_Type;
941
942       procedure Optional_Subunit;
943       --  This procedure is called when the main unit is a stub, or when we
944       --  are not generating code. In such a case, we analyze the subunit if
945       --  present, which is user-friendly and in fact required for ASIS, but
946       --  we don't complain if the subunit is missing.
947
948       ----------------------
949       -- Optional_Subunit --
950       ----------------------
951
952       procedure Optional_Subunit is
953          Comp_Unit : Node_Id;
954
955       begin
956          --  Try to load subunit, but ignore any errors that occur during
957          --  the loading of the subunit, by using the special feature in
958          --  Errout to ignore all errors. Note that Fatal_Error will still
959          --  be set, so we will be able to check for this case below.
960
961          if not ASIS_Mode then
962             Ignore_Errors_Enable := Ignore_Errors_Enable + 1;
963          end if;
964
965          Unum :=
966            Load_Unit
967              (Load_Name  => Subunit_Name,
968               Required   => False,
969               Subunit    => True,
970               Error_Node => N);
971
972          if not ASIS_Mode then
973             Ignore_Errors_Enable := Ignore_Errors_Enable - 1;
974          end if;
975
976          --  All done if we successfully loaded the subunit
977
978          if Unum /= No_Unit
979            and then (not Fatal_Error (Unum) or else Try_Semantics)
980          then
981             Comp_Unit := Cunit (Unum);
982
983             --  If the file was empty or seriously mangled, the unit
984             --  itself may be missing.
985
986             if No (Unit (Comp_Unit)) then
987                Error_Msg_N
988                  ("subunit does not contain expected proper body", N);
989
990             elsif Nkind (Unit (Comp_Unit)) /= N_Subunit then
991                Error_Msg_N
992                  ("expected SEPARATE subunit, found child unit",
993                   Cunit_Entity (Unum));
994             else
995                Set_Corresponding_Stub (Unit (Comp_Unit), N);
996                Analyze_Subunit (Comp_Unit);
997                Set_Library_Unit (N, Comp_Unit);
998             end if;
999
1000          elsif Unum = No_Unit
1001            and then Present (Nam)
1002          then
1003             if Is_Protected_Type (Nam) then
1004                Set_Corresponding_Body (Parent (Nam), Defining_Identifier (N));
1005             else
1006                Set_Corresponding_Body (
1007                  Unit_Declaration_Node (Nam), Defining_Identifier (N));
1008             end if;
1009          end if;
1010       end Optional_Subunit;
1011
1012    --  Start of processing for Analyze_Proper_Body
1013
1014    begin
1015       --  If the subunit is already loaded, it means that the main unit
1016       --  is a subunit, and that the current unit is one of its parents
1017       --  which was being analyzed to provide the needed context for the
1018       --  analysis of the subunit. In this case we analyze the subunit and
1019       --  continue with the parent, without looking a subsequent subunits.
1020
1021       if Is_Loaded (Subunit_Name) then
1022
1023          --  If the proper body is already linked to the stub node,
1024          --  the stub is in a generic unit and just needs analyzing.
1025
1026          if Present (Library_Unit (N)) then
1027             Set_Corresponding_Stub (Unit (Library_Unit (N)), N);
1028             Analyze_Subunit (Library_Unit (N));
1029
1030          --  Otherwise we must load the subunit and link to it
1031
1032          else
1033             --  Load the subunit, this must work, since we originally
1034             --  loaded the subunit earlier on. So this will not really
1035             --  load it, just give access to it.
1036
1037             Unum :=
1038               Load_Unit
1039                 (Load_Name  => Subunit_Name,
1040                  Required   => True,
1041                  Subunit    => False,
1042                  Error_Node => N);
1043
1044             --  And analyze the subunit in the parent context (note that we
1045             --  do not call Semantics, since that would remove the parent
1046             --  context). Because of this, we have to manually reset the
1047             --  compiler state to Analyzing since it got destroyed by Load.
1048
1049             if Unum /= No_Unit then
1050                Compiler_State := Analyzing;
1051
1052                --  Check that the proper body is a subunit and not a child
1053                --  unit. If the unit was previously loaded, the error will
1054                --  have been emitted when copying the generic node, so we
1055                --  just return to avoid cascaded errors.
1056
1057                if Nkind (Unit (Cunit (Unum))) /= N_Subunit then
1058                   return;
1059                end if;
1060
1061                Set_Corresponding_Stub (Unit (Cunit (Unum)), N);
1062                Analyze_Subunit (Cunit (Unum));
1063                Set_Library_Unit (N, Cunit (Unum));
1064             end if;
1065          end if;
1066
1067       --  If the main unit is a subunit, then we are just performing semantic
1068       --  analysis on that subunit, and any other subunits of any parent unit
1069       --  should be ignored, except that if we are building trees for ASIS
1070       --  usage we want to annotate the stub properly.
1071
1072       elsif Nkind (Unit (Cunit (Main_Unit))) = N_Subunit
1073         and then Subunit_Name /= Unit_Name (Main_Unit)
1074       then
1075          if ASIS_Mode then
1076             Optional_Subunit;
1077          end if;
1078
1079          --  But before we return, set the flag for unloaded subunits. This
1080          --  will suppress junk warnings of variables in the same declarative
1081          --  part (or a higher level one) that are in danger of looking unused
1082          --  when in fact there might be a declaration in the subunit that we
1083          --  do not intend to load.
1084
1085          Unloaded_Subunits := True;
1086          return;
1087
1088       --  If the subunit is not already loaded, and we are generating code,
1089       --  then this is the case where compilation started from the parent,
1090       --  and we are generating code for an entire subunit tree. In that
1091       --  case we definitely need to load the subunit.
1092
1093       --  In order to continue the analysis with the rest of the parent,
1094       --  and other subunits, we load the unit without requiring its
1095       --  presence, and emit a warning if not found, rather than terminating
1096       --  the compilation abruptly, as for other missing file problems.
1097
1098       elsif Original_Operating_Mode = Generate_Code then
1099
1100          --  If the proper body is already linked to the stub node,
1101          --  the stub is in a generic unit and just needs analyzing.
1102
1103          --  We update the version. Although we are not technically
1104          --  semantically dependent on the subunit, given our approach
1105          --  of macro substitution of subunits, it makes sense to
1106          --  include it in the version identification.
1107
1108          if Present (Library_Unit (N)) then
1109             Set_Corresponding_Stub (Unit (Library_Unit (N)), N);
1110             Analyze_Subunit (Library_Unit (N));
1111             Version_Update (Cunit (Main_Unit), Library_Unit (N));
1112
1113          --  Otherwise we must load the subunit and link to it
1114
1115          else
1116             Unum :=
1117               Load_Unit
1118                 (Load_Name  => Subunit_Name,
1119                  Required   => False,
1120                  Subunit    => True,
1121                  Error_Node => N);
1122
1123             if Original_Operating_Mode = Generate_Code
1124               and then Unum = No_Unit
1125             then
1126                Error_Msg_Name_1 := Subunit_Name;
1127                Error_Msg_Name_2 :=
1128                  Get_File_Name (Subunit_Name, Subunit => True);
1129                Error_Msg_N
1130                  ("subunit% in file{ not found!?", N);
1131                Subunits_Missing := True;
1132             end if;
1133
1134             --  Load_Unit may reset Compiler_State, since it may have been
1135             --  necessary to parse an additional units, so we make sure
1136             --  that we reset it to the Analyzing state.
1137
1138             Compiler_State := Analyzing;
1139
1140             if Unum /= No_Unit
1141               and then (not Fatal_Error (Unum) or else Try_Semantics)
1142             then
1143                if Debug_Flag_L then
1144                   Write_Str ("*** Loaded subunit from stub. Analyze");
1145                   Write_Eol;
1146                end if;
1147
1148                declare
1149                   Comp_Unit : constant Node_Id := Cunit (Unum);
1150
1151                begin
1152                   --  Check for child unit instead of subunit
1153
1154                   if Nkind (Unit (Comp_Unit)) /= N_Subunit then
1155                      Error_Msg_N
1156                        ("expected SEPARATE subunit, found child unit",
1157                         Cunit_Entity (Unum));
1158
1159                   --  OK, we have a subunit, so go ahead and analyze it,
1160                   --  and set Scope of entity in stub, for ASIS use.
1161
1162                   else
1163                      Set_Corresponding_Stub (Unit (Comp_Unit), N);
1164                      Analyze_Subunit (Comp_Unit);
1165                      Set_Library_Unit (N, Comp_Unit);
1166
1167                      --  We update the version. Although we are not technically
1168                      --  semantically dependent on the subunit, given our
1169                      --  approach of macro substitution of subunits, it makes
1170                      --  sense to include it in the version identification.
1171
1172                      Version_Update (Cunit (Main_Unit), Comp_Unit);
1173                   end if;
1174                end;
1175             end if;
1176          end if;
1177
1178          --  The remaining case is when the subunit is not already loaded and
1179          --  we are not generating code. In this case we are just performing
1180          --  semantic analysis on the parent, and we are not interested in
1181          --  the subunit. For subprograms, analyze the stub as a body. For
1182          --  other entities the stub has already been marked as completed.
1183
1184       else
1185          Optional_Subunit;
1186       end if;
1187
1188    end Analyze_Proper_Body;
1189
1190    ----------------------------------
1191    -- Analyze_Protected_Body_Stub --
1192    ----------------------------------
1193
1194    procedure Analyze_Protected_Body_Stub (N : Node_Id) is
1195       Nam : Entity_Id := Current_Entity_In_Scope (Defining_Identifier (N));
1196
1197    begin
1198       Check_Stub_Level (N);
1199
1200       --  First occurence of name may have been as an incomplete type
1201
1202       if Present (Nam) and then Ekind (Nam) = E_Incomplete_Type then
1203          Nam := Full_View (Nam);
1204       end if;
1205
1206       if No (Nam)
1207         or else not Is_Protected_Type (Etype (Nam))
1208       then
1209          Error_Msg_N ("missing specification for Protected body", N);
1210       else
1211          Set_Scope (Defining_Entity (N), Current_Scope);
1212          Set_Has_Completion (Etype (Nam));
1213          Generate_Reference (Nam, Defining_Identifier (N), 'b');
1214          Analyze_Proper_Body (N, Etype (Nam));
1215       end if;
1216    end Analyze_Protected_Body_Stub;
1217
1218    ----------------------------------
1219    -- Analyze_Subprogram_Body_Stub --
1220    ----------------------------------
1221
1222    --  A subprogram body stub can appear with or without a previous
1223    --  specification. If there is one, the analysis of the body will
1224    --  find it and verify conformance.  The formals appearing in the
1225    --  specification of the stub play no role, except for requiring an
1226    --  additional conformance check. If there is no previous subprogram
1227    --  declaration, the stub acts as a spec, and provides the defining
1228    --  entity for the subprogram.
1229
1230    procedure Analyze_Subprogram_Body_Stub (N : Node_Id) is
1231       Decl : Node_Id;
1232
1233    begin
1234       Check_Stub_Level (N);
1235
1236       --  Verify that the identifier for the stub is unique within this
1237       --  declarative part.
1238
1239       if Nkind (Parent (N)) = N_Block_Statement
1240         or else Nkind (Parent (N)) = N_Package_Body
1241         or else Nkind (Parent (N)) = N_Subprogram_Body
1242       then
1243          Decl := First (Declarations (Parent (N)));
1244
1245          while Present (Decl)
1246            and then Decl /= N
1247          loop
1248             if Nkind (Decl) = N_Subprogram_Body_Stub
1249               and then (Chars (Defining_Unit_Name (Specification (Decl)))
1250                       = Chars (Defining_Unit_Name (Specification (N))))
1251             then
1252                Error_Msg_N ("identifier for stub is not unique", N);
1253             end if;
1254
1255             Next (Decl);
1256          end loop;
1257       end if;
1258
1259       --  Treat stub as a body, which checks conformance if there is a previous
1260       --  declaration, or else introduces entity and its signature.
1261
1262       Analyze_Subprogram_Body (N);
1263       Analyze_Proper_Body (N, Empty);
1264    end Analyze_Subprogram_Body_Stub;
1265
1266    ---------------------
1267    -- Analyze_Subunit --
1268    ---------------------
1269
1270    --  A subunit is compiled either by itself (for semantic checking)
1271    --  or as part of compiling the parent (for code generation). In
1272    --  either case, by the time we actually process the subunit, the
1273    --  parent has already been installed and analyzed. The node N is
1274    --  a compilation unit, whose context needs to be treated here,
1275    --  because we come directly here from the parent without calling
1276    --  Analyze_Compilation_Unit.
1277
1278    --  The compilation context includes the explicit context of the
1279    --  subunit, and the context of the parent, together with the parent
1280    --  itself. In order to compile the current context, we remove the
1281    --  one inherited from the parent, in order to have a clean visibility
1282    --  table. We restore the parent context before analyzing the proper
1283    --  body itself. On exit, we remove only the explicit context of the
1284    --  subunit.
1285
1286    procedure Analyze_Subunit (N : Node_Id) is
1287       Lib_Unit : constant Node_Id   := Library_Unit (N);
1288       Par_Unit : constant Entity_Id := Current_Scope;
1289
1290       Lib_Spec        : Node_Id := Library_Unit (Lib_Unit);
1291       Num_Scopes      : Int := 0;
1292       Use_Clauses     : array (1 .. Scope_Stack.Last) of Node_Id;
1293       Enclosing_Child : Entity_Id := Empty;
1294       Svg             : constant Suppress_Array := Scope_Suppress;
1295
1296       procedure Analyze_Subunit_Context;
1297       --  Capture names in use clauses of the subunit. This must be done
1298       --  before re-installing parent declarations, because items in the
1299       --  context must not be hidden by declarations local to the parent.
1300
1301       procedure Re_Install_Parents (L : Node_Id; Scop : Entity_Id);
1302       --  Recursive procedure to restore scope of all ancestors of subunit,
1303       --  from outermost in. If parent is not a subunit, the call to install
1304       --  context installs context of spec and (if parent is a child unit)
1305       --  the context of its parents as well. It is confusing that parents
1306       --  should be treated differently in both cases, but the semantics are
1307       --  just not identical.
1308
1309       procedure Re_Install_Use_Clauses;
1310       --  As part of the removal of the parent scope, the use clauses are
1311       --  removed, to be reinstalled when the context of the subunit has
1312       --  been analyzed. Use clauses may also have been affected by the
1313       --  analysis of the context of the subunit, so they have to be applied
1314       --  again, to insure that the compilation environment of the rest of
1315       --  the parent unit is identical.
1316
1317       procedure Remove_Scope;
1318       --  Remove current scope from scope stack, and preserve the list
1319       --  of use clauses in it, to be reinstalled after context is analyzed.
1320
1321       -----------------------------
1322       -- Analyze_Subunit_Context --
1323       -----------------------------
1324
1325       procedure Analyze_Subunit_Context is
1326          Item      :  Node_Id;
1327          Nam       :  Node_Id;
1328          Unit_Name : Entity_Id;
1329
1330       begin
1331          Analyze_Context (N);
1332          Item := First (Context_Items (N));
1333
1334          --  make withed units immediately visible. If child unit, make the
1335          --  ultimate parent immediately visible.
1336
1337          while Present (Item) loop
1338
1339             if Nkind (Item) = N_With_Clause then
1340                Unit_Name := Entity (Name (Item));
1341
1342                while Is_Child_Unit (Unit_Name) loop
1343                   Set_Is_Visible_Child_Unit (Unit_Name);
1344                   Unit_Name := Scope (Unit_Name);
1345                end loop;
1346
1347                if not Is_Immediately_Visible (Unit_Name) then
1348                   Set_Is_Immediately_Visible (Unit_Name);
1349                   Set_Context_Installed (Item);
1350                end if;
1351
1352             elsif Nkind (Item) = N_Use_Package_Clause then
1353                Nam := First (Names (Item));
1354
1355                while Present (Nam) loop
1356                   Analyze (Nam);
1357                   Next (Nam);
1358                end loop;
1359
1360             elsif Nkind (Item) = N_Use_Type_Clause then
1361                Nam := First (Subtype_Marks (Item));
1362
1363                while Present (Nam) loop
1364                   Analyze (Nam);
1365                   Next (Nam);
1366                end loop;
1367             end if;
1368
1369             Next (Item);
1370          end loop;
1371
1372          Item := First (Context_Items (N));
1373
1374          --  reset visibility of withed units. They will be made visible
1375          --  again when we install the subunit context.
1376
1377          while Present (Item) loop
1378
1379             if Nkind (Item) = N_With_Clause then
1380                Unit_Name := Entity (Name (Item));
1381
1382                while Is_Child_Unit (Unit_Name) loop
1383                   Set_Is_Visible_Child_Unit (Unit_Name, False);
1384                   Unit_Name := Scope (Unit_Name);
1385                end loop;
1386
1387                if Context_Installed (Item) then
1388                   Set_Is_Immediately_Visible (Unit_Name, False);
1389                   Set_Context_Installed (Item, False);
1390                end if;
1391             end if;
1392
1393             Next (Item);
1394          end loop;
1395
1396       end Analyze_Subunit_Context;
1397
1398       ------------------------
1399       -- Re_Install_Parents --
1400       ------------------------
1401
1402       procedure Re_Install_Parents (L : Node_Id; Scop : Entity_Id) is
1403          E : Entity_Id;
1404
1405       begin
1406          if Nkind (Unit (L)) = N_Subunit then
1407             Re_Install_Parents (Library_Unit (L), Scope (Scop));
1408          end if;
1409
1410          Install_Context (L);
1411
1412          --  If the subunit occurs within a child unit, we must restore the
1413          --  immediate visibility of any siblings that may occur in context.
1414
1415          if Present (Enclosing_Child) then
1416             Install_Siblings (Enclosing_Child, L);
1417          end if;
1418
1419          New_Scope (Scop);
1420
1421          if Scop /= Par_Unit then
1422             Set_Is_Immediately_Visible (Scop);
1423          end if;
1424
1425          E := First_Entity (Current_Scope);
1426
1427          while Present (E) loop
1428             Set_Is_Immediately_Visible (E);
1429             Next_Entity (E);
1430          end loop;
1431
1432          --  A subunit appears within a body, and for a nested subunits
1433          --  all the parents are bodies. Restore full visibility of their
1434          --  private entities.
1435
1436          if Ekind (Scop) = E_Package then
1437             Set_In_Package_Body (Scop);
1438             Install_Private_Declarations (Scop);
1439          end if;
1440       end Re_Install_Parents;
1441
1442       ----------------------------
1443       -- Re_Install_Use_Clauses --
1444       ----------------------------
1445
1446       procedure Re_Install_Use_Clauses is
1447          U  : Node_Id;
1448
1449       begin
1450          for J in reverse 1 .. Num_Scopes loop
1451             U := Use_Clauses (J);
1452             Scope_Stack.Table (Scope_Stack.Last - J + 1).First_Use_Clause := U;
1453             Install_Use_Clauses (U, Force_Installation => True);
1454          end loop;
1455       end Re_Install_Use_Clauses;
1456
1457       ------------------
1458       -- Remove_Scope --
1459       ------------------
1460
1461       procedure Remove_Scope is
1462          E : Entity_Id;
1463
1464       begin
1465          Num_Scopes := Num_Scopes + 1;
1466          Use_Clauses (Num_Scopes) :=
1467                Scope_Stack.Table (Scope_Stack.Last).First_Use_Clause;
1468          E := First_Entity (Current_Scope);
1469
1470          while Present (E) loop
1471             Set_Is_Immediately_Visible (E, False);
1472             Next_Entity (E);
1473          end loop;
1474
1475          if Is_Child_Unit (Current_Scope) then
1476             Enclosing_Child := Current_Scope;
1477          end if;
1478
1479          Pop_Scope;
1480       end Remove_Scope;
1481
1482    --  Start of processing for Analyze_Subunit
1483
1484    begin
1485       if not Is_Empty_List (Context_Items (N)) then
1486
1487          --  Save current use clauses
1488
1489          Remove_Scope;
1490          Remove_Context (Lib_Unit);
1491
1492          --  Now remove parents and their context, including enclosing
1493          --  subunits and the outer parent body which is not a subunit.
1494
1495          if Present (Lib_Spec) then
1496             Remove_Context (Lib_Spec);
1497
1498             while Nkind (Unit (Lib_Spec)) = N_Subunit loop
1499                Lib_Spec := Library_Unit (Lib_Spec);
1500                Remove_Scope;
1501                Remove_Context (Lib_Spec);
1502             end loop;
1503
1504             if Nkind (Unit (Lib_Unit)) = N_Subunit then
1505                Remove_Scope;
1506             end if;
1507
1508             if Nkind (Unit (Lib_Spec)) = N_Package_Body then
1509                Remove_Context (Library_Unit (Lib_Spec));
1510             end if;
1511          end if;
1512
1513          Set_Is_Immediately_Visible (Par_Unit, False);
1514
1515          Analyze_Subunit_Context;
1516
1517          Re_Install_Parents (Lib_Unit, Par_Unit);
1518          Set_Is_Immediately_Visible (Par_Unit);
1519
1520          --  If the context includes a child unit of the parent of the
1521          --  subunit, the parent will have been removed from visibility,
1522          --  after compiling that cousin in the context. The visibility
1523          --  of the parent must be restored now. This also applies if the
1524          --  context includes another subunit of the same parent which in
1525          --  turn includes a child unit in its context.
1526
1527          if Ekind (Par_Unit) = E_Package then
1528             if not Is_Immediately_Visible (Par_Unit)
1529               or else (Present (First_Entity (Par_Unit))
1530                         and then not Is_Immediately_Visible
1531                                       (First_Entity (Par_Unit)))
1532             then
1533                Set_Is_Immediately_Visible   (Par_Unit);
1534                Install_Visible_Declarations (Par_Unit);
1535                Install_Private_Declarations (Par_Unit);
1536             end if;
1537          end if;
1538
1539          Re_Install_Use_Clauses;
1540          Install_Context (N);
1541
1542          --  Restore state of suppress flags for current body
1543
1544          Scope_Suppress := Svg;
1545
1546          --  If the subunit is within a child unit, then siblings of any
1547          --  parent unit that appear in the context clause of the subunit
1548          --  must also be made immediately visible.
1549
1550          if Present (Enclosing_Child) then
1551             Install_Siblings (Enclosing_Child, N);
1552          end if;
1553
1554       end if;
1555
1556       Analyze (Proper_Body (Unit (N)));
1557       Remove_Context (N);
1558    end Analyze_Subunit;
1559
1560    ----------------------------
1561    -- Analyze_Task_Body_Stub --
1562    ----------------------------
1563
1564    procedure Analyze_Task_Body_Stub (N : Node_Id) is
1565       Nam : Entity_Id := Current_Entity_In_Scope (Defining_Identifier (N));
1566       Loc : constant Source_Ptr := Sloc (N);
1567
1568    begin
1569       Check_Stub_Level (N);
1570
1571       --  First occurence of name may have been as an incomplete type
1572
1573       if Present (Nam) and then Ekind (Nam) = E_Incomplete_Type then
1574          Nam := Full_View (Nam);
1575       end if;
1576
1577       if No (Nam)
1578         or else not Is_Task_Type (Etype (Nam))
1579       then
1580          Error_Msg_N ("missing specification for task body", N);
1581       else
1582          Set_Scope (Defining_Entity (N), Current_Scope);
1583          Generate_Reference (Nam, Defining_Identifier (N), 'b');
1584          Set_Has_Completion (Etype (Nam));
1585          Analyze_Proper_Body (N, Etype (Nam));
1586
1587          --  Set elaboration flag to indicate that entity is callable.
1588          --  This cannot be done in the expansion of the body  itself,
1589          --  because the proper body is not in a declarative part. This
1590          --  is only done if expansion is active, because the context
1591          --  may be generic and the flag not defined yet.
1592
1593          if Expander_Active then
1594             Insert_After (N,
1595               Make_Assignment_Statement (Loc,
1596                 Name =>
1597                   Make_Identifier (Loc,
1598                     New_External_Name (Chars (Etype (Nam)), 'E')),
1599                  Expression => New_Reference_To (Standard_True, Loc)));
1600          end if;
1601
1602       end if;
1603    end Analyze_Task_Body_Stub;
1604
1605    -------------------------
1606    -- Analyze_With_Clause --
1607    -------------------------
1608
1609    --  Analyze the declaration of a unit in a with clause. At end,
1610    --  label the with clause with the defining entity for the unit.
1611
1612    procedure Analyze_With_Clause (N : Node_Id) is
1613
1614       --  Retrieve the original kind of the unit node, before analysis.
1615       --  If it is a subprogram instantiation, its analysis below will
1616       --  rewrite as the declaration of the wrapper package. If the same
1617       --  instantiation appears indirectly elsewhere in the context, it
1618       --  will have been analyzed already.
1619
1620       Unit_Kind : constant Node_Kind :=
1621                     Nkind (Original_Node (Unit (Library_Unit (N))));
1622
1623       E_Name    : Entity_Id;
1624       Par_Name  : Entity_Id;
1625       Pref      : Node_Id;
1626       U         : Node_Id;
1627
1628       Intunit : Boolean;
1629       --  Set True if the unit currently being compiled is an internal unit
1630
1631       Save_Style_Check : constant Boolean := Opt.Style_Check;
1632       Save_C_Restrict  : constant Save_Cunit_Boolean_Restrictions :=
1633                            Cunit_Boolean_Restrictions_Save;
1634
1635    begin
1636       if Limited_Present (N) then
1637          --  Ada 2005 (AI-50217): Build visibility structures but do not
1638          --  analyze unit
1639
1640          Build_Limited_Views (N);
1641          return;
1642       end if;
1643
1644       --  We reset ordinary style checking during the analysis of a with'ed
1645       --  unit, but we do NOT reset GNAT special analysis mode (the latter
1646       --  definitely *does* apply to with'ed units).
1647
1648       if not GNAT_Mode then
1649          Style_Check := False;
1650       end if;
1651
1652       --  If the library unit is a predefined unit, and we are in high
1653       --  integrity mode, then temporarily reset Configurable_Run_Time_Mode
1654       --  for the analysis of the with'ed unit. This mode does not prevent
1655       --  explicit with'ing of run-time units.
1656
1657       if Configurable_Run_Time_Mode
1658         and then
1659           Is_Predefined_File_Name
1660             (Unit_File_Name (Get_Source_Unit (Unit (Library_Unit (N)))))
1661       then
1662          Configurable_Run_Time_Mode := False;
1663          Semantics (Library_Unit (N));
1664          Configurable_Run_Time_Mode := True;
1665
1666       else
1667          Semantics (Library_Unit (N));
1668       end if;
1669
1670       U := Unit (Library_Unit (N));
1671       Check_Restriction_No_Dependence (Name (N), N);
1672       Intunit := Is_Internal_File_Name (Unit_File_Name (Current_Sem_Unit));
1673
1674       --  Following checks are skipped for dummy packages (those supplied
1675       --  for with's where no matching file could be found). Such packages
1676       --  are identified by the Sloc value being set to No_Location
1677
1678       if Sloc (U) /= No_Location then
1679
1680          --  Check restrictions, except that we skip the check if this
1681          --  is an internal unit unless we are compiling the internal
1682          --  unit as the main unit. We also skip this for dummy packages.
1683
1684          if not Intunit or else Current_Sem_Unit = Main_Unit then
1685             Check_Restricted_Unit (Unit_Name (Get_Source_Unit (U)), N);
1686          end if;
1687
1688          --  Check for inappropriate with of internal implementation unit
1689          --  if we are currently compiling the main unit and the main unit
1690          --  is itself not an internal unit. We do not issue this message
1691          --  for implicit with's generated by the compiler itself.
1692
1693          if Implementation_Unit_Warnings
1694            and then Current_Sem_Unit = Main_Unit
1695            and then not Intunit
1696            and then not Implicit_With (N)
1697            and then not GNAT_Mode
1698          then
1699             declare
1700                U_Kind : constant Kind_Of_Unit :=
1701                           Get_Kind_Of_Unit (Get_Source_Unit (U));
1702
1703             begin
1704                if U_Kind = Implementation_Unit then
1705                   Error_Msg_N ("& is an internal 'G'N'A'T unit?", Name (N));
1706                   Error_Msg_N
1707                     ("\use of this unit is non-portable " &
1708                      "and version-dependent?",
1709                      Name (N));
1710
1711                elsif U_Kind = Ada_05_Unit and then Ada_Version = Ada_95 then
1712                   Error_Msg_N ("& is an Ada 2005 unit?", Name (N));
1713                end if;
1714             end;
1715          end if;
1716       end if;
1717
1718       --  Semantic analysis of a generic unit is performed on a copy of
1719       --  the original tree. Retrieve the entity on  which semantic info
1720       --  actually appears.
1721
1722       if Unit_Kind in N_Generic_Declaration then
1723          E_Name := Defining_Entity (U);
1724
1725       --  Note: in the following test, Unit_Kind is the original Nkind, but
1726       --  in the case of an instantiation, semantic analysis above will
1727       --  have replaced the unit by its instantiated version. If the instance
1728       --  body has been generated, the instance now denotes the body entity.
1729       --  For visibility purposes we need the entity of its spec.
1730
1731       elsif (Unit_Kind = N_Package_Instantiation
1732               or else Nkind (Original_Node (Unit (Library_Unit (N)))) =
1733                 N_Package_Instantiation)
1734         and then Nkind (U) = N_Package_Body
1735       then
1736          E_Name := Corresponding_Spec (U);
1737
1738       elsif Unit_Kind = N_Package_Instantiation
1739         and then Nkind (U) = N_Package_Instantiation
1740       then
1741          --  If the instance has not been rewritten as a package declaration,
1742          --  then it appeared already in a previous with clause. Retrieve
1743          --  the entity from the previous instance.
1744
1745          E_Name := Defining_Entity (Specification (Instance_Spec (U)));
1746
1747       elsif Unit_Kind = N_Procedure_Instantiation
1748         or else Unit_Kind = N_Function_Instantiation
1749       then
1750          --  Instantiation node is replaced with a package that contains
1751          --  renaming declarations and instance itself. The subprogram
1752          --  Instance is declared in the visible part of the wrapper package.
1753
1754          E_Name := First_Entity (Defining_Entity (U));
1755
1756          while Present (E_Name) loop
1757             exit when Is_Subprogram (E_Name)
1758               and then Is_Generic_Instance (E_Name);
1759             E_Name := Next_Entity (E_Name);
1760          end loop;
1761
1762       elsif Unit_Kind = N_Package_Renaming_Declaration
1763         or else Unit_Kind in N_Generic_Renaming_Declaration
1764       then
1765          E_Name := Defining_Entity (U);
1766
1767       elsif Unit_Kind = N_Subprogram_Body
1768         and then Nkind (Name (N)) = N_Selected_Component
1769         and then not Acts_As_Spec (Library_Unit (N))
1770       then
1771          --  For a child unit that has no spec, one has been created and
1772          --  analyzed. The entity required is that of the spec.
1773
1774          E_Name := Corresponding_Spec (U);
1775
1776       else
1777          E_Name := Defining_Entity (U);
1778       end if;
1779
1780       if Nkind (Name (N)) = N_Selected_Component then
1781
1782          --  Child unit in a with clause
1783
1784          Change_Selected_Component_To_Expanded_Name (Name (N));
1785       end if;
1786
1787       --  Restore style checks and restrictions
1788
1789       Style_Check := Save_Style_Check;
1790       Cunit_Boolean_Restrictions_Restore (Save_C_Restrict);
1791
1792       --  Record the reference, but do NOT set the unit as referenced, we
1793       --  want to consider the unit as unreferenced if this is the only
1794       --  reference that occurs.
1795
1796       Set_Entity_With_Style_Check (Name (N), E_Name);
1797       Generate_Reference (E_Name, Name (N), 'w', Set_Ref => False);
1798
1799       if Is_Child_Unit (E_Name) then
1800          Pref     := Prefix (Name (N));
1801          Par_Name := Scope (E_Name);
1802
1803          while Nkind (Pref) = N_Selected_Component loop
1804             Change_Selected_Component_To_Expanded_Name (Pref);
1805             Set_Entity_With_Style_Check (Pref, Par_Name);
1806
1807             Generate_Reference (Par_Name, Pref);
1808             Pref := Prefix (Pref);
1809
1810             --  If E_Name is the dummy entity for a nonexistent unit,
1811             --  its scope is set to Standard_Standard, and no attempt
1812             --  should be made to further unwind scopes.
1813
1814             if Par_Name /= Standard_Standard then
1815                Par_Name := Scope (Par_Name);
1816             end if;
1817          end loop;
1818
1819          if Present (Entity (Pref))
1820            and then not Analyzed (Parent (Parent (Entity (Pref))))
1821          then
1822             --  If the entity is set without its unit being compiled,
1823             --  the original parent is a renaming, and Par_Name is the
1824             --  renamed entity. For visibility purposes, we need the
1825             --  original entity, which must be analyzed now, because
1826             --  Load_Unit retrieves directly the renamed unit, and the
1827             --  renaming declaration itself has not been analyzed.
1828
1829             Analyze (Parent (Parent (Entity (Pref))));
1830             pragma Assert (Renamed_Object (Entity (Pref)) = Par_Name);
1831             Par_Name := Entity (Pref);
1832          end if;
1833
1834          Set_Entity_With_Style_Check (Pref, Par_Name);
1835          Generate_Reference (Par_Name, Pref);
1836       end if;
1837
1838       --  If the withed unit is System, and a system extension pragma is
1839       --  present, compile the extension now, rather than waiting for
1840       --  a visibility check on a specific entity.
1841
1842       if Chars (E_Name) = Name_System
1843         and then Scope (E_Name) = Standard_Standard
1844         and then Present (System_Extend_Unit)
1845         and then Present_System_Aux (N)
1846       then
1847          --  If the extension is not present, an error will have been emitted
1848
1849          null;
1850       end if;
1851
1852       --  Ada 2005 (AI-262): Remove from visibility the entity corresponding
1853       --  to private_with units; they will be made visible later (just before
1854       --  the private part is analyzed)
1855
1856       if Private_Present (N) then
1857          Set_Is_Immediately_Visible (E_Name, False);
1858       end if;
1859    end Analyze_With_Clause;
1860
1861    ------------------------------
1862    -- Analyze_With_Type_Clause --
1863    ------------------------------
1864
1865    procedure Analyze_With_Type_Clause (N : Node_Id) is
1866       Loc  : constant Source_Ptr := Sloc (N);
1867       Nam  : constant Node_Id    := Name (N);
1868       Pack : Node_Id;
1869       Decl : Node_Id;
1870       P    : Entity_Id;
1871       Unum : Unit_Number_Type;
1872       Sel  : Node_Id;
1873
1874       procedure Decorate_Tagged_Type (T : Entity_Id);
1875       --  Set basic attributes of type, including its class_wide type
1876
1877       function In_Chain (E : Entity_Id) return Boolean;
1878       --  Check that the imported type is not already in the homonym chain,
1879       --  for example through a with_type clause in a parent unit.
1880
1881       --------------------------
1882       -- Decorate_Tagged_Type --
1883       --------------------------
1884
1885       procedure Decorate_Tagged_Type (T : Entity_Id) is
1886          CW : Entity_Id;
1887
1888       begin
1889          Set_Ekind (T, E_Record_Type);
1890          Set_Is_Tagged_Type (T);
1891          Set_Etype (T, T);
1892          Set_From_With_Type (T);
1893          Set_Scope (T, P);
1894
1895          if not In_Chain (T) then
1896             Set_Homonym (T, Current_Entity (T));
1897             Set_Current_Entity (T);
1898          end if;
1899
1900          --  Build bogus class_wide type, if not previously done
1901
1902          if No (Class_Wide_Type (T)) then
1903             CW := Make_Defining_Identifier (Loc,  New_Internal_Name ('S'));
1904
1905             Set_Ekind            (CW, E_Class_Wide_Type);
1906             Set_Etype            (CW, T);
1907             Set_Scope            (CW, P);
1908             Set_Is_Tagged_Type   (CW);
1909             Set_Is_First_Subtype (CW, True);
1910             Init_Size_Align      (CW);
1911             Set_Has_Unknown_Discriminants
1912                                  (CW, True);
1913             Set_Class_Wide_Type  (CW, CW);
1914             Set_Equivalent_Type  (CW, Empty);
1915             Set_From_With_Type   (CW);
1916
1917             Set_Class_Wide_Type (T, CW);
1918          end if;
1919       end Decorate_Tagged_Type;
1920
1921       --------------
1922       -- In_Chain --
1923       --------------
1924
1925       function In_Chain (E : Entity_Id) return Boolean is
1926          H : Entity_Id := Current_Entity (E);
1927
1928       begin
1929          while Present (H) loop
1930
1931             if H = E then
1932                return True;
1933             else
1934                H := Homonym (H);
1935             end if;
1936          end loop;
1937
1938          return False;
1939       end In_Chain;
1940
1941    --  Start of processing for Analyze_With_Type_Clause
1942
1943    begin
1944       if Nkind (Nam) = N_Selected_Component then
1945          Pack := New_Copy_Tree (Prefix (Nam));
1946          Sel  := Selector_Name (Nam);
1947
1948       else
1949          Error_Msg_N ("illegal name for imported type", Nam);
1950          return;
1951       end if;
1952
1953       Decl :=
1954         Make_Package_Declaration (Loc,
1955           Specification =>
1956              (Make_Package_Specification (Loc,
1957                Defining_Unit_Name   => Pack,
1958                Visible_Declarations => New_List,
1959                End_Label            => Empty)));
1960
1961       Unum :=
1962         Load_Unit
1963           (Load_Name  => Get_Unit_Name (Decl),
1964            Required   => True,
1965            Subunit    => False,
1966            Error_Node => Nam);
1967
1968       if Unum = No_Unit
1969          or else Nkind (Unit (Cunit (Unum))) /= N_Package_Declaration
1970       then
1971          Error_Msg_N ("imported type must be declared in package", Nam);
1972          return;
1973
1974       elsif Unum = Current_Sem_Unit then
1975
1976          --  If type is defined in unit being analyzed, then the clause
1977          --  is redundant.
1978
1979          return;
1980
1981       else
1982          P := Cunit_Entity (Unum);
1983       end if;
1984
1985       --  Find declaration for imported type, and set its basic attributes
1986       --  if it has not been analyzed (which will be the case if there is
1987       --  circular dependence).
1988
1989       declare
1990          Decl : Node_Id;
1991          Typ  : Entity_Id;
1992
1993       begin
1994          if not Analyzed (Cunit (Unum))
1995            and then not From_With_Type (P)
1996          then
1997             Set_Ekind (P, E_Package);
1998             Set_Etype (P, Standard_Void_Type);
1999             Set_From_With_Type (P);
2000             Set_Scope (P, Standard_Standard);
2001             Set_Homonym (P, Current_Entity (P));
2002             Set_Current_Entity (P);
2003
2004          elsif Analyzed (Cunit (Unum))
2005            and then Is_Child_Unit (P)
2006          then
2007             --  If the child unit is already in scope, indicate that it is
2008             --  visible, and remains so after intervening calls to rtsfind.
2009
2010             Set_Is_Visible_Child_Unit (P);
2011          end if;
2012
2013          if Nkind (Parent (P)) = N_Defining_Program_Unit_Name then
2014
2015             --  Make parent packages visible
2016
2017             declare
2018                Parent_Comp : Node_Id;
2019                Parent_Id   : Entity_Id;
2020                Child       : Entity_Id;
2021
2022             begin
2023                Child   := P;
2024                Parent_Comp := Parent_Spec (Unit (Cunit (Unum)));
2025
2026                loop
2027                   Parent_Id := Defining_Entity (Unit (Parent_Comp));
2028                   Set_Scope (Child, Parent_Id);
2029
2030                   --  The type may be imported from a child unit, in which
2031                   --  case the current compilation appears in the name. Do
2032                   --  not change its visibility here because it will conflict
2033                   --  with the subsequent normal processing.
2034
2035                   if not Analyzed (Unit_Declaration_Node (Parent_Id))
2036                     and then Parent_Id /= Cunit_Entity (Current_Sem_Unit)
2037                   then
2038                      Set_Ekind (Parent_Id, E_Package);
2039                      Set_Etype (Parent_Id, Standard_Void_Type);
2040
2041                      --  The same package may appear is several with_type
2042                      --  clauses.
2043
2044                      if not From_With_Type (Parent_Id) then
2045                         Set_Homonym (Parent_Id, Current_Entity (Parent_Id));
2046                         Set_Current_Entity (Parent_Id);
2047                         Set_From_With_Type (Parent_Id);
2048                      end if;
2049                   end if;
2050
2051                   Set_Is_Immediately_Visible (Parent_Id);
2052
2053                   Child := Parent_Id;
2054                   Parent_Comp := Parent_Spec (Unit (Parent_Comp));
2055                   exit when No (Parent_Comp);
2056                end loop;
2057
2058                Set_Scope (Parent_Id, Standard_Standard);
2059             end;
2060          end if;
2061
2062          --  Even if analyzed, the package may not be currently visible. It
2063          --  must be while the with_type clause is active.
2064
2065          Set_Is_Immediately_Visible (P);
2066
2067          Decl :=
2068            First (Visible_Declarations (Specification (Unit (Cunit (Unum)))));
2069
2070          while Present (Decl) loop
2071
2072             if Nkind (Decl) = N_Full_Type_Declaration
2073               and then Chars (Defining_Identifier (Decl)) = Chars (Sel)
2074             then
2075                Typ := Defining_Identifier (Decl);
2076
2077                if Tagged_Present (N) then
2078
2079                   --  The declaration must indicate that this is a tagged
2080                   --  type or a type extension.
2081
2082                   if (Nkind (Type_Definition (Decl)) = N_Record_Definition
2083                        and then Tagged_Present (Type_Definition (Decl)))
2084                     or else
2085                       (Nkind (Type_Definition (Decl))
2086                           = N_Derived_Type_Definition
2087                          and then Present
2088                            (Record_Extension_Part (Type_Definition (Decl))))
2089                   then
2090                      null;
2091                   else
2092                      Error_Msg_N ("imported type is not a tagged type", Nam);
2093                      return;
2094                   end if;
2095
2096                   if not Analyzed (Decl) then
2097
2098                      --  Unit is not currently visible. Add basic attributes
2099                      --  to type and build its class-wide type.
2100
2101                      Init_Size_Align (Typ);
2102                      Decorate_Tagged_Type (Typ);
2103                   end if;
2104
2105                else
2106                   if Nkind (Type_Definition (Decl))
2107                      /= N_Access_To_Object_Definition
2108                   then
2109                      Error_Msg_N
2110                       ("imported type is not an access type", Nam);
2111
2112                   elsif not Analyzed (Decl) then
2113                      Set_Ekind                    (Typ, E_Access_Type);
2114                      Set_Etype                    (Typ, Typ);
2115                      Set_Scope                    (Typ, P);
2116                      Init_Size                    (Typ, System_Address_Size);
2117                      Init_Alignment               (Typ);
2118                      Set_Directly_Designated_Type (Typ, Standard_Integer);
2119                      Set_From_With_Type           (Typ);
2120
2121                      if not In_Chain (Typ) then
2122                         Set_Homonym               (Typ, Current_Entity (Typ));
2123                         Set_Current_Entity        (Typ);
2124                      end if;
2125                   end if;
2126                end if;
2127
2128                Set_Entity (Sel, Typ);
2129                return;
2130
2131             elsif ((Nkind (Decl) = N_Private_Type_Declaration
2132                       and then Tagged_Present (Decl))
2133                 or else (Nkind (Decl) = N_Private_Extension_Declaration))
2134               and then Chars (Defining_Identifier (Decl)) = Chars (Sel)
2135             then
2136                Typ := Defining_Identifier (Decl);
2137
2138                if not Tagged_Present (N) then
2139                   Error_Msg_N ("type must be declared tagged", N);
2140
2141                elsif not Analyzed (Decl) then
2142                   Decorate_Tagged_Type (Typ);
2143                end if;
2144
2145                Set_Entity (Sel, Typ);
2146                Set_From_With_Type (Typ);
2147                return;
2148             end if;
2149
2150             Decl := Next (Decl);
2151          end loop;
2152
2153          Error_Msg_NE ("not a visible access or tagged type in&", Nam, P);
2154       end;
2155    end Analyze_With_Type_Clause;
2156
2157    -----------------------------
2158    -- Check_With_Type_Clauses --
2159    -----------------------------
2160
2161    procedure Check_With_Type_Clauses (N : Node_Id) is
2162       Lib_Unit : constant Node_Id := Unit (N);
2163
2164       procedure Check_Parent_Context (U : Node_Id);
2165       --  Examine context items of parent unit to locate with_type clauses
2166
2167       --------------------------
2168       -- Check_Parent_Context --
2169       --------------------------
2170
2171       procedure Check_Parent_Context (U : Node_Id) is
2172          Item : Node_Id;
2173
2174       begin
2175          Item := First (Context_Items (U));
2176          while Present (Item) loop
2177             if Nkind (Item) = N_With_Type_Clause
2178               and then not Error_Posted (Item)
2179               and then
2180                 From_With_Type (Scope (Entity (Selector_Name (Name (Item)))))
2181             then
2182                Error_Msg_Sloc := Sloc (Item);
2183                Error_Msg_N ("Missing With_Clause for With_Type_Clause#", N);
2184             end if;
2185
2186             Next (Item);
2187          end loop;
2188       end Check_Parent_Context;
2189
2190    --  Start of processing for Check_With_Type_Clauses
2191
2192    begin
2193       if Extensions_Allowed
2194         and then (Nkind (Lib_Unit) = N_Package_Body
2195                    or else Nkind (Lib_Unit) = N_Subprogram_Body)
2196       then
2197          Check_Parent_Context (Library_Unit (N));
2198
2199          if Is_Child_Spec (Unit (Library_Unit (N))) then
2200             Check_Parent_Context (Parent_Spec (Unit (Library_Unit (N))));
2201          end if;
2202       end if;
2203    end Check_With_Type_Clauses;
2204
2205    ------------------------------
2206    -- Check_Private_Child_Unit --
2207    ------------------------------
2208
2209    procedure Check_Private_Child_Unit (N : Node_Id) is
2210       Lib_Unit   : constant Node_Id := Unit (N);
2211       Item       : Node_Id;
2212       Curr_Unit  : Entity_Id;
2213       Sub_Parent : Node_Id;
2214       Priv_Child : Entity_Id;
2215       Par_Lib    : Entity_Id;
2216       Par_Spec   : Node_Id;
2217
2218       function Is_Private_Library_Unit (Unit : Entity_Id) return Boolean;
2219       --  Returns true if and only if the library unit is declared with
2220       --  an explicit designation of private.
2221
2222       function Is_Private_Library_Unit (Unit : Entity_Id) return Boolean is
2223          Comp_Unit : constant Node_Id := Parent (Unit_Declaration_Node (Unit));
2224
2225       begin
2226          return Private_Present (Comp_Unit);
2227       end Is_Private_Library_Unit;
2228
2229    --  Start of processing for Check_Private_Child_Unit
2230
2231    begin
2232       if Nkind (Lib_Unit) = N_Package_Body
2233         or else Nkind (Lib_Unit) = N_Subprogram_Body
2234       then
2235          Curr_Unit := Defining_Entity (Unit (Library_Unit (N)));
2236          Par_Lib   := Curr_Unit;
2237
2238       elsif Nkind (Lib_Unit) = N_Subunit then
2239
2240          --  The parent is itself a body. The parent entity is to be found
2241          --  in the corresponding spec.
2242
2243          Sub_Parent := Library_Unit (N);
2244          Curr_Unit  := Defining_Entity (Unit (Library_Unit (Sub_Parent)));
2245
2246          --  If the parent itself is a subunit, Curr_Unit is the entity
2247          --  of the enclosing body, retrieve the spec entity which is
2248          --  the proper ancestor we need for the following tests.
2249
2250          if Ekind (Curr_Unit) = E_Package_Body then
2251             Curr_Unit := Spec_Entity (Curr_Unit);
2252          end if;
2253
2254          Par_Lib    := Curr_Unit;
2255
2256       else
2257          Curr_Unit := Defining_Entity (Lib_Unit);
2258
2259          Par_Lib := Curr_Unit;
2260          Par_Spec  := Parent_Spec (Lib_Unit);
2261
2262          if No (Par_Spec) then
2263             Par_Lib := Empty;
2264          else
2265             Par_Lib := Defining_Entity (Unit (Par_Spec));
2266          end if;
2267       end if;
2268
2269       --  Loop through context items
2270
2271       Item := First (Context_Items (N));
2272       while Present (Item) loop
2273
2274          --  Ada 2005 (AI-262): Allow private_with of a private child package
2275          --  in public siblings
2276
2277          if Nkind (Item) = N_With_Clause
2278             and then not Implicit_With (Item)
2279             and then not Private_Present (Item)
2280             and then Is_Private_Descendant (Entity (Name (Item)))
2281          then
2282             Priv_Child := Entity (Name (Item));
2283
2284             declare
2285                Curr_Parent  : Entity_Id := Par_Lib;
2286                Child_Parent : Entity_Id := Scope (Priv_Child);
2287                Prv_Ancestor : Entity_Id := Child_Parent;
2288                Curr_Private : Boolean   := Is_Private_Library_Unit (Curr_Unit);
2289
2290             begin
2291                --  If the child unit is a public child then locate
2292                --  the nearest private ancestor; Child_Parent will
2293                --  then be set to the parent of that ancestor.
2294
2295                if not Is_Private_Library_Unit (Priv_Child) then
2296                   while Present (Prv_Ancestor)
2297                     and then not Is_Private_Library_Unit (Prv_Ancestor)
2298                   loop
2299                      Prv_Ancestor := Scope (Prv_Ancestor);
2300                   end loop;
2301
2302                   if Present (Prv_Ancestor) then
2303                      Child_Parent := Scope (Prv_Ancestor);
2304                   end if;
2305                end if;
2306
2307                while Present (Curr_Parent)
2308                  and then Curr_Parent /= Standard_Standard
2309                  and then Curr_Parent /= Child_Parent
2310                loop
2311                   Curr_Private :=
2312                     Curr_Private or else Is_Private_Library_Unit (Curr_Parent);
2313                   Curr_Parent := Scope (Curr_Parent);
2314                end loop;
2315
2316                if not Present (Curr_Parent) then
2317                   Curr_Parent := Standard_Standard;
2318                end if;
2319
2320                if Curr_Parent /= Child_Parent then
2321
2322                   if Ekind (Priv_Child) = E_Generic_Package
2323                     and then Chars (Priv_Child) in Text_IO_Package_Name
2324                     and then Chars (Scope (Scope (Priv_Child))) = Name_Ada
2325                   then
2326                      Error_Msg_NE
2327                        ("& is a nested package, not a compilation unit",
2328                        Name (Item), Priv_Child);
2329
2330                   else
2331                      Error_Msg_N
2332                        ("unit in with clause is private child unit!", Item);
2333                      Error_Msg_NE
2334                        ("current unit must also have parent&!",
2335                         Item, Child_Parent);
2336                   end if;
2337
2338                elsif not Curr_Private
2339                  and then Nkind (Lib_Unit) /= N_Package_Body
2340                  and then Nkind (Lib_Unit) /= N_Subprogram_Body
2341                  and then Nkind (Lib_Unit) /= N_Subunit
2342                then
2343                   Error_Msg_NE
2344                     ("current unit must also be private descendant of&",
2345                      Item, Child_Parent);
2346                end if;
2347             end;
2348          end if;
2349
2350          Next (Item);
2351       end loop;
2352
2353    end Check_Private_Child_Unit;
2354
2355    ----------------------
2356    -- Check_Stub_Level --
2357    ----------------------
2358
2359    procedure Check_Stub_Level (N : Node_Id) is
2360       Par  : constant Node_Id   := Parent (N);
2361       Kind : constant Node_Kind := Nkind (Par);
2362
2363    begin
2364       if (Kind = N_Package_Body
2365            or else Kind = N_Subprogram_Body
2366            or else Kind = N_Task_Body
2367            or else Kind = N_Protected_Body)
2368
2369         and then (Nkind (Parent (Par)) = N_Compilation_Unit
2370                    or else Nkind (Parent (Par)) = N_Subunit)
2371       then
2372          null;
2373
2374       --  In an instance, a missing stub appears at any level. A warning
2375       --  message will have been emitted already for the missing file.
2376
2377       elsif not In_Instance then
2378          Error_Msg_N ("stub cannot appear in an inner scope", N);
2379
2380       elsif Expander_Active then
2381          Error_Msg_N ("missing proper body", N);
2382       end if;
2383    end Check_Stub_Level;
2384
2385    ------------------------
2386    -- Expand_With_Clause --
2387    ------------------------
2388
2389    procedure Expand_With_Clause (Nam : Node_Id; N : Node_Id) is
2390       Loc   : constant Source_Ptr := Sloc (Nam);
2391       Ent   : constant Entity_Id := Entity (Nam);
2392       Withn : Node_Id;
2393       P     : Node_Id;
2394
2395       function Build_Unit_Name (Nam : Node_Id) return Node_Id;
2396
2397       function Build_Unit_Name (Nam : Node_Id) return Node_Id is
2398          Result : Node_Id;
2399
2400       begin
2401          if Nkind (Nam) = N_Identifier then
2402             return New_Occurrence_Of (Entity (Nam), Loc);
2403
2404          else
2405             Result :=
2406               Make_Expanded_Name (Loc,
2407                 Chars  => Chars (Entity (Nam)),
2408                 Prefix => Build_Unit_Name (Prefix (Nam)),
2409                 Selector_Name => New_Occurrence_Of (Entity (Nam), Loc));
2410             Set_Entity (Result, Entity (Nam));
2411             return Result;
2412          end if;
2413       end Build_Unit_Name;
2414
2415    begin
2416       New_Nodes_OK := New_Nodes_OK + 1;
2417       Withn :=
2418         Make_With_Clause (Loc, Name => Build_Unit_Name (Nam));
2419
2420       P := Parent (Unit_Declaration_Node (Ent));
2421       Set_Library_Unit          (Withn, P);
2422       Set_Corresponding_Spec    (Withn, Ent);
2423       Set_First_Name            (Withn, True);
2424       Set_Implicit_With         (Withn, True);
2425
2426       Prepend (Withn, Context_Items (N));
2427       Mark_Rewrite_Insertion (Withn);
2428       Install_Withed_Unit (Withn);
2429
2430       if Nkind (Nam) = N_Expanded_Name then
2431          Expand_With_Clause (Prefix (Nam), N);
2432       end if;
2433
2434       New_Nodes_OK := New_Nodes_OK - 1;
2435    end Expand_With_Clause;
2436
2437    --------------------------------
2438    -- Expand_Limited_With_Clause --
2439    --------------------------------
2440
2441    procedure Expand_Limited_With_Clause (Nam : Node_Id; N : Node_Id) is
2442       Loc   : constant Source_Ptr := Sloc (Nam);
2443       Unum  : Unit_Number_Type;
2444       Withn : Node_Id;
2445
2446    begin
2447       New_Nodes_OK := New_Nodes_OK + 1;
2448
2449       if Nkind (Nam) = N_Identifier then
2450          Withn :=
2451            Make_With_Clause (Loc, Name => Nam);
2452          Set_Limited_Present (Withn);
2453          Set_First_Name      (Withn);
2454          Set_Implicit_With   (Withn);
2455
2456          --  Load the corresponding parent unit
2457
2458          Unum :=
2459            Load_Unit
2460            (Load_Name  => Get_Spec_Name (Get_Unit_Name (Nam)),
2461             Required   => True,
2462             Subunit    => False,
2463             Error_Node => Nam);
2464
2465          if not Analyzed (Cunit (Unum)) then
2466             Set_Library_Unit (Withn, Cunit (Unum));
2467             Set_Corresponding_Spec
2468               (Withn, Specification (Unit (Cunit (Unum))));
2469
2470             Prepend (Withn, Context_Items (Parent (N)));
2471             Mark_Rewrite_Insertion (Withn);
2472          end if;
2473
2474       else pragma Assert (Nkind (Nam) = N_Selected_Component);
2475          Withn :=
2476            Make_With_Clause
2477            (Loc,
2478             Name =>
2479               Make_Selected_Component
2480                 (Loc,
2481                  Prefix        => Prefix (Nam),
2482                  Selector_Name => Selector_Name (Nam)));
2483
2484          Set_Parent (Withn, Parent (N));
2485          Set_Limited_Present (Withn);
2486          Set_First_Name      (Withn);
2487          Set_Implicit_With   (Withn);
2488
2489          Unum :=
2490            Load_Unit
2491              (Load_Name  => Get_Spec_Name (Get_Unit_Name (Nam)),
2492               Required   => True,
2493               Subunit    => False,
2494               Error_Node => Nam);
2495
2496          if not Analyzed (Cunit (Unum)) then
2497             Set_Library_Unit (Withn, Cunit (Unum));
2498             Set_Corresponding_Spec
2499               (Withn, Specification (Unit (Cunit (Unum))));
2500             Prepend (Withn, Context_Items (Parent (N)));
2501             Mark_Rewrite_Insertion (Withn);
2502
2503             Expand_Limited_With_Clause (Prefix (Nam), N);
2504          end if;
2505       end if;
2506
2507       New_Nodes_OK := New_Nodes_OK - 1;
2508    end Expand_Limited_With_Clause;
2509
2510    -----------------------
2511    -- Get_Parent_Entity --
2512    -----------------------
2513
2514    function Get_Parent_Entity (Unit : Node_Id) return Entity_Id is
2515    begin
2516       if Nkind (Unit) = N_Package_Body
2517         and then Nkind (Original_Node (Unit)) = N_Package_Instantiation
2518       then
2519          return
2520            Defining_Entity
2521              (Specification (Instance_Spec (Original_Node (Unit))));
2522
2523       elsif Nkind (Unit) = N_Package_Instantiation then
2524          return Defining_Entity (Specification (Instance_Spec (Unit)));
2525
2526       else
2527          return Defining_Entity (Unit);
2528       end if;
2529    end Get_Parent_Entity;
2530
2531    -----------------------------
2532    -- Implicit_With_On_Parent --
2533    -----------------------------
2534
2535    procedure Implicit_With_On_Parent
2536      (Child_Unit : Node_Id;
2537       N          : Node_Id)
2538    is
2539       Loc    : constant Source_Ptr := Sloc (N);
2540       P      : constant Node_Id    := Parent_Spec (Child_Unit);
2541
2542       P_Unit : Node_Id    := Unit (P);
2543
2544       P_Name : constant Entity_Id  := Get_Parent_Entity (P_Unit);
2545       Withn  : Node_Id;
2546
2547       function Build_Ancestor_Name (P : Node_Id) return Node_Id;
2548       --  Build prefix of child unit name. Recurse if needed
2549
2550       function Build_Unit_Name return Node_Id;
2551       --  If the unit is a child unit, build qualified name with all
2552       --  ancestors.
2553
2554       -------------------------
2555       -- Build_Ancestor_Name --
2556       -------------------------
2557
2558       function Build_Ancestor_Name (P : Node_Id) return Node_Id is
2559          P_Ref : constant Node_Id :=
2560                    New_Reference_To (Defining_Entity (P), Loc);
2561       begin
2562          if No (Parent_Spec (P)) then
2563             return P_Ref;
2564          else
2565             return
2566               Make_Selected_Component (Loc,
2567                 Prefix => Build_Ancestor_Name (Unit (Parent_Spec (P))),
2568                 Selector_Name => P_Ref);
2569          end if;
2570       end Build_Ancestor_Name;
2571
2572       ---------------------
2573       -- Build_Unit_Name --
2574       ---------------------
2575
2576       function Build_Unit_Name return Node_Id is
2577          Result : Node_Id;
2578       begin
2579          if No (Parent_Spec (P_Unit)) then
2580             return New_Reference_To (P_Name, Loc);
2581          else
2582             Result :=
2583               Make_Expanded_Name (Loc,
2584                 Chars  => Chars (P_Name),
2585                 Prefix => Build_Ancestor_Name (Unit (Parent_Spec (P_Unit))),
2586                 Selector_Name => New_Reference_To (P_Name, Loc));
2587             Set_Entity (Result, P_Name);
2588             return Result;
2589          end if;
2590       end Build_Unit_Name;
2591
2592    --  Start of processing for Implicit_With_On_Parent
2593
2594    begin
2595       --  The unit of the current compilation may be a package body
2596       --  that replaces an instance node. In this case we need the
2597       --  original instance node to construct the proper parent name.
2598
2599       if Nkind (P_Unit) = N_Package_Body
2600         and then Nkind (Original_Node (P_Unit)) = N_Package_Instantiation
2601       then
2602          P_Unit := Original_Node (P_Unit);
2603       end if;
2604
2605       New_Nodes_OK := New_Nodes_OK + 1;
2606       Withn := Make_With_Clause (Loc, Name => Build_Unit_Name);
2607
2608       Set_Library_Unit          (Withn, P);
2609       Set_Corresponding_Spec    (Withn, P_Name);
2610       Set_First_Name            (Withn, True);
2611       Set_Implicit_With         (Withn, True);
2612
2613       --  Node is placed at the beginning of the context items, so that
2614       --  subsequent use clauses on the parent can be validated.
2615
2616       Prepend (Withn, Context_Items (N));
2617       Mark_Rewrite_Insertion (Withn);
2618       Install_Withed_Unit (Withn);
2619
2620       if Is_Child_Spec (P_Unit) then
2621          Implicit_With_On_Parent (P_Unit, N);
2622       end if;
2623
2624       New_Nodes_OK := New_Nodes_OK - 1;
2625    end Implicit_With_On_Parent;
2626
2627    ---------------------
2628    -- Install_Context --
2629    ---------------------
2630
2631    procedure Install_Context (N : Node_Id) is
2632       Lib_Unit : constant Node_Id := Unit (N);
2633
2634    begin
2635       Install_Context_Clauses (N);
2636
2637       if Is_Child_Spec (Lib_Unit) then
2638          Install_Parents (Lib_Unit, Private_Present (Parent (Lib_Unit)));
2639       end if;
2640
2641       Install_Limited_Context_Clauses (N);
2642
2643       Check_With_Type_Clauses (N);
2644    end Install_Context;
2645
2646    -----------------------------
2647    -- Install_Context_Clauses --
2648    -----------------------------
2649
2650    procedure Install_Context_Clauses (N : Node_Id) is
2651       Lib_Unit      : constant Node_Id := Unit (N);
2652       Item          : Node_Id;
2653       Uname_Node    : Entity_Id;
2654       Check_Private : Boolean := False;
2655       Decl_Node     : Node_Id;
2656       Lib_Parent    : Entity_Id;
2657
2658    begin
2659       --  Loop through context clauses to find the with/use clauses.
2660       --  This is done twice, first for everything except limited_with
2661       --  clauses, and then for those, if any are present.
2662
2663       Item := First (Context_Items (N));
2664       while Present (Item) loop
2665
2666          --  Case of explicit WITH clause
2667
2668          if Nkind (Item) = N_With_Clause
2669            and then not Implicit_With (Item)
2670          then
2671             if Limited_Present (Item) then
2672
2673                --  Limited withed units will be installed later
2674
2675                goto Continue;
2676
2677             --  If Name (Item) is not an entity name, something is wrong, and
2678             --  this will be detected in due course, for now ignore the item
2679
2680             elsif not Is_Entity_Name (Name (Item)) then
2681                goto Continue;
2682
2683             elsif No (Entity (Name (Item))) then
2684                Set_Entity (Name (Item), Any_Id);
2685                goto Continue;
2686             end if;
2687
2688             Uname_Node := Entity (Name (Item));
2689
2690             if Is_Private_Descendant (Uname_Node) then
2691                Check_Private := True;
2692             end if;
2693
2694             Install_Withed_Unit (Item);
2695
2696             Decl_Node := Unit_Declaration_Node (Uname_Node);
2697
2698             --  If the unit is a subprogram instance, it appears nested
2699             --  within a package that carries the parent information.
2700
2701             if Is_Generic_Instance (Uname_Node)
2702               and then Ekind (Uname_Node) /= E_Package
2703             then
2704                Decl_Node := Parent (Parent (Decl_Node));
2705             end if;
2706
2707             if Is_Child_Spec (Decl_Node) then
2708                if Nkind (Name (Item)) = N_Expanded_Name then
2709                   Expand_With_Clause (Prefix (Name (Item)), N);
2710                else
2711                   --  if not an expanded name, the child unit must be a
2712                   --  renaming, nothing to do.
2713
2714                   null;
2715                end if;
2716
2717             elsif Nkind (Decl_Node) = N_Subprogram_Body
2718               and then not Acts_As_Spec (Parent (Decl_Node))
2719               and then Is_Child_Spec (Unit (Library_Unit (Parent (Decl_Node))))
2720             then
2721                Implicit_With_On_Parent
2722                  (Unit (Library_Unit (Parent (Decl_Node))), N);
2723             end if;
2724
2725             --  Check license conditions unless this is a dummy unit
2726
2727             if Sloc (Library_Unit (Item)) /= No_Location then
2728                License_Check : declare
2729                   Withl : constant License_Type :=
2730                             License (Source_Index
2731                                        (Get_Source_Unit
2732                                          (Library_Unit (Item))));
2733
2734                   Unitl : constant License_Type :=
2735                            License (Source_Index (Current_Sem_Unit));
2736
2737                   procedure License_Error;
2738                   --  Signal error of bad license
2739
2740                   -------------------
2741                   -- License_Error --
2742                   -------------------
2743
2744                   procedure License_Error is
2745                   begin
2746                      Error_Msg_N
2747                        ("?license of with'ed unit & is incompatible",
2748                         Name (Item));
2749                   end License_Error;
2750
2751                --  Start of processing for License_Check
2752
2753                begin
2754                   case Unitl is
2755                      when Unknown =>
2756                         null;
2757
2758                      when Restricted =>
2759                         if Withl = GPL then
2760                            License_Error;
2761                         end if;
2762
2763                      when GPL =>
2764                         if Withl = Restricted then
2765                            License_Error;
2766                         end if;
2767
2768                      when Modified_GPL =>
2769                         if Withl = Restricted or else Withl = GPL then
2770                            License_Error;
2771                         end if;
2772
2773                      when Unrestricted =>
2774                         null;
2775                   end case;
2776                end License_Check;
2777             end if;
2778
2779          --  Case of USE PACKAGE clause
2780
2781          elsif Nkind (Item) = N_Use_Package_Clause then
2782             Analyze_Use_Package (Item);
2783
2784          --  Case of USE TYPE clause
2785
2786          elsif Nkind (Item) = N_Use_Type_Clause then
2787             Analyze_Use_Type (Item);
2788
2789          --  Case of WITH TYPE clause
2790
2791          --  A With_Type_Clause is processed when installing the context,
2792          --  because it is a visibility mechanism and does not create a
2793          --  semantic dependence on other units, as a With_Clause does.
2794
2795          elsif Nkind (Item) = N_With_Type_Clause then
2796             Analyze_With_Type_Clause (Item);
2797
2798          --  case of PRAGMA
2799
2800          elsif Nkind (Item) = N_Pragma then
2801             Analyze (Item);
2802          end if;
2803
2804       <<Continue>>
2805          Next (Item);
2806       end loop;
2807
2808       if Is_Child_Spec (Lib_Unit) then
2809
2810          --  The unit also has implicit withs on its own parents
2811
2812          if No (Context_Items (N)) then
2813             Set_Context_Items (N, New_List);
2814          end if;
2815
2816          Implicit_With_On_Parent (Lib_Unit, N);
2817       end if;
2818
2819       --  If the unit is a body, the context of the specification must also
2820       --  be installed.
2821
2822       if Nkind (Lib_Unit) = N_Package_Body
2823         or else (Nkind (Lib_Unit) = N_Subprogram_Body
2824                   and then not Acts_As_Spec (N))
2825       then
2826          Install_Context (Library_Unit (N));
2827
2828          if Is_Child_Spec (Unit (Library_Unit (N))) then
2829
2830             --  If the unit is the body of a public child unit, the private
2831             --  declarations of the parent must be made visible. If the child
2832             --  unit is private, the private declarations have been installed
2833             --  already in the call to Install_Parents for the spec. Installing
2834             --  private declarations must be done for all ancestors of public
2835             --  child units. In addition, sibling units mentioned in the
2836             --  context clause of the body are directly visible.
2837
2838             declare
2839                Lib_Spec : Node_Id := Unit (Library_Unit (N));
2840                P        : Node_Id;
2841                P_Name   : Entity_Id;
2842
2843             begin
2844                while Is_Child_Spec (Lib_Spec) loop
2845                   P := Unit (Parent_Spec (Lib_Spec));
2846
2847                   if not (Private_Present (Parent (Lib_Spec))) then
2848                      P_Name := Defining_Entity (P);
2849                      Install_Private_Declarations (P_Name);
2850                      Install_Private_With_Clauses (P_Name);
2851                      Set_Use (Private_Declarations (Specification (P)));
2852                   end if;
2853
2854                   Lib_Spec := P;
2855                end loop;
2856             end;
2857          end if;
2858
2859          --  For a package body, children in context are immediately visible
2860
2861          Install_Siblings (Defining_Entity (Unit (Library_Unit (N))), N);
2862       end if;
2863
2864       if Nkind (Lib_Unit) = N_Generic_Package_Declaration
2865         or else Nkind (Lib_Unit) = N_Generic_Subprogram_Declaration
2866         or else Nkind (Lib_Unit) = N_Package_Declaration
2867         or else Nkind (Lib_Unit) = N_Subprogram_Declaration
2868       then
2869          if Is_Child_Spec (Lib_Unit) then
2870             Lib_Parent := Defining_Entity (Unit (Parent_Spec (Lib_Unit)));
2871             Set_Is_Private_Descendant
2872               (Defining_Entity (Lib_Unit),
2873                Is_Private_Descendant (Lib_Parent)
2874                  or else Private_Present (Parent (Lib_Unit)));
2875
2876          else
2877             Set_Is_Private_Descendant
2878               (Defining_Entity (Lib_Unit),
2879                Private_Present (Parent (Lib_Unit)));
2880          end if;
2881       end if;
2882
2883       if Check_Private then
2884          Check_Private_Child_Unit (N);
2885       end if;
2886    end Install_Context_Clauses;
2887
2888    -------------------------------------
2889    -- Install_Limited_Context_Clauses --
2890    -------------------------------------
2891
2892    procedure Install_Limited_Context_Clauses (N : Node_Id) is
2893       Item : Node_Id;
2894
2895       procedure Check_Parent (P : Node_Id; W : Node_Id);
2896       --  Check that the unlimited view of a given compilation_unit is not
2897       --  already visible in the parents (neither immediately through the
2898       --  context clauses, nor indirectly through "use + renamings").
2899
2900       procedure Check_Private_Limited_Withed_Unit (N : Node_Id);
2901       --  Check that if a limited_with clause of a given compilation_unit
2902       --  mentions a private child of some library unit, then the given
2903       --  compilation_unit shall be the declaration of a private descendant
2904       --  of that library unit.
2905
2906       procedure Check_Withed_Unit (W : Node_Id);
2907       --  Check that a limited with_clause does not appear in the same
2908       --  context_clause as a nonlimited with_clause that mentions
2909       --  the same library.
2910
2911       ------------------
2912       -- Check_Parent --
2913       ------------------
2914
2915       procedure Check_Parent (P : Node_Id; W : Node_Id) is
2916          Item   : Node_Id;
2917          Spec   : Node_Id;
2918          WEnt   : Entity_Id;
2919          Nam    : Node_Id;
2920          E      : Entity_Id;
2921          E2     : Entity_Id;
2922
2923       begin
2924          pragma Assert (Nkind (W) = N_With_Clause);
2925
2926          --  Step 1: Check if the unlimited view is installed in the parent
2927
2928          Item := First (Context_Items (P));
2929          while Present (Item) loop
2930             if Nkind (Item) = N_With_Clause
2931               and then not Limited_Present (Item)
2932               and then not Implicit_With (Item)
2933               and then Library_Unit (Item) = Library_Unit (W)
2934             then
2935                Error_Msg_N ("unlimited view visible in ancestor", W);
2936                return;
2937             end if;
2938
2939             Next (Item);
2940          end loop;
2941
2942          --  Step 2: Check "use + renamings"
2943
2944          WEnt := Defining_Unit_Name (Specification (Unit (Library_Unit (W))));
2945          Spec := Specification (Unit (P));
2946
2947          --  We tried to traverse the list of entities corresponding to the
2948          --  defining entity of the package spec. However, first_entity was
2949          --  found to be 'empty'. Don't know why???
2950
2951          --          Def  := Defining_Unit_Name (Spec);
2952          --          Ent  := First_Entity (Def);
2953
2954          --  As a workaround we traverse the list of visible declarations ???
2955
2956          Item := First (Visible_Declarations (Spec));
2957          while Present (Item) loop
2958
2959             if Nkind (Item) = N_Use_Package_Clause then
2960
2961                --  Traverse the list of packages
2962
2963                Nam := First (Names (Item));
2964
2965                while Present (Nam) loop
2966                   E := Entity (Nam);
2967
2968                   pragma Assert (Present (Parent (E)));
2969
2970                   if Nkind (Parent (E))
2971                     = N_Package_Renaming_Declaration
2972                     and then Renamed_Entity (E) = WEnt
2973                   then
2974                      Error_Msg_N ("unlimited view visible through "
2975                                   & "use_clause + renamings", W);
2976                      return;
2977
2978                   elsif Nkind (Parent (E)) = N_Package_Specification then
2979
2980                      --  The use clause may refer to a local package.
2981                      --  Check all the enclosing scopes.
2982
2983                      E2 := E;
2984                      while E2 /= Standard_Standard
2985                        and then E2 /= WEnt loop
2986                         E2 := Scope (E2);
2987                      end loop;
2988
2989                      if E2 = WEnt then
2990                         Error_Msg_N ("unlimited view visible through "
2991                                      & "use_clause ", W);
2992                         return;
2993                      end if;
2994
2995                   end if;
2996                   Next (Nam);
2997                end loop;
2998
2999             end if;
3000
3001             Next (Item);
3002          end loop;
3003
3004          --  Recursive call to check all the ancestors
3005
3006          if Is_Child_Spec (Unit (P)) then
3007             Check_Parent (P => Parent_Spec (Unit (P)), W => W);
3008          end if;
3009       end Check_Parent;
3010
3011       ---------------------------------------
3012       -- Check_Private_Limited_Withed_Unit --
3013       ---------------------------------------
3014
3015       procedure Check_Private_Limited_Withed_Unit (N : Node_Id) is
3016          C     : Node_Id;
3017          P     : Node_Id;
3018          Found : Boolean := False;
3019
3020       begin
3021          --  If the current compilation unit is not private we don't
3022          --  need to check anything else.
3023
3024          if not Private_Present (Parent (N)) then
3025             Found := False;
3026
3027          else
3028             --  Compilation unit of the parent of the withed library unit
3029
3030             P := Parent_Spec (Unit (Library_Unit (N)));
3031
3032             --  Traverse all the ancestors of the current compilation
3033             --  unit to check if it is a descendant of named library unit.
3034
3035             C := Parent (N);
3036             while Present (Parent_Spec (Unit (C))) loop
3037                C := Parent_Spec (Unit (C));
3038
3039                if C = P then
3040                   Found := True;
3041                   exit;
3042                end if;
3043             end loop;
3044          end if;
3045
3046          if not Found then
3047             Error_Msg_N ("current unit is not a private descendant"
3048                          & " of the withed unit ('R'M 10.1.2(8)", N);
3049          end if;
3050       end Check_Private_Limited_Withed_Unit;
3051
3052       -----------------------
3053       -- Check_Withed_Unit --
3054       -----------------------
3055
3056       procedure Check_Withed_Unit (W : Node_Id) is
3057          Item : Node_Id;
3058
3059       begin
3060          --  A limited with_clause can not appear in the same context_clause
3061          --  as a nonlimited with_clause which mentions the same library.
3062
3063          Item := First (Context_Items (N));
3064          while Present (Item) loop
3065             if Nkind (Item) = N_With_Clause
3066               and then not Limited_Present (Item)
3067               and then not Implicit_With (Item)
3068               and then Library_Unit (Item) = Library_Unit (W)
3069             then
3070                Error_Msg_N ("limited and unlimited view "
3071                             & "not allowed in the same context clauses", W);
3072                return;
3073             end if;
3074
3075             Next (Item);
3076          end loop;
3077       end Check_Withed_Unit;
3078
3079    --  Start of processing for Install_Limited_Context_Clauses
3080
3081    begin
3082       Item := First (Context_Items (N));
3083       while Present (Item) loop
3084          if Nkind (Item) = N_With_Clause
3085            and then Limited_Present (Item)
3086          then
3087             Check_Withed_Unit (Item);
3088
3089             if Private_Present (Library_Unit (Item)) then
3090                Check_Private_Limited_Withed_Unit (Item);
3091             end if;
3092
3093             if Is_Child_Spec (Unit (N)) then
3094                Check_Parent (Parent_Spec (Unit (N)), Item);
3095             end if;
3096
3097             Install_Limited_Withed_Unit (Item);
3098          end if;
3099
3100          Next (Item);
3101       end loop;
3102    end Install_Limited_Context_Clauses;
3103
3104    ---------------------
3105    -- Install_Parents --
3106    ---------------------
3107
3108    procedure Install_Parents (Lib_Unit : Node_Id; Is_Private : Boolean) is
3109       P      : Node_Id;
3110       E_Name : Entity_Id;
3111       P_Name : Entity_Id;
3112       P_Spec : Node_Id;
3113
3114    begin
3115       P := Unit (Parent_Spec (Lib_Unit));
3116       P_Name := Get_Parent_Entity (P);
3117
3118       if Etype (P_Name) = Any_Type then
3119          return;
3120       end if;
3121
3122       if Ekind (P_Name) = E_Generic_Package
3123         and then Nkind (Lib_Unit) /= N_Generic_Subprogram_Declaration
3124         and then Nkind (Lib_Unit) /= N_Generic_Package_Declaration
3125         and then Nkind (Lib_Unit) not in N_Generic_Renaming_Declaration
3126       then
3127          Error_Msg_N
3128            ("child of a generic package must be a generic unit", Lib_Unit);
3129
3130       elsif not Is_Package (P_Name) then
3131          Error_Msg_N
3132            ("parent unit must be package or generic package", Lib_Unit);
3133          raise Unrecoverable_Error;
3134
3135       elsif Present (Renamed_Object (P_Name)) then
3136          Error_Msg_N ("parent unit cannot be a renaming", Lib_Unit);
3137          raise Unrecoverable_Error;
3138
3139       --  Verify that a child of an instance is itself an instance, or
3140       --  the renaming of one. Given that an instance that is a unit is
3141       --  replaced with a package declaration, check against the original
3142       --  node.
3143
3144       elsif Nkind (Original_Node (P)) = N_Package_Instantiation
3145         and then Nkind (Lib_Unit)
3146                    not in N_Renaming_Declaration
3147         and then Nkind (Original_Node (Lib_Unit))
3148                    not in N_Generic_Instantiation
3149       then
3150          Error_Msg_N
3151            ("child of an instance must be an instance or renaming", Lib_Unit);
3152       end if;
3153
3154       --  This is the recursive call that ensures all parents are loaded
3155
3156       if Is_Child_Spec (P) then
3157          Install_Parents (P,
3158            Is_Private or else Private_Present (Parent (Lib_Unit)));
3159       end if;
3160
3161       --  Now we can install the context for this parent
3162
3163       Install_Context_Clauses (Parent_Spec (Lib_Unit));
3164       Install_Siblings (P_Name, Parent (Lib_Unit));
3165
3166       --  The child unit is in the declarative region of the parent. The
3167       --  parent must therefore appear in the scope stack and be visible,
3168       --  as when compiling the corresponding body. If the child unit is
3169       --  private or it is a package body, private declarations must be
3170       --  accessible as well. Use declarations in the parent must also
3171       --  be installed. Finally, other child units of the same parent that
3172       --  are in the context are immediately visible.
3173
3174       --  Find entity for compilation unit, and set its private descendant
3175       --  status as needed.
3176
3177       E_Name := Defining_Entity (Lib_Unit);
3178
3179       Set_Is_Child_Unit (E_Name);
3180
3181       Set_Is_Private_Descendant (E_Name,
3182          Is_Private_Descendant (P_Name)
3183            or else Private_Present (Parent (Lib_Unit)));
3184
3185       P_Spec := Specification (Unit_Declaration_Node (P_Name));
3186       New_Scope (P_Name);
3187
3188       --  Save current visibility of unit
3189
3190       Scope_Stack.Table (Scope_Stack.Last).Previous_Visibility :=
3191         Is_Immediately_Visible (P_Name);
3192       Set_Is_Immediately_Visible (P_Name);
3193       Install_Visible_Declarations (P_Name);
3194       Set_Use (Visible_Declarations (P_Spec));
3195
3196       --  If the parent is a generic unit, its formal part may contain
3197       --  formal packages and use clauses for them.
3198
3199       if Ekind (P_Name) = E_Generic_Package then
3200          Set_Use (Generic_Formal_Declarations (Parent (P_Spec)));
3201       end if;
3202
3203       if Is_Private
3204         or else Private_Present (Parent (Lib_Unit))
3205       then
3206          Install_Private_Declarations (P_Name);
3207          Install_Private_With_Clauses (P_Name);
3208          Set_Use (Private_Declarations (P_Spec));
3209       end if;
3210    end Install_Parents;
3211
3212    ----------------------------------
3213    -- Install_Private_With_Clauses --
3214    ----------------------------------
3215
3216    procedure Install_Private_With_Clauses (P : Entity_Id) is
3217       Decl   : constant Node_Id := Unit_Declaration_Node (P);
3218       Item   : Node_Id;
3219
3220    begin
3221       if Debug_Flag_I then
3222          Write_Str ("install private with clauses of ");
3223          Write_Name (Chars (P));
3224          Write_Eol;
3225       end if;
3226
3227       if Nkind (Parent (Decl)) = N_Compilation_Unit then
3228          Item := First (Context_Items (Parent (Decl)));
3229
3230          while Present (Item) loop
3231             if Nkind (Item) = N_With_Clause
3232               and then Private_Present (Item)
3233             then
3234                if Limited_Present (Item) then
3235                   Install_Limited_Withed_Unit (Item);
3236                else
3237                   Install_Withed_Unit (Item, Private_With_OK => True);
3238                end if;
3239             end if;
3240
3241             Next (Item);
3242          end loop;
3243       end if;
3244    end Install_Private_With_Clauses;
3245
3246    ----------------------
3247    -- Install_Siblings --
3248    ----------------------
3249
3250    procedure Install_Siblings (U_Name : Entity_Id; N : Node_Id) is
3251       Item : Node_Id;
3252       Id   : Entity_Id;
3253       Prev : Entity_Id;
3254    begin
3255       --  Iterate over explicit with clauses, and check whether the
3256       --  scope of each entity is an ancestor of the current unit.
3257
3258       Item := First (Context_Items (N));
3259       while Present (Item) loop
3260          if Nkind (Item) = N_With_Clause
3261            and then not Implicit_With (Item)
3262            and then not Limited_Present (Item)
3263          then
3264             Id := Entity (Name (Item));
3265
3266             if Is_Child_Unit (Id)
3267               and then Is_Ancestor_Package (Scope (Id), U_Name)
3268             then
3269                Set_Is_Immediately_Visible (Id);
3270
3271                --  Check for the presence of another unit in the context,
3272                --  that may be inadvertently hidden by the child.
3273
3274                Prev := Current_Entity (Id);
3275
3276                if Present (Prev)
3277                  and then Is_Immediately_Visible (Prev)
3278                  and then not Is_Child_Unit (Prev)
3279                then
3280                   declare
3281                      Clause : Node_Id;
3282
3283                   begin
3284                      Clause := First (Context_Items (N));
3285
3286                      while Present (Clause) loop
3287                         if Nkind (Clause) = N_With_Clause
3288                           and then Entity (Name (Clause)) = Prev
3289                         then
3290                            Error_Msg_NE
3291                               ("child unit& hides compilation unit " &
3292                                "with the same name?",
3293                                  Name (Item), Id);
3294                            exit;
3295                         end if;
3296
3297                         Next (Clause);
3298                      end loop;
3299                   end;
3300                end if;
3301
3302             --  the With_Clause may be on a grand-child, which makes
3303             --  the child immediately visible.
3304
3305             elsif Is_Child_Unit (Scope (Id))
3306               and then Is_Ancestor_Package (Scope (Scope (Id)), U_Name)
3307             then
3308                Set_Is_Immediately_Visible (Scope (Id));
3309             end if;
3310          end if;
3311
3312          Next (Item);
3313       end loop;
3314    end Install_Siblings;
3315
3316    -------------------------------
3317    -- Install_Limited_With_Unit --
3318    -------------------------------
3319
3320    procedure Install_Limited_Withed_Unit (N : Node_Id) is
3321       Unum             : constant Unit_Number_Type :=
3322                            Get_Source_Unit (Library_Unit (N));
3323       P_Unit           : constant Entity_Id := Unit (Library_Unit (N));
3324       P                : Entity_Id;
3325       Is_Child_Package : Boolean := False;
3326
3327       Lim_Header       : Entity_Id;
3328       Lim_Typ          : Entity_Id;
3329
3330       function In_Chain (E : Entity_Id) return Boolean;
3331       --  Check that the shadow entity is not already in the homonym
3332       --  chain, for example through a limited_with clause in a parent unit.
3333
3334       --------------
3335       -- In_Chain --
3336       --------------
3337
3338       function In_Chain (E : Entity_Id) return Boolean is
3339          H : Entity_Id := Current_Entity (E);
3340
3341       begin
3342          while Present (H) loop
3343             if H = E then
3344                return True;
3345             else
3346                H := Homonym (H);
3347             end if;
3348          end loop;
3349
3350          return False;
3351       end In_Chain;
3352
3353    --  Start of processing for Install_Limited_Withed_Unit
3354
3355    begin
3356       --  In case of limited with_clause on subprograms, generics, instances,
3357       --  or generic renamings, the corresponding error was previously posted
3358       --  and we have nothing to do here.
3359
3360       case Nkind (P_Unit) is
3361
3362          when N_Package_Declaration =>
3363             null;
3364
3365          when N_Subprogram_Declaration                 |
3366               N_Generic_Package_Declaration            |
3367               N_Generic_Subprogram_Declaration         |
3368               N_Package_Instantiation                  |
3369               N_Function_Instantiation                 |
3370               N_Procedure_Instantiation                |
3371               N_Generic_Package_Renaming_Declaration   |
3372               N_Generic_Procedure_Renaming_Declaration |
3373               N_Generic_Function_Renaming_Declaration =>
3374             return;
3375
3376          when others =>
3377             raise Program_Error;
3378       end case;
3379
3380       P := Defining_Unit_Name (Specification (P_Unit));
3381
3382       if Nkind (P) = N_Defining_Program_Unit_Name then
3383
3384          --  Retrieve entity of child package
3385
3386          Is_Child_Package := True;
3387          P := Defining_Identifier (P);
3388       end if;
3389
3390       --  A common usage of the limited-with is to have a limited-with
3391       --  in the package spec, and a normal with in its package body.
3392       --  For example:
3393
3394       --       limited with X;  -- [1]
3395       --       package A is ...
3396
3397       --       with X;          -- [2]
3398       --       package body A is ...
3399
3400       --  The compilation of A's body installs the entities of its
3401       --  withed packages (the context clauses found at [2]) and
3402       --  then the context clauses of its specification (found at [1]).
3403
3404       --  As a consequence, at point [1] the specification of X has been
3405       --  analyzed and it is immediately visible. According to the semantics
3406       --  of the limited-with context clauses we don't install the limited
3407       --  view because the full view of X supersedes its limited view.
3408
3409       if Analyzed (Cunit (Unum))
3410         and then (Is_Immediately_Visible (P)
3411                    or else (Is_Child_Package
3412                              and then Is_Visible_Child_Unit (P)))
3413       then
3414          --  Ada 2005 (AI-262): Install the private declarations of P
3415
3416          if Private_Present (N)
3417            and then not In_Private_Part (P)
3418          then
3419             declare
3420                Id : Entity_Id;
3421             begin
3422                Id := First_Private_Entity (P);
3423
3424                while Present (Id) loop
3425                   if not Is_Internal (Id)
3426                     and then not Is_Child_Unit (Id)
3427                   then
3428                      if not In_Chain (Id) then
3429                         Set_Homonym (Id, Current_Entity (Id));
3430                         Set_Current_Entity (Id);
3431                      end if;
3432
3433                      Set_Is_Immediately_Visible (Id);
3434                   end if;
3435
3436                   Next_Entity (Id);
3437                end loop;
3438
3439                Set_In_Private_Part (P);
3440             end;
3441          end if;
3442
3443          return;
3444       end if;
3445
3446       if Debug_Flag_I then
3447          Write_Str ("install limited view of ");
3448          Write_Name (Chars (P));
3449          Write_Eol;
3450       end if;
3451
3452       if not Analyzed (Cunit (Unum)) then
3453          Set_Ekind (P, E_Package);
3454          Set_Etype (P, Standard_Void_Type);
3455          Set_Scope (P, Standard_Standard);
3456
3457          --  Place entity on visibility structure
3458
3459          if Current_Entity (P) /= P then
3460             Set_Homonym (P, Current_Entity (P));
3461             Set_Current_Entity (P);
3462
3463             if Debug_Flag_I then
3464                Write_Str ("   (homonym) chain ");
3465                Write_Name (Chars (P));
3466                Write_Eol;
3467             end if;
3468
3469          end if;
3470
3471          if Is_Child_Package then
3472             Set_Is_Child_Unit (P);
3473             Set_Is_Visible_Child_Unit (P);
3474
3475             declare
3476                Parent_Comp : Node_Id;
3477                Parent_Id   : Entity_Id;
3478
3479             begin
3480                Parent_Comp := Parent_Spec (Unit (Cunit (Unum)));
3481                Parent_Id   := Defining_Entity (Unit (Parent_Comp));
3482
3483                Set_Scope (P, Parent_Id);
3484             end;
3485          end if;
3486
3487       else
3488
3489          --  If the unit appears in a previous regular with_clause, the
3490          --  regular entities must be unchained before the shadow ones
3491          --  are made accessible.
3492
3493          declare
3494             Ent : Entity_Id;
3495          begin
3496             Ent := First_Entity (P);
3497
3498             while Present (Ent) loop
3499                Unchain (Ent);
3500                Next_Entity (Ent);
3501             end loop;
3502          end;
3503
3504       end if;
3505
3506       --  The package must be visible while the with_type clause is active,
3507       --  because references to the type P.T must resolve in the usual way.
3508
3509       Set_Is_Immediately_Visible (P);
3510
3511       --  Install each incomplete view. The first element of the limited view
3512       --  is a header (an E_Package entity) that is used to reference the first
3513       --  shadow entity in the private part of the package
3514
3515       Lim_Header := Limited_View (P);
3516       Lim_Typ    := First_Entity (Lim_Header);
3517
3518       while Present (Lim_Typ) loop
3519
3520          exit when not Private_Present (N)
3521                         and then Lim_Typ = First_Private_Entity (Lim_Header);
3522
3523          if not In_Chain (Lim_Typ) then
3524             Set_Homonym (Lim_Typ, Current_Entity (Lim_Typ));
3525             Set_Current_Entity (Lim_Typ);
3526
3527             if Debug_Flag_I then
3528                Write_Str ("   (homonym) chain ");
3529                Write_Name (Chars (Lim_Typ));
3530                Write_Eol;
3531             end if;
3532          end if;
3533
3534          Next_Entity (Lim_Typ);
3535       end loop;
3536
3537       --  The context clause has installed a limited-view, mark it
3538       --  accordingly, to uninstall it when the context is removed.
3539
3540       Set_Limited_View_Installed (N);
3541       Set_From_With_Type (P);
3542    end Install_Limited_Withed_Unit;
3543
3544    -------------------------
3545    -- Install_Withed_Unit --
3546    -------------------------
3547
3548    procedure Install_Withed_Unit
3549      (With_Clause     : Node_Id;
3550       Private_With_OK : Boolean := False)
3551    is
3552       Uname : constant Entity_Id := Entity (Name (With_Clause));
3553       P     : constant Entity_Id := Scope (Uname);
3554
3555    begin
3556       --  Ada 2005 (AI-262): Do not install the private withed unit if we are
3557       --  compiling a package declaration and the Private_With_OK flag was not
3558       --  set by the caller. These declarations will be installed later (before
3559       --  analyzing the private part of the package).
3560
3561       if Private_Present (With_Clause)
3562         and then Nkind (Cunit (Current_Sem_Unit)) = N_Package_Declaration
3563         and then not (Private_With_OK)
3564       then
3565          return;
3566       end if;
3567
3568       if Debug_Flag_I then
3569          if Private_Present (With_Clause) then
3570             Write_Str ("install private withed unit ");
3571          else
3572             Write_Str ("install withed unit ");
3573          end if;
3574
3575          Write_Name (Chars (Uname));
3576          Write_Eol;
3577       end if;
3578
3579       --  We do not apply the restrictions to an internal unit unless
3580       --  we are compiling the internal unit as a main unit. This check
3581       --  is also skipped for dummy units (for missing packages).
3582
3583       if Sloc (Uname) /= No_Location
3584         and then (not Is_Internal_File_Name (Unit_File_Name (Current_Sem_Unit))
3585                     or else Current_Sem_Unit = Main_Unit)
3586       then
3587          Check_Restricted_Unit
3588            (Unit_Name (Get_Source_Unit (Uname)), With_Clause);
3589       end if;
3590
3591       if P /= Standard_Standard then
3592
3593          --  If the unit is not analyzed after analysis of the with clause,
3594          --  and it is an instantiation, then it awaits a body and is the main
3595          --  unit. Its appearance in the context of some other unit indicates
3596          --  a circular dependency (DEC suite perversity).
3597
3598          if not Analyzed (Uname)
3599            and then Nkind (Parent (Uname)) = N_Package_Instantiation
3600          then
3601             Error_Msg_N
3602               ("instantiation depends on itself", Name (With_Clause));
3603
3604          elsif not Is_Visible_Child_Unit (Uname) then
3605             Set_Is_Visible_Child_Unit (Uname);
3606
3607             if Is_Generic_Instance (Uname)
3608               and then Ekind (Uname) in Subprogram_Kind
3609             then
3610                --  Set flag as well on the visible entity that denotes the
3611                --  instance, which renames the current one.
3612
3613                Set_Is_Visible_Child_Unit
3614                  (Related_Instance
3615                    (Defining_Entity (Unit (Library_Unit (With_Clause)))));
3616             end if;
3617
3618             --  The parent unit may have been installed already, and
3619             --  may have appeared in a use clause.
3620
3621             if In_Use (Scope (Uname)) then
3622                Set_Is_Potentially_Use_Visible (Uname);
3623             end if;
3624
3625             Set_Context_Installed (With_Clause);
3626          end if;
3627
3628       elsif not Is_Immediately_Visible (Uname) then
3629          if not Private_Present (With_Clause)
3630            or else Private_With_OK
3631          then
3632             Set_Is_Immediately_Visible (Uname);
3633          end if;
3634
3635          Set_Context_Installed (With_Clause);
3636       end if;
3637
3638       --   A with-clause overrides a with-type clause: there are no restric-
3639       --   tions on the use of package entities.
3640
3641       if Ekind (Uname) = E_Package then
3642          Set_From_With_Type (Uname, False);
3643       end if;
3644
3645       --  Ada 2005 (AI-377): it is illegal for a with_clause to name a child
3646       --  unit if there is a visible homograph for it declared in the same
3647       --  declarative region. This pathological case can only arise when an
3648       --  instance I1 of a generic unit G1 has an explicit child unit I1.G2,
3649       --  G1 has a generic child also named G2, and the context includes with_
3650       --  clauses for both I1.G2 and for G1.G2, making an implicit declaration
3651       --  of I1.G2 visible as well.
3652
3653       if Is_Child_Unit (Uname)
3654         and then Is_Visible_Child_Unit (Uname)
3655         and then Ada_Version >= Ada_05
3656       then
3657          declare
3658             Decl1 : constant Node_Id  := Unit_Declaration_Node (P);
3659             Decl2 : Node_Id;
3660             P2    : Entity_Id;
3661             U2    : Entity_Id;
3662
3663          begin
3664             U2 := Homonym (Uname);
3665             while Present (U2) loop
3666                P2 := Scope (U2);
3667                Decl2  := Unit_Declaration_Node (P2);
3668
3669                if Is_Child_Unit (U2)
3670                  and then Is_Visible_Child_Unit (U2)
3671                then
3672                   if Is_Generic_Instance (P)
3673                     and then Nkind (Decl1) = N_Package_Declaration
3674                     and then Generic_Parent (Specification (Decl1)) = P2
3675                   then
3676                      Error_Msg_N ("illegal with_clause", With_Clause);
3677                      Error_Msg_N
3678                        ("\child unit has visible homograph" &
3679                            " ('R'M 8.3(26), 10.1.1(19))",
3680                          With_Clause);
3681                      exit;
3682
3683                   elsif Is_Generic_Instance (P2)
3684                     and then Nkind (Decl2) = N_Package_Declaration
3685                     and then Generic_Parent (Specification (Decl2)) = P
3686                   then
3687                      --  With_clause for child unit of instance appears before
3688                      --  in the context. We want to place the error message on
3689                      --  it, not on the generic child unit itself.
3690
3691                      declare
3692                         Prev_Clause : Node_Id;
3693
3694                      begin
3695                         Prev_Clause := First (List_Containing (With_Clause));
3696                         while Entity (Name (Prev_Clause)) /= U2 loop
3697                            Next (Prev_Clause);
3698                         end loop;
3699
3700                         pragma Assert (Present (Prev_Clause));
3701                         Error_Msg_N ("illegal with_clause", Prev_Clause);
3702                         Error_Msg_N
3703                           ("\child unit has visible homograph" &
3704                               " ('R'M 8.3(26), 10.1.1(19))",
3705                             Prev_Clause);
3706                         exit;
3707                      end;
3708                   end if;
3709                end if;
3710
3711                U2 := Homonym (U2);
3712             end loop;
3713          end;
3714       end if;
3715    end Install_Withed_Unit;
3716
3717    -------------------
3718    -- Is_Child_Spec --
3719    -------------------
3720
3721    function Is_Child_Spec (Lib_Unit : Node_Id) return Boolean is
3722       K : constant Node_Kind := Nkind (Lib_Unit);
3723
3724    begin
3725       return (K in N_Generic_Declaration              or else
3726               K in N_Generic_Instantiation            or else
3727               K in N_Generic_Renaming_Declaration     or else
3728               K =  N_Package_Declaration              or else
3729               K =  N_Package_Renaming_Declaration     or else
3730               K =  N_Subprogram_Declaration           or else
3731               K =  N_Subprogram_Renaming_Declaration)
3732         and then Present (Parent_Spec (Lib_Unit));
3733    end Is_Child_Spec;
3734
3735    -----------------------
3736    -- Load_Needed_Body --
3737    -----------------------
3738
3739    --  N is a generic unit named in a with clause, or else it is
3740    --  a unit that contains a generic unit or an inlined function.
3741    --  In order to perform an instantiation, the body of the unit
3742    --  must be present. If the unit itself is generic, we assume
3743    --  that an instantiation follows, and  load and analyze the body
3744    --  unconditionally. This forces analysis of the spec as well.
3745
3746    --  If the unit is not generic, but contains a generic unit, it
3747    --  is loaded on demand, at the point of instantiation (see ch12).
3748
3749    procedure Load_Needed_Body (N : Node_Id; OK : out Boolean) is
3750       Body_Name : Unit_Name_Type;
3751       Unum      : Unit_Number_Type;
3752
3753       Save_Style_Check : constant Boolean := Opt.Style_Check;
3754       --  The loading and analysis is done with style checks off
3755
3756    begin
3757       if not GNAT_Mode then
3758          Style_Check := False;
3759       end if;
3760
3761       Body_Name := Get_Body_Name (Get_Unit_Name (Unit (N)));
3762       Unum :=
3763         Load_Unit
3764           (Load_Name  => Body_Name,
3765            Required   => False,
3766            Subunit    => False,
3767            Error_Node => N,
3768            Renamings  => True);
3769
3770       if Unum = No_Unit then
3771          OK := False;
3772
3773       else
3774          Compiler_State := Analyzing; -- reset after load
3775
3776          if not Fatal_Error (Unum) or else Try_Semantics then
3777             if Debug_Flag_L then
3778                Write_Str ("*** Loaded generic body");
3779                Write_Eol;
3780             end if;
3781
3782             Semantics (Cunit (Unum));
3783          end if;
3784
3785          OK := True;
3786       end if;
3787
3788       Style_Check := Save_Style_Check;
3789    end Load_Needed_Body;
3790
3791    -------------------------
3792    -- Build_Limited_Views --
3793    -------------------------
3794
3795    procedure Build_Limited_Views (N : Node_Id) is
3796       Unum : constant Unit_Number_Type := Get_Source_Unit (Library_Unit (N));
3797       P    : constant Entity_Id        := Cunit_Entity (Unum);
3798
3799       Spec        : Node_Id;            --  To denote a package specification
3800       Lim_Typ     : Entity_Id;          --  To denote shadow entities
3801       Comp_Typ    : Entity_Id;          --  To denote real entities
3802
3803       Lim_Header  : Entity_Id;          --  Package entity
3804       Last_Lim_E  : Entity_Id := Empty; --  Last limited entity built
3805       Last_Pub_Lim_E : Entity_Id;       --  To set the first private entity
3806
3807       procedure Decorate_Incomplete_Type
3808         (E    : Entity_Id;
3809          Scop : Entity_Id);
3810       --  Add attributes of an incomplete type to a shadow entity. The same
3811       --  attributes are placed on the real entity, so that gigi receives
3812       --  a consistent view.
3813
3814       procedure Decorate_Package_Specification (P : Entity_Id);
3815       --  Add attributes of a package entity to the entity in a package
3816       --  declaration
3817
3818       procedure Decorate_Tagged_Type
3819         (Loc  : Source_Ptr;
3820          T    : Entity_Id;
3821          Scop : Entity_Id);
3822       --  Set basic attributes of tagged type T, including its class_wide type.
3823       --  The parameters Loc, Scope are used to decorate the class_wide type.
3824
3825       procedure Build_Chain
3826         (Scope      : Entity_Id;
3827          First_Decl : Node_Id);
3828       --  Construct list of shadow entities and attach it to entity of
3829       --  package that is mentioned in a limited_with clause.
3830
3831       function New_Internal_Shadow_Entity
3832         (Kind       : Entity_Kind;
3833          Sloc_Value : Source_Ptr;
3834          Id_Char    : Character) return Entity_Id;
3835       --  Build a new internal entity and append it to the list of shadow
3836       --  entities available through the limited-header
3837
3838       ------------------------------
3839       -- Decorate_Incomplete_Type --
3840       ------------------------------
3841
3842       procedure Decorate_Incomplete_Type
3843         (E    : Entity_Id;
3844          Scop : Entity_Id)
3845       is
3846       begin
3847          Set_Ekind             (E, E_Incomplete_Type);
3848          Set_Scope             (E, Scop);
3849          Set_Etype             (E, E);
3850          Set_Is_First_Subtype  (E, True);
3851          Set_Stored_Constraint (E, No_Elist);
3852          Set_Full_View         (E, Empty);
3853          Init_Size_Align       (E);
3854       end Decorate_Incomplete_Type;
3855
3856       --------------------------
3857       -- Decorate_Tagged_Type --
3858       --------------------------
3859
3860       procedure Decorate_Tagged_Type
3861         (Loc  : Source_Ptr;
3862          T    : Entity_Id;
3863          Scop : Entity_Id)
3864       is
3865          CW : Entity_Id;
3866
3867       begin
3868          Decorate_Incomplete_Type (T, Scop);
3869          Set_Is_Tagged_Type (T);
3870
3871          --  Build corresponding class_wide type, if not previously done
3872
3873          if No (Class_Wide_Type (T)) then
3874             CW := Make_Defining_Identifier (Loc,  New_Internal_Name ('S'));
3875
3876             Set_Ekind                     (CW, E_Class_Wide_Type);
3877             Set_Etype                     (CW, T);
3878             Set_Scope                     (CW, Scop);
3879             Set_Is_Tagged_Type            (CW);
3880             Set_Is_First_Subtype          (CW, True);
3881             Init_Size_Align               (CW);
3882             Set_Has_Unknown_Discriminants (CW, True);
3883             Set_Class_Wide_Type           (CW, CW);
3884             Set_Equivalent_Type           (CW, Empty);
3885             Set_From_With_Type            (CW, From_With_Type (T));
3886
3887             Set_Class_Wide_Type           (T, CW);
3888          end if;
3889       end Decorate_Tagged_Type;
3890
3891       ------------------------------------
3892       -- Decorate_Package_Specification --
3893       ------------------------------------
3894
3895       procedure Decorate_Package_Specification (P : Entity_Id) is
3896       begin
3897          --  Place only the most basic attributes
3898
3899          Set_Ekind (P, E_Package);
3900          Set_Etype (P, Standard_Void_Type);
3901       end Decorate_Package_Specification;
3902
3903       -------------------------
3904       -- New_Internal_Entity --
3905       -------------------------
3906
3907       function New_Internal_Shadow_Entity
3908         (Kind       : Entity_Kind;
3909          Sloc_Value : Source_Ptr;
3910          Id_Char    : Character) return Entity_Id
3911       is
3912          E : constant Entity_Id :=
3913                Make_Defining_Identifier (Sloc_Value,
3914                  Chars => New_Internal_Name (Id_Char));
3915
3916       begin
3917          Set_Ekind       (E, Kind);
3918          Set_Is_Internal (E, True);
3919
3920          if Kind in Type_Kind then
3921             Init_Size_Align (E);
3922          end if;
3923
3924          Append_Entity (E, Lim_Header);
3925          Last_Lim_E := E;
3926          return E;
3927       end New_Internal_Shadow_Entity;
3928
3929       -----------------
3930       -- Build_Chain --
3931       -----------------
3932
3933       procedure Build_Chain
3934         (Scope         : Entity_Id;
3935          First_Decl    : Node_Id)
3936       is
3937          Analyzed_Unit : constant Boolean := Analyzed (Cunit (Unum));
3938          Is_Tagged     : Boolean;
3939          Decl          : Node_Id;
3940
3941       begin
3942          Decl := First_Decl;
3943
3944          while Present (Decl) loop
3945
3946             --  For each library_package_declaration in the environment, there
3947             --  is an implicit declaration of a *limited view* of that library
3948             --  package. The limited view of a package contains:
3949             --
3950             --   * For each nested package_declaration, a declaration of the
3951             --     limited view of that package, with the same defining-
3952             --     program-unit name.
3953             --
3954             --   * For each type_declaration in the visible part, an incomplete
3955             --     type-declaration with the same defining_identifier, whose
3956             --     completion is the type_declaration. If the type_declaration
3957             --     is tagged, then the incomplete_type_declaration is tagged
3958             --     incomplete.
3959
3960             if Nkind (Decl) = N_Full_Type_Declaration then
3961                Is_Tagged :=
3962                   Nkind (Type_Definition (Decl)) = N_Record_Definition
3963                   and then Tagged_Present (Type_Definition (Decl));
3964
3965                Comp_Typ := Defining_Identifier (Decl);
3966
3967                if not Analyzed_Unit then
3968                   if Is_Tagged then
3969                      Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
3970                   else
3971                      Decorate_Incomplete_Type (Comp_Typ, Scope);
3972                   end if;
3973                end if;
3974
3975                --  Create shadow entity for type
3976
3977                Lim_Typ := New_Internal_Shadow_Entity
3978                  (Kind       => Ekind (Comp_Typ),
3979                   Sloc_Value => Sloc (Comp_Typ),
3980                   Id_Char    => 'Z');
3981
3982                Set_Chars  (Lim_Typ, Chars (Comp_Typ));
3983                Set_Parent (Lim_Typ, Parent (Comp_Typ));
3984                Set_From_With_Type (Lim_Typ);
3985
3986                if Is_Tagged then
3987                   Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
3988                else
3989                   Decorate_Incomplete_Type (Lim_Typ, Scope);
3990                end if;
3991
3992                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
3993
3994             elsif Nkind (Decl) = N_Private_Type_Declaration
3995               and then Tagged_Present (Decl)
3996             then
3997                Comp_Typ := Defining_Identifier (Decl);
3998
3999                if not Analyzed_Unit then
4000                   Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
4001                end if;
4002
4003                Lim_Typ  := New_Internal_Shadow_Entity
4004                  (Kind       => Ekind (Comp_Typ),
4005                   Sloc_Value => Sloc (Comp_Typ),
4006                   Id_Char    => 'Z');
4007
4008                Set_Chars  (Lim_Typ, Chars (Comp_Typ));
4009                Set_Parent (Lim_Typ, Parent (Comp_Typ));
4010                Set_From_With_Type (Lim_Typ);
4011
4012                Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
4013
4014                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
4015
4016             elsif Nkind (Decl) = N_Package_Declaration then
4017
4018                --  Local package
4019
4020                declare
4021                   Spec : constant Node_Id := Specification (Decl);
4022
4023                begin
4024                   Comp_Typ := Defining_Unit_Name (Spec);
4025
4026                   if not Analyzed (Cunit (Unum)) then
4027                      Decorate_Package_Specification (Comp_Typ);
4028                      Set_Scope (Comp_Typ, Scope);
4029                   end if;
4030
4031                   Lim_Typ  := New_Internal_Shadow_Entity
4032                     (Kind       => Ekind (Comp_Typ),
4033                      Sloc_Value => Sloc (Comp_Typ),
4034                      Id_Char    => 'Z');
4035
4036                   Decorate_Package_Specification (Lim_Typ);
4037                   Set_Scope (Lim_Typ, Scope);
4038
4039                   Set_Chars (Lim_Typ, Chars (Comp_Typ));
4040                   Set_Parent (Lim_Typ, Parent (Comp_Typ));
4041                   Set_From_With_Type (Lim_Typ);
4042
4043                   --  Note: The non_limited_view attribute is not used
4044                   --  for local packages.
4045
4046                   Build_Chain
4047                     (Scope      => Lim_Typ,
4048                      First_Decl => First (Visible_Declarations (Spec)));
4049                end;
4050             end if;
4051
4052             Next (Decl);
4053          end loop;
4054       end Build_Chain;
4055
4056    --  Start of processing for Build_Limited_Views
4057
4058    begin
4059       pragma Assert (Limited_Present (N));
4060
4061       --  A library_item mentioned in a limited_with_clause shall be
4062       --  a package_declaration, not a subprogram_declaration,
4063       --  generic_declaration, generic_instantiation, or
4064       --  package_renaming_declaration
4065
4066       case Nkind (Unit (Library_Unit (N))) is
4067
4068          when N_Package_Declaration =>
4069             null;
4070
4071          when N_Subprogram_Declaration =>
4072             Error_Msg_N ("subprograms not allowed in "
4073                          & "limited with_clauses", N);
4074             return;
4075
4076          when N_Generic_Package_Declaration |
4077               N_Generic_Subprogram_Declaration =>
4078             Error_Msg_N ("generics not allowed in "
4079                          & "limited with_clauses", N);
4080             return;
4081
4082          when N_Package_Instantiation |
4083               N_Function_Instantiation |
4084               N_Procedure_Instantiation =>
4085             Error_Msg_N ("generic instantiations not allowed in "
4086                          & "limited with_clauses", N);
4087             return;
4088
4089          when N_Generic_Package_Renaming_Declaration |
4090               N_Generic_Procedure_Renaming_Declaration |
4091               N_Generic_Function_Renaming_Declaration =>
4092             Error_Msg_N ("generic renamings not allowed in "
4093                          & "limited with_clauses", N);
4094             return;
4095
4096          when others =>
4097             raise Program_Error;
4098       end case;
4099
4100       --  Check if the chain is already built
4101
4102       Spec := Specification (Unit (Library_Unit (N)));
4103
4104       if Limited_View_Installed (Spec) then
4105          return;
4106       end if;
4107
4108       Set_Ekind (P, E_Package);
4109
4110       --  Build the header of the limited_view
4111
4112       Lim_Header := Make_Defining_Identifier (Sloc (N),
4113                       Chars => New_Internal_Name (Id_Char => 'Z'));
4114       Set_Ekind (Lim_Header, E_Package);
4115       Set_Is_Internal (Lim_Header);
4116       Set_Limited_View (P, Lim_Header);
4117
4118       --  Create the auxiliary chain. All the shadow entities are appended
4119       --  to the list of entities of the limited-view header
4120
4121       Build_Chain
4122         (Scope      => P,
4123          First_Decl => First (Visible_Declarations (Spec)));
4124
4125       --  Save the last built shadow entity. It is needed later to set the
4126       --  reference to the first shadow entity in the private part
4127
4128       Last_Pub_Lim_E := Last_Lim_E;
4129
4130       --  Ada 2005 (AI-262): Add the limited view of the private declarations
4131       --  Required to give support to limited-private-with clauses
4132
4133       Build_Chain (Scope      => P,
4134                    First_Decl => First (Private_Declarations (Spec)));
4135
4136       if Last_Pub_Lim_E /= Empty then
4137          Set_First_Private_Entity (Lim_Header,
4138                                    Next_Entity (Last_Pub_Lim_E));
4139       else
4140          Set_First_Private_Entity (Lim_Header,
4141                                    First_Entity (P));
4142       end if;
4143
4144       Set_Limited_View_Installed (Spec);
4145    end Build_Limited_Views;
4146
4147    -------------------------------
4148    -- Check_Body_Needed_For_SAL --
4149    -------------------------------
4150
4151    procedure Check_Body_Needed_For_SAL (Unit_Name : Entity_Id) is
4152
4153       function Entity_Needs_Body (E : Entity_Id) return Boolean;
4154       --  Determine whether use of entity E might require the presence
4155       --  of its body. For a package this requires a recursive traversal
4156       --  of all nested declarations.
4157
4158       ---------------------------
4159       -- Entity_Needed_For_SAL --
4160       ---------------------------
4161
4162       function Entity_Needs_Body (E : Entity_Id) return Boolean is
4163          Ent : Entity_Id;
4164
4165       begin
4166          if Is_Subprogram (E)
4167            and then Has_Pragma_Inline (E)
4168          then
4169             return True;
4170
4171          elsif Ekind (E) = E_Generic_Function
4172            or else Ekind (E) = E_Generic_Procedure
4173          then
4174             return True;
4175
4176          elsif Ekind (E) = E_Generic_Package
4177            and then
4178              Nkind (Unit_Declaration_Node (E)) = N_Generic_Package_Declaration
4179            and then Present (Corresponding_Body (Unit_Declaration_Node (E)))
4180          then
4181             return True;
4182
4183          elsif Ekind (E) = E_Package
4184            and then
4185              Nkind (Unit_Declaration_Node (E)) = N_Package_Declaration
4186            and then Present (Corresponding_Body (Unit_Declaration_Node (E)))
4187          then
4188             Ent := First_Entity (E);
4189
4190             while Present (Ent) loop
4191                if Entity_Needs_Body (Ent) then
4192                   return True;
4193                end if;
4194
4195                Next_Entity (Ent);
4196             end loop;
4197
4198             return False;
4199
4200          else
4201             return False;
4202          end if;
4203       end Entity_Needs_Body;
4204
4205    --  Start of processing for Check_Body_Needed_For_SAL
4206
4207    begin
4208       if Ekind (Unit_Name) = E_Generic_Package
4209         and then
4210           Nkind (Unit_Declaration_Node (Unit_Name)) =
4211                                             N_Generic_Package_Declaration
4212         and then
4213           Present (Corresponding_Body (Unit_Declaration_Node (Unit_Name)))
4214       then
4215          Set_Body_Needed_For_SAL (Unit_Name);
4216
4217       elsif Ekind (Unit_Name) = E_Generic_Procedure
4218         or else Ekind (Unit_Name) = E_Generic_Function
4219       then
4220          Set_Body_Needed_For_SAL (Unit_Name);
4221
4222       elsif Is_Subprogram (Unit_Name)
4223         and then Nkind (Unit_Declaration_Node (Unit_Name)) =
4224                                             N_Subprogram_Declaration
4225         and then Has_Pragma_Inline (Unit_Name)
4226       then
4227          Set_Body_Needed_For_SAL (Unit_Name);
4228
4229       elsif Ekind (Unit_Name) = E_Subprogram_Body then
4230          Check_Body_Needed_For_SAL
4231            (Corresponding_Spec (Unit_Declaration_Node (Unit_Name)));
4232
4233       elsif Ekind (Unit_Name) = E_Package
4234         and then Entity_Needs_Body (Unit_Name)
4235       then
4236          Set_Body_Needed_For_SAL (Unit_Name);
4237
4238       elsif Ekind (Unit_Name) = E_Package_Body
4239         and then Nkind (Unit_Declaration_Node (Unit_Name)) = N_Package_Body
4240       then
4241          Check_Body_Needed_For_SAL
4242            (Corresponding_Spec (Unit_Declaration_Node (Unit_Name)));
4243       end if;
4244    end Check_Body_Needed_For_SAL;
4245
4246    --------------------
4247    -- Remove_Context --
4248    --------------------
4249
4250    procedure Remove_Context (N : Node_Id) is
4251       Lib_Unit : constant Node_Id := Unit (N);
4252
4253    begin
4254       --  If this is a child unit, first remove the parent units
4255
4256       if Is_Child_Spec (Lib_Unit) then
4257          Remove_Parents (Lib_Unit);
4258       end if;
4259
4260       Remove_Context_Clauses (N);
4261    end Remove_Context;
4262
4263    ----------------------------
4264    -- Remove_Context_Clauses --
4265    ----------------------------
4266
4267    procedure Remove_Context_Clauses (N : Node_Id) is
4268       Item      : Node_Id;
4269       Unit_Name : Entity_Id;
4270
4271    begin
4272       --  Ada 2005 (AI-50217): We remove the context clauses in two phases:
4273       --  limited-views first and regular-views later (to maintain the
4274       --  stack model).
4275
4276       --  First Phase: Remove limited_with context clauses
4277
4278       Item := First (Context_Items (N));
4279       while Present (Item) loop
4280
4281          --  We are interested only in with clauses which got installed
4282          --  on entry.
4283
4284          if Nkind (Item) = N_With_Clause
4285            and then Limited_Present (Item)
4286            and then Limited_View_Installed (Item)
4287          then
4288             Remove_Limited_With_Clause (Item);
4289          end if;
4290
4291          Next (Item);
4292       end loop;
4293
4294       --  Second Phase: Loop through context items and undo regular
4295       --  with_clauses and use_clauses.
4296
4297       Item := First (Context_Items (N));
4298       while Present (Item) loop
4299
4300          --  We are interested only in with clauses which got installed
4301          --  on entry, as indicated by their Context_Installed flag set
4302
4303          if Nkind (Item) = N_With_Clause
4304            and then Limited_Present (Item)
4305            and then Limited_View_Installed (Item)
4306          then
4307             null;
4308
4309          elsif Nkind (Item) = N_With_Clause
4310             and then Context_Installed (Item)
4311          then
4312             --  Remove items from one with'ed unit
4313
4314             Unit_Name := Entity (Name (Item));
4315             Remove_Unit_From_Visibility (Unit_Name);
4316             Set_Context_Installed (Item, False);
4317
4318          elsif Nkind (Item) = N_Use_Package_Clause then
4319             End_Use_Package (Item);
4320
4321          elsif Nkind (Item) = N_Use_Type_Clause then
4322             End_Use_Type (Item);
4323
4324          elsif Nkind (Item) = N_With_Type_Clause then
4325             Remove_With_Type_Clause (Name (Item));
4326          end if;
4327
4328          Next (Item);
4329       end loop;
4330    end Remove_Context_Clauses;
4331
4332    --------------------------------
4333    -- Remove_Limited_With_Clause --
4334    --------------------------------
4335
4336    procedure Remove_Limited_With_Clause (N : Node_Id) is
4337       P_Unit     : constant Entity_Id := Unit (Library_Unit (N));
4338       P          : Entity_Id := Defining_Unit_Name (Specification (P_Unit));
4339       Lim_Typ    : Entity_Id;
4340
4341    begin
4342       if Nkind (P) = N_Defining_Program_Unit_Name then
4343
4344          --  Retrieve entity of Child package
4345
4346          P := Defining_Identifier (P);
4347       end if;
4348
4349       if Debug_Flag_I then
4350          Write_Str ("remove limited view of ");
4351          Write_Name (Chars (P));
4352          Write_Str (" from visibility");
4353          Write_Eol;
4354       end if;
4355
4356       --  Remove all shadow entities from visibility. The first element of the
4357       --  limited view is a header (an E_Package entity) that is used to
4358       --  reference the first shadow entity in the private part of the package
4359
4360       Lim_Typ    := First_Entity (Limited_View (P));
4361
4362       while Present (Lim_Typ) loop
4363          Unchain (Lim_Typ);
4364          Next_Entity (Lim_Typ);
4365       end loop;
4366
4367       --  Indicate that the limited view of the package is not installed
4368
4369       Set_From_With_Type (P, False);
4370       Set_Limited_View_Installed (N, False);
4371
4372       --  If the exporting package has previously been analyzed, it
4373       --  has appeared in the closure already and should be left alone.
4374       --  Otherwise, remove package itself from visibility.
4375
4376       if not Analyzed (P_Unit) then
4377          Unchain (P);
4378          Set_First_Entity (P, Empty);
4379          Set_Last_Entity (P, Empty);
4380          Set_Ekind (P, E_Void);
4381          Set_Scope (P, Empty);
4382          Set_Is_Immediately_Visible (P, False);
4383
4384       else
4385
4386          --  Reinstall visible entities (entities removed from visibility in
4387          --  Install_Limited_Withed to install the shadow entities).
4388
4389          declare
4390             Ent : Entity_Id;
4391
4392          begin
4393             Ent := First_Entity (P);
4394             while Present (Ent) and then Ent /= First_Private_Entity (P) loop
4395
4396                --  Shadow entities have not been added to the list of
4397                --  entities associated to the package spec. Therefore we
4398                --  just have to re-chain all its visible entities.
4399
4400                if not Is_Class_Wide_Type (Ent) then
4401
4402                   Set_Homonym (Ent, Current_Entity (Ent));
4403                   Set_Current_Entity (Ent);
4404
4405                   if Debug_Flag_I then
4406                      Write_Str ("   (homonym) chain ");
4407                      Write_Name (Chars (Ent));
4408                      Write_Eol;
4409                   end if;
4410                end if;
4411
4412                Next_Entity (Ent);
4413             end loop;
4414          end;
4415       end if;
4416    end Remove_Limited_With_Clause;
4417
4418    --------------------
4419    -- Remove_Parents --
4420    --------------------
4421
4422    procedure Remove_Parents (Lib_Unit : Node_Id) is
4423       P      : Node_Id;
4424       P_Name : Entity_Id;
4425       P_Spec : Node_Id := Empty;
4426       E      : Entity_Id;
4427       Vis    : constant Boolean :=
4428                  Scope_Stack.Table (Scope_Stack.Last).Previous_Visibility;
4429
4430    begin
4431       if Is_Child_Spec (Lib_Unit) then
4432          P_Spec := Parent_Spec (Lib_Unit);
4433
4434       elsif Nkind (Lib_Unit) = N_Package_Body
4435         and then Nkind (Original_Node (Lib_Unit)) = N_Package_Instantiation
4436       then
4437          P_Spec := Parent_Spec (Original_Node (Lib_Unit));
4438       end if;
4439
4440       if Present (P_Spec) then
4441
4442          P := Unit (P_Spec);
4443          P_Name := Get_Parent_Entity (P);
4444          Remove_Context_Clauses (P_Spec);
4445          End_Package_Scope (P_Name);
4446          Set_Is_Immediately_Visible (P_Name, Vis);
4447
4448          --  Remove from visibility the siblings as well, which are directly
4449          --  visible while the parent is in scope.
4450
4451          E := First_Entity (P_Name);
4452
4453          while Present (E) loop
4454
4455             if Is_Child_Unit (E) then
4456                Set_Is_Immediately_Visible (E, False);
4457             end if;
4458
4459             Next_Entity (E);
4460          end loop;
4461
4462          Set_In_Package_Body (P_Name, False);
4463
4464          --  This is the recursive call to remove the context of any
4465          --  higher level parent. This recursion ensures that all parents
4466          --  are removed in the reverse order of their installation.
4467
4468          Remove_Parents (P);
4469       end if;
4470    end Remove_Parents;
4471
4472    -----------------------------
4473    -- Remove_With_Type_Clause --
4474    -----------------------------
4475
4476    procedure Remove_With_Type_Clause (Name : Node_Id) is
4477       Typ : Entity_Id;
4478       P   : Entity_Id;
4479
4480       procedure Unchain (E : Entity_Id);
4481       --  Remove entity from visibility list
4482
4483       -------------
4484       -- Unchain --
4485       -------------
4486
4487       procedure Unchain (E : Entity_Id) is
4488          Prev : Entity_Id;
4489
4490       begin
4491          Prev := Current_Entity (E);
4492
4493          --  Package entity may appear is several with_type_clauses, and
4494          --  may have been removed already.
4495
4496          if No (Prev) then
4497             return;
4498
4499          elsif Prev = E then
4500             Set_Name_Entity_Id (Chars (E), Homonym (E));
4501
4502          else
4503             while Present (Prev)
4504               and then Homonym (Prev) /= E
4505             loop
4506                Prev := Homonym (Prev);
4507             end loop;
4508
4509             if Present (Prev) then
4510                Set_Homonym (Prev, Homonym (E));
4511             end if;
4512          end if;
4513       end Unchain;
4514
4515    --  Start of processing for Remove_With_Type_Clause
4516
4517    begin
4518       if Nkind (Name) = N_Selected_Component then
4519          Typ := Entity (Selector_Name (Name));
4520
4521          --  If no Typ, then error in declaration, ignore
4522
4523          if No (Typ) then
4524             return;
4525          end if;
4526       else
4527          return;
4528       end if;
4529
4530       P := Scope (Typ);
4531
4532       --  If the exporting package has been analyzed, it has appeared in the
4533       --  context already and should be left alone. Otherwise, remove from
4534       --  visibility.
4535
4536       if not Analyzed (Unit_Declaration_Node (P)) then
4537          Unchain (P);
4538          Unchain (Typ);
4539          Set_Is_Frozen (Typ, False);
4540       end if;
4541
4542       if Ekind (Typ) = E_Record_Type then
4543          Set_From_With_Type (Class_Wide_Type (Typ), False);
4544          Set_From_With_Type (Typ, False);
4545       end if;
4546
4547       Set_From_With_Type (P, False);
4548
4549       --  If P is a child unit, remove parents as well
4550
4551       P := Scope (P);
4552
4553       while Present (P)
4554         and then P /= Standard_Standard
4555       loop
4556          Set_From_With_Type (P, False);
4557
4558          if not Analyzed (Unit_Declaration_Node (P)) then
4559             Unchain (P);
4560          end if;
4561
4562          P := Scope (P);
4563       end loop;
4564
4565       --  The back-end needs to know that an access type is imported, so it
4566       --  does not need elaboration and can appear in a mutually recursive
4567       --  record definition, so the imported flag on an access  type is
4568       --  preserved.
4569
4570    end Remove_With_Type_Clause;
4571
4572    ---------------------------------
4573    -- Remove_Unit_From_Visibility --
4574    ---------------------------------
4575
4576    procedure Remove_Unit_From_Visibility (Unit_Name : Entity_Id) is
4577       P : constant Entity_Id := Scope (Unit_Name);
4578
4579    begin
4580
4581       if Debug_Flag_I then
4582          Write_Str ("remove unit ");
4583          Write_Name (Chars (Unit_Name));
4584          Write_Str (" from visibility");
4585          Write_Eol;
4586       end if;
4587
4588       if P /= Standard_Standard then
4589          Set_Is_Visible_Child_Unit (Unit_Name, False);
4590       end if;
4591
4592       Set_Is_Potentially_Use_Visible (Unit_Name, False);
4593       Set_Is_Immediately_Visible     (Unit_Name, False);
4594
4595    end Remove_Unit_From_Visibility;
4596
4597    -------------
4598    -- Unchain --
4599    -------------
4600
4601    procedure Unchain (E : Entity_Id) is
4602       Prev : Entity_Id;
4603
4604    begin
4605       Prev := Current_Entity (E);
4606
4607       if No (Prev) then
4608          return;
4609
4610       elsif Prev = E then
4611          Set_Name_Entity_Id (Chars (E), Homonym (E));
4612
4613       else
4614          while Present (Prev)
4615            and then Homonym (Prev) /= E
4616          loop
4617             Prev := Homonym (Prev);
4618          end loop;
4619
4620          if Present (Prev) then
4621             Set_Homonym (Prev, Homonym (E));
4622          end if;
4623       end if;
4624
4625       if Debug_Flag_I then
4626          Write_Str ("   (homonym) unchain ");
4627          Write_Name (Chars (E));
4628          Write_Eol;
4629       end if;
4630
4631    end Unchain;
4632 end Sem_Ch10;