OSDN Git Service

* s-atacco.ads, a-direio.adb: Protect use of 'Constrained by warnings
[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-2004 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 Implementation_Unit (Get_Source_Unit (U))
1696            and then not Intunit
1697            and then not Implicit_With (N)
1698          then
1699             Error_Msg_N ("& is an internal 'G'N'A'T unit?", Name (N));
1700             Error_Msg_N
1701               ("\use of this unit is non-portable and version-dependent?",
1702                Name (N));
1703          end if;
1704       end if;
1705
1706       --  Semantic analysis of a generic unit is performed on a copy of
1707       --  the original tree. Retrieve the entity on  which semantic info
1708       --  actually appears.
1709
1710       if Unit_Kind in N_Generic_Declaration then
1711          E_Name := Defining_Entity (U);
1712
1713       --  Note: in the following test, Unit_Kind is the original Nkind, but
1714       --  in the case of an instantiation, semantic analysis above will
1715       --  have replaced the unit by its instantiated version. If the instance
1716       --  body has been generated, the instance now denotes the body entity.
1717       --  For visibility purposes we need the entity of its spec.
1718
1719       elsif (Unit_Kind = N_Package_Instantiation
1720               or else Nkind (Original_Node (Unit (Library_Unit (N)))) =
1721                 N_Package_Instantiation)
1722         and then Nkind (U) = N_Package_Body
1723       then
1724          E_Name := Corresponding_Spec (U);
1725
1726       elsif Unit_Kind = N_Package_Instantiation
1727         and then Nkind (U) = N_Package_Instantiation
1728       then
1729          --  If the instance has not been rewritten as a package declaration,
1730          --  then it appeared already in a previous with clause. Retrieve
1731          --  the entity from the previous instance.
1732
1733          E_Name := Defining_Entity (Specification (Instance_Spec (U)));
1734
1735       elsif Unit_Kind = N_Procedure_Instantiation
1736         or else Unit_Kind = N_Function_Instantiation
1737       then
1738          --  Instantiation node is replaced with a package that contains
1739          --  renaming declarations and instance itself. The subprogram
1740          --  Instance is declared in the visible part of the wrapper package.
1741
1742          E_Name := First_Entity (Defining_Entity (U));
1743
1744          while Present (E_Name) loop
1745             exit when Is_Subprogram (E_Name)
1746               and then Is_Generic_Instance (E_Name);
1747             E_Name := Next_Entity (E_Name);
1748          end loop;
1749
1750       elsif Unit_Kind = N_Package_Renaming_Declaration
1751         or else Unit_Kind in N_Generic_Renaming_Declaration
1752       then
1753          E_Name := Defining_Entity (U);
1754
1755       elsif Unit_Kind = N_Subprogram_Body
1756         and then Nkind (Name (N)) = N_Selected_Component
1757         and then not Acts_As_Spec (Library_Unit (N))
1758       then
1759          --  For a child unit that has no spec, one has been created and
1760          --  analyzed. The entity required is that of the spec.
1761
1762          E_Name := Corresponding_Spec (U);
1763
1764       else
1765          E_Name := Defining_Entity (U);
1766       end if;
1767
1768       if Nkind (Name (N)) = N_Selected_Component then
1769
1770          --  Child unit in a with clause
1771
1772          Change_Selected_Component_To_Expanded_Name (Name (N));
1773       end if;
1774
1775       --  Restore style checks and restrictions
1776
1777       Style_Check := Save_Style_Check;
1778       Cunit_Boolean_Restrictions_Restore (Save_C_Restrict);
1779
1780       --  Record the reference, but do NOT set the unit as referenced, we
1781       --  want to consider the unit as unreferenced if this is the only
1782       --  reference that occurs.
1783
1784       Set_Entity_With_Style_Check (Name (N), E_Name);
1785       Generate_Reference (E_Name, Name (N), 'w', Set_Ref => False);
1786
1787       if Is_Child_Unit (E_Name) then
1788          Pref     := Prefix (Name (N));
1789          Par_Name := Scope (E_Name);
1790
1791          while Nkind (Pref) = N_Selected_Component loop
1792             Change_Selected_Component_To_Expanded_Name (Pref);
1793             Set_Entity_With_Style_Check (Pref, Par_Name);
1794
1795             Generate_Reference (Par_Name, Pref);
1796             Pref := Prefix (Pref);
1797
1798             --  If E_Name is the dummy entity for a nonexistent unit,
1799             --  its scope is set to Standard_Standard, and no attempt
1800             --  should be made to further unwind scopes.
1801
1802             if Par_Name /= Standard_Standard then
1803                Par_Name := Scope (Par_Name);
1804             end if;
1805          end loop;
1806
1807          if Present (Entity (Pref))
1808            and then not Analyzed (Parent (Parent (Entity (Pref))))
1809          then
1810             --  If the entity is set without its unit being compiled,
1811             --  the original parent is a renaming, and Par_Name is the
1812             --  renamed entity. For visibility purposes, we need the
1813             --  original entity, which must be analyzed now, because
1814             --  Load_Unit retrieves directly the renamed unit, and the
1815             --  renaming declaration itself has not been analyzed.
1816
1817             Analyze (Parent (Parent (Entity (Pref))));
1818             pragma Assert (Renamed_Object (Entity (Pref)) = Par_Name);
1819             Par_Name := Entity (Pref);
1820          end if;
1821
1822          Set_Entity_With_Style_Check (Pref, Par_Name);
1823          Generate_Reference (Par_Name, Pref);
1824       end if;
1825
1826       --  If the withed unit is System, and a system extension pragma is
1827       --  present, compile the extension now, rather than waiting for
1828       --  a visibility check on a specific entity.
1829
1830       if Chars (E_Name) = Name_System
1831         and then Scope (E_Name) = Standard_Standard
1832         and then Present (System_Extend_Unit)
1833         and then Present_System_Aux (N)
1834       then
1835          --  If the extension is not present, an error will have been emitted
1836
1837          null;
1838       end if;
1839
1840       --  Ada 2005 (AI-262): Remove from visibility the entity corresponding
1841       --  to private_with units; they will be made visible later (just before
1842       --  the private part is analyzed)
1843
1844       if Private_Present (N) then
1845          Set_Is_Immediately_Visible (E_Name, False);
1846       end if;
1847    end Analyze_With_Clause;
1848
1849    ------------------------------
1850    -- Analyze_With_Type_Clause --
1851    ------------------------------
1852
1853    procedure Analyze_With_Type_Clause (N : Node_Id) is
1854       Loc  : constant Source_Ptr := Sloc (N);
1855       Nam  : constant Node_Id    := Name (N);
1856       Pack : Node_Id;
1857       Decl : Node_Id;
1858       P    : Entity_Id;
1859       Unum : Unit_Number_Type;
1860       Sel  : Node_Id;
1861
1862       procedure Decorate_Tagged_Type (T : Entity_Id);
1863       --  Set basic attributes of type, including its class_wide type
1864
1865       function In_Chain (E : Entity_Id) return Boolean;
1866       --  Check that the imported type is not already in the homonym chain,
1867       --  for example through a with_type clause in a parent unit.
1868
1869       --------------------------
1870       -- Decorate_Tagged_Type --
1871       --------------------------
1872
1873       procedure Decorate_Tagged_Type (T : Entity_Id) is
1874          CW : Entity_Id;
1875
1876       begin
1877          Set_Ekind (T, E_Record_Type);
1878          Set_Is_Tagged_Type (T);
1879          Set_Etype (T, T);
1880          Set_From_With_Type (T);
1881          Set_Scope (T, P);
1882
1883          if not In_Chain (T) then
1884             Set_Homonym (T, Current_Entity (T));
1885             Set_Current_Entity (T);
1886          end if;
1887
1888          --  Build bogus class_wide type, if not previously done
1889
1890          if No (Class_Wide_Type (T)) then
1891             CW := Make_Defining_Identifier (Loc,  New_Internal_Name ('S'));
1892
1893             Set_Ekind            (CW, E_Class_Wide_Type);
1894             Set_Etype            (CW, T);
1895             Set_Scope            (CW, P);
1896             Set_Is_Tagged_Type   (CW);
1897             Set_Is_First_Subtype (CW, True);
1898             Init_Size_Align      (CW);
1899             Set_Has_Unknown_Discriminants
1900                                  (CW, True);
1901             Set_Class_Wide_Type  (CW, CW);
1902             Set_Equivalent_Type  (CW, Empty);
1903             Set_From_With_Type   (CW);
1904
1905             Set_Class_Wide_Type (T, CW);
1906          end if;
1907       end Decorate_Tagged_Type;
1908
1909       --------------
1910       -- In_Chain --
1911       --------------
1912
1913       function In_Chain (E : Entity_Id) return Boolean is
1914          H : Entity_Id := Current_Entity (E);
1915
1916       begin
1917          while Present (H) loop
1918
1919             if H = E then
1920                return True;
1921             else
1922                H := Homonym (H);
1923             end if;
1924          end loop;
1925
1926          return False;
1927       end In_Chain;
1928
1929    --  Start of processing for Analyze_With_Type_Clause
1930
1931    begin
1932       if Nkind (Nam) = N_Selected_Component then
1933          Pack := New_Copy_Tree (Prefix (Nam));
1934          Sel  := Selector_Name (Nam);
1935
1936       else
1937          Error_Msg_N ("illegal name for imported type", Nam);
1938          return;
1939       end if;
1940
1941       Decl :=
1942         Make_Package_Declaration (Loc,
1943           Specification =>
1944              (Make_Package_Specification (Loc,
1945                Defining_Unit_Name   => Pack,
1946                Visible_Declarations => New_List,
1947                End_Label            => Empty)));
1948
1949       Unum :=
1950         Load_Unit
1951           (Load_Name  => Get_Unit_Name (Decl),
1952            Required   => True,
1953            Subunit    => False,
1954            Error_Node => Nam);
1955
1956       if Unum = No_Unit
1957          or else Nkind (Unit (Cunit (Unum))) /= N_Package_Declaration
1958       then
1959          Error_Msg_N ("imported type must be declared in package", Nam);
1960          return;
1961
1962       elsif Unum = Current_Sem_Unit then
1963
1964          --  If type is defined in unit being analyzed, then the clause
1965          --  is redundant.
1966
1967          return;
1968
1969       else
1970          P := Cunit_Entity (Unum);
1971       end if;
1972
1973       --  Find declaration for imported type, and set its basic attributes
1974       --  if it has not been analyzed (which will be the case if there is
1975       --  circular dependence).
1976
1977       declare
1978          Decl : Node_Id;
1979          Typ  : Entity_Id;
1980
1981       begin
1982          if not Analyzed (Cunit (Unum))
1983            and then not From_With_Type (P)
1984          then
1985             Set_Ekind (P, E_Package);
1986             Set_Etype (P, Standard_Void_Type);
1987             Set_From_With_Type (P);
1988             Set_Scope (P, Standard_Standard);
1989             Set_Homonym (P, Current_Entity (P));
1990             Set_Current_Entity (P);
1991
1992          elsif Analyzed (Cunit (Unum))
1993            and then Is_Child_Unit (P)
1994          then
1995             --  If the child unit is already in scope, indicate that it is
1996             --  visible, and remains so after intervening calls to rtsfind.
1997
1998             Set_Is_Visible_Child_Unit (P);
1999          end if;
2000
2001          if Nkind (Parent (P)) = N_Defining_Program_Unit_Name then
2002
2003             --  Make parent packages visible
2004
2005             declare
2006                Parent_Comp : Node_Id;
2007                Parent_Id   : Entity_Id;
2008                Child       : Entity_Id;
2009
2010             begin
2011                Child   := P;
2012                Parent_Comp := Parent_Spec (Unit (Cunit (Unum)));
2013
2014                loop
2015                   Parent_Id := Defining_Entity (Unit (Parent_Comp));
2016                   Set_Scope (Child, Parent_Id);
2017
2018                   --  The type may be imported from a child unit, in which
2019                   --  case the current compilation appears in the name. Do
2020                   --  not change its visibility here because it will conflict
2021                   --  with the subsequent normal processing.
2022
2023                   if not Analyzed (Unit_Declaration_Node (Parent_Id))
2024                     and then Parent_Id /= Cunit_Entity (Current_Sem_Unit)
2025                   then
2026                      Set_Ekind (Parent_Id, E_Package);
2027                      Set_Etype (Parent_Id, Standard_Void_Type);
2028
2029                      --  The same package may appear is several with_type
2030                      --  clauses.
2031
2032                      if not From_With_Type (Parent_Id) then
2033                         Set_Homonym (Parent_Id, Current_Entity (Parent_Id));
2034                         Set_Current_Entity (Parent_Id);
2035                         Set_From_With_Type (Parent_Id);
2036                      end if;
2037                   end if;
2038
2039                   Set_Is_Immediately_Visible (Parent_Id);
2040
2041                   Child := Parent_Id;
2042                   Parent_Comp := Parent_Spec (Unit (Parent_Comp));
2043                   exit when No (Parent_Comp);
2044                end loop;
2045
2046                Set_Scope (Parent_Id, Standard_Standard);
2047             end;
2048          end if;
2049
2050          --  Even if analyzed, the package may not be currently visible. It
2051          --  must be while the with_type clause is active.
2052
2053          Set_Is_Immediately_Visible (P);
2054
2055          Decl :=
2056            First (Visible_Declarations (Specification (Unit (Cunit (Unum)))));
2057
2058          while Present (Decl) loop
2059
2060             if Nkind (Decl) = N_Full_Type_Declaration
2061               and then Chars (Defining_Identifier (Decl)) = Chars (Sel)
2062             then
2063                Typ := Defining_Identifier (Decl);
2064
2065                if Tagged_Present (N) then
2066
2067                   --  The declaration must indicate that this is a tagged
2068                   --  type or a type extension.
2069
2070                   if (Nkind (Type_Definition (Decl)) = N_Record_Definition
2071                        and then Tagged_Present (Type_Definition (Decl)))
2072                     or else
2073                       (Nkind (Type_Definition (Decl))
2074                           = N_Derived_Type_Definition
2075                          and then Present
2076                            (Record_Extension_Part (Type_Definition (Decl))))
2077                   then
2078                      null;
2079                   else
2080                      Error_Msg_N ("imported type is not a tagged type", Nam);
2081                      return;
2082                   end if;
2083
2084                   if not Analyzed (Decl) then
2085
2086                      --  Unit is not currently visible. Add basic attributes
2087                      --  to type and build its class-wide type.
2088
2089                      Init_Size_Align (Typ);
2090                      Decorate_Tagged_Type (Typ);
2091                   end if;
2092
2093                else
2094                   if Nkind (Type_Definition (Decl))
2095                      /= N_Access_To_Object_Definition
2096                   then
2097                      Error_Msg_N
2098                       ("imported type is not an access type", Nam);
2099
2100                   elsif not Analyzed (Decl) then
2101                      Set_Ekind                    (Typ, E_Access_Type);
2102                      Set_Etype                    (Typ, Typ);
2103                      Set_Scope                    (Typ, P);
2104                      Init_Size                    (Typ, System_Address_Size);
2105                      Init_Alignment               (Typ);
2106                      Set_Directly_Designated_Type (Typ, Standard_Integer);
2107                      Set_From_With_Type           (Typ);
2108
2109                      if not In_Chain (Typ) then
2110                         Set_Homonym               (Typ, Current_Entity (Typ));
2111                         Set_Current_Entity        (Typ);
2112                      end if;
2113                   end if;
2114                end if;
2115
2116                Set_Entity (Sel, Typ);
2117                return;
2118
2119             elsif ((Nkind (Decl) = N_Private_Type_Declaration
2120                       and then Tagged_Present (Decl))
2121                 or else (Nkind (Decl) = N_Private_Extension_Declaration))
2122               and then Chars (Defining_Identifier (Decl)) = Chars (Sel)
2123             then
2124                Typ := Defining_Identifier (Decl);
2125
2126                if not Tagged_Present (N) then
2127                   Error_Msg_N ("type must be declared tagged", N);
2128
2129                elsif not Analyzed (Decl) then
2130                   Decorate_Tagged_Type (Typ);
2131                end if;
2132
2133                Set_Entity (Sel, Typ);
2134                Set_From_With_Type (Typ);
2135                return;
2136             end if;
2137
2138             Decl := Next (Decl);
2139          end loop;
2140
2141          Error_Msg_NE ("not a visible access or tagged type in&", Nam, P);
2142       end;
2143    end Analyze_With_Type_Clause;
2144
2145    -----------------------------
2146    -- Check_With_Type_Clauses --
2147    -----------------------------
2148
2149    procedure Check_With_Type_Clauses (N : Node_Id) is
2150       Lib_Unit : constant Node_Id := Unit (N);
2151
2152       procedure Check_Parent_Context (U : Node_Id);
2153       --  Examine context items of parent unit to locate with_type clauses
2154
2155       --------------------------
2156       -- Check_Parent_Context --
2157       --------------------------
2158
2159       procedure Check_Parent_Context (U : Node_Id) is
2160          Item : Node_Id;
2161
2162       begin
2163          Item := First (Context_Items (U));
2164          while Present (Item) loop
2165             if Nkind (Item) = N_With_Type_Clause
2166               and then not Error_Posted (Item)
2167               and then
2168                 From_With_Type (Scope (Entity (Selector_Name (Name (Item)))))
2169             then
2170                Error_Msg_Sloc := Sloc (Item);
2171                Error_Msg_N ("Missing With_Clause for With_Type_Clause#", N);
2172             end if;
2173
2174             Next (Item);
2175          end loop;
2176       end Check_Parent_Context;
2177
2178    --  Start of processing for Check_With_Type_Clauses
2179
2180    begin
2181       if Extensions_Allowed
2182         and then (Nkind (Lib_Unit) = N_Package_Body
2183                    or else Nkind (Lib_Unit) = N_Subprogram_Body)
2184       then
2185          Check_Parent_Context (Library_Unit (N));
2186
2187          if Is_Child_Spec (Unit (Library_Unit (N))) then
2188             Check_Parent_Context (Parent_Spec (Unit (Library_Unit (N))));
2189          end if;
2190       end if;
2191    end Check_With_Type_Clauses;
2192
2193    ------------------------------
2194    -- Check_Private_Child_Unit --
2195    ------------------------------
2196
2197    procedure Check_Private_Child_Unit (N : Node_Id) is
2198       Lib_Unit   : constant Node_Id := Unit (N);
2199       Item       : Node_Id;
2200       Curr_Unit  : Entity_Id;
2201       Sub_Parent : Node_Id;
2202       Priv_Child : Entity_Id;
2203       Par_Lib    : Entity_Id;
2204       Par_Spec   : Node_Id;
2205
2206       function Is_Private_Library_Unit (Unit : Entity_Id) return Boolean;
2207       --  Returns true if and only if the library unit is declared with
2208       --  an explicit designation of private.
2209
2210       function Is_Private_Library_Unit (Unit : Entity_Id) return Boolean is
2211          Comp_Unit : constant Node_Id := Parent (Unit_Declaration_Node (Unit));
2212
2213       begin
2214          return Private_Present (Comp_Unit);
2215       end Is_Private_Library_Unit;
2216
2217    --  Start of processing for Check_Private_Child_Unit
2218
2219    begin
2220       if Nkind (Lib_Unit) = N_Package_Body
2221         or else Nkind (Lib_Unit) = N_Subprogram_Body
2222       then
2223          Curr_Unit := Defining_Entity (Unit (Library_Unit (N)));
2224          Par_Lib   := Curr_Unit;
2225
2226       elsif Nkind (Lib_Unit) = N_Subunit then
2227
2228          --  The parent is itself a body. The parent entity is to be found
2229          --  in the corresponding spec.
2230
2231          Sub_Parent := Library_Unit (N);
2232          Curr_Unit  := Defining_Entity (Unit (Library_Unit (Sub_Parent)));
2233
2234          --  If the parent itself is a subunit, Curr_Unit is the entity
2235          --  of the enclosing body, retrieve the spec entity which is
2236          --  the proper ancestor we need for the following tests.
2237
2238          if Ekind (Curr_Unit) = E_Package_Body then
2239             Curr_Unit := Spec_Entity (Curr_Unit);
2240          end if;
2241
2242          Par_Lib    := Curr_Unit;
2243
2244       else
2245          Curr_Unit := Defining_Entity (Lib_Unit);
2246
2247          Par_Lib := Curr_Unit;
2248          Par_Spec  := Parent_Spec (Lib_Unit);
2249
2250          if No (Par_Spec) then
2251             Par_Lib := Empty;
2252          else
2253             Par_Lib := Defining_Entity (Unit (Par_Spec));
2254          end if;
2255       end if;
2256
2257       --  Loop through context items
2258
2259       Item := First (Context_Items (N));
2260       while Present (Item) loop
2261
2262          --  Ada 2005 (AI-262): Allow private_with of a private child package
2263          --  in public siblings
2264
2265          if Nkind (Item) = N_With_Clause
2266             and then not Implicit_With (Item)
2267             and then not Private_Present (Item)
2268             and then Is_Private_Descendant (Entity (Name (Item)))
2269          then
2270             Priv_Child := Entity (Name (Item));
2271
2272             declare
2273                Curr_Parent  : Entity_Id := Par_Lib;
2274                Child_Parent : Entity_Id := Scope (Priv_Child);
2275                Prv_Ancestor : Entity_Id := Child_Parent;
2276                Curr_Private : Boolean   := Is_Private_Library_Unit (Curr_Unit);
2277
2278             begin
2279                --  If the child unit is a public child then locate
2280                --  the nearest private ancestor; Child_Parent will
2281                --  then be set to the parent of that ancestor.
2282
2283                if not Is_Private_Library_Unit (Priv_Child) then
2284                   while Present (Prv_Ancestor)
2285                     and then not Is_Private_Library_Unit (Prv_Ancestor)
2286                   loop
2287                      Prv_Ancestor := Scope (Prv_Ancestor);
2288                   end loop;
2289
2290                   if Present (Prv_Ancestor) then
2291                      Child_Parent := Scope (Prv_Ancestor);
2292                   end if;
2293                end if;
2294
2295                while Present (Curr_Parent)
2296                  and then Curr_Parent /= Standard_Standard
2297                  and then Curr_Parent /= Child_Parent
2298                loop
2299                   Curr_Private :=
2300                     Curr_Private or else Is_Private_Library_Unit (Curr_Parent);
2301                   Curr_Parent := Scope (Curr_Parent);
2302                end loop;
2303
2304                if not Present (Curr_Parent) then
2305                   Curr_Parent := Standard_Standard;
2306                end if;
2307
2308                if Curr_Parent /= Child_Parent then
2309
2310                   if Ekind (Priv_Child) = E_Generic_Package
2311                     and then Chars (Priv_Child) in Text_IO_Package_Name
2312                     and then Chars (Scope (Scope (Priv_Child))) = Name_Ada
2313                   then
2314                      Error_Msg_NE
2315                        ("& is a nested package, not a compilation unit",
2316                        Name (Item), Priv_Child);
2317
2318                   else
2319                      Error_Msg_N
2320                        ("unit in with clause is private child unit!", Item);
2321                      Error_Msg_NE
2322                        ("current unit must also have parent&!",
2323                         Item, Child_Parent);
2324                   end if;
2325
2326                elsif not Curr_Private
2327                  and then Nkind (Lib_Unit) /= N_Package_Body
2328                  and then Nkind (Lib_Unit) /= N_Subprogram_Body
2329                  and then Nkind (Lib_Unit) /= N_Subunit
2330                then
2331                   Error_Msg_NE
2332                     ("current unit must also be private descendant of&",
2333                      Item, Child_Parent);
2334                end if;
2335             end;
2336          end if;
2337
2338          Next (Item);
2339       end loop;
2340
2341    end Check_Private_Child_Unit;
2342
2343    ----------------------
2344    -- Check_Stub_Level --
2345    ----------------------
2346
2347    procedure Check_Stub_Level (N : Node_Id) is
2348       Par  : constant Node_Id   := Parent (N);
2349       Kind : constant Node_Kind := Nkind (Par);
2350
2351    begin
2352       if (Kind = N_Package_Body
2353            or else Kind = N_Subprogram_Body
2354            or else Kind = N_Task_Body
2355            or else Kind = N_Protected_Body)
2356
2357         and then (Nkind (Parent (Par)) = N_Compilation_Unit
2358                    or else Nkind (Parent (Par)) = N_Subunit)
2359       then
2360          null;
2361
2362       --  In an instance, a missing stub appears at any level. A warning
2363       --  message will have been emitted already for the missing file.
2364
2365       elsif not In_Instance then
2366          Error_Msg_N ("stub cannot appear in an inner scope", N);
2367
2368       elsif Expander_Active then
2369          Error_Msg_N ("missing proper body", N);
2370       end if;
2371    end Check_Stub_Level;
2372
2373    ------------------------
2374    -- Expand_With_Clause --
2375    ------------------------
2376
2377    procedure Expand_With_Clause (Nam : Node_Id; N : Node_Id) is
2378       Loc   : constant Source_Ptr := Sloc (Nam);
2379       Ent   : constant Entity_Id := Entity (Nam);
2380       Withn : Node_Id;
2381       P     : Node_Id;
2382
2383       function Build_Unit_Name (Nam : Node_Id) return Node_Id;
2384
2385       function Build_Unit_Name (Nam : Node_Id) return Node_Id is
2386          Result : Node_Id;
2387
2388       begin
2389          if Nkind (Nam) = N_Identifier then
2390             return New_Occurrence_Of (Entity (Nam), Loc);
2391
2392          else
2393             Result :=
2394               Make_Expanded_Name (Loc,
2395                 Chars  => Chars (Entity (Nam)),
2396                 Prefix => Build_Unit_Name (Prefix (Nam)),
2397                 Selector_Name => New_Occurrence_Of (Entity (Nam), Loc));
2398             Set_Entity (Result, Entity (Nam));
2399             return Result;
2400          end if;
2401       end Build_Unit_Name;
2402
2403    begin
2404       New_Nodes_OK := New_Nodes_OK + 1;
2405       Withn :=
2406         Make_With_Clause (Loc, Name => Build_Unit_Name (Nam));
2407
2408       P := Parent (Unit_Declaration_Node (Ent));
2409       Set_Library_Unit          (Withn, P);
2410       Set_Corresponding_Spec    (Withn, Ent);
2411       Set_First_Name            (Withn, True);
2412       Set_Implicit_With         (Withn, True);
2413
2414       Prepend (Withn, Context_Items (N));
2415       Mark_Rewrite_Insertion (Withn);
2416       Install_Withed_Unit (Withn);
2417
2418       if Nkind (Nam) = N_Expanded_Name then
2419          Expand_With_Clause (Prefix (Nam), N);
2420       end if;
2421
2422       New_Nodes_OK := New_Nodes_OK - 1;
2423    end Expand_With_Clause;
2424
2425    --------------------------------
2426    -- Expand_Limited_With_Clause --
2427    --------------------------------
2428
2429    procedure Expand_Limited_With_Clause (Nam : Node_Id; N : Node_Id) is
2430       Loc   : constant Source_Ptr := Sloc (Nam);
2431       Unum  : Unit_Number_Type;
2432       Withn : Node_Id;
2433
2434    begin
2435       New_Nodes_OK := New_Nodes_OK + 1;
2436
2437       if Nkind (Nam) = N_Identifier then
2438          Withn :=
2439            Make_With_Clause (Loc, Name => Nam);
2440          Set_Limited_Present (Withn);
2441          Set_First_Name      (Withn);
2442          Set_Implicit_With   (Withn);
2443
2444          --  Load the corresponding parent unit
2445
2446          Unum :=
2447            Load_Unit
2448            (Load_Name  => Get_Spec_Name (Get_Unit_Name (Nam)),
2449             Required   => True,
2450             Subunit    => False,
2451             Error_Node => Nam);
2452
2453          if not Analyzed (Cunit (Unum)) then
2454             Set_Library_Unit (Withn, Cunit (Unum));
2455             Set_Corresponding_Spec
2456               (Withn, Specification (Unit (Cunit (Unum))));
2457
2458             Prepend (Withn, Context_Items (Parent (N)));
2459             Mark_Rewrite_Insertion (Withn);
2460          end if;
2461
2462       else pragma Assert (Nkind (Nam) = N_Selected_Component);
2463          Withn :=
2464            Make_With_Clause
2465            (Loc,
2466             Name =>
2467               Make_Selected_Component
2468                 (Loc,
2469                  Prefix        => Prefix (Nam),
2470                  Selector_Name => Selector_Name (Nam)));
2471
2472          Set_Parent (Withn, Parent (N));
2473          Set_Limited_Present (Withn);
2474          Set_First_Name      (Withn);
2475          Set_Implicit_With   (Withn);
2476
2477          Unum :=
2478            Load_Unit
2479              (Load_Name  => Get_Spec_Name (Get_Unit_Name (Nam)),
2480               Required   => True,
2481               Subunit    => False,
2482               Error_Node => Nam);
2483
2484          if not Analyzed (Cunit (Unum)) then
2485             Set_Library_Unit (Withn, Cunit (Unum));
2486             Set_Corresponding_Spec
2487               (Withn, Specification (Unit (Cunit (Unum))));
2488             Prepend (Withn, Context_Items (Parent (N)));
2489             Mark_Rewrite_Insertion (Withn);
2490
2491             Expand_Limited_With_Clause (Prefix (Nam), N);
2492          end if;
2493       end if;
2494
2495       New_Nodes_OK := New_Nodes_OK - 1;
2496    end Expand_Limited_With_Clause;
2497
2498    -----------------------
2499    -- Get_Parent_Entity --
2500    -----------------------
2501
2502    function Get_Parent_Entity (Unit : Node_Id) return Entity_Id is
2503    begin
2504       if Nkind (Unit) = N_Package_Body
2505         and then Nkind (Original_Node (Unit)) = N_Package_Instantiation
2506       then
2507          return
2508            Defining_Entity
2509              (Specification (Instance_Spec (Original_Node (Unit))));
2510
2511       elsif Nkind (Unit) = N_Package_Instantiation then
2512          return Defining_Entity (Specification (Instance_Spec (Unit)));
2513
2514       else
2515          return Defining_Entity (Unit);
2516       end if;
2517    end Get_Parent_Entity;
2518
2519    -----------------------------
2520    -- Implicit_With_On_Parent --
2521    -----------------------------
2522
2523    procedure Implicit_With_On_Parent
2524      (Child_Unit : Node_Id;
2525       N          : Node_Id)
2526    is
2527       Loc    : constant Source_Ptr := Sloc (N);
2528       P      : constant Node_Id    := Parent_Spec (Child_Unit);
2529
2530       P_Unit : Node_Id    := Unit (P);
2531
2532       P_Name : constant Entity_Id  := Get_Parent_Entity (P_Unit);
2533       Withn  : Node_Id;
2534
2535       function Build_Ancestor_Name (P : Node_Id) return Node_Id;
2536       --  Build prefix of child unit name. Recurse if needed
2537
2538       function Build_Unit_Name return Node_Id;
2539       --  If the unit is a child unit, build qualified name with all
2540       --  ancestors.
2541
2542       -------------------------
2543       -- Build_Ancestor_Name --
2544       -------------------------
2545
2546       function Build_Ancestor_Name (P : Node_Id) return Node_Id is
2547          P_Ref : constant Node_Id :=
2548                    New_Reference_To (Defining_Entity (P), Loc);
2549       begin
2550          if No (Parent_Spec (P)) then
2551             return P_Ref;
2552          else
2553             return
2554               Make_Selected_Component (Loc,
2555                 Prefix => Build_Ancestor_Name (Unit (Parent_Spec (P))),
2556                 Selector_Name => P_Ref);
2557          end if;
2558       end Build_Ancestor_Name;
2559
2560       ---------------------
2561       -- Build_Unit_Name --
2562       ---------------------
2563
2564       function Build_Unit_Name return Node_Id is
2565          Result : Node_Id;
2566       begin
2567          if No (Parent_Spec (P_Unit)) then
2568             return New_Reference_To (P_Name, Loc);
2569          else
2570             Result :=
2571               Make_Expanded_Name (Loc,
2572                 Chars  => Chars (P_Name),
2573                 Prefix => Build_Ancestor_Name (Unit (Parent_Spec (P_Unit))),
2574                 Selector_Name => New_Reference_To (P_Name, Loc));
2575             Set_Entity (Result, P_Name);
2576             return Result;
2577          end if;
2578       end Build_Unit_Name;
2579
2580    --  Start of processing for Implicit_With_On_Parent
2581
2582    begin
2583       --  The unit of the current compilation may be a package body
2584       --  that replaces an instance node. In this case we need the
2585       --  original instance node to construct the proper parent name.
2586
2587       if Nkind (P_Unit) = N_Package_Body
2588         and then Nkind (Original_Node (P_Unit)) = N_Package_Instantiation
2589       then
2590          P_Unit := Original_Node (P_Unit);
2591       end if;
2592
2593       New_Nodes_OK := New_Nodes_OK + 1;
2594       Withn := Make_With_Clause (Loc, Name => Build_Unit_Name);
2595
2596       Set_Library_Unit          (Withn, P);
2597       Set_Corresponding_Spec    (Withn, P_Name);
2598       Set_First_Name            (Withn, True);
2599       Set_Implicit_With         (Withn, True);
2600
2601       --  Node is placed at the beginning of the context items, so that
2602       --  subsequent use clauses on the parent can be validated.
2603
2604       Prepend (Withn, Context_Items (N));
2605       Mark_Rewrite_Insertion (Withn);
2606       Install_Withed_Unit (Withn);
2607
2608       if Is_Child_Spec (P_Unit) then
2609          Implicit_With_On_Parent (P_Unit, N);
2610       end if;
2611
2612       New_Nodes_OK := New_Nodes_OK - 1;
2613    end Implicit_With_On_Parent;
2614
2615    ---------------------
2616    -- Install_Context --
2617    ---------------------
2618
2619    procedure Install_Context (N : Node_Id) is
2620       Lib_Unit : constant Node_Id := Unit (N);
2621
2622    begin
2623       Install_Context_Clauses (N);
2624
2625       if Is_Child_Spec (Lib_Unit) then
2626          Install_Parents (Lib_Unit, Private_Present (Parent (Lib_Unit)));
2627       end if;
2628
2629       Install_Limited_Context_Clauses (N);
2630
2631       Check_With_Type_Clauses (N);
2632    end Install_Context;
2633
2634    -----------------------------
2635    -- Install_Context_Clauses --
2636    -----------------------------
2637
2638    procedure Install_Context_Clauses (N : Node_Id) is
2639       Lib_Unit      : constant Node_Id := Unit (N);
2640       Item          : Node_Id;
2641       Uname_Node    : Entity_Id;
2642       Check_Private : Boolean := False;
2643       Decl_Node     : Node_Id;
2644       Lib_Parent    : Entity_Id;
2645
2646    begin
2647       --  Loop through context clauses to find the with/use clauses.
2648       --  This is done twice, first for everything except limited_with
2649       --  clauses, and then for those, if any are present.
2650
2651       Item := First (Context_Items (N));
2652       while Present (Item) loop
2653
2654          --  Case of explicit WITH clause
2655
2656          if Nkind (Item) = N_With_Clause
2657            and then not Implicit_With (Item)
2658          then
2659             if Limited_Present (Item) then
2660
2661                --  Limited withed units will be installed later
2662
2663                goto Continue;
2664
2665             --  If Name (Item) is not an entity name, something is wrong, and
2666             --  this will be detected in due course, for now ignore the item
2667
2668             elsif not Is_Entity_Name (Name (Item)) then
2669                goto Continue;
2670
2671             elsif No (Entity (Name (Item))) then
2672                Set_Entity (Name (Item), Any_Id);
2673                goto Continue;
2674             end if;
2675
2676             Uname_Node := Entity (Name (Item));
2677
2678             if Is_Private_Descendant (Uname_Node) then
2679                Check_Private := True;
2680             end if;
2681
2682             Install_Withed_Unit (Item);
2683
2684             Decl_Node := Unit_Declaration_Node (Uname_Node);
2685
2686             --  If the unit is a subprogram instance, it appears nested
2687             --  within a package that carries the parent information.
2688
2689             if Is_Generic_Instance (Uname_Node)
2690               and then Ekind (Uname_Node) /= E_Package
2691             then
2692                Decl_Node := Parent (Parent (Decl_Node));
2693             end if;
2694
2695             if Is_Child_Spec (Decl_Node) then
2696                if Nkind (Name (Item)) = N_Expanded_Name then
2697                   Expand_With_Clause (Prefix (Name (Item)), N);
2698                else
2699                   --  if not an expanded name, the child unit must be a
2700                   --  renaming, nothing to do.
2701
2702                   null;
2703                end if;
2704
2705             elsif Nkind (Decl_Node) = N_Subprogram_Body
2706               and then not Acts_As_Spec (Parent (Decl_Node))
2707               and then Is_Child_Spec (Unit (Library_Unit (Parent (Decl_Node))))
2708             then
2709                Implicit_With_On_Parent
2710                  (Unit (Library_Unit (Parent (Decl_Node))), N);
2711             end if;
2712
2713             --  Check license conditions unless this is a dummy unit
2714
2715             if Sloc (Library_Unit (Item)) /= No_Location then
2716                License_Check : declare
2717                   Withl : constant License_Type :=
2718                             License (Source_Index
2719                                        (Get_Source_Unit
2720                                          (Library_Unit (Item))));
2721
2722                   Unitl : constant License_Type :=
2723                            License (Source_Index (Current_Sem_Unit));
2724
2725                   procedure License_Error;
2726                   --  Signal error of bad license
2727
2728                   -------------------
2729                   -- License_Error --
2730                   -------------------
2731
2732                   procedure License_Error is
2733                   begin
2734                      Error_Msg_N
2735                        ("?license of with'ed unit & is incompatible",
2736                         Name (Item));
2737                   end License_Error;
2738
2739                --  Start of processing for License_Check
2740
2741                begin
2742                   case Unitl is
2743                      when Unknown =>
2744                         null;
2745
2746                      when Restricted =>
2747                         if Withl = GPL then
2748                            License_Error;
2749                         end if;
2750
2751                      when GPL =>
2752                         if Withl = Restricted then
2753                            License_Error;
2754                         end if;
2755
2756                      when Modified_GPL =>
2757                         if Withl = Restricted or else Withl = GPL then
2758                            License_Error;
2759                         end if;
2760
2761                      when Unrestricted =>
2762                         null;
2763                   end case;
2764                end License_Check;
2765             end if;
2766
2767          --  Case of USE PACKAGE clause
2768
2769          elsif Nkind (Item) = N_Use_Package_Clause then
2770             Analyze_Use_Package (Item);
2771
2772          --  Case of USE TYPE clause
2773
2774          elsif Nkind (Item) = N_Use_Type_Clause then
2775             Analyze_Use_Type (Item);
2776
2777          --  Case of WITH TYPE clause
2778
2779          --  A With_Type_Clause is processed when installing the context,
2780          --  because it is a visibility mechanism and does not create a
2781          --  semantic dependence on other units, as a With_Clause does.
2782
2783          elsif Nkind (Item) = N_With_Type_Clause then
2784             Analyze_With_Type_Clause (Item);
2785
2786          --  case of PRAGMA
2787
2788          elsif Nkind (Item) = N_Pragma then
2789             Analyze (Item);
2790          end if;
2791
2792       <<Continue>>
2793          Next (Item);
2794       end loop;
2795
2796       if Is_Child_Spec (Lib_Unit) then
2797
2798          --  The unit also has implicit withs on its own parents
2799
2800          if No (Context_Items (N)) then
2801             Set_Context_Items (N, New_List);
2802          end if;
2803
2804          Implicit_With_On_Parent (Lib_Unit, N);
2805       end if;
2806
2807       --  If the unit is a body, the context of the specification must also
2808       --  be installed.
2809
2810       if Nkind (Lib_Unit) = N_Package_Body
2811         or else (Nkind (Lib_Unit) = N_Subprogram_Body
2812                   and then not Acts_As_Spec (N))
2813       then
2814          Install_Context (Library_Unit (N));
2815
2816          if Is_Child_Spec (Unit (Library_Unit (N))) then
2817
2818             --  If the unit is the body of a public child unit, the private
2819             --  declarations of the parent must be made visible. If the child
2820             --  unit is private, the private declarations have been installed
2821             --  already in the call to Install_Parents for the spec. Installing
2822             --  private declarations must be done for all ancestors of public
2823             --  child units. In addition, sibling units mentioned in the
2824             --  context clause of the body are directly visible.
2825
2826             declare
2827                Lib_Spec : Node_Id := Unit (Library_Unit (N));
2828                P        : Node_Id;
2829                P_Name   : Entity_Id;
2830
2831             begin
2832                while Is_Child_Spec (Lib_Spec) loop
2833                   P := Unit (Parent_Spec (Lib_Spec));
2834
2835                   if not (Private_Present (Parent (Lib_Spec))) then
2836                      P_Name := Defining_Entity (P);
2837                      Install_Private_Declarations (P_Name);
2838                      Install_Private_With_Clauses (P_Name);
2839                      Set_Use (Private_Declarations (Specification (P)));
2840                   end if;
2841
2842                   Lib_Spec := P;
2843                end loop;
2844             end;
2845          end if;
2846
2847          --  For a package body, children in context are immediately visible
2848
2849          Install_Siblings (Defining_Entity (Unit (Library_Unit (N))), N);
2850       end if;
2851
2852       if Nkind (Lib_Unit) = N_Generic_Package_Declaration
2853         or else Nkind (Lib_Unit) = N_Generic_Subprogram_Declaration
2854         or else Nkind (Lib_Unit) = N_Package_Declaration
2855         or else Nkind (Lib_Unit) = N_Subprogram_Declaration
2856       then
2857          if Is_Child_Spec (Lib_Unit) then
2858             Lib_Parent := Defining_Entity (Unit (Parent_Spec (Lib_Unit)));
2859             Set_Is_Private_Descendant
2860               (Defining_Entity (Lib_Unit),
2861                Is_Private_Descendant (Lib_Parent)
2862                  or else Private_Present (Parent (Lib_Unit)));
2863
2864          else
2865             Set_Is_Private_Descendant
2866               (Defining_Entity (Lib_Unit),
2867                Private_Present (Parent (Lib_Unit)));
2868          end if;
2869       end if;
2870
2871       if Check_Private then
2872          Check_Private_Child_Unit (N);
2873       end if;
2874    end Install_Context_Clauses;
2875
2876    -------------------------------------
2877    -- Install_Limited_Context_Clauses --
2878    -------------------------------------
2879
2880    procedure Install_Limited_Context_Clauses (N : Node_Id) is
2881       Item : Node_Id;
2882
2883       procedure Check_Parent (P : Node_Id; W : Node_Id);
2884       --  Check that the unlimited view of a given compilation_unit is not
2885       --  already visible in the parents (neither immediately through the
2886       --  context clauses, nor indirectly through "use + renamings").
2887
2888       procedure Check_Private_Limited_Withed_Unit (N : Node_Id);
2889       --  Check that if a limited_with clause of a given compilation_unit
2890       --  mentions a private child of some library unit, then the given
2891       --  compilation_unit shall be the declaration of a private descendant
2892       --  of that library unit.
2893
2894       procedure Check_Withed_Unit (W : Node_Id);
2895       --  Check that a limited with_clause does not appear in the same
2896       --  context_clause as a nonlimited with_clause that mentions
2897       --  the same library.
2898
2899       ------------------
2900       -- Check_Parent --
2901       ------------------
2902
2903       procedure Check_Parent (P : Node_Id; W : Node_Id) is
2904          Item   : Node_Id;
2905          Spec   : Node_Id;
2906          WEnt   : Entity_Id;
2907          Nam    : Node_Id;
2908          E      : Entity_Id;
2909          E2     : Entity_Id;
2910
2911       begin
2912          pragma Assert (Nkind (W) = N_With_Clause);
2913
2914          --  Step 1: Check if the unlimited view is installed in the parent
2915
2916          Item := First (Context_Items (P));
2917          while Present (Item) loop
2918             if Nkind (Item) = N_With_Clause
2919               and then not Limited_Present (Item)
2920               and then not Implicit_With (Item)
2921               and then Library_Unit (Item) = Library_Unit (W)
2922             then
2923                Error_Msg_N ("unlimited view visible in ancestor", W);
2924                return;
2925             end if;
2926
2927             Next (Item);
2928          end loop;
2929
2930          --  Step 2: Check "use + renamings"
2931
2932          WEnt := Defining_Unit_Name (Specification (Unit (Library_Unit (W))));
2933          Spec := Specification (Unit (P));
2934
2935          --  We tried to traverse the list of entities corresponding to the
2936          --  defining entity of the package spec. However, first_entity was
2937          --  found to be 'empty'. Don't know why???
2938
2939          --          Def  := Defining_Unit_Name (Spec);
2940          --          Ent  := First_Entity (Def);
2941
2942          --  As a workaround we traverse the list of visible declarations ???
2943
2944          Item := First (Visible_Declarations (Spec));
2945          while Present (Item) loop
2946
2947             if Nkind (Item) = N_Use_Package_Clause then
2948
2949                --  Traverse the list of packages
2950
2951                Nam := First (Names (Item));
2952
2953                while Present (Nam) loop
2954                   E := Entity (Nam);
2955
2956                   pragma Assert (Present (Parent (E)));
2957
2958                   if Nkind (Parent (E))
2959                     = N_Package_Renaming_Declaration
2960                     and then Renamed_Entity (E) = WEnt
2961                   then
2962                      Error_Msg_N ("unlimited view visible through "
2963                                   & "use_clause + renamings", W);
2964                      return;
2965
2966                   elsif Nkind (Parent (E)) = N_Package_Specification then
2967
2968                      --  The use clause may refer to a local package.
2969                      --  Check all the enclosing scopes.
2970
2971                      E2 := E;
2972                      while E2 /= Standard_Standard
2973                        and then E2 /= WEnt loop
2974                         E2 := Scope (E2);
2975                      end loop;
2976
2977                      if E2 = WEnt then
2978                         Error_Msg_N ("unlimited view visible through "
2979                                      & "use_clause ", W);
2980                         return;
2981                      end if;
2982
2983                   end if;
2984                   Next (Nam);
2985                end loop;
2986
2987             end if;
2988
2989             Next (Item);
2990          end loop;
2991
2992          --  Recursive call to check all the ancestors
2993
2994          if Is_Child_Spec (Unit (P)) then
2995             Check_Parent (P => Parent_Spec (Unit (P)), W => W);
2996          end if;
2997       end Check_Parent;
2998
2999       ---------------------------------------
3000       -- Check_Private_Limited_Withed_Unit --
3001       ---------------------------------------
3002
3003       procedure Check_Private_Limited_Withed_Unit (N : Node_Id) is
3004          C     : Node_Id;
3005          P     : Node_Id;
3006          Found : Boolean := False;
3007
3008       begin
3009          --  If the current compilation unit is not private we don't
3010          --  need to check anything else.
3011
3012          if not Private_Present (Parent (N)) then
3013             Found := False;
3014
3015          else
3016             --  Compilation unit of the parent of the withed library unit
3017
3018             P := Parent_Spec (Unit (Library_Unit (N)));
3019
3020             --  Traverse all the ancestors of the current compilation
3021             --  unit to check if it is a descendant of named library unit.
3022
3023             C := Parent (N);
3024             while Present (Parent_Spec (Unit (C))) loop
3025                C := Parent_Spec (Unit (C));
3026
3027                if C = P then
3028                   Found := True;
3029                   exit;
3030                end if;
3031             end loop;
3032          end if;
3033
3034          if not Found then
3035             Error_Msg_N ("current unit is not a private descendant"
3036                          & " of the withed unit ('R'M 10.1.2(8)", N);
3037          end if;
3038       end Check_Private_Limited_Withed_Unit;
3039
3040       -----------------------
3041       -- Check_Withed_Unit --
3042       -----------------------
3043
3044       procedure Check_Withed_Unit (W : Node_Id) is
3045          Item : Node_Id;
3046
3047       begin
3048          --  A limited with_clause can not appear in the same context_clause
3049          --  as a nonlimited with_clause which mentions the same library.
3050
3051          Item := First (Context_Items (N));
3052          while Present (Item) loop
3053             if Nkind (Item) = N_With_Clause
3054               and then not Limited_Present (Item)
3055               and then not Implicit_With (Item)
3056               and then Library_Unit (Item) = Library_Unit (W)
3057             then
3058                Error_Msg_N ("limited and unlimited view "
3059                             & "not allowed in the same context clauses", W);
3060                return;
3061             end if;
3062
3063             Next (Item);
3064          end loop;
3065       end Check_Withed_Unit;
3066
3067    --  Start of processing for Install_Limited_Context_Clauses
3068
3069    begin
3070       Item := First (Context_Items (N));
3071       while Present (Item) loop
3072          if Nkind (Item) = N_With_Clause
3073            and then Limited_Present (Item)
3074          then
3075             Check_Withed_Unit (Item);
3076
3077             if Private_Present (Library_Unit (Item)) then
3078                Check_Private_Limited_Withed_Unit (Item);
3079             end if;
3080
3081             if Is_Child_Spec (Unit (N)) then
3082                Check_Parent (Parent_Spec (Unit (N)), Item);
3083             end if;
3084
3085             Install_Limited_Withed_Unit (Item);
3086          end if;
3087
3088          Next (Item);
3089       end loop;
3090    end Install_Limited_Context_Clauses;
3091
3092    ---------------------
3093    -- Install_Parents --
3094    ---------------------
3095
3096    procedure Install_Parents (Lib_Unit : Node_Id; Is_Private : Boolean) is
3097       P      : Node_Id;
3098       E_Name : Entity_Id;
3099       P_Name : Entity_Id;
3100       P_Spec : Node_Id;
3101
3102    begin
3103       P := Unit (Parent_Spec (Lib_Unit));
3104       P_Name := Get_Parent_Entity (P);
3105
3106       if Etype (P_Name) = Any_Type then
3107          return;
3108       end if;
3109
3110       if Ekind (P_Name) = E_Generic_Package
3111         and then Nkind (Lib_Unit) /= N_Generic_Subprogram_Declaration
3112         and then Nkind (Lib_Unit) /= N_Generic_Package_Declaration
3113         and then Nkind (Lib_Unit) not in N_Generic_Renaming_Declaration
3114       then
3115          Error_Msg_N
3116            ("child of a generic package must be a generic unit", Lib_Unit);
3117
3118       elsif not Is_Package (P_Name) then
3119          Error_Msg_N
3120            ("parent unit must be package or generic package", Lib_Unit);
3121          raise Unrecoverable_Error;
3122
3123       elsif Present (Renamed_Object (P_Name)) then
3124          Error_Msg_N ("parent unit cannot be a renaming", Lib_Unit);
3125          raise Unrecoverable_Error;
3126
3127       --  Verify that a child of an instance is itself an instance, or
3128       --  the renaming of one. Given that an instance that is a unit is
3129       --  replaced with a package declaration, check against the original
3130       --  node.
3131
3132       elsif Nkind (Original_Node (P)) = N_Package_Instantiation
3133         and then Nkind (Lib_Unit)
3134                    not in N_Renaming_Declaration
3135         and then Nkind (Original_Node (Lib_Unit))
3136                    not in N_Generic_Instantiation
3137       then
3138          Error_Msg_N
3139            ("child of an instance must be an instance or renaming", Lib_Unit);
3140       end if;
3141
3142       --  This is the recursive call that ensures all parents are loaded
3143
3144       if Is_Child_Spec (P) then
3145          Install_Parents (P,
3146            Is_Private or else Private_Present (Parent (Lib_Unit)));
3147       end if;
3148
3149       --  Now we can install the context for this parent
3150
3151       Install_Context_Clauses (Parent_Spec (Lib_Unit));
3152       Install_Siblings (P_Name, Parent (Lib_Unit));
3153
3154       --  The child unit is in the declarative region of the parent. The
3155       --  parent must therefore appear in the scope stack and be visible,
3156       --  as when compiling the corresponding body. If the child unit is
3157       --  private or it is a package body, private declarations must be
3158       --  accessible as well. Use declarations in the parent must also
3159       --  be installed. Finally, other child units of the same parent that
3160       --  are in the context are immediately visible.
3161
3162       --  Find entity for compilation unit, and set its private descendant
3163       --  status as needed.
3164
3165       E_Name := Defining_Entity (Lib_Unit);
3166
3167       Set_Is_Child_Unit (E_Name);
3168
3169       Set_Is_Private_Descendant (E_Name,
3170          Is_Private_Descendant (P_Name)
3171            or else Private_Present (Parent (Lib_Unit)));
3172
3173       P_Spec := Specification (Unit_Declaration_Node (P_Name));
3174       New_Scope (P_Name);
3175
3176       --  Save current visibility of unit
3177
3178       Scope_Stack.Table (Scope_Stack.Last).Previous_Visibility :=
3179         Is_Immediately_Visible (P_Name);
3180       Set_Is_Immediately_Visible (P_Name);
3181       Install_Visible_Declarations (P_Name);
3182       Set_Use (Visible_Declarations (P_Spec));
3183
3184       --  If the parent is a generic unit, its formal part may contain
3185       --  formal packages and use clauses for them.
3186
3187       if Ekind (P_Name) = E_Generic_Package then
3188          Set_Use (Generic_Formal_Declarations (Parent (P_Spec)));
3189       end if;
3190
3191       if Is_Private
3192         or else Private_Present (Parent (Lib_Unit))
3193       then
3194          Install_Private_Declarations (P_Name);
3195          Install_Private_With_Clauses (P_Name);
3196          Set_Use (Private_Declarations (P_Spec));
3197       end if;
3198    end Install_Parents;
3199
3200    ----------------------------------
3201    -- Install_Private_With_Clauses --
3202    ----------------------------------
3203
3204    procedure Install_Private_With_Clauses (P : Entity_Id) is
3205       Decl   : constant Node_Id := Unit_Declaration_Node (P);
3206       Item   : Node_Id;
3207
3208    begin
3209       if Debug_Flag_I then
3210          Write_Str ("install private with clauses of ");
3211          Write_Name (Chars (P));
3212          Write_Eol;
3213       end if;
3214
3215       if Nkind (Parent (Decl)) = N_Compilation_Unit then
3216          Item := First (Context_Items (Parent (Decl)));
3217
3218          while Present (Item) loop
3219             if Nkind (Item) = N_With_Clause
3220               and then Private_Present (Item)
3221             then
3222                if Limited_Present (Item) then
3223                   Install_Limited_Withed_Unit (Item);
3224                else
3225                   Install_Withed_Unit (Item, Private_With_OK => True);
3226                end if;
3227             end if;
3228
3229             Next (Item);
3230          end loop;
3231       end if;
3232    end Install_Private_With_Clauses;
3233
3234    ----------------------
3235    -- Install_Siblings --
3236    ----------------------
3237
3238    procedure Install_Siblings (U_Name : Entity_Id; N : Node_Id) is
3239       Item : Node_Id;
3240       Id   : Entity_Id;
3241       Prev : Entity_Id;
3242    begin
3243       --  Iterate over explicit with clauses, and check whether the
3244       --  scope of each entity is an ancestor of the current unit.
3245
3246       Item := First (Context_Items (N));
3247       while Present (Item) loop
3248          if Nkind (Item) = N_With_Clause
3249            and then not Implicit_With (Item)
3250            and then not Limited_Present (Item)
3251          then
3252             Id := Entity (Name (Item));
3253
3254             if Is_Child_Unit (Id)
3255               and then Is_Ancestor_Package (Scope (Id), U_Name)
3256             then
3257                Set_Is_Immediately_Visible (Id);
3258
3259                --  Check for the presence of another unit in the context,
3260                --  that may be inadvertently hidden by the child.
3261
3262                Prev := Current_Entity (Id);
3263
3264                if Present (Prev)
3265                  and then Is_Immediately_Visible (Prev)
3266                  and then not Is_Child_Unit (Prev)
3267                then
3268                   declare
3269                      Clause : Node_Id;
3270
3271                   begin
3272                      Clause := First (Context_Items (N));
3273
3274                      while Present (Clause) loop
3275                         if Nkind (Clause) = N_With_Clause
3276                           and then Entity (Name (Clause)) = Prev
3277                         then
3278                            Error_Msg_NE
3279                               ("child unit& hides compilation unit " &
3280                                "with the same name?",
3281                                  Name (Item), Id);
3282                            exit;
3283                         end if;
3284
3285                         Next (Clause);
3286                      end loop;
3287                   end;
3288                end if;
3289
3290             --  the With_Clause may be on a grand-child, which makes
3291             --  the child immediately visible.
3292
3293             elsif Is_Child_Unit (Scope (Id))
3294               and then Is_Ancestor_Package (Scope (Scope (Id)), U_Name)
3295             then
3296                Set_Is_Immediately_Visible (Scope (Id));
3297             end if;
3298          end if;
3299
3300          Next (Item);
3301       end loop;
3302    end Install_Siblings;
3303
3304    -------------------------------
3305    -- Install_Limited_With_Unit --
3306    -------------------------------
3307
3308    procedure Install_Limited_Withed_Unit (N : Node_Id) is
3309       Unum             : constant Unit_Number_Type :=
3310                            Get_Source_Unit (Library_Unit (N));
3311       P_Unit           : constant Entity_Id := Unit (Library_Unit (N));
3312       P                : Entity_Id;
3313       Is_Child_Package : Boolean := False;
3314
3315       Lim_Header       : Entity_Id;
3316       Lim_Typ          : Entity_Id;
3317
3318       function In_Chain (E : Entity_Id) return Boolean;
3319       --  Check that the shadow entity is not already in the homonym
3320       --  chain, for example through a limited_with clause in a parent unit.
3321
3322       --------------
3323       -- In_Chain --
3324       --------------
3325
3326       function In_Chain (E : Entity_Id) return Boolean is
3327          H : Entity_Id := Current_Entity (E);
3328
3329       begin
3330          while Present (H) loop
3331             if H = E then
3332                return True;
3333             else
3334                H := Homonym (H);
3335             end if;
3336          end loop;
3337
3338          return False;
3339       end In_Chain;
3340
3341    --  Start of processing for Install_Limited_Withed_Unit
3342
3343    begin
3344       --  In case of limited with_clause on subprograms, generics, instances,
3345       --  or generic renamings, the corresponding error was previously posted
3346       --  and we have nothing to do here.
3347
3348       case Nkind (P_Unit) is
3349
3350          when N_Package_Declaration =>
3351             null;
3352
3353          when N_Subprogram_Declaration                 |
3354               N_Generic_Package_Declaration            |
3355               N_Generic_Subprogram_Declaration         |
3356               N_Package_Instantiation                  |
3357               N_Function_Instantiation                 |
3358               N_Procedure_Instantiation                |
3359               N_Generic_Package_Renaming_Declaration   |
3360               N_Generic_Procedure_Renaming_Declaration |
3361               N_Generic_Function_Renaming_Declaration =>
3362             return;
3363
3364          when others =>
3365             raise Program_Error;
3366       end case;
3367
3368       P := Defining_Unit_Name (Specification (P_Unit));
3369
3370       if Nkind (P) = N_Defining_Program_Unit_Name then
3371
3372          --  Retrieve entity of child package
3373
3374          Is_Child_Package := True;
3375          P := Defining_Identifier (P);
3376       end if;
3377
3378       --  A common usage of the limited-with is to have a limited-with
3379       --  in the package spec, and a normal with in its package body.
3380       --  For example:
3381
3382       --       limited with X;  -- [1]
3383       --       package A is ...
3384
3385       --       with X;          -- [2]
3386       --       package body A is ...
3387
3388       --  The compilation of A's body installs the entities of its
3389       --  withed packages (the context clauses found at [2]) and
3390       --  then the context clauses of its specification (found at [1]).
3391
3392       --  As a consequence, at point [1] the specification of X has been
3393       --  analyzed and it is immediately visible. According to the semantics
3394       --  of the limited-with context clauses we don't install the limited
3395       --  view because the full view of X supersedes its limited view.
3396
3397       if Analyzed (Cunit (Unum))
3398         and then (Is_Immediately_Visible (P)
3399                    or else (Is_Child_Package
3400                              and then Is_Visible_Child_Unit (P)))
3401       then
3402          --  Ada 2005 (AI-262): Install the private declarations of P
3403
3404          if Private_Present (N)
3405            and then not In_Private_Part (P)
3406          then
3407             declare
3408                Id : Entity_Id;
3409             begin
3410                Id := First_Private_Entity (P);
3411
3412                while Present (Id) loop
3413                   if not Is_Internal (Id)
3414                     and then not Is_Child_Unit (Id)
3415                   then
3416                      if not In_Chain (Id) then
3417                         Set_Homonym (Id, Current_Entity (Id));
3418                         Set_Current_Entity (Id);
3419                      end if;
3420
3421                      Set_Is_Immediately_Visible (Id);
3422                   end if;
3423
3424                   Next_Entity (Id);
3425                end loop;
3426
3427                Set_In_Private_Part (P);
3428             end;
3429          end if;
3430
3431          return;
3432       end if;
3433
3434       if Debug_Flag_I then
3435          Write_Str ("install limited view of ");
3436          Write_Name (Chars (P));
3437          Write_Eol;
3438       end if;
3439
3440       if not Analyzed (Cunit (Unum)) then
3441          Set_Ekind (P, E_Package);
3442          Set_Etype (P, Standard_Void_Type);
3443          Set_Scope (P, Standard_Standard);
3444
3445          --  Place entity on visibility structure
3446
3447          if Current_Entity (P) /= P then
3448             Set_Homonym (P, Current_Entity (P));
3449             Set_Current_Entity (P);
3450
3451             if Debug_Flag_I then
3452                Write_Str ("   (homonym) chain ");
3453                Write_Name (Chars (P));
3454                Write_Eol;
3455             end if;
3456
3457          end if;
3458
3459          if Is_Child_Package then
3460             Set_Is_Child_Unit (P);
3461             Set_Is_Visible_Child_Unit (P);
3462
3463             declare
3464                Parent_Comp : Node_Id;
3465                Parent_Id   : Entity_Id;
3466
3467             begin
3468                Parent_Comp := Parent_Spec (Unit (Cunit (Unum)));
3469                Parent_Id   := Defining_Entity (Unit (Parent_Comp));
3470
3471                Set_Scope (P, Parent_Id);
3472             end;
3473          end if;
3474
3475       else
3476
3477          --  If the unit appears in a previous regular with_clause, the
3478          --  regular entities must be unchained before the shadow ones
3479          --  are made accessible.
3480
3481          declare
3482             Ent : Entity_Id;
3483          begin
3484             Ent := First_Entity (P);
3485
3486             while Present (Ent) loop
3487                Unchain (Ent);
3488                Next_Entity (Ent);
3489             end loop;
3490          end;
3491
3492       end if;
3493
3494       --  The package must be visible while the with_type clause is active,
3495       --  because references to the type P.T must resolve in the usual way.
3496
3497       Set_Is_Immediately_Visible (P);
3498
3499       --  Install each incomplete view. The first element of the limited view
3500       --  is a header (an E_Package entity) that is used to reference the first
3501       --  shadow entity in the private part of the package
3502
3503       Lim_Header := Limited_View (P);
3504       Lim_Typ    := First_Entity (Lim_Header);
3505
3506       while Present (Lim_Typ) loop
3507
3508          exit when not Private_Present (N)
3509                         and then Lim_Typ = First_Private_Entity (Lim_Header);
3510
3511          if not In_Chain (Lim_Typ) then
3512             Set_Homonym (Lim_Typ, Current_Entity (Lim_Typ));
3513             Set_Current_Entity (Lim_Typ);
3514
3515             if Debug_Flag_I then
3516                Write_Str ("   (homonym) chain ");
3517                Write_Name (Chars (Lim_Typ));
3518                Write_Eol;
3519             end if;
3520          end if;
3521
3522          Next_Entity (Lim_Typ);
3523       end loop;
3524
3525       --  The context clause has installed a limited-view, mark it
3526       --  accordingly, to uninstall it when the context is removed.
3527
3528       Set_Limited_View_Installed (N);
3529       Set_From_With_Type (P);
3530    end Install_Limited_Withed_Unit;
3531
3532    -------------------------
3533    -- Install_Withed_Unit --
3534    -------------------------
3535
3536    procedure Install_Withed_Unit
3537      (With_Clause     : Node_Id;
3538       Private_With_OK : Boolean := False)
3539    is
3540       Uname : constant Entity_Id := Entity (Name (With_Clause));
3541       P     : constant Entity_Id := Scope (Uname);
3542
3543    begin
3544       --  Ada 2005 (AI-262): Do not install the private withed unit if we are
3545       --  compiling a package declaration and the Private_With_OK flag was not
3546       --  set by the caller. These declarations will be installed later (before
3547       --  analyzing the private part of the package).
3548
3549       if Private_Present (With_Clause)
3550         and then Nkind (Cunit (Current_Sem_Unit)) = N_Package_Declaration
3551         and then not (Private_With_OK)
3552       then
3553          return;
3554       end if;
3555
3556       if Debug_Flag_I then
3557          if Private_Present (With_Clause) then
3558             Write_Str ("install private withed unit ");
3559          else
3560             Write_Str ("install withed unit ");
3561          end if;
3562
3563          Write_Name (Chars (Uname));
3564          Write_Eol;
3565       end if;
3566
3567       --  We do not apply the restrictions to an internal unit unless
3568       --  we are compiling the internal unit as a main unit. This check
3569       --  is also skipped for dummy units (for missing packages).
3570
3571       if Sloc (Uname) /= No_Location
3572         and then (not Is_Internal_File_Name (Unit_File_Name (Current_Sem_Unit))
3573                     or else Current_Sem_Unit = Main_Unit)
3574       then
3575          Check_Restricted_Unit
3576            (Unit_Name (Get_Source_Unit (Uname)), With_Clause);
3577       end if;
3578
3579       if P /= Standard_Standard then
3580
3581          --  If the unit is not analyzed after analysis of the with clause,
3582          --  and it is an instantiation, then it awaits a body and is the main
3583          --  unit. Its appearance in the context of some other unit indicates
3584          --  a circular dependency (DEC suite perversity).
3585
3586          if not Analyzed (Uname)
3587            and then Nkind (Parent (Uname)) = N_Package_Instantiation
3588          then
3589             Error_Msg_N
3590               ("instantiation depends on itself", Name (With_Clause));
3591
3592          elsif not Is_Visible_Child_Unit (Uname) then
3593             Set_Is_Visible_Child_Unit (Uname);
3594
3595             if Is_Generic_Instance (Uname)
3596               and then Ekind (Uname) in Subprogram_Kind
3597             then
3598                --  Set flag as well on the visible entity that denotes the
3599                --  instance, which renames the current one.
3600
3601                Set_Is_Visible_Child_Unit
3602                  (Related_Instance
3603                    (Defining_Entity (Unit (Library_Unit (With_Clause)))));
3604             end if;
3605
3606             --  The parent unit may have been installed already, and
3607             --  may have appeared in a use clause.
3608
3609             if In_Use (Scope (Uname)) then
3610                Set_Is_Potentially_Use_Visible (Uname);
3611             end if;
3612
3613             Set_Context_Installed (With_Clause);
3614          end if;
3615
3616       elsif not Is_Immediately_Visible (Uname) then
3617          if not Private_Present (With_Clause)
3618            or else Private_With_OK
3619          then
3620             Set_Is_Immediately_Visible (Uname);
3621          end if;
3622
3623          Set_Context_Installed (With_Clause);
3624       end if;
3625
3626       --   A with-clause overrides a with-type clause: there are no restric-
3627       --   tions on the use of package entities.
3628
3629       if Ekind (Uname) = E_Package then
3630          Set_From_With_Type (Uname, False);
3631       end if;
3632
3633       --  Ada 2005 (AI-377): it is illegal for a with_clause to name a child
3634       --  unit if there is a visible homograph for it declared in the same
3635       --  declarative region. This pathological case can only arise when an
3636       --  instance I1 of a generic unit G1 has an explicit child unit I1.G2,
3637       --  G1 has a generic child also named G2, and the context includes with_
3638       --  clauses for both I1.G2 and for G1.G2, making an implicit declaration
3639       --  of I1.G2 visible as well.
3640
3641       if Is_Child_Unit (Uname)
3642         and then Is_Visible_Child_Unit (Uname)
3643         and then Ada_Version >= Ada_05
3644       then
3645          declare
3646             Decl1 : constant Node_Id  := Unit_Declaration_Node (P);
3647             Decl2 : Node_Id;
3648             P2    : Entity_Id;
3649             U2    : Entity_Id;
3650
3651          begin
3652             U2 := Homonym (Uname);
3653             while Present (U2) loop
3654                P2 := Scope (U2);
3655                Decl2  := Unit_Declaration_Node (P2);
3656
3657                if Is_Child_Unit (U2)
3658                  and then Is_Visible_Child_Unit (U2)
3659                then
3660                   if Is_Generic_Instance (P)
3661                     and then Nkind (Decl1) = N_Package_Declaration
3662                     and then Generic_Parent (Specification (Decl1)) = P2
3663                   then
3664                      Error_Msg_N ("illegal with_clause", With_Clause);
3665                      Error_Msg_N
3666                        ("\child unit has visible homograph" &
3667                            " ('R'M 8.3(26), 10.1.1(19))",
3668                          With_Clause);
3669                      exit;
3670
3671                   elsif Is_Generic_Instance (P2)
3672                     and then Nkind (Decl2) = N_Package_Declaration
3673                     and then Generic_Parent (Specification (Decl2)) = P
3674                   then
3675                      --  With_clause for child unit of instance appears before
3676                      --  in the context. We want to place the error message on
3677                      --  it, not on the generic child unit itself.
3678
3679                      declare
3680                         Prev_Clause : Node_Id;
3681
3682                      begin
3683                         Prev_Clause := First (List_Containing (With_Clause));
3684                         while Entity (Name (Prev_Clause)) /= U2 loop
3685                            Next (Prev_Clause);
3686                         end loop;
3687
3688                         pragma Assert (Present (Prev_Clause));
3689                         Error_Msg_N ("illegal with_clause", Prev_Clause);
3690                         Error_Msg_N
3691                           ("\child unit has visible homograph" &
3692                               " ('R'M 8.3(26), 10.1.1(19))",
3693                             Prev_Clause);
3694                         exit;
3695                      end;
3696                   end if;
3697                end if;
3698
3699                U2 := Homonym (U2);
3700             end loop;
3701          end;
3702       end if;
3703    end Install_Withed_Unit;
3704
3705    -------------------
3706    -- Is_Child_Spec --
3707    -------------------
3708
3709    function Is_Child_Spec (Lib_Unit : Node_Id) return Boolean is
3710       K : constant Node_Kind := Nkind (Lib_Unit);
3711
3712    begin
3713       return (K in N_Generic_Declaration              or else
3714               K in N_Generic_Instantiation            or else
3715               K in N_Generic_Renaming_Declaration     or else
3716               K =  N_Package_Declaration              or else
3717               K =  N_Package_Renaming_Declaration     or else
3718               K =  N_Subprogram_Declaration           or else
3719               K =  N_Subprogram_Renaming_Declaration)
3720         and then Present (Parent_Spec (Lib_Unit));
3721    end Is_Child_Spec;
3722
3723    -----------------------
3724    -- Load_Needed_Body --
3725    -----------------------
3726
3727    --  N is a generic unit named in a with clause, or else it is
3728    --  a unit that contains a generic unit or an inlined function.
3729    --  In order to perform an instantiation, the body of the unit
3730    --  must be present. If the unit itself is generic, we assume
3731    --  that an instantiation follows, and  load and analyze the body
3732    --  unconditionally. This forces analysis of the spec as well.
3733
3734    --  If the unit is not generic, but contains a generic unit, it
3735    --  is loaded on demand, at the point of instantiation (see ch12).
3736
3737    procedure Load_Needed_Body (N : Node_Id; OK : out Boolean) is
3738       Body_Name : Unit_Name_Type;
3739       Unum      : Unit_Number_Type;
3740
3741       Save_Style_Check : constant Boolean := Opt.Style_Check;
3742       --  The loading and analysis is done with style checks off
3743
3744    begin
3745       if not GNAT_Mode then
3746          Style_Check := False;
3747       end if;
3748
3749       Body_Name := Get_Body_Name (Get_Unit_Name (Unit (N)));
3750       Unum :=
3751         Load_Unit
3752           (Load_Name  => Body_Name,
3753            Required   => False,
3754            Subunit    => False,
3755            Error_Node => N,
3756            Renamings  => True);
3757
3758       if Unum = No_Unit then
3759          OK := False;
3760
3761       else
3762          Compiler_State := Analyzing; -- reset after load
3763
3764          if not Fatal_Error (Unum) or else Try_Semantics then
3765             if Debug_Flag_L then
3766                Write_Str ("*** Loaded generic body");
3767                Write_Eol;
3768             end if;
3769
3770             Semantics (Cunit (Unum));
3771          end if;
3772
3773          OK := True;
3774       end if;
3775
3776       Style_Check := Save_Style_Check;
3777    end Load_Needed_Body;
3778
3779    -------------------------
3780    -- Build_Limited_Views --
3781    -------------------------
3782
3783    procedure Build_Limited_Views (N : Node_Id) is
3784       Unum : constant Unit_Number_Type := Get_Source_Unit (Library_Unit (N));
3785       P    : constant Entity_Id        := Cunit_Entity (Unum);
3786
3787       Spec        : Node_Id;            --  To denote a package specification
3788       Lim_Typ     : Entity_Id;          --  To denote shadow entities
3789       Comp_Typ    : Entity_Id;          --  To denote real entities
3790
3791       Lim_Header  : Entity_Id;          --  Package entity
3792       Last_Lim_E  : Entity_Id := Empty; --  Last limited entity built
3793       Last_Pub_Lim_E : Entity_Id;       --  To set the first private entity
3794
3795       procedure Decorate_Incomplete_Type
3796         (E    : Entity_Id;
3797          Scop : Entity_Id);
3798       --  Add attributes of an incomplete type to a shadow entity. The same
3799       --  attributes are placed on the real entity, so that gigi receives
3800       --  a consistent view.
3801
3802       procedure Decorate_Package_Specification (P : Entity_Id);
3803       --  Add attributes of a package entity to the entity in a package
3804       --  declaration
3805
3806       procedure Decorate_Tagged_Type
3807         (Loc  : Source_Ptr;
3808          T    : Entity_Id;
3809          Scop : Entity_Id);
3810       --  Set basic attributes of tagged type T, including its class_wide type.
3811       --  The parameters Loc, Scope are used to decorate the class_wide type.
3812
3813       procedure Build_Chain
3814         (Scope      : Entity_Id;
3815          First_Decl : Node_Id);
3816       --  Construct list of shadow entities and attach it to entity of
3817       --  package that is mentioned in a limited_with clause.
3818
3819       function New_Internal_Shadow_Entity
3820         (Kind       : Entity_Kind;
3821          Sloc_Value : Source_Ptr;
3822          Id_Char    : Character) return Entity_Id;
3823       --  Build a new internal entity and append it to the list of shadow
3824       --  entities available through the limited-header
3825
3826       ------------------------------
3827       -- Decorate_Incomplete_Type --
3828       ------------------------------
3829
3830       procedure Decorate_Incomplete_Type
3831         (E    : Entity_Id;
3832          Scop : Entity_Id)
3833       is
3834       begin
3835          Set_Ekind             (E, E_Incomplete_Type);
3836          Set_Scope             (E, Scop);
3837          Set_Etype             (E, E);
3838          Set_Is_First_Subtype  (E, True);
3839          Set_Stored_Constraint (E, No_Elist);
3840          Set_Full_View         (E, Empty);
3841          Init_Size_Align       (E);
3842       end Decorate_Incomplete_Type;
3843
3844       --------------------------
3845       -- Decorate_Tagged_Type --
3846       --------------------------
3847
3848       procedure Decorate_Tagged_Type
3849         (Loc  : Source_Ptr;
3850          T    : Entity_Id;
3851          Scop : Entity_Id)
3852       is
3853          CW : Entity_Id;
3854
3855       begin
3856          Decorate_Incomplete_Type (T, Scop);
3857          Set_Is_Tagged_Type (T);
3858
3859          --  Build corresponding class_wide type, if not previously done
3860
3861          if No (Class_Wide_Type (T)) then
3862             CW := Make_Defining_Identifier (Loc,  New_Internal_Name ('S'));
3863
3864             Set_Ekind                     (CW, E_Class_Wide_Type);
3865             Set_Etype                     (CW, T);
3866             Set_Scope                     (CW, Scop);
3867             Set_Is_Tagged_Type            (CW);
3868             Set_Is_First_Subtype          (CW, True);
3869             Init_Size_Align               (CW);
3870             Set_Has_Unknown_Discriminants (CW, True);
3871             Set_Class_Wide_Type           (CW, CW);
3872             Set_Equivalent_Type           (CW, Empty);
3873             Set_From_With_Type            (CW, From_With_Type (T));
3874
3875             Set_Class_Wide_Type           (T, CW);
3876          end if;
3877       end Decorate_Tagged_Type;
3878
3879       ------------------------------------
3880       -- Decorate_Package_Specification --
3881       ------------------------------------
3882
3883       procedure Decorate_Package_Specification (P : Entity_Id) is
3884       begin
3885          --  Place only the most basic attributes
3886
3887          Set_Ekind (P, E_Package);
3888          Set_Etype (P, Standard_Void_Type);
3889       end Decorate_Package_Specification;
3890
3891       -------------------------
3892       -- New_Internal_Entity --
3893       -------------------------
3894
3895       function New_Internal_Shadow_Entity
3896         (Kind       : Entity_Kind;
3897          Sloc_Value : Source_Ptr;
3898          Id_Char    : Character) return Entity_Id
3899       is
3900          E : constant Entity_Id :=
3901                Make_Defining_Identifier (Sloc_Value,
3902                  Chars => New_Internal_Name (Id_Char));
3903
3904       begin
3905          Set_Ekind       (E, Kind);
3906          Set_Is_Internal (E, True);
3907
3908          if Kind in Type_Kind then
3909             Init_Size_Align (E);
3910          end if;
3911
3912          Append_Entity (E, Lim_Header);
3913          Last_Lim_E := E;
3914          return E;
3915       end New_Internal_Shadow_Entity;
3916
3917       -----------------
3918       -- Build_Chain --
3919       -----------------
3920
3921       procedure Build_Chain
3922         (Scope         : Entity_Id;
3923          First_Decl    : Node_Id)
3924       is
3925          Analyzed_Unit : constant Boolean := Analyzed (Cunit (Unum));
3926          Is_Tagged     : Boolean;
3927          Decl          : Node_Id;
3928
3929       begin
3930          Decl := First_Decl;
3931
3932          while Present (Decl) loop
3933
3934             --  For each library_package_declaration in the environment, there
3935             --  is an implicit declaration of a *limited view* of that library
3936             --  package. The limited view of a package contains:
3937             --
3938             --   * For each nested package_declaration, a declaration of the
3939             --     limited view of that package, with the same defining-
3940             --     program-unit name.
3941             --
3942             --   * For each type_declaration in the visible part, an incomplete
3943             --     type-declaration with the same defining_identifier, whose
3944             --     completion is the type_declaration. If the type_declaration
3945             --     is tagged, then the incomplete_type_declaration is tagged
3946             --     incomplete.
3947
3948             if Nkind (Decl) = N_Full_Type_Declaration then
3949                Is_Tagged :=
3950                   Nkind (Type_Definition (Decl)) = N_Record_Definition
3951                   and then Tagged_Present (Type_Definition (Decl));
3952
3953                Comp_Typ := Defining_Identifier (Decl);
3954
3955                if not Analyzed_Unit then
3956                   if Is_Tagged then
3957                      Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
3958                   else
3959                      Decorate_Incomplete_Type (Comp_Typ, Scope);
3960                   end if;
3961                end if;
3962
3963                --  Create shadow entity for type
3964
3965                Lim_Typ := New_Internal_Shadow_Entity
3966                  (Kind       => Ekind (Comp_Typ),
3967                   Sloc_Value => Sloc (Comp_Typ),
3968                   Id_Char    => 'Z');
3969
3970                Set_Chars  (Lim_Typ, Chars (Comp_Typ));
3971                Set_Parent (Lim_Typ, Parent (Comp_Typ));
3972                Set_From_With_Type (Lim_Typ);
3973
3974                if Is_Tagged then
3975                   Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
3976                else
3977                   Decorate_Incomplete_Type (Lim_Typ, Scope);
3978                end if;
3979
3980                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
3981
3982             elsif Nkind (Decl) = N_Private_Type_Declaration
3983               and then Tagged_Present (Decl)
3984             then
3985                Comp_Typ := Defining_Identifier (Decl);
3986
3987                if not Analyzed_Unit then
3988                   Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
3989                end if;
3990
3991                Lim_Typ  := New_Internal_Shadow_Entity
3992                  (Kind       => Ekind (Comp_Typ),
3993                   Sloc_Value => Sloc (Comp_Typ),
3994                   Id_Char    => 'Z');
3995
3996                Set_Chars  (Lim_Typ, Chars (Comp_Typ));
3997                Set_Parent (Lim_Typ, Parent (Comp_Typ));
3998                Set_From_With_Type (Lim_Typ);
3999
4000                Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
4001
4002                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
4003
4004             elsif Nkind (Decl) = N_Package_Declaration then
4005
4006                --  Local package
4007
4008                declare
4009                   Spec : constant Node_Id := Specification (Decl);
4010
4011                begin
4012                   Comp_Typ := Defining_Unit_Name (Spec);
4013
4014                   if not Analyzed (Cunit (Unum)) then
4015                      Decorate_Package_Specification (Comp_Typ);
4016                      Set_Scope (Comp_Typ, Scope);
4017                   end if;
4018
4019                   Lim_Typ  := New_Internal_Shadow_Entity
4020                     (Kind       => Ekind (Comp_Typ),
4021                      Sloc_Value => Sloc (Comp_Typ),
4022                      Id_Char    => 'Z');
4023
4024                   Decorate_Package_Specification (Lim_Typ);
4025                   Set_Scope (Lim_Typ, Scope);
4026
4027                   Set_Chars (Lim_Typ, Chars (Comp_Typ));
4028                   Set_Parent (Lim_Typ, Parent (Comp_Typ));
4029                   Set_From_With_Type (Lim_Typ);
4030
4031                   --  Note: The non_limited_view attribute is not used
4032                   --  for local packages.
4033
4034                   Build_Chain
4035                     (Scope      => Lim_Typ,
4036                      First_Decl => First (Visible_Declarations (Spec)));
4037                end;
4038             end if;
4039
4040             Next (Decl);
4041          end loop;
4042       end Build_Chain;
4043
4044    --  Start of processing for Build_Limited_Views
4045
4046    begin
4047       pragma Assert (Limited_Present (N));
4048
4049       --  A library_item mentioned in a limited_with_clause shall be
4050       --  a package_declaration, not a subprogram_declaration,
4051       --  generic_declaration, generic_instantiation, or
4052       --  package_renaming_declaration
4053
4054       case Nkind (Unit (Library_Unit (N))) is
4055
4056          when N_Package_Declaration =>
4057             null;
4058
4059          when N_Subprogram_Declaration =>
4060             Error_Msg_N ("subprograms not allowed in "
4061                          & "limited with_clauses", N);
4062             return;
4063
4064          when N_Generic_Package_Declaration |
4065               N_Generic_Subprogram_Declaration =>
4066             Error_Msg_N ("generics not allowed in "
4067                          & "limited with_clauses", N);
4068             return;
4069
4070          when N_Package_Instantiation |
4071               N_Function_Instantiation |
4072               N_Procedure_Instantiation =>
4073             Error_Msg_N ("generic instantiations not allowed in "
4074                          & "limited with_clauses", N);
4075             return;
4076
4077          when N_Generic_Package_Renaming_Declaration |
4078               N_Generic_Procedure_Renaming_Declaration |
4079               N_Generic_Function_Renaming_Declaration =>
4080             Error_Msg_N ("generic renamings not allowed in "
4081                          & "limited with_clauses", N);
4082             return;
4083
4084          when others =>
4085             raise Program_Error;
4086       end case;
4087
4088       --  Check if the chain is already built
4089
4090       Spec := Specification (Unit (Library_Unit (N)));
4091
4092       if Limited_View_Installed (Spec) then
4093          return;
4094       end if;
4095
4096       Set_Ekind (P, E_Package);
4097
4098       --  Build the header of the limited_view
4099
4100       Lim_Header := Make_Defining_Identifier (Sloc (N),
4101                       Chars => New_Internal_Name (Id_Char => 'Z'));
4102       Set_Ekind (Lim_Header, E_Package);
4103       Set_Is_Internal (Lim_Header);
4104       Set_Limited_View (P, Lim_Header);
4105
4106       --  Create the auxiliary chain. All the shadow entities are appended
4107       --  to the list of entities of the limited-view header
4108
4109       Build_Chain
4110         (Scope      => P,
4111          First_Decl => First (Visible_Declarations (Spec)));
4112
4113       --  Save the last built shadow entity. It is needed later to set the
4114       --  reference to the first shadow entity in the private part
4115
4116       Last_Pub_Lim_E := Last_Lim_E;
4117
4118       --  Ada 2005 (AI-262): Add the limited view of the private declarations
4119       --  Required to give support to limited-private-with clauses
4120
4121       Build_Chain (Scope      => P,
4122                    First_Decl => First (Private_Declarations (Spec)));
4123
4124       if Last_Pub_Lim_E /= Empty then
4125          Set_First_Private_Entity (Lim_Header,
4126                                    Next_Entity (Last_Pub_Lim_E));
4127       else
4128          Set_First_Private_Entity (Lim_Header,
4129                                    First_Entity (P));
4130       end if;
4131
4132       Set_Limited_View_Installed (Spec);
4133    end Build_Limited_Views;
4134
4135    -------------------------------
4136    -- Check_Body_Needed_For_SAL --
4137    -------------------------------
4138
4139    procedure Check_Body_Needed_For_SAL (Unit_Name : Entity_Id) is
4140
4141       function Entity_Needs_Body (E : Entity_Id) return Boolean;
4142       --  Determine whether use of entity E might require the presence
4143       --  of its body. For a package this requires a recursive traversal
4144       --  of all nested declarations.
4145
4146       ---------------------------
4147       -- Entity_Needed_For_SAL --
4148       ---------------------------
4149
4150       function Entity_Needs_Body (E : Entity_Id) return Boolean is
4151          Ent : Entity_Id;
4152
4153       begin
4154          if Is_Subprogram (E)
4155            and then Has_Pragma_Inline (E)
4156          then
4157             return True;
4158
4159          elsif Ekind (E) = E_Generic_Function
4160            or else Ekind (E) = E_Generic_Procedure
4161          then
4162             return True;
4163
4164          elsif Ekind (E) = E_Generic_Package
4165            and then
4166              Nkind (Unit_Declaration_Node (E)) = N_Generic_Package_Declaration
4167            and then Present (Corresponding_Body (Unit_Declaration_Node (E)))
4168          then
4169             return True;
4170
4171          elsif Ekind (E) = E_Package
4172            and then
4173              Nkind (Unit_Declaration_Node (E)) = N_Package_Declaration
4174            and then Present (Corresponding_Body (Unit_Declaration_Node (E)))
4175          then
4176             Ent := First_Entity (E);
4177
4178             while Present (Ent) loop
4179                if Entity_Needs_Body (Ent) then
4180                   return True;
4181                end if;
4182
4183                Next_Entity (Ent);
4184             end loop;
4185
4186             return False;
4187
4188          else
4189             return False;
4190          end if;
4191       end Entity_Needs_Body;
4192
4193    --  Start of processing for Check_Body_Needed_For_SAL
4194
4195    begin
4196       if Ekind (Unit_Name) = E_Generic_Package
4197         and then
4198           Nkind (Unit_Declaration_Node (Unit_Name)) =
4199                                             N_Generic_Package_Declaration
4200         and then
4201           Present (Corresponding_Body (Unit_Declaration_Node (Unit_Name)))
4202       then
4203          Set_Body_Needed_For_SAL (Unit_Name);
4204
4205       elsif Ekind (Unit_Name) = E_Generic_Procedure
4206         or else Ekind (Unit_Name) = E_Generic_Function
4207       then
4208          Set_Body_Needed_For_SAL (Unit_Name);
4209
4210       elsif Is_Subprogram (Unit_Name)
4211         and then Nkind (Unit_Declaration_Node (Unit_Name)) =
4212                                             N_Subprogram_Declaration
4213         and then Has_Pragma_Inline (Unit_Name)
4214       then
4215          Set_Body_Needed_For_SAL (Unit_Name);
4216
4217       elsif Ekind (Unit_Name) = E_Subprogram_Body then
4218          Check_Body_Needed_For_SAL
4219            (Corresponding_Spec (Unit_Declaration_Node (Unit_Name)));
4220
4221       elsif Ekind (Unit_Name) = E_Package
4222         and then Entity_Needs_Body (Unit_Name)
4223       then
4224          Set_Body_Needed_For_SAL (Unit_Name);
4225
4226       elsif Ekind (Unit_Name) = E_Package_Body
4227         and then Nkind (Unit_Declaration_Node (Unit_Name)) = N_Package_Body
4228       then
4229          Check_Body_Needed_For_SAL
4230            (Corresponding_Spec (Unit_Declaration_Node (Unit_Name)));
4231       end if;
4232    end Check_Body_Needed_For_SAL;
4233
4234    --------------------
4235    -- Remove_Context --
4236    --------------------
4237
4238    procedure Remove_Context (N : Node_Id) is
4239       Lib_Unit : constant Node_Id := Unit (N);
4240
4241    begin
4242       --  If this is a child unit, first remove the parent units
4243
4244       if Is_Child_Spec (Lib_Unit) then
4245          Remove_Parents (Lib_Unit);
4246       end if;
4247
4248       Remove_Context_Clauses (N);
4249    end Remove_Context;
4250
4251    ----------------------------
4252    -- Remove_Context_Clauses --
4253    ----------------------------
4254
4255    procedure Remove_Context_Clauses (N : Node_Id) is
4256       Item      : Node_Id;
4257       Unit_Name : Entity_Id;
4258
4259    begin
4260       --  Ada 2005 (AI-50217): We remove the context clauses in two phases:
4261       --  limited-views first and regular-views later (to maintain the
4262       --  stack model).
4263
4264       --  First Phase: Remove limited_with context clauses
4265
4266       Item := First (Context_Items (N));
4267       while Present (Item) loop
4268
4269          --  We are interested only in with clauses which got installed
4270          --  on entry.
4271
4272          if Nkind (Item) = N_With_Clause
4273            and then Limited_Present (Item)
4274            and then Limited_View_Installed (Item)
4275          then
4276             Remove_Limited_With_Clause (Item);
4277          end if;
4278
4279          Next (Item);
4280       end loop;
4281
4282       --  Second Phase: Loop through context items and undo regular
4283       --  with_clauses and use_clauses.
4284
4285       Item := First (Context_Items (N));
4286       while Present (Item) loop
4287
4288          --  We are interested only in with clauses which got installed
4289          --  on entry, as indicated by their Context_Installed flag set
4290
4291          if Nkind (Item) = N_With_Clause
4292            and then Limited_Present (Item)
4293            and then Limited_View_Installed (Item)
4294          then
4295             null;
4296
4297          elsif Nkind (Item) = N_With_Clause
4298             and then Context_Installed (Item)
4299          then
4300             --  Remove items from one with'ed unit
4301
4302             Unit_Name := Entity (Name (Item));
4303             Remove_Unit_From_Visibility (Unit_Name);
4304             Set_Context_Installed (Item, False);
4305
4306          elsif Nkind (Item) = N_Use_Package_Clause then
4307             End_Use_Package (Item);
4308
4309          elsif Nkind (Item) = N_Use_Type_Clause then
4310             End_Use_Type (Item);
4311
4312          elsif Nkind (Item) = N_With_Type_Clause then
4313             Remove_With_Type_Clause (Name (Item));
4314          end if;
4315
4316          Next (Item);
4317       end loop;
4318    end Remove_Context_Clauses;
4319
4320    --------------------------------
4321    -- Remove_Limited_With_Clause --
4322    --------------------------------
4323
4324    procedure Remove_Limited_With_Clause (N : Node_Id) is
4325       P_Unit     : constant Entity_Id := Unit (Library_Unit (N));
4326       P          : Entity_Id := Defining_Unit_Name (Specification (P_Unit));
4327       Lim_Typ    : Entity_Id;
4328
4329    begin
4330       if Nkind (P) = N_Defining_Program_Unit_Name then
4331
4332          --  Retrieve entity of Child package
4333
4334          P := Defining_Identifier (P);
4335       end if;
4336
4337       if Debug_Flag_I then
4338          Write_Str ("remove limited view of ");
4339          Write_Name (Chars (P));
4340          Write_Str (" from visibility");
4341          Write_Eol;
4342       end if;
4343
4344       --  Remove all shadow entities from visibility. The first element of the
4345       --  limited view is a header (an E_Package entity) that is used to
4346       --  reference the first shadow entity in the private part of the package
4347
4348       Lim_Typ    := First_Entity (Limited_View (P));
4349
4350       while Present (Lim_Typ) loop
4351          Unchain (Lim_Typ);
4352          Next_Entity (Lim_Typ);
4353       end loop;
4354
4355       --  Indicate that the limited view of the package is not installed
4356
4357       Set_From_With_Type (P, False);
4358       Set_Limited_View_Installed (N, False);
4359
4360       --  If the exporting package has previously been analyzed, it
4361       --  has appeared in the closure already and should be left alone.
4362       --  Otherwise, remove package itself from visibility.
4363
4364       if not Analyzed (P_Unit) then
4365          Unchain (P);
4366          Set_First_Entity (P, Empty);
4367          Set_Last_Entity (P, Empty);
4368          Set_Ekind (P, E_Void);
4369          Set_Scope (P, Empty);
4370          Set_Is_Immediately_Visible (P, False);
4371
4372       else
4373
4374          --  Reinstall visible entities (entities removed from visibility in
4375          --  Install_Limited_Withed to install the shadow entities).
4376
4377          declare
4378             Ent : Entity_Id;
4379
4380          begin
4381             Ent := First_Entity (P);
4382             while Present (Ent) and then Ent /= First_Private_Entity (P) loop
4383
4384                --  Shadow entities have not been added to the list of
4385                --  entities associated to the package spec. Therefore we
4386                --  just have to re-chain all its visible entities.
4387
4388                if not Is_Class_Wide_Type (Ent) then
4389
4390                   Set_Homonym (Ent, Current_Entity (Ent));
4391                   Set_Current_Entity (Ent);
4392
4393                   if Debug_Flag_I then
4394                      Write_Str ("   (homonym) chain ");
4395                      Write_Name (Chars (Ent));
4396                      Write_Eol;
4397                   end if;
4398                end if;
4399
4400                Next_Entity (Ent);
4401             end loop;
4402          end;
4403       end if;
4404    end Remove_Limited_With_Clause;
4405
4406    --------------------
4407    -- Remove_Parents --
4408    --------------------
4409
4410    procedure Remove_Parents (Lib_Unit : Node_Id) is
4411       P      : Node_Id;
4412       P_Name : Entity_Id;
4413       P_Spec : Node_Id := Empty;
4414       E      : Entity_Id;
4415       Vis    : constant Boolean :=
4416                  Scope_Stack.Table (Scope_Stack.Last).Previous_Visibility;
4417
4418    begin
4419       if Is_Child_Spec (Lib_Unit) then
4420          P_Spec := Parent_Spec (Lib_Unit);
4421
4422       elsif Nkind (Lib_Unit) = N_Package_Body
4423         and then Nkind (Original_Node (Lib_Unit)) = N_Package_Instantiation
4424       then
4425          P_Spec := Parent_Spec (Original_Node (Lib_Unit));
4426       end if;
4427
4428       if Present (P_Spec) then
4429
4430          P := Unit (P_Spec);
4431          P_Name := Get_Parent_Entity (P);
4432          Remove_Context_Clauses (P_Spec);
4433          End_Package_Scope (P_Name);
4434          Set_Is_Immediately_Visible (P_Name, Vis);
4435
4436          --  Remove from visibility the siblings as well, which are directly
4437          --  visible while the parent is in scope.
4438
4439          E := First_Entity (P_Name);
4440
4441          while Present (E) loop
4442
4443             if Is_Child_Unit (E) then
4444                Set_Is_Immediately_Visible (E, False);
4445             end if;
4446
4447             Next_Entity (E);
4448          end loop;
4449
4450          Set_In_Package_Body (P_Name, False);
4451
4452          --  This is the recursive call to remove the context of any
4453          --  higher level parent. This recursion ensures that all parents
4454          --  are removed in the reverse order of their installation.
4455
4456          Remove_Parents (P);
4457       end if;
4458    end Remove_Parents;
4459
4460    -----------------------------
4461    -- Remove_With_Type_Clause --
4462    -----------------------------
4463
4464    procedure Remove_With_Type_Clause (Name : Node_Id) is
4465       Typ : Entity_Id;
4466       P   : Entity_Id;
4467
4468       procedure Unchain (E : Entity_Id);
4469       --  Remove entity from visibility list
4470
4471       -------------
4472       -- Unchain --
4473       -------------
4474
4475       procedure Unchain (E : Entity_Id) is
4476          Prev : Entity_Id;
4477
4478       begin
4479          Prev := Current_Entity (E);
4480
4481          --  Package entity may appear is several with_type_clauses, and
4482          --  may have been removed already.
4483
4484          if No (Prev) then
4485             return;
4486
4487          elsif Prev = E then
4488             Set_Name_Entity_Id (Chars (E), Homonym (E));
4489
4490          else
4491             while Present (Prev)
4492               and then Homonym (Prev) /= E
4493             loop
4494                Prev := Homonym (Prev);
4495             end loop;
4496
4497             if Present (Prev) then
4498                Set_Homonym (Prev, Homonym (E));
4499             end if;
4500          end if;
4501       end Unchain;
4502
4503    --  Start of processing for Remove_With_Type_Clause
4504
4505    begin
4506       if Nkind (Name) = N_Selected_Component then
4507          Typ := Entity (Selector_Name (Name));
4508
4509          --  If no Typ, then error in declaration, ignore
4510
4511          if No (Typ) then
4512             return;
4513          end if;
4514       else
4515          return;
4516       end if;
4517
4518       P := Scope (Typ);
4519
4520       --  If the exporting package has been analyzed, it has appeared in the
4521       --  context already and should be left alone. Otherwise, remove from
4522       --  visibility.
4523
4524       if not Analyzed (Unit_Declaration_Node (P)) then
4525          Unchain (P);
4526          Unchain (Typ);
4527          Set_Is_Frozen (Typ, False);
4528       end if;
4529
4530       if Ekind (Typ) = E_Record_Type then
4531          Set_From_With_Type (Class_Wide_Type (Typ), False);
4532          Set_From_With_Type (Typ, False);
4533       end if;
4534
4535       Set_From_With_Type (P, False);
4536
4537       --  If P is a child unit, remove parents as well
4538
4539       P := Scope (P);
4540
4541       while Present (P)
4542         and then P /= Standard_Standard
4543       loop
4544          Set_From_With_Type (P, False);
4545
4546          if not Analyzed (Unit_Declaration_Node (P)) then
4547             Unchain (P);
4548          end if;
4549
4550          P := Scope (P);
4551       end loop;
4552
4553       --  The back-end needs to know that an access type is imported, so it
4554       --  does not need elaboration and can appear in a mutually recursive
4555       --  record definition, so the imported flag on an access  type is
4556       --  preserved.
4557
4558    end Remove_With_Type_Clause;
4559
4560    ---------------------------------
4561    -- Remove_Unit_From_Visibility --
4562    ---------------------------------
4563
4564    procedure Remove_Unit_From_Visibility (Unit_Name : Entity_Id) is
4565       P : constant Entity_Id := Scope (Unit_Name);
4566
4567    begin
4568
4569       if Debug_Flag_I then
4570          Write_Str ("remove unit ");
4571          Write_Name (Chars (Unit_Name));
4572          Write_Str (" from visibility");
4573          Write_Eol;
4574       end if;
4575
4576       if P /= Standard_Standard then
4577          Set_Is_Visible_Child_Unit (Unit_Name, False);
4578       end if;
4579
4580       Set_Is_Potentially_Use_Visible (Unit_Name, False);
4581       Set_Is_Immediately_Visible     (Unit_Name, False);
4582
4583    end Remove_Unit_From_Visibility;
4584
4585    -------------
4586    -- Unchain --
4587    -------------
4588
4589    procedure Unchain (E : Entity_Id) is
4590       Prev : Entity_Id;
4591
4592    begin
4593       Prev := Current_Entity (E);
4594
4595       if No (Prev) then
4596          return;
4597
4598       elsif Prev = E then
4599          Set_Name_Entity_Id (Chars (E), Homonym (E));
4600
4601       else
4602          while Present (Prev)
4603            and then Homonym (Prev) /= E
4604          loop
4605             Prev := Homonym (Prev);
4606          end loop;
4607
4608          if Present (Prev) then
4609             Set_Homonym (Prev, Homonym (E));
4610          end if;
4611       end if;
4612
4613       if Debug_Flag_I then
4614          Write_Str ("   (homonym) unchain ");
4615          Write_Name (Chars (E));
4616          Write_Eol;
4617       end if;
4618
4619    end Unchain;
4620 end Sem_Ch10;