OSDN Git Service

2011-08-29 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_ch8.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              S E M . C H 8                               --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Atree;    use Atree;
27 with Debug;    use Debug;
28 with Einfo;    use Einfo;
29 with Elists;   use Elists;
30 with Errout;   use Errout;
31 with Exp_Tss;  use Exp_Tss;
32 with Exp_Util; use Exp_Util;
33 with Fname;    use Fname;
34 with Freeze;   use Freeze;
35 with Impunit;  use Impunit;
36 with Lib;      use Lib;
37 with Lib.Load; use Lib.Load;
38 with Lib.Xref; use Lib.Xref;
39 with Namet;    use Namet;
40 with Namet.Sp; use Namet.Sp;
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 Rident;   use Rident;
47 with Rtsfind;  use Rtsfind;
48 with Sem;      use Sem;
49 with Sem_Aux;  use Sem_Aux;
50 with Sem_Cat;  use Sem_Cat;
51 with Sem_Ch3;  use Sem_Ch3;
52 with Sem_Ch4;  use Sem_Ch4;
53 with Sem_Ch6;  use Sem_Ch6;
54 with Sem_Ch12; use Sem_Ch12;
55 with Sem_Disp; use Sem_Disp;
56 with Sem_Dist; use Sem_Dist;
57 with Sem_Eval; use Sem_Eval;
58 with Sem_Res;  use Sem_Res;
59 with Sem_Util; use Sem_Util;
60 with Sem_Type; use Sem_Type;
61 with Stand;    use Stand;
62 with Sinfo;    use Sinfo;
63 with Sinfo.CN; use Sinfo.CN;
64 with Snames;   use Snames;
65 with Style;    use Style;
66 with Table;
67 with Targparm; use Targparm;
68 with Tbuild;   use Tbuild;
69 with Uintp;    use Uintp;
70
71 package body Sem_Ch8 is
72
73    ------------------------------------
74    -- Visibility and Name Resolution --
75    ------------------------------------
76
77    --  This package handles name resolution and the collection of possible
78    --  interpretations for overloaded names, prior to overload resolution.
79
80    --  Name resolution is the process that establishes a mapping between source
81    --  identifiers and the entities they denote at each point in the program.
82    --  Each entity is represented by a defining occurrence. Each identifier
83    --  that denotes an entity points to the corresponding defining occurrence.
84    --  This is the entity of the applied occurrence. Each occurrence holds
85    --  an index into the names table, where source identifiers are stored.
86
87    --  Each entry in the names table for an identifier or designator uses the
88    --  Info pointer to hold a link to the currently visible entity that has
89    --  this name (see subprograms Get_Name_Entity_Id and Set_Name_Entity_Id
90    --  in package Sem_Util). The visibility is initialized at the beginning of
91    --  semantic processing to make entities in package Standard immediately
92    --  visible. The visibility table is used in a more subtle way when
93    --  compiling subunits (see below).
94
95    --  Entities that have the same name (i.e. homonyms) are chained. In the
96    --  case of overloaded entities, this chain holds all the possible meanings
97    --  of a given identifier. The process of overload resolution uses type
98    --  information to select from this chain the unique meaning of a given
99    --  identifier.
100
101    --  Entities are also chained in their scope, through the Next_Entity link.
102    --  As a consequence, the name space is organized as a sparse matrix, where
103    --  each row corresponds to a scope, and each column to a source identifier.
104    --  Open scopes, that is to say scopes currently being compiled, have their
105    --  corresponding rows of entities in order, innermost scope first.
106
107    --  The scopes of packages that are mentioned in  context clauses appear in
108    --  no particular order, interspersed among open scopes. This is because
109    --  in the course of analyzing the context of a compilation, a package
110    --  declaration is first an open scope, and subsequently an element of the
111    --  context. If subunits or child units are present, a parent unit may
112    --  appear under various guises at various times in the compilation.
113
114    --  When the compilation of the innermost scope is complete, the entities
115    --  defined therein are no longer visible. If the scope is not a package
116    --  declaration, these entities are never visible subsequently, and can be
117    --  removed from visibility chains. If the scope is a package declaration,
118    --  its visible declarations may still be accessible. Therefore the entities
119    --  defined in such a scope are left on the visibility chains, and only
120    --  their visibility (immediately visibility or potential use-visibility)
121    --  is affected.
122
123    --  The ordering of homonyms on their chain does not necessarily follow
124    --  the order of their corresponding scopes on the scope stack. For
125    --  example, if package P and the enclosing scope both contain entities
126    --  named E, then when compiling the package body the chain for E will
127    --  hold the global entity first,  and the local one (corresponding to
128    --  the current inner scope) next. As a result, name resolution routines
129    --  do not assume any relative ordering of the homonym chains, either
130    --  for scope nesting or to order of appearance of context clauses.
131
132    --  When compiling a child unit, entities in the parent scope are always
133    --  immediately visible. When compiling the body of a child unit, private
134    --  entities in the parent must also be made immediately visible. There
135    --  are separate routines to make the visible and private declarations
136    --  visible at various times (see package Sem_Ch7).
137
138    --              +--------+         +-----+
139    --              | In use |-------->| EU1 |-------------------------->
140    --              +--------+         +-----+
141    --                                    |                      |
142    --      +--------+                 +-----+                +-----+
143    --      | Stand. |---------------->| ES1 |--------------->| ES2 |--->
144    --      +--------+                 +-----+                +-----+
145    --                                    |                      |
146    --              +---------+           |                   +-----+
147    --              | with'ed |------------------------------>| EW2 |--->
148    --              +---------+           |                   +-----+
149    --                                    |                      |
150    --      +--------+                 +-----+                +-----+
151    --      | Scope2 |---------------->| E12 |--------------->| E22 |--->
152    --      +--------+                 +-----+                +-----+
153    --                                    |                      |
154    --      +--------+                 +-----+                +-----+
155    --      | Scope1 |---------------->| E11 |--------------->| E12 |--->
156    --      +--------+                 +-----+                +-----+
157    --          ^                         |                      |
158    --          |                         |                      |
159    --          |   +---------+           |                      |
160    --          |   | with'ed |----------------------------------------->
161    --          |   +---------+           |                      |
162    --          |                         |                      |
163    --      Scope stack                   |                      |
164    --      (innermost first)             |                      |
165    --                                 +----------------------------+
166    --      Names  table =>            | Id1 |     |    |     | Id2 |
167    --                                 +----------------------------+
168
169    --  Name resolution must deal with several syntactic forms: simple names,
170    --  qualified names, indexed names, and various forms of calls.
171
172    --  Each identifier points to an entry in the names table. The resolution
173    --  of a simple name consists in traversing the homonym chain, starting
174    --  from the names table. If an entry is immediately visible, it is the one
175    --  designated by the identifier. If only potentially use-visible entities
176    --  are on the chain, we must verify that they do not hide each other. If
177    --  the entity we find is overloadable, we collect all other overloadable
178    --  entities on the chain as long as they are not hidden.
179    --
180    --  To resolve expanded names, we must find the entity at the intersection
181    --  of the entity chain for the scope (the prefix) and the homonym chain
182    --  for the selector. In general, homonym chains will be much shorter than
183    --  entity chains, so it is preferable to start from the names table as
184    --  well. If the entity found is overloadable, we must collect all other
185    --  interpretations that are defined in the scope denoted by the prefix.
186
187    --  For records, protected types, and tasks, their local entities are
188    --  removed from visibility chains on exit from the corresponding scope.
189    --  From the outside, these entities are always accessed by selected
190    --  notation, and the entity chain for the record type, protected type,
191    --  etc. is traversed sequentially in  order to find the designated entity.
192
193    --  The discriminants of a type and the operations of a protected type or
194    --  task are unchained on  exit from the first view of the type, (such as
195    --  a private or incomplete type declaration, or a protected type speci-
196    --  fication) and re-chained when compiling the second view.
197
198    --  In the case of operators,  we do not make operators on derived types
199    --  explicit. As a result, the notation P."+" may denote either a user-
200    --  defined function with name "+", or else an implicit declaration of the
201    --  operator "+" in package P. The resolution of expanded names always
202    --  tries to resolve an operator name as such an implicitly defined entity,
203    --  in addition to looking for explicit declarations.
204
205    --  All forms of names that denote entities (simple names, expanded names,
206    --  character literals in some cases) have a Entity attribute, which
207    --  identifies the entity denoted by the name.
208
209    ---------------------
210    -- The Scope Stack --
211    ---------------------
212
213    --  The Scope stack keeps track of the scopes currently been compiled.
214    --  Every entity that contains declarations (including records) is placed
215    --  on the scope stack while it is being processed, and removed at the end.
216    --  Whenever a non-package scope is exited, the entities defined therein
217    --  are removed from the visibility table, so that entities in outer scopes
218    --  become visible (see previous description). On entry to Sem, the scope
219    --  stack only contains the package Standard. As usual, subunits complicate
220    --  this picture ever so slightly.
221
222    --  The Rtsfind mechanism can force a call to Semantics while another
223    --  compilation is in progress. The unit retrieved by Rtsfind must be
224    --  compiled in  its own context, and has no access to the visibility of
225    --  the unit currently being compiled. The procedures Save_Scope_Stack and
226    --  Restore_Scope_Stack make entities in current open scopes invisible
227    --  before compiling the retrieved unit, and restore the compilation
228    --  environment afterwards.
229
230    ------------------------
231    -- Compiling subunits --
232    ------------------------
233
234    --  Subunits must be compiled in the environment of the corresponding stub,
235    --  that is to say with the same visibility into the parent (and its
236    --  context) that is available at the point of the stub declaration, but
237    --  with the additional visibility provided by the context clause of the
238    --  subunit itself. As a result, compilation of a subunit forces compilation
239    --  of the parent (see description in lib-). At the point of the stub
240    --  declaration, Analyze is called recursively to compile the proper body of
241    --  the subunit, but without reinitializing the names table, nor the scope
242    --  stack (i.e. standard is not pushed on the stack). In this fashion the
243    --  context of the subunit is added to the context of the parent, and the
244    --  subunit is compiled in the correct environment. Note that in the course
245    --  of processing the context of a subunit, Standard will appear twice on
246    --  the scope stack: once for the parent of the subunit, and once for the
247    --  unit in the context clause being compiled. However, the two sets of
248    --  entities are not linked by homonym chains, so that the compilation of
249    --  any context unit happens in a fresh visibility environment.
250
251    -------------------------------
252    -- Processing of USE Clauses --
253    -------------------------------
254
255    --  Every defining occurrence has a flag indicating if it is potentially use
256    --  visible. Resolution of simple names examines this flag. The processing
257    --  of use clauses consists in setting this flag on all visible entities
258    --  defined in the corresponding package. On exit from the scope of the use
259    --  clause, the corresponding flag must be reset. However, a package may
260    --  appear in several nested use clauses (pathological but legal, alas!)
261    --  which forces us to use a slightly more involved scheme:
262
263    --    a) The defining occurrence for a package holds a flag -In_Use- to
264    --    indicate that it is currently in the scope of a use clause. If a
265    --    redundant use clause is encountered, then the corresponding occurrence
266    --    of the package name is flagged -Redundant_Use-.
267
268    --    b) On exit from a scope, the use clauses in its declarative part are
269    --    scanned. The visibility flag is reset in all entities declared in
270    --    package named in a use clause, as long as the package is not flagged
271    --    as being in a redundant use clause (in which case the outer use
272    --    clause is still in effect, and the direct visibility of its entities
273    --    must be retained).
274
275    --  Note that entities are not removed from their homonym chains on exit
276    --  from the package specification. A subsequent use clause does not need
277    --  to rechain the visible entities, but only to establish their direct
278    --  visibility.
279
280    -----------------------------------
281    -- Handling private declarations --
282    -----------------------------------
283
284    --  The principle that each entity has a single defining occurrence clashes
285    --  with the presence of two separate definitions for private types: the
286    --  first is the private type declaration, and second is the full type
287    --  declaration. It is important that all references to the type point to
288    --  the same defining occurrence, namely the first one. To enforce the two
289    --  separate views of the entity, the corresponding information is swapped
290    --  between the two declarations. Outside of the package, the defining
291    --  occurrence only contains the private declaration information, while in
292    --  the private part and the body of the package the defining occurrence
293    --  contains the full declaration. To simplify the swap, the defining
294    --  occurrence that currently holds the private declaration points to the
295    --  full declaration. During semantic processing the defining occurrence
296    --  also points to a list of private dependents, that is to say access types
297    --  or composite types whose designated types or component types are
298    --  subtypes or derived types of the private type in question. After the
299    --  full declaration has been seen, the private dependents are updated to
300    --  indicate that they have full definitions.
301
302    ------------------------------------
303    -- Handling of Undefined Messages --
304    ------------------------------------
305
306    --  In normal mode, only the first use of an undefined identifier generates
307    --  a message. The table Urefs is used to record error messages that have
308    --  been issued so that second and subsequent ones do not generate further
309    --  messages. However, the second reference causes text to be added to the
310    --  original undefined message noting "(more references follow)". The
311    --  full error list option (-gnatf) forces messages to be generated for
312    --  every reference and disconnects the use of this table.
313
314    type Uref_Entry is record
315       Node : Node_Id;
316       --  Node for identifier for which original message was posted. The
317       --  Chars field of this identifier is used to detect later references
318       --  to the same identifier.
319
320       Err : Error_Msg_Id;
321       --  Records error message Id of original undefined message. Reset to
322       --  No_Error_Msg after the second occurrence, where it is used to add
323       --  text to the original message as described above.
324
325       Nvis : Boolean;
326       --  Set if the message is not visible rather than undefined
327
328       Loc : Source_Ptr;
329       --  Records location of error message. Used to make sure that we do
330       --  not consider a, b : undefined as two separate instances, which
331       --  would otherwise happen, since the parser converts this sequence
332       --  to a : undefined; b : undefined.
333
334    end record;
335
336    package Urefs is new Table.Table (
337      Table_Component_Type => Uref_Entry,
338      Table_Index_Type     => Nat,
339      Table_Low_Bound      => 1,
340      Table_Initial        => 10,
341      Table_Increment      => 100,
342      Table_Name           => "Urefs");
343
344    Candidate_Renaming : Entity_Id;
345    --  Holds a candidate interpretation that appears in a subprogram renaming
346    --  declaration and does not match the given specification, but matches at
347    --  least on the first formal. Allows better error message when given
348    --  specification omits defaulted parameters, a common error.
349
350    -----------------------
351    -- Local Subprograms --
352    -----------------------
353
354    procedure Analyze_Generic_Renaming
355      (N : Node_Id;
356       K : Entity_Kind);
357    --  Common processing for all three kinds of generic renaming declarations.
358    --  Enter new name and indicate that it renames the generic unit.
359
360    procedure Analyze_Renamed_Character
361      (N       : Node_Id;
362       New_S   : Entity_Id;
363       Is_Body : Boolean);
364    --  Renamed entity is given by a character literal, which must belong
365    --  to the return type of the new entity. Is_Body indicates whether the
366    --  declaration is a renaming_as_body. If the original declaration has
367    --  already been frozen (because of an intervening body, e.g.) the body of
368    --  the function must be built now. The same applies to the following
369    --  various renaming procedures.
370
371    procedure Analyze_Renamed_Dereference
372      (N       : Node_Id;
373       New_S   : Entity_Id;
374       Is_Body : Boolean);
375    --  Renamed entity is given by an explicit dereference. Prefix must be a
376    --  conformant access_to_subprogram type.
377
378    procedure Analyze_Renamed_Entry
379      (N       : Node_Id;
380       New_S   : Entity_Id;
381       Is_Body : Boolean);
382    --  If the renamed entity in a subprogram renaming is an entry or protected
383    --  subprogram, build a body for the new entity whose only statement is a
384    --  call to the renamed entity.
385
386    procedure Analyze_Renamed_Family_Member
387      (N       : Node_Id;
388       New_S   : Entity_Id;
389       Is_Body : Boolean);
390    --  Used when the renamed entity is an indexed component. The prefix must
391    --  denote an entry family.
392
393    procedure Analyze_Renamed_Primitive_Operation
394      (N       : Node_Id;
395       New_S   : Entity_Id;
396       Is_Body : Boolean);
397    --  If the renamed entity in a subprogram renaming is a primitive operation
398    --  or a class-wide operation in prefix form, save the target object, which
399    --  must be added to the list of actuals in any subsequent call.
400
401    function Applicable_Use (Pack_Name : Node_Id) return Boolean;
402    --  Common code to Use_One_Package and Set_Use, to determine whether use
403    --  clause must be processed. Pack_Name is an entity name that references
404    --  the package in question.
405
406    procedure Attribute_Renaming (N : Node_Id);
407    --  Analyze renaming of attribute as subprogram. The renaming declaration N
408    --  is rewritten as a subprogram body that returns the attribute reference
409    --  applied to the formals of the function.
410
411    procedure Set_Entity_Or_Discriminal (N : Node_Id; E : Entity_Id);
412    --  Set Entity, with style check if need be. For a discriminant reference,
413    --  replace by the corresponding discriminal, i.e. the parameter of the
414    --  initialization procedure that corresponds to the discriminant.
415
416    procedure Check_Frozen_Renaming (N : Node_Id; Subp : Entity_Id);
417    --  A renaming_as_body may occur after the entity of the original decla-
418    --  ration has been frozen. In that case, the body of the new entity must
419    --  be built now, because the usual mechanism of building the renamed
420    --  body at the point of freezing will not work. Subp is the subprogram
421    --  for which N provides the Renaming_As_Body.
422
423    procedure Check_In_Previous_With_Clause
424      (N   : Node_Id;
425       Nam : Node_Id);
426    --  N is a use_package clause and Nam the package name, or N is a use_type
427    --  clause and Nam is the prefix of the type name. In either case, verify
428    --  that the package is visible at that point in the context: either  it
429    --  appears in a previous with_clause, or because it is a fully qualified
430    --  name and the root ancestor appears in a previous with_clause.
431
432    procedure Check_Library_Unit_Renaming (N : Node_Id; Old_E : Entity_Id);
433    --  Verify that the entity in a renaming declaration that is a library unit
434    --  is itself a library unit and not a nested unit or subunit. Also check
435    --  that if the renaming is a child unit of a generic parent, then the
436    --  renamed unit must also be a child unit of that parent. Finally, verify
437    --  that a renamed generic unit is not an implicit child declared within
438    --  an instance of the parent.
439
440    procedure Chain_Use_Clause (N : Node_Id);
441    --  Chain use clause onto list of uses clauses headed by First_Use_Clause in
442    --  the proper scope table entry. This is usually the current scope, but it
443    --  will be an inner scope when installing the use clauses of the private
444    --  declarations of a parent unit prior to compiling the private part of a
445    --  child unit. This chain is traversed when installing/removing use clauses
446    --  when compiling a subunit or instantiating a generic body on the fly,
447    --  when it is necessary to save and restore full environments.
448
449    function Has_Implicit_Character_Literal (N : Node_Id) return Boolean;
450    --  Find a type derived from Character or Wide_Character in the prefix of N.
451    --  Used to resolved qualified names whose selector is a character literal.
452
453    function Has_Private_With (E : Entity_Id) return Boolean;
454    --  Ada 2005 (AI-262): Determines if the current compilation unit has a
455    --  private with on E.
456
457    procedure Find_Expanded_Name (N : Node_Id);
458    --  The input is a selected component known to be an expanded name. Verify
459    --  legality of selector given the scope denoted by prefix, and change node
460    --  N into a expanded name with a properly set Entity field.
461
462    function Find_Renamed_Entity
463      (N         : Node_Id;
464       Nam       : Node_Id;
465       New_S     : Entity_Id;
466       Is_Actual : Boolean := False) return Entity_Id;
467    --  Find the renamed entity that corresponds to the given parameter profile
468    --  in a subprogram renaming declaration. The renamed entity may be an
469    --  operator, a subprogram, an entry, or a protected operation. Is_Actual
470    --  indicates that the renaming is the one generated for an actual subpro-
471    --  gram in an instance, for which special visibility checks apply.
472
473    function Has_Implicit_Operator (N : Node_Id) return Boolean;
474    --  N is an expanded name whose selector is an operator name (e.g. P."+").
475    --  declarative part contains an implicit declaration of an operator if it
476    --  has a declaration of a type to which one of the predefined operators
477    --  apply. The existence of this routine is an implementation artifact. A
478    --  more straightforward but more space-consuming choice would be to make
479    --  all inherited operators explicit in the symbol table.
480
481    procedure Inherit_Renamed_Profile (New_S : Entity_Id; Old_S : Entity_Id);
482    --  A subprogram defined by a renaming declaration inherits the parameter
483    --  profile of the renamed entity. The subtypes given in the subprogram
484    --  specification are discarded and replaced with those of the renamed
485    --  subprogram, which are then used to recheck the default values.
486
487    function Is_Appropriate_For_Record (T : Entity_Id) return Boolean;
488    --  Prefix is appropriate for record if it is of a record type, or an access
489    --  to such.
490
491    function Is_Appropriate_For_Entry_Prefix (T : Entity_Id) return Boolean;
492    --  True if it is of a task type, a protected type, or else an access to one
493    --  of these types.
494
495    procedure Note_Redundant_Use (Clause : Node_Id);
496    --  Mark the name in a use clause as redundant if the corresponding entity
497    --  is already use-visible. Emit a warning if the use clause comes from
498    --  source and the proper warnings are enabled.
499
500    procedure Premature_Usage (N : Node_Id);
501    --  Diagnose usage of an entity before it is visible
502
503    procedure Use_One_Package (P : Entity_Id; N : Node_Id);
504    --  Make visible entities declared in package P potentially use-visible
505    --  in the current context. Also used in the analysis of subunits, when
506    --  re-installing use clauses of parent units. N is the use_clause that
507    --  names P (and possibly other packages).
508
509    procedure Use_One_Type (Id : Node_Id; Installed : Boolean := False);
510    --  Id is the subtype mark from a use type clause. This procedure makes
511    --  the primitive operators of the type potentially use-visible. The
512    --  boolean flag Installed indicates that the clause is being reinstalled
513    --  after previous analysis, and primitive operations are already chained
514    --  on the Used_Operations list of the clause.
515
516    procedure Write_Info;
517    --  Write debugging information on entities declared in current scope
518
519    --------------------------------
520    -- Analyze_Exception_Renaming --
521    --------------------------------
522
523    --  The language only allows a single identifier, but the tree holds an
524    --  identifier list. The parser has already issued an error message if
525    --  there is more than one element in the list.
526
527    procedure Analyze_Exception_Renaming (N : Node_Id) is
528       Id  : constant Node_Id := Defining_Identifier (N);
529       Nam : constant Node_Id := Name (N);
530
531    begin
532       Check_SPARK_Restriction ("exception renaming is not allowed", N);
533
534       Enter_Name (Id);
535       Analyze (Nam);
536
537       Set_Ekind          (Id, E_Exception);
538       Set_Exception_Code (Id, Uint_0);
539       Set_Etype          (Id, Standard_Exception_Type);
540       Set_Is_Pure        (Id, Is_Pure (Current_Scope));
541
542       if not Is_Entity_Name (Nam) or else
543         Ekind (Entity (Nam)) /= E_Exception
544       then
545          Error_Msg_N ("invalid exception name in renaming", Nam);
546       else
547          if Present (Renamed_Object (Entity (Nam))) then
548             Set_Renamed_Object (Id, Renamed_Object (Entity (Nam)));
549          else
550             Set_Renamed_Object (Id, Entity (Nam));
551          end if;
552       end if;
553    end Analyze_Exception_Renaming;
554
555    ---------------------------
556    -- Analyze_Expanded_Name --
557    ---------------------------
558
559    procedure Analyze_Expanded_Name (N : Node_Id) is
560    begin
561       --  If the entity pointer is already set, this is an internal node, or a
562       --  node that is analyzed more than once, after a tree modification. In
563       --  such a case there is no resolution to perform, just set the type. For
564       --  completeness, analyze prefix as well.
565
566       if Present (Entity (N)) then
567          if Is_Type (Entity (N)) then
568             Set_Etype (N, Entity (N));
569          else
570             Set_Etype (N, Etype (Entity (N)));
571          end if;
572
573          Analyze (Prefix (N));
574          return;
575       else
576          Find_Expanded_Name (N);
577       end if;
578    end Analyze_Expanded_Name;
579
580    ---------------------------------------
581    -- Analyze_Generic_Function_Renaming --
582    ---------------------------------------
583
584    procedure Analyze_Generic_Function_Renaming  (N : Node_Id) is
585    begin
586       Analyze_Generic_Renaming (N, E_Generic_Function);
587    end Analyze_Generic_Function_Renaming;
588
589    --------------------------------------
590    -- Analyze_Generic_Package_Renaming --
591    --------------------------------------
592
593    procedure Analyze_Generic_Package_Renaming   (N : Node_Id) is
594    begin
595       --  Apply the Text_IO Kludge here, since we may be renaming one of the
596       --  subpackages of Text_IO, then join common routine.
597
598       Text_IO_Kludge (Name (N));
599
600       Analyze_Generic_Renaming (N, E_Generic_Package);
601    end Analyze_Generic_Package_Renaming;
602
603    ----------------------------------------
604    -- Analyze_Generic_Procedure_Renaming --
605    ----------------------------------------
606
607    procedure Analyze_Generic_Procedure_Renaming (N : Node_Id) is
608    begin
609       Analyze_Generic_Renaming (N, E_Generic_Procedure);
610    end Analyze_Generic_Procedure_Renaming;
611
612    ------------------------------
613    -- Analyze_Generic_Renaming --
614    ------------------------------
615
616    procedure Analyze_Generic_Renaming
617      (N : Node_Id;
618       K : Entity_Kind)
619    is
620       New_P : constant Entity_Id := Defining_Entity (N);
621       Old_P : Entity_Id;
622       Inst  : Boolean   := False; -- prevent junk warning
623
624    begin
625       if Name (N) = Error then
626          return;
627       end if;
628
629       Check_SPARK_Restriction ("generic renaming is not allowed", N);
630
631       Generate_Definition (New_P);
632
633       if Current_Scope /= Standard_Standard then
634          Set_Is_Pure (New_P, Is_Pure (Current_Scope));
635       end if;
636
637       if Nkind (Name (N)) = N_Selected_Component then
638          Check_Generic_Child_Unit (Name (N), Inst);
639       else
640          Analyze (Name (N));
641       end if;
642
643       if not Is_Entity_Name (Name (N)) then
644          Error_Msg_N ("expect entity name in renaming declaration", Name (N));
645          Old_P := Any_Id;
646       else
647          Old_P := Entity (Name (N));
648       end if;
649
650       Enter_Name (New_P);
651       Set_Ekind (New_P, K);
652
653       if Etype (Old_P) = Any_Type then
654          null;
655
656       elsif Ekind (Old_P) /= K then
657          Error_Msg_N ("invalid generic unit name", Name (N));
658
659       else
660          if Present (Renamed_Object (Old_P)) then
661             Set_Renamed_Object (New_P,  Renamed_Object (Old_P));
662          else
663             Set_Renamed_Object (New_P, Old_P);
664          end if;
665
666          Set_Is_Pure          (New_P, Is_Pure          (Old_P));
667          Set_Is_Preelaborated (New_P, Is_Preelaborated (Old_P));
668
669          Set_Etype (New_P, Etype (Old_P));
670          Set_Has_Completion (New_P);
671
672          if In_Open_Scopes (Old_P) then
673             Error_Msg_N ("within its scope, generic denotes its instance", N);
674          end if;
675
676          Check_Library_Unit_Renaming (N, Old_P);
677       end if;
678    end Analyze_Generic_Renaming;
679
680    -----------------------------
681    -- Analyze_Object_Renaming --
682    -----------------------------
683
684    procedure Analyze_Object_Renaming (N : Node_Id) is
685       Loc : constant Source_Ptr := Sloc (N);
686       Id  : constant Entity_Id  := Defining_Identifier (N);
687       Dec : Node_Id;
688       Nam : constant Node_Id    := Name (N);
689       T   : Entity_Id;
690       T2  : Entity_Id;
691
692       procedure Check_Constrained_Object;
693       --  If the nominal type is unconstrained but the renamed object is
694       --  constrained, as can happen with renaming an explicit dereference or
695       --  a function return, build a constrained subtype from the object. If
696       --  the renaming is for a formal in an accept statement, the analysis
697       --  has already established its actual subtype. This is only relevant
698       --  if the renamed object is an explicit dereference.
699
700       function In_Generic_Scope (E : Entity_Id) return Boolean;
701       --  Determine whether entity E is inside a generic cope
702
703       ------------------------------
704       -- Check_Constrained_Object --
705       ------------------------------
706
707       procedure Check_Constrained_Object is
708          Subt : Entity_Id;
709
710       begin
711          if Nkind_In (Nam, N_Function_Call, N_Explicit_Dereference)
712            and then Is_Composite_Type (Etype (Nam))
713            and then not Is_Constrained (Etype (Nam))
714            and then not Has_Unknown_Discriminants (Etype (Nam))
715            and then Expander_Active
716          then
717             --  If Actual_Subtype is already set, nothing to do
718
719             if Ekind_In (Id, E_Variable, E_Constant)
720               and then Present (Actual_Subtype (Id))
721             then
722                null;
723
724             --  A renaming of an unchecked union does not have an
725             --  actual subtype.
726
727             elsif Is_Unchecked_Union (Etype (Nam)) then
728                null;
729
730             else
731                Subt := Make_Temporary (Loc, 'T');
732                Remove_Side_Effects (Nam);
733                Insert_Action (N,
734                  Make_Subtype_Declaration (Loc,
735                    Defining_Identifier => Subt,
736                    Subtype_Indication  =>
737                      Make_Subtype_From_Expr (Nam, Etype (Nam))));
738                Rewrite (Subtype_Mark (N), New_Occurrence_Of (Subt, Loc));
739                Set_Etype (Nam, Subt);
740             end if;
741          end if;
742       end Check_Constrained_Object;
743
744       ----------------------
745       -- In_Generic_Scope --
746       ----------------------
747
748       function In_Generic_Scope (E : Entity_Id) return Boolean is
749          S : Entity_Id;
750
751       begin
752          S := Scope (E);
753          while Present (S) and then S /= Standard_Standard loop
754             if Is_Generic_Unit (S) then
755                return True;
756             end if;
757
758             S := Scope (S);
759          end loop;
760
761          return False;
762       end In_Generic_Scope;
763
764    --  Start of processing for Analyze_Object_Renaming
765
766    begin
767       if Nam = Error then
768          return;
769       end if;
770
771       Check_SPARK_Restriction ("object renaming is not allowed", N);
772
773       Set_Is_Pure (Id, Is_Pure (Current_Scope));
774       Enter_Name (Id);
775
776       --  The renaming of a component that depends on a discriminant requires
777       --  an actual subtype, because in subsequent use of the object Gigi will
778       --  be unable to locate the actual bounds. This explicit step is required
779       --  when the renaming is generated in removing side effects of an
780       --  already-analyzed expression.
781
782       if Nkind (Nam) = N_Selected_Component
783         and then Analyzed (Nam)
784       then
785          T := Etype (Nam);
786          Dec :=  Build_Actual_Subtype_Of_Component (Etype (Nam), Nam);
787
788          if Present (Dec) then
789             Insert_Action (N, Dec);
790             T := Defining_Identifier (Dec);
791             Set_Etype (Nam, T);
792          end if;
793
794          --  Complete analysis of the subtype mark in any case, for ASIS use
795
796          if Present (Subtype_Mark (N)) then
797             Find_Type (Subtype_Mark (N));
798          end if;
799
800       elsif Present (Subtype_Mark (N)) then
801          Find_Type (Subtype_Mark (N));
802          T := Entity (Subtype_Mark (N));
803          Analyze (Nam);
804
805          if Nkind (Nam) = N_Type_Conversion
806             and then not Is_Tagged_Type (T)
807          then
808             Error_Msg_N
809               ("renaming of conversion only allowed for tagged types", Nam);
810          end if;
811
812          Resolve (Nam, T);
813
814          --  If the renamed object is a function call of a limited type,
815          --  the expansion of the renaming is complicated by the presence
816          --  of various temporaries and subtypes that capture constraints
817          --  of the renamed object. Rewrite node as an object declaration,
818          --  whose expansion is simpler. Given that the object is limited
819          --  there is no copy involved and no performance hit.
820
821          if Nkind (Nam) = N_Function_Call
822            and then Is_Immutably_Limited_Type (Etype (Nam))
823            and then not Is_Constrained (Etype (Nam))
824            and then Comes_From_Source (N)
825          then
826             Set_Etype (Id, T);
827             Set_Ekind (Id, E_Constant);
828             Rewrite (N,
829               Make_Object_Declaration (Loc,
830                 Defining_Identifier => Id,
831                 Constant_Present    => True,
832                 Object_Definition   => New_Occurrence_Of (Etype (Nam), Loc),
833                 Expression          => Relocate_Node (Nam)));
834             return;
835          end if;
836
837          --  Check that a class-wide object is not being renamed as an object
838          --  of a specific type. The test for access types is needed to exclude
839          --  cases where the renamed object is a dynamically tagged access
840          --  result, such as occurs in certain expansions.
841
842          if Is_Tagged_Type (T) then
843             Check_Dynamically_Tagged_Expression
844               (Expr        => Nam,
845                Typ         => T,
846                Related_Nod => N);
847          end if;
848
849       --  Ada 2005 (AI-230/AI-254): Access renaming
850
851       else pragma Assert (Present (Access_Definition (N)));
852          T := Access_Definition
853                 (Related_Nod => N,
854                  N           => Access_Definition (N));
855
856          Analyze (Nam);
857
858          --  Ada 2005 AI05-105: if the declaration has an anonymous access
859          --  type, the renamed object must also have an anonymous type, and
860          --  this is a name resolution rule. This was implicit in the last part
861          --  of the first sentence in 8.5.1(3/2), and is made explicit by this
862          --  recent AI.
863
864          if not Is_Overloaded (Nam) then
865             if Ekind (Etype (Nam)) /= Ekind (T) then
866                Error_Msg_N
867                  ("expect anonymous access type in object renaming", N);
868             end if;
869
870          else
871             declare
872                I    : Interp_Index;
873                It   : Interp;
874                Typ  : Entity_Id := Empty;
875                Seen : Boolean   := False;
876
877             begin
878                Get_First_Interp (Nam, I, It);
879                while Present (It.Typ) loop
880
881                   --  Renaming is ambiguous if more than one candidate
882                   --  interpretation is type-conformant with the context.
883
884                   if Ekind (It.Typ) = Ekind (T) then
885                      if Ekind (T) = E_Anonymous_Access_Subprogram_Type
886                        and then
887                          Type_Conformant
888                            (Designated_Type (T), Designated_Type (It.Typ))
889                      then
890                         if not Seen then
891                            Seen := True;
892                         else
893                            Error_Msg_N
894                              ("ambiguous expression in renaming", Nam);
895                         end if;
896
897                      elsif Ekind (T) = E_Anonymous_Access_Type
898                        and then
899                          Covers (Designated_Type (T), Designated_Type (It.Typ))
900                      then
901                         if not Seen then
902                            Seen := True;
903                         else
904                            Error_Msg_N
905                              ("ambiguous expression in renaming", Nam);
906                         end if;
907                      end if;
908
909                      if Covers (T, It.Typ) then
910                         Typ := It.Typ;
911                         Set_Etype (Nam, Typ);
912                         Set_Is_Overloaded (Nam, False);
913                      end if;
914                   end if;
915
916                   Get_Next_Interp (I, It);
917                end loop;
918             end;
919          end if;
920
921          Resolve (Nam, T);
922
923          --  Ada 2005 (AI-231): "In the case where the type is defined by an
924          --  access_definition, the renamed entity shall be of an access-to-
925          --  constant type if and only if the access_definition defines an
926          --  access-to-constant type" ARM 8.5.1(4)
927
928          if Constant_Present (Access_Definition (N))
929            and then not Is_Access_Constant (Etype (Nam))
930          then
931             Error_Msg_N ("(Ada 2005): the renamed object is not "
932                          & "access-to-constant (RM 8.5.1(6))", N);
933
934          elsif not Constant_Present (Access_Definition (N))
935            and then Is_Access_Constant (Etype (Nam))
936          then
937             Error_Msg_N ("(Ada 2005): the renamed object is not "
938                          & "access-to-variable (RM 8.5.1(6))", N);
939          end if;
940
941          if Is_Access_Subprogram_Type (Etype (Nam)) then
942             Check_Subtype_Conformant
943               (Designated_Type (T), Designated_Type (Etype (Nam)));
944
945          elsif not Subtypes_Statically_Match
946                      (Designated_Type (T),
947                       Available_View (Designated_Type (Etype (Nam))))
948          then
949             Error_Msg_N
950               ("subtype of renamed object does not statically match", N);
951          end if;
952       end if;
953
954       --  Special processing for renaming function return object. Some errors
955       --  and warnings are produced only for calls that come from source.
956
957       if Nkind (Nam) = N_Function_Call then
958          case Ada_Version is
959
960             --  Usage is illegal in Ada 83
961
962             when Ada_83 =>
963                if Comes_From_Source (Nam) then
964                   Error_Msg_N
965                     ("(Ada 83) cannot rename function return object", Nam);
966                end if;
967
968             --  In Ada 95, warn for odd case of renaming parameterless function
969             --  call if this is not a limited type (where this is useful).
970
971             when others =>
972                if Warn_On_Object_Renames_Function
973                  and then No (Parameter_Associations (Nam))
974                  and then not Is_Limited_Type (Etype (Nam))
975                  and then Comes_From_Source (Nam)
976                then
977                   Error_Msg_N
978                     ("?renaming function result object is suspicious", Nam);
979                   Error_Msg_NE
980                     ("\?function & will be called only once", Nam,
981                      Entity (Name (Nam)));
982                   Error_Msg_N -- CODEFIX
983                     ("\?suggest using an initialized constant object instead",
984                      Nam);
985                end if;
986
987          end case;
988       end if;
989
990       Check_Constrained_Object;
991
992       --  An object renaming requires an exact match of the type. Class-wide
993       --  matching is not allowed.
994
995       if Is_Class_Wide_Type (T)
996         and then Base_Type (Etype (Nam)) /= Base_Type (T)
997       then
998          Wrong_Type (Nam, T);
999       end if;
1000
1001       T2 := Etype (Nam);
1002
1003       --  Ada 2005 (AI-326): Handle wrong use of incomplete type
1004
1005       if Nkind (Nam) = N_Explicit_Dereference
1006         and then Ekind (Etype (T2)) = E_Incomplete_Type
1007       then
1008          Error_Msg_NE ("invalid use of incomplete type&", Id, T2);
1009          return;
1010
1011       elsif Ekind (Etype (T)) = E_Incomplete_Type then
1012          Error_Msg_NE ("invalid use of incomplete type&", Id, T);
1013          return;
1014       end if;
1015
1016       --  Ada 2005 (AI-327)
1017
1018       if Ada_Version >= Ada_2005
1019         and then Nkind (Nam) = N_Attribute_Reference
1020         and then Attribute_Name (Nam) = Name_Priority
1021       then
1022          null;
1023
1024       elsif Ada_Version >= Ada_2005
1025         and then Nkind (Nam) in N_Has_Entity
1026       then
1027          declare
1028             Nam_Decl : Node_Id;
1029             Nam_Ent  : Entity_Id;
1030
1031          begin
1032             if Nkind (Nam) = N_Attribute_Reference then
1033                Nam_Ent := Entity (Prefix (Nam));
1034             else
1035                Nam_Ent := Entity (Nam);
1036             end if;
1037
1038             Nam_Decl := Parent (Nam_Ent);
1039
1040             if Has_Null_Exclusion (N)
1041               and then not Has_Null_Exclusion (Nam_Decl)
1042             then
1043                --  Ada 2005 (AI-423): If the object name denotes a generic
1044                --  formal object of a generic unit G, and the object renaming
1045                --  declaration occurs within the body of G or within the body
1046                --  of a generic unit declared within the declarative region
1047                --  of G, then the declaration of the formal object of G must
1048                --  have a null exclusion or a null-excluding subtype.
1049
1050                if Is_Formal_Object (Nam_Ent)
1051                     and then In_Generic_Scope (Id)
1052                then
1053                   if not Can_Never_Be_Null (Etype (Nam_Ent)) then
1054                      Error_Msg_N
1055                        ("renamed formal does not exclude `NULL` "
1056                         & "(RM 8.5.1(4.6/2))", N);
1057
1058                   elsif In_Package_Body (Scope (Id)) then
1059                      Error_Msg_N
1060                        ("formal object does not have a null exclusion"
1061                         & "(RM 8.5.1(4.6/2))", N);
1062                   end if;
1063
1064                --  Ada 2005 (AI-423): Otherwise, the subtype of the object name
1065                --  shall exclude null.
1066
1067                elsif not Can_Never_Be_Null (Etype (Nam_Ent)) then
1068                   Error_Msg_N
1069                     ("renamed object does not exclude `NULL` "
1070                      & "(RM 8.5.1(4.6/2))", N);
1071
1072                --  An instance is illegal if it contains a renaming that
1073                --  excludes null, and the actual does not. The renaming
1074                --  declaration has already indicated that the declaration
1075                --  of the renamed actual in the instance will raise
1076                --  constraint_error.
1077
1078                elsif Nkind (Nam_Decl) = N_Object_Declaration
1079                  and then In_Instance
1080                  and then Present
1081                    (Corresponding_Generic_Association (Nam_Decl))
1082                  and then Nkind (Expression (Nam_Decl))
1083                    = N_Raise_Constraint_Error
1084                then
1085                   Error_Msg_N
1086                     ("renamed actual does not exclude `NULL` "
1087                      & "(RM 8.5.1(4.6/2))", N);
1088
1089                --  Finally, if there is a null exclusion, the subtype mark
1090                --  must not be null-excluding.
1091
1092                elsif No (Access_Definition (N))
1093                  and then Can_Never_Be_Null (T)
1094                then
1095                   Error_Msg_NE
1096                     ("`NOT NULL` not allowed (& already excludes null)",
1097                       N, T);
1098
1099                end if;
1100
1101             elsif Can_Never_Be_Null (T)
1102               and then not Can_Never_Be_Null (Etype (Nam_Ent))
1103             then
1104                Error_Msg_N
1105                  ("renamed object does not exclude `NULL` "
1106                   & "(RM 8.5.1(4.6/2))", N);
1107
1108             elsif Has_Null_Exclusion (N)
1109               and then No (Access_Definition (N))
1110               and then Can_Never_Be_Null (T)
1111             then
1112                Error_Msg_NE
1113                  ("`NOT NULL` not allowed (& already excludes null)", N, T);
1114             end if;
1115          end;
1116       end if;
1117
1118       Set_Ekind (Id, E_Variable);
1119       Init_Size_Align (Id);
1120
1121       if T = Any_Type or else Etype (Nam) = Any_Type then
1122          return;
1123
1124       --  Verify that the renamed entity is an object or a function call. It
1125       --  may have been rewritten in several ways.
1126
1127       elsif Is_Object_Reference (Nam) then
1128          if Comes_From_Source (N)
1129            and then Is_Dependent_Component_Of_Mutable_Object (Nam)
1130          then
1131             Error_Msg_N
1132               ("illegal renaming of discriminant-dependent component", Nam);
1133          end if;
1134
1135       --  A static function call may have been folded into a literal
1136
1137       elsif Nkind (Original_Node (Nam)) = N_Function_Call
1138
1139             --  When expansion is disabled, attribute reference is not
1140             --  rewritten as function call. Otherwise it may be rewritten
1141             --  as a conversion, so check original node.
1142
1143         or else (Nkind (Original_Node (Nam)) = N_Attribute_Reference
1144                   and then Is_Function_Attribute_Name
1145                              (Attribute_Name (Original_Node (Nam))))
1146
1147             --  Weird but legal, equivalent to renaming a function call.
1148             --  Illegal if the literal is the result of constant-folding an
1149             --  attribute reference that is not a function.
1150
1151         or else (Is_Entity_Name (Nam)
1152                   and then Ekind (Entity (Nam)) = E_Enumeration_Literal
1153                   and then
1154                     Nkind (Original_Node (Nam)) /= N_Attribute_Reference)
1155
1156         or else (Nkind (Nam) = N_Type_Conversion
1157                     and then Is_Tagged_Type (Entity (Subtype_Mark (Nam))))
1158       then
1159          null;
1160
1161       elsif Nkind (Nam) = N_Type_Conversion then
1162          Error_Msg_N
1163            ("renaming of conversion only allowed for tagged types", Nam);
1164
1165       --  Ada 2005 (AI-327)
1166
1167       elsif Ada_Version >= Ada_2005
1168         and then Nkind (Nam) = N_Attribute_Reference
1169         and then Attribute_Name (Nam) = Name_Priority
1170       then
1171          null;
1172
1173       --  Allow internally generated x'Reference expression
1174
1175       elsif Nkind (Nam) = N_Reference then
1176          null;
1177
1178       else
1179          Error_Msg_N ("expect object name in renaming", Nam);
1180       end if;
1181
1182       Set_Etype (Id, T2);
1183
1184       if not Is_Variable (Nam) then
1185          Set_Ekind               (Id, E_Constant);
1186          Set_Never_Set_In_Source (Id, True);
1187          Set_Is_True_Constant    (Id, True);
1188       end if;
1189
1190       Set_Renamed_Object (Id, Nam);
1191    end Analyze_Object_Renaming;
1192
1193    ------------------------------
1194    -- Analyze_Package_Renaming --
1195    ------------------------------
1196
1197    procedure Analyze_Package_Renaming (N : Node_Id) is
1198       New_P : constant Entity_Id := Defining_Entity (N);
1199       Old_P : Entity_Id;
1200       Spec  : Node_Id;
1201
1202    begin
1203       if Name (N) = Error then
1204          return;
1205       end if;
1206
1207       --  Apply Text_IO kludge here since we may be renaming a child of Text_IO
1208
1209       Text_IO_Kludge (Name (N));
1210
1211       if Current_Scope /= Standard_Standard then
1212          Set_Is_Pure (New_P, Is_Pure (Current_Scope));
1213       end if;
1214
1215       Enter_Name (New_P);
1216       Analyze (Name (N));
1217
1218       if Is_Entity_Name (Name (N)) then
1219          Old_P := Entity (Name (N));
1220       else
1221          Old_P := Any_Id;
1222       end if;
1223
1224       if Etype (Old_P) = Any_Type then
1225          Error_Msg_N ("expect package name in renaming", Name (N));
1226
1227       elsif Ekind (Old_P) /= E_Package
1228         and then not (Ekind (Old_P) = E_Generic_Package
1229                        and then In_Open_Scopes (Old_P))
1230       then
1231          if Ekind (Old_P) = E_Generic_Package then
1232             Error_Msg_N
1233                ("generic package cannot be renamed as a package", Name (N));
1234          else
1235             Error_Msg_Sloc := Sloc (Old_P);
1236             Error_Msg_NE
1237              ("expect package name in renaming, found& declared#",
1238                Name (N), Old_P);
1239          end if;
1240
1241          --  Set basic attributes to minimize cascaded errors
1242
1243          Set_Ekind (New_P, E_Package);
1244          Set_Etype (New_P, Standard_Void_Type);
1245
1246       --  Here for OK package renaming
1247
1248       else
1249          --  Entities in the old package are accessible through the renaming
1250          --  entity. The simplest implementation is to have both packages share
1251          --  the entity list.
1252
1253          Set_Ekind (New_P, E_Package);
1254          Set_Etype (New_P, Standard_Void_Type);
1255
1256          if Present (Renamed_Object (Old_P)) then
1257             Set_Renamed_Object (New_P,  Renamed_Object (Old_P));
1258          else
1259             Set_Renamed_Object (New_P, Old_P);
1260          end if;
1261
1262          Set_Has_Completion (New_P);
1263
1264          Set_First_Entity (New_P,  First_Entity (Old_P));
1265          Set_Last_Entity  (New_P,  Last_Entity  (Old_P));
1266          Set_First_Private_Entity (New_P, First_Private_Entity (Old_P));
1267          Check_Library_Unit_Renaming (N, Old_P);
1268          Generate_Reference (Old_P, Name (N));
1269
1270          --  If the renaming is in the visible part of a package, then we set
1271          --  Renamed_In_Spec for the renamed package, to prevent giving
1272          --  warnings about no entities referenced. Such a warning would be
1273          --  overenthusiastic, since clients can see entities in the renamed
1274          --  package via the visible package renaming.
1275
1276          declare
1277             Ent : constant Entity_Id := Cunit_Entity (Current_Sem_Unit);
1278          begin
1279             if Ekind (Ent) = E_Package
1280               and then not In_Private_Part (Ent)
1281               and then In_Extended_Main_Source_Unit (N)
1282               and then Ekind (Old_P) = E_Package
1283             then
1284                Set_Renamed_In_Spec (Old_P);
1285             end if;
1286          end;
1287
1288          --  If this is the renaming declaration of a package instantiation
1289          --  within itself, it is the declaration that ends the list of actuals
1290          --  for the instantiation. At this point, the subtypes that rename
1291          --  the actuals are flagged as generic, to avoid spurious ambiguities
1292          --  if the actuals for two distinct formals happen to coincide. If
1293          --  the actual is a private type, the subtype has a private completion
1294          --  that is flagged in the same fashion.
1295
1296          --  Resolution is identical to what is was in the original generic.
1297          --  On exit from the generic instance, these are turned into regular
1298          --  subtypes again, so they are compatible with types in their class.
1299
1300          if not Is_Generic_Instance (Old_P) then
1301             return;
1302          else
1303             Spec := Specification (Unit_Declaration_Node (Old_P));
1304          end if;
1305
1306          if Nkind (Spec) = N_Package_Specification
1307            and then Present (Generic_Parent (Spec))
1308            and then Old_P = Current_Scope
1309            and then Chars (New_P) = Chars (Generic_Parent (Spec))
1310          then
1311             declare
1312                E : Entity_Id;
1313
1314             begin
1315                E := First_Entity (Old_P);
1316                while Present (E)
1317                  and then E /= New_P
1318                loop
1319                   if Is_Type (E)
1320                     and then Nkind (Parent (E)) = N_Subtype_Declaration
1321                   then
1322                      Set_Is_Generic_Actual_Type (E);
1323
1324                      if Is_Private_Type (E)
1325                        and then Present (Full_View (E))
1326                      then
1327                         Set_Is_Generic_Actual_Type (Full_View (E));
1328                      end if;
1329                   end if;
1330
1331                   Next_Entity (E);
1332                end loop;
1333             end;
1334          end if;
1335       end if;
1336    end Analyze_Package_Renaming;
1337
1338    -------------------------------
1339    -- Analyze_Renamed_Character --
1340    -------------------------------
1341
1342    procedure Analyze_Renamed_Character
1343      (N       : Node_Id;
1344       New_S   : Entity_Id;
1345       Is_Body : Boolean)
1346    is
1347       C : constant Node_Id := Name (N);
1348
1349    begin
1350       if Ekind (New_S) = E_Function then
1351          Resolve (C, Etype (New_S));
1352
1353          if Is_Body then
1354             Check_Frozen_Renaming (N, New_S);
1355          end if;
1356
1357       else
1358          Error_Msg_N ("character literal can only be renamed as function", N);
1359       end if;
1360    end Analyze_Renamed_Character;
1361
1362    ---------------------------------
1363    -- Analyze_Renamed_Dereference --
1364    ---------------------------------
1365
1366    procedure Analyze_Renamed_Dereference
1367      (N       : Node_Id;
1368       New_S   : Entity_Id;
1369       Is_Body : Boolean)
1370    is
1371       Nam : constant Node_Id := Name (N);
1372       P   : constant Node_Id := Prefix (Nam);
1373       Typ : Entity_Id;
1374       Ind : Interp_Index;
1375       It  : Interp;
1376
1377    begin
1378       if not Is_Overloaded (P) then
1379          if Ekind (Etype (Nam)) /= E_Subprogram_Type
1380            or else not Type_Conformant (Etype (Nam), New_S)
1381          then
1382             Error_Msg_N ("designated type does not match specification", P);
1383          else
1384             Resolve (P);
1385          end if;
1386
1387          return;
1388
1389       else
1390          Typ := Any_Type;
1391          Get_First_Interp (Nam, Ind, It);
1392
1393          while Present (It.Nam) loop
1394
1395             if Ekind (It.Nam) = E_Subprogram_Type
1396               and then Type_Conformant (It.Nam, New_S)
1397             then
1398                if Typ /= Any_Id then
1399                   Error_Msg_N ("ambiguous renaming", P);
1400                   return;
1401                else
1402                   Typ := It.Nam;
1403                end if;
1404             end if;
1405
1406             Get_Next_Interp (Ind, It);
1407          end loop;
1408
1409          if Typ = Any_Type then
1410             Error_Msg_N ("designated type does not match specification", P);
1411          else
1412             Resolve (N, Typ);
1413
1414             if Is_Body then
1415                Check_Frozen_Renaming (N, New_S);
1416             end if;
1417          end if;
1418       end if;
1419    end Analyze_Renamed_Dereference;
1420
1421    ---------------------------
1422    -- Analyze_Renamed_Entry --
1423    ---------------------------
1424
1425    procedure Analyze_Renamed_Entry
1426      (N       : Node_Id;
1427       New_S   : Entity_Id;
1428       Is_Body : Boolean)
1429    is
1430       Nam   : constant Node_Id := Name (N);
1431       Sel   : constant Node_Id := Selector_Name (Nam);
1432       Old_S : Entity_Id;
1433
1434    begin
1435       if Entity (Sel) = Any_Id then
1436
1437          --  Selector is undefined on prefix. Error emitted already
1438
1439          Set_Has_Completion (New_S);
1440          return;
1441       end if;
1442
1443       --  Otherwise find renamed entity and build body of New_S as a call to it
1444
1445       Old_S := Find_Renamed_Entity (N, Selector_Name (Nam), New_S);
1446
1447       if Old_S = Any_Id then
1448          Error_Msg_N (" no subprogram or entry matches specification",  N);
1449       else
1450          if Is_Body then
1451             Check_Subtype_Conformant (New_S, Old_S, N);
1452             Generate_Reference (New_S, Defining_Entity (N), 'b');
1453             Style.Check_Identifier (Defining_Entity (N), New_S);
1454
1455          else
1456             --  Only mode conformance required for a renaming_as_declaration
1457
1458             Check_Mode_Conformant (New_S, Old_S, N);
1459          end if;
1460
1461          Inherit_Renamed_Profile (New_S, Old_S);
1462
1463          --  The prefix can be an arbitrary expression that yields a task type,
1464          --  so it must be resolved.
1465
1466          Resolve (Prefix (Nam), Scope (Old_S));
1467       end if;
1468
1469       Set_Convention (New_S, Convention (Old_S));
1470       Set_Has_Completion (New_S, Inside_A_Generic);
1471
1472       if Is_Body then
1473          Check_Frozen_Renaming (N, New_S);
1474       end if;
1475    end Analyze_Renamed_Entry;
1476
1477    -----------------------------------
1478    -- Analyze_Renamed_Family_Member --
1479    -----------------------------------
1480
1481    procedure Analyze_Renamed_Family_Member
1482      (N       : Node_Id;
1483       New_S   : Entity_Id;
1484       Is_Body : Boolean)
1485    is
1486       Nam   : constant Node_Id := Name (N);
1487       P     : constant Node_Id := Prefix (Nam);
1488       Old_S : Entity_Id;
1489
1490    begin
1491       if (Is_Entity_Name (P) and then Ekind (Entity (P)) = E_Entry_Family)
1492         or else (Nkind (P) = N_Selected_Component
1493                    and then
1494                  Ekind (Entity (Selector_Name (P))) = E_Entry_Family)
1495       then
1496          if Is_Entity_Name (P) then
1497             Old_S := Entity (P);
1498          else
1499             Old_S := Entity (Selector_Name (P));
1500          end if;
1501
1502          if not Entity_Matches_Spec (Old_S, New_S) then
1503             Error_Msg_N ("entry family does not match specification", N);
1504
1505          elsif Is_Body then
1506             Check_Subtype_Conformant (New_S, Old_S, N);
1507             Generate_Reference (New_S, Defining_Entity (N), 'b');
1508             Style.Check_Identifier (Defining_Entity (N), New_S);
1509          end if;
1510
1511       else
1512          Error_Msg_N ("no entry family matches specification", N);
1513       end if;
1514
1515       Set_Has_Completion (New_S, Inside_A_Generic);
1516
1517       if Is_Body then
1518          Check_Frozen_Renaming (N, New_S);
1519       end if;
1520    end Analyze_Renamed_Family_Member;
1521
1522    -----------------------------------------
1523    -- Analyze_Renamed_Primitive_Operation --
1524    -----------------------------------------
1525
1526    procedure Analyze_Renamed_Primitive_Operation
1527      (N       : Node_Id;
1528       New_S   : Entity_Id;
1529       Is_Body : Boolean)
1530    is
1531       Old_S : Entity_Id;
1532
1533       function Conforms
1534         (Subp : Entity_Id;
1535          Ctyp : Conformance_Type) return Boolean;
1536       --  Verify that the signatures of the renamed entity and the new entity
1537       --  match. The first formal of the renamed entity is skipped because it
1538       --  is the target object in any subsequent call.
1539
1540       function Conforms
1541         (Subp : Entity_Id;
1542          Ctyp : Conformance_Type) return Boolean
1543       is
1544          Old_F : Entity_Id;
1545          New_F : Entity_Id;
1546
1547       begin
1548          if Ekind (Subp) /= Ekind (New_S) then
1549             return False;
1550          end if;
1551
1552          Old_F := Next_Formal (First_Formal (Subp));
1553          New_F := First_Formal (New_S);
1554          while Present (Old_F) and then Present (New_F) loop
1555             if not Conforming_Types (Etype (Old_F), Etype (New_F), Ctyp) then
1556                return False;
1557             end if;
1558
1559             if Ctyp >= Mode_Conformant
1560               and then Ekind (Old_F) /= Ekind (New_F)
1561             then
1562                return False;
1563             end if;
1564
1565             Next_Formal (New_F);
1566             Next_Formal (Old_F);
1567          end loop;
1568
1569          return True;
1570       end Conforms;
1571
1572    begin
1573       if not Is_Overloaded (Selector_Name (Name (N))) then
1574          Old_S := Entity (Selector_Name (Name (N)));
1575
1576          if not Conforms (Old_S, Type_Conformant) then
1577             Old_S := Any_Id;
1578          end if;
1579
1580       else
1581          --  Find the operation that matches the given signature
1582
1583          declare
1584             It  : Interp;
1585             Ind : Interp_Index;
1586
1587          begin
1588             Old_S := Any_Id;
1589             Get_First_Interp (Selector_Name (Name (N)), Ind, It);
1590
1591             while Present (It.Nam) loop
1592                if Conforms (It.Nam, Type_Conformant) then
1593                   Old_S := It.Nam;
1594                end if;
1595
1596                Get_Next_Interp (Ind, It);
1597             end loop;
1598          end;
1599       end if;
1600
1601       if Old_S = Any_Id then
1602          Error_Msg_N (" no subprogram or entry matches specification",  N);
1603
1604       else
1605          if Is_Body then
1606             if not Conforms (Old_S, Subtype_Conformant) then
1607                Error_Msg_N ("subtype conformance error in renaming", N);
1608             end if;
1609
1610             Generate_Reference (New_S, Defining_Entity (N), 'b');
1611             Style.Check_Identifier (Defining_Entity (N), New_S);
1612
1613          else
1614             --  Only mode conformance required for a renaming_as_declaration
1615
1616             if not Conforms (Old_S, Mode_Conformant) then
1617                Error_Msg_N ("mode conformance error in renaming", N);
1618             end if;
1619          end if;
1620
1621          --  Inherit_Renamed_Profile (New_S, Old_S);
1622
1623          --  The prefix can be an arbitrary expression that yields an
1624          --  object, so it must be resolved.
1625
1626          Resolve (Prefix (Name (N)));
1627       end if;
1628    end Analyze_Renamed_Primitive_Operation;
1629
1630    ---------------------------------
1631    -- Analyze_Subprogram_Renaming --
1632    ---------------------------------
1633
1634    procedure Analyze_Subprogram_Renaming (N : Node_Id) is
1635       Formal_Spec : constant Node_Id := Corresponding_Formal_Spec (N);
1636       Is_Actual   : constant Boolean := Present (Formal_Spec);
1637       Inst_Node   : Node_Id                   := Empty;
1638       Nam         : constant Node_Id          := Name (N);
1639       New_S       : Entity_Id;
1640       Old_S       : Entity_Id                 := Empty;
1641       Rename_Spec : Entity_Id;
1642       Save_AV     : constant Ada_Version_Type := Ada_Version;
1643       Save_AV_Exp : constant Ada_Version_Type := Ada_Version_Explicit;
1644       Spec        : constant Node_Id          := Specification (N);
1645
1646       procedure Check_Null_Exclusion
1647         (Ren : Entity_Id;
1648          Sub : Entity_Id);
1649       --  Ada 2005 (AI-423): Given renaming Ren of subprogram Sub, check the
1650       --  following AI rules:
1651       --
1652       --    If Ren is a renaming of a formal subprogram and one of its
1653       --    parameters has a null exclusion, then the corresponding formal
1654       --    in Sub must also have one. Otherwise the subtype of the Sub's
1655       --    formal parameter must exclude null.
1656       --
1657       --    If Ren is a renaming of a formal function and its return
1658       --    profile has a null exclusion, then Sub's return profile must
1659       --    have one. Otherwise the subtype of Sub's return profile must
1660       --    exclude null.
1661
1662       function Original_Subprogram (Subp : Entity_Id) return Entity_Id;
1663       --  Find renamed entity when the declaration is a renaming_as_body and
1664       --  the renamed entity may itself be a renaming_as_body. Used to enforce
1665       --  rule that a renaming_as_body is illegal if the declaration occurs
1666       --  before the subprogram it completes is frozen, and renaming indirectly
1667       --  renames the subprogram itself.(Defect Report 8652/0027).
1668
1669       function Check_Class_Wide_Actual return Entity_Id;
1670       --  AI05-0071: In an instance, if the actual for a formal type FT with
1671       --  unknown discriminants is a class-wide type CT, and the generic has
1672       --  a formal subprogram with a box for a primitive operation of FT,
1673       --  then the corresponding actual subprogram denoted by the default is a
1674       --  class-wide operation whose body is a dispatching call. We replace the
1675       --  generated renaming declaration:
1676       --
1677       --    procedure P (X : CT) renames P;
1678       --
1679       --  by a different renaming and a class-wide operation:
1680       --
1681       --    procedure Pr (X : T) renames P;   --  renames primitive operation
1682       --    procedure P (X : CT);             --  class-wide operation
1683       --    ...
1684       --    procedure P (X : CT) is begin Pr (X); end;  -- dispatching call
1685       --
1686       --  This rule only applies if there is no explicit visible class-wide
1687       --  operation at the point of the instantiation.
1688
1689       function Has_Class_Wide_Actual return Boolean;
1690       --  Ada 2012 (AI05-071, AI05-0131): True if N is the renaming for a
1691       --  defaulted formal subprogram when the actual for the controlling
1692       --  formal type is class-wide.
1693
1694       -----------------------------
1695       -- Check_Class_Wide_Actual --
1696       -----------------------------
1697
1698       function Check_Class_Wide_Actual return Entity_Id is
1699          Loc : constant Source_Ptr := Sloc (N);
1700
1701          F           : Entity_Id;
1702          Formal_Type : Entity_Id;
1703          Actual_Type : Entity_Id;
1704          New_Body    : Node_Id;
1705          New_Decl    : Node_Id;
1706          Result      : Entity_Id;
1707
1708          function Make_Call (Prim_Op : Entity_Id) return Node_Id;
1709          --  Build dispatching call for body of class-wide operation
1710
1711          function Make_Spec return Node_Id;
1712          --  Create subprogram specification for declaration and body of
1713          --  class-wide operation, using signature of renaming declaration.
1714
1715          ---------------
1716          -- Make_Call --
1717          ---------------
1718
1719          function Make_Call (Prim_Op : Entity_Id) return Node_Id is
1720             Actuals : List_Id;
1721             F       : Node_Id;
1722
1723          begin
1724             Actuals := New_List;
1725             F := First (Parameter_Specifications (Specification (New_Decl)));
1726             while Present (F) loop
1727                Append_To (Actuals,
1728                  Make_Identifier (Loc, Chars (Defining_Identifier (F))));
1729                Next (F);
1730             end loop;
1731
1732             if Ekind_In (Prim_Op, E_Function, E_Operator) then
1733                return Make_Simple_Return_Statement (Loc,
1734                   Expression =>
1735                     Make_Function_Call (Loc,
1736                       Name => New_Occurrence_Of (Prim_Op, Loc),
1737                       Parameter_Associations => Actuals));
1738             else
1739                return
1740                  Make_Procedure_Call_Statement (Loc,
1741                       Name => New_Occurrence_Of (Prim_Op, Loc),
1742                       Parameter_Associations => Actuals);
1743             end if;
1744          end Make_Call;
1745
1746          ---------------
1747          -- Make_Spec --
1748          ---------------
1749
1750          function Make_Spec return Node_Id is
1751             Param_Specs : constant List_Id := Copy_Parameter_List (New_S);
1752
1753          begin
1754             if Ekind (New_S) = E_Procedure then
1755                return
1756                  Make_Procedure_Specification (Loc,
1757                    Defining_Unit_Name =>
1758                      Make_Defining_Identifier (Loc,
1759                        Chars (Defining_Unit_Name (Spec))),
1760                    Parameter_Specifications => Param_Specs);
1761             else
1762                return
1763                   Make_Function_Specification (Loc,
1764                     Defining_Unit_Name =>
1765                       Make_Defining_Identifier (Loc,
1766                         Chars (Defining_Unit_Name (Spec))),
1767                     Parameter_Specifications => Param_Specs,
1768                     Result_Definition =>
1769                       New_Copy_Tree (Result_Definition (Spec)));
1770             end if;
1771          end Make_Spec;
1772
1773       --  Start of processing for Check_Class_Wide_Actual
1774
1775       begin
1776          Result := Any_Id;
1777          Formal_Type := Empty;
1778          Actual_Type := Empty;
1779
1780          F := First_Formal (Formal_Spec);
1781          while Present (F) loop
1782             if Has_Unknown_Discriminants (Etype (F))
1783               and then not Is_Class_Wide_Type (Etype (F))
1784               and then Is_Class_Wide_Type (Get_Instance_Of (Etype (F)))
1785             then
1786                Formal_Type := Etype (F);
1787                Actual_Type := Etype (Get_Instance_Of (Formal_Type));
1788                exit;
1789             end if;
1790
1791             Next_Formal (F);
1792          end loop;
1793
1794          if Present (Formal_Type) then
1795
1796             --  Create declaration and body for class-wide operation
1797
1798             New_Decl :=
1799               Make_Subprogram_Declaration (Loc, Specification => Make_Spec);
1800
1801             New_Body :=
1802               Make_Subprogram_Body (Loc,
1803                 Specification => Make_Spec,
1804                 Declarations => No_List,
1805                 Handled_Statement_Sequence =>
1806                   Make_Handled_Sequence_Of_Statements (Loc, New_List));
1807
1808             --  Modify Spec and create internal name for renaming of primitive
1809             --  operation.
1810
1811             Set_Defining_Unit_Name (Spec, Make_Temporary (Loc, 'R'));
1812             F := First (Parameter_Specifications (Spec));
1813             while Present (F) loop
1814                if Nkind (Parameter_Type (F)) = N_Identifier
1815                  and then Is_Class_Wide_Type (Entity (Parameter_Type (F)))
1816                then
1817                   Set_Parameter_Type (F, New_Occurrence_Of (Actual_Type, Loc));
1818                end if;
1819                Next (F);
1820             end loop;
1821
1822             New_S := Analyze_Subprogram_Specification (Spec);
1823             Result :=  Find_Renamed_Entity (N, Name (N), New_S, Is_Actual);
1824          end if;
1825
1826          if Result /= Any_Id then
1827             Insert_Before (N, New_Decl);
1828             Analyze (New_Decl);
1829
1830             --  Add dispatching call to body of class-wide operation
1831
1832             Append (Make_Call (Result),
1833               Statements (Handled_Statement_Sequence (New_Body)));
1834
1835             --  The generated body does not freeze. It is analyzed when the
1836             --  generated operation is frozen.
1837
1838             Append_Freeze_Action (Defining_Entity (New_Decl), New_Body);
1839
1840             Result := Defining_Entity (New_Decl);
1841          end if;
1842
1843          --  Return the class-wide operation if one was created
1844
1845          return Result;
1846       end Check_Class_Wide_Actual;
1847
1848       --------------------------
1849       -- Check_Null_Exclusion --
1850       --------------------------
1851
1852       procedure Check_Null_Exclusion
1853         (Ren : Entity_Id;
1854          Sub : Entity_Id)
1855       is
1856          Ren_Formal : Entity_Id;
1857          Sub_Formal : Entity_Id;
1858
1859       begin
1860          --  Parameter check
1861
1862          Ren_Formal := First_Formal (Ren);
1863          Sub_Formal := First_Formal (Sub);
1864          while Present (Ren_Formal)
1865            and then Present (Sub_Formal)
1866          loop
1867             if Has_Null_Exclusion (Parent (Ren_Formal))
1868               and then
1869                 not (Has_Null_Exclusion (Parent (Sub_Formal))
1870                        or else Can_Never_Be_Null (Etype (Sub_Formal)))
1871             then
1872                Error_Msg_NE
1873                  ("`NOT NULL` required for parameter &",
1874                   Parent (Sub_Formal), Sub_Formal);
1875             end if;
1876
1877             Next_Formal (Ren_Formal);
1878             Next_Formal (Sub_Formal);
1879          end loop;
1880
1881          --  Return profile check
1882
1883          if Nkind (Parent (Ren)) = N_Function_Specification
1884            and then Nkind (Parent (Sub)) = N_Function_Specification
1885            and then Has_Null_Exclusion (Parent (Ren))
1886            and then
1887              not (Has_Null_Exclusion (Parent (Sub))
1888                     or else Can_Never_Be_Null (Etype (Sub)))
1889          then
1890             Error_Msg_N
1891               ("return must specify `NOT NULL`",
1892                Result_Definition (Parent (Sub)));
1893          end if;
1894       end Check_Null_Exclusion;
1895
1896       ---------------------------
1897       -- Has_Class_Wide_Actual --
1898       ---------------------------
1899
1900       function Has_Class_Wide_Actual return Boolean is
1901          F_Nam  : Entity_Id;
1902          F_Spec : Entity_Id;
1903
1904       begin
1905          if Is_Actual
1906            and then Nkind (Nam) in N_Has_Entity
1907            and then Present (Entity (Nam))
1908            and then Is_Dispatching_Operation (Entity (Nam))
1909          then
1910             F_Nam  := First_Entity (Entity (Nam));
1911             F_Spec := First_Formal (Formal_Spec);
1912             while Present (F_Nam)
1913               and then Present (F_Spec)
1914             loop
1915                if Is_Controlling_Formal (F_Nam)
1916                  and then Has_Unknown_Discriminants (Etype (F_Spec))
1917                  and then not Is_Class_Wide_Type (Etype (F_Spec))
1918                  and then Is_Class_Wide_Type (Get_Instance_Of (Etype (F_Spec)))
1919                then
1920                   return True;
1921                end if;
1922
1923                Next_Entity (F_Nam);
1924                Next_Formal (F_Spec);
1925             end loop;
1926          end if;
1927
1928          return False;
1929       end Has_Class_Wide_Actual;
1930
1931       -------------------------
1932       -- Original_Subprogram --
1933       -------------------------
1934
1935       function Original_Subprogram (Subp : Entity_Id) return Entity_Id is
1936          Orig_Decl : Node_Id;
1937          Orig_Subp : Entity_Id;
1938
1939       begin
1940          --  First case: renamed entity is itself a renaming
1941
1942          if Present (Alias (Subp)) then
1943             return Alias (Subp);
1944
1945          elsif
1946            Nkind (Unit_Declaration_Node (Subp)) = N_Subprogram_Declaration
1947              and then Present
1948               (Corresponding_Body (Unit_Declaration_Node (Subp)))
1949          then
1950             --  Check if renamed entity is a renaming_as_body
1951
1952             Orig_Decl :=
1953               Unit_Declaration_Node
1954                 (Corresponding_Body (Unit_Declaration_Node (Subp)));
1955
1956             if Nkind (Orig_Decl) = N_Subprogram_Renaming_Declaration then
1957                Orig_Subp := Entity (Name (Orig_Decl));
1958
1959                if Orig_Subp = Rename_Spec then
1960
1961                   --  Circularity detected
1962
1963                   return Orig_Subp;
1964
1965                else
1966                   return (Original_Subprogram (Orig_Subp));
1967                end if;
1968             else
1969                return Subp;
1970             end if;
1971          else
1972             return Subp;
1973          end if;
1974       end Original_Subprogram;
1975
1976       CW_Actual : constant Boolean := Has_Class_Wide_Actual;
1977       --  Ada 2012 (AI05-071, AI05-0131): True if the renaming is for a
1978       --  defaulted formal subprogram when the actual for a related formal
1979       --  type is class-wide.
1980
1981    --  Start of processing for Analyze_Subprogram_Renaming
1982
1983    begin
1984       --  We must test for the attribute renaming case before the Analyze
1985       --  call because otherwise Sem_Attr will complain that the attribute
1986       --  is missing an argument when it is analyzed.
1987
1988       if Nkind (Nam) = N_Attribute_Reference then
1989
1990          --  In the case of an abstract formal subprogram association, rewrite
1991          --  an actual given by a stream attribute as the name of the
1992          --  corresponding stream primitive of the type.
1993
1994          --  In a generic context the stream operations are not generated, and
1995          --  this must be treated as a normal attribute reference, to be
1996          --  expanded in subsequent instantiations.
1997
1998          if Is_Actual and then Is_Abstract_Subprogram (Formal_Spec)
1999            and then Expander_Active
2000          then
2001             declare
2002                Stream_Prim : Entity_Id;
2003                Prefix_Type : constant Entity_Id := Entity (Prefix (Nam));
2004
2005             begin
2006                --  The class-wide forms of the stream attributes are not
2007                --  primitive dispatching operations (even though they
2008                --  internally dispatch to a stream attribute).
2009
2010                if Is_Class_Wide_Type (Prefix_Type) then
2011                   Error_Msg_N
2012                     ("attribute must be a primitive dispatching operation",
2013                      Nam);
2014                   return;
2015                end if;
2016
2017                --  Retrieve the primitive subprogram associated with the
2018                --  attribute. This can only be a stream attribute, since those
2019                --  are the only ones that are dispatching (and the actual for
2020                --  an abstract formal subprogram must be dispatching
2021                --  operation).
2022
2023                begin
2024                   case Attribute_Name (Nam) is
2025                      when Name_Input  =>
2026                         Stream_Prim :=
2027                           Find_Prim_Op (Prefix_Type, TSS_Stream_Input);
2028                      when Name_Output =>
2029                         Stream_Prim :=
2030                           Find_Prim_Op (Prefix_Type, TSS_Stream_Output);
2031                      when Name_Read   =>
2032                         Stream_Prim :=
2033                           Find_Prim_Op (Prefix_Type, TSS_Stream_Read);
2034                      when Name_Write  =>
2035                         Stream_Prim :=
2036                           Find_Prim_Op (Prefix_Type, TSS_Stream_Write);
2037                      when others      =>
2038                         Error_Msg_N
2039                           ("attribute must be a primitive"
2040                             & " dispatching operation", Nam);
2041                         return;
2042                   end case;
2043
2044                exception
2045
2046                   --  If no operation was found, and the type is limited,
2047                   --  the user should have defined one.
2048
2049                   when Program_Error =>
2050                      if Is_Limited_Type (Prefix_Type) then
2051                         Error_Msg_NE
2052                          ("stream operation not defined for type&",
2053                            N, Prefix_Type);
2054                         return;
2055
2056                      --  Otherwise, compiler should have generated default
2057
2058                      else
2059                         raise;
2060                      end if;
2061                end;
2062
2063                --  Rewrite the attribute into the name of its corresponding
2064                --  primitive dispatching subprogram. We can then proceed with
2065                --  the usual processing for subprogram renamings.
2066
2067                declare
2068                   Prim_Name : constant Node_Id :=
2069                                 Make_Identifier (Sloc (Nam),
2070                                   Chars => Chars (Stream_Prim));
2071                begin
2072                   Set_Entity (Prim_Name, Stream_Prim);
2073                   Rewrite (Nam, Prim_Name);
2074                   Analyze (Nam);
2075                end;
2076             end;
2077
2078          --  Normal processing for a renaming of an attribute
2079
2080          else
2081             Attribute_Renaming (N);
2082             return;
2083          end if;
2084       end if;
2085
2086       --  Check whether this declaration corresponds to the instantiation
2087       --  of a formal subprogram.
2088
2089       --  If this is an instantiation, the corresponding actual is frozen and
2090       --  error messages can be made more precise. If this is a default
2091       --  subprogram, the entity is already established in the generic, and is
2092       --  not retrieved by visibility. If it is a default with a box, the
2093       --  candidate interpretations, if any, have been collected when building
2094       --  the renaming declaration. If overloaded, the proper interpretation is
2095       --  determined in Find_Renamed_Entity. If the entity is an operator,
2096       --  Find_Renamed_Entity applies additional visibility checks.
2097
2098       if Is_Actual then
2099          Inst_Node := Unit_Declaration_Node (Formal_Spec);
2100
2101          --  Check whether the renaming is for a defaulted actual subprogram
2102          --  with a class-wide actual.
2103
2104          if CW_Actual then
2105             New_S := Analyze_Subprogram_Specification (Spec);
2106             Old_S := Check_Class_Wide_Actual;
2107
2108          elsif Is_Entity_Name (Nam)
2109            and then Present (Entity (Nam))
2110            and then not Comes_From_Source (Nam)
2111            and then not Is_Overloaded (Nam)
2112          then
2113             Old_S := Entity (Nam);
2114             New_S := Analyze_Subprogram_Specification (Spec);
2115
2116             --  Operator case
2117
2118             if Ekind (Entity (Nam)) = E_Operator then
2119
2120                --  Box present
2121
2122                if Box_Present (Inst_Node) then
2123                   Old_S := Find_Renamed_Entity (N, Name (N), New_S, Is_Actual);
2124
2125                --  If there is an immediately visible homonym of the operator
2126                --  and the declaration has a default, this is worth a warning
2127                --  because the user probably did not intend to get the pre-
2128                --  defined operator, visible in the generic declaration. To
2129                --  find if there is an intended candidate, analyze the renaming
2130                --  again in the current context.
2131
2132                elsif Scope (Old_S) = Standard_Standard
2133                  and then Present (Default_Name (Inst_Node))
2134                then
2135                   declare
2136                      Decl   : constant Node_Id := New_Copy_Tree (N);
2137                      Hidden : Entity_Id;
2138
2139                   begin
2140                      Set_Entity (Name (Decl), Empty);
2141                      Analyze (Name (Decl));
2142                      Hidden :=
2143                        Find_Renamed_Entity (Decl, Name (Decl), New_S, True);
2144
2145                      if Present (Hidden)
2146                        and then In_Open_Scopes (Scope (Hidden))
2147                        and then Is_Immediately_Visible (Hidden)
2148                        and then Comes_From_Source (Hidden)
2149                        and then Hidden /= Old_S
2150                      then
2151                         Error_Msg_Sloc := Sloc (Hidden);
2152                         Error_Msg_N ("?default subprogram is resolved " &
2153                                      "in the generic declaration " &
2154                                      "(RM 12.6(17))", N);
2155                         Error_Msg_NE ("\?and will not use & #", N, Hidden);
2156                      end if;
2157                   end;
2158                end if;
2159             end if;
2160
2161          else
2162             Analyze (Nam);
2163             New_S := Analyze_Subprogram_Specification (Spec);
2164          end if;
2165
2166       else
2167          --  Renamed entity must be analyzed first, to avoid being hidden by
2168          --  new name (which might be the same in a generic instance).
2169
2170          Analyze (Nam);
2171
2172          --  The renaming defines a new overloaded entity, which is analyzed
2173          --  like a subprogram declaration.
2174
2175          New_S := Analyze_Subprogram_Specification (Spec);
2176       end if;
2177
2178       if Current_Scope /= Standard_Standard then
2179          Set_Is_Pure (New_S, Is_Pure (Current_Scope));
2180       end if;
2181
2182       Rename_Spec := Find_Corresponding_Spec (N);
2183
2184       --  Case of Renaming_As_Body
2185
2186       if Present (Rename_Spec) then
2187
2188          --  Renaming declaration is the completion of the declaration of
2189          --  Rename_Spec. We build an actual body for it at the freezing point.
2190
2191          Set_Corresponding_Spec (N, Rename_Spec);
2192
2193          --  Deal with special case of stream functions of abstract types
2194          --  and interfaces.
2195
2196          if Nkind (Unit_Declaration_Node (Rename_Spec)) =
2197                                      N_Abstract_Subprogram_Declaration
2198          then
2199             --  Input stream functions are abstract if the object type is
2200             --  abstract. Similarly, all default stream functions for an
2201             --  interface type are abstract. However, these subprograms may
2202             --  receive explicit declarations in representation clauses, making
2203             --  the attribute subprograms usable as defaults in subsequent
2204             --  type extensions.
2205             --  In this case we rewrite the declaration to make the subprogram
2206             --  non-abstract. We remove the previous declaration, and insert
2207             --  the new one at the point of the renaming, to prevent premature
2208             --  access to unfrozen types. The new declaration reuses the
2209             --  specification of the previous one, and must not be analyzed.
2210
2211             pragma Assert
2212               (Is_Primitive (Entity (Nam))
2213                  and then
2214                    Is_Abstract_Type (Find_Dispatching_Type (Entity (Nam))));
2215             declare
2216                Old_Decl : constant Node_Id :=
2217                             Unit_Declaration_Node (Rename_Spec);
2218                New_Decl : constant Node_Id :=
2219                             Make_Subprogram_Declaration (Sloc (N),
2220                               Specification =>
2221                                 Relocate_Node (Specification (Old_Decl)));
2222             begin
2223                Remove (Old_Decl);
2224                Insert_After (N, New_Decl);
2225                Set_Is_Abstract_Subprogram (Rename_Spec, False);
2226                Set_Analyzed (New_Decl);
2227             end;
2228          end if;
2229
2230          Set_Corresponding_Body (Unit_Declaration_Node (Rename_Spec), New_S);
2231
2232          if Ada_Version = Ada_83 and then Comes_From_Source (N) then
2233             Error_Msg_N ("(Ada 83) renaming cannot serve as a body", N);
2234          end if;
2235
2236          Set_Convention (New_S, Convention (Rename_Spec));
2237          Check_Fully_Conformant (New_S, Rename_Spec);
2238          Set_Public_Status (New_S);
2239
2240          --  The specification does not introduce new formals, but only
2241          --  repeats the formals of the original subprogram declaration.
2242          --  For cross-reference purposes, and for refactoring tools, we
2243          --  treat the formals of the renaming declaration as body formals.
2244
2245          Reference_Body_Formals (Rename_Spec, New_S);
2246
2247          --  Indicate that the entity in the declaration functions like the
2248          --  corresponding body, and is not a new entity. The body will be
2249          --  constructed later at the freeze point, so indicate that the
2250          --  completion has not been seen yet.
2251
2252          Set_Ekind (New_S, E_Subprogram_Body);
2253          New_S := Rename_Spec;
2254          Set_Has_Completion (Rename_Spec, False);
2255
2256          --  Ada 2005: check overriding indicator
2257
2258          if Present (Overridden_Operation (Rename_Spec)) then
2259             if Must_Not_Override (Specification (N)) then
2260                Error_Msg_NE
2261                  ("subprogram& overrides inherited operation",
2262                     N, Rename_Spec);
2263             elsif
2264               Style_Check and then not Must_Override (Specification (N))
2265             then
2266                Style.Missing_Overriding (N, Rename_Spec);
2267             end if;
2268
2269          elsif Must_Override (Specification (N)) then
2270             Error_Msg_NE ("subprogram& is not overriding", N, Rename_Spec);
2271          end if;
2272
2273       --  Normal subprogram renaming (not renaming as body)
2274
2275       else
2276          Generate_Definition (New_S);
2277          New_Overloaded_Entity (New_S);
2278
2279          if Is_Entity_Name (Nam)
2280            and then Is_Intrinsic_Subprogram (Entity (Nam))
2281          then
2282             null;
2283          else
2284             Check_Delayed_Subprogram (New_S);
2285          end if;
2286       end if;
2287
2288       --  There is no need for elaboration checks on the new entity, which may
2289       --  be called before the next freezing point where the body will appear.
2290       --  Elaboration checks refer to the real entity, not the one created by
2291       --  the renaming declaration.
2292
2293       Set_Kill_Elaboration_Checks (New_S, True);
2294
2295       if Etype (Nam) = Any_Type then
2296          Set_Has_Completion (New_S);
2297          return;
2298
2299       elsif Nkind (Nam) = N_Selected_Component then
2300
2301          --  A prefix of the form  A.B can designate an entry of task A, a
2302          --  protected operation of protected object A, or finally a primitive
2303          --  operation of object A. In the later case, A is an object of some
2304          --  tagged type, or an access type that denotes one such. To further
2305          --  distinguish these cases, note that the scope of a task entry or
2306          --  protected operation is type of the prefix.
2307
2308          --  The prefix could be an overloaded function call that returns both
2309          --  kinds of operations. This overloading pathology is left to the
2310          --  dedicated reader ???
2311
2312          declare
2313             T : constant Entity_Id := Etype (Prefix (Nam));
2314
2315          begin
2316             if Present (T)
2317               and then
2318                 (Is_Tagged_Type (T)
2319                   or else
2320                     (Is_Access_Type (T)
2321                       and then
2322                         Is_Tagged_Type (Designated_Type (T))))
2323               and then Scope (Entity (Selector_Name (Nam))) /= T
2324             then
2325                Analyze_Renamed_Primitive_Operation
2326                  (N, New_S, Present (Rename_Spec));
2327                return;
2328
2329             else
2330                --  Renamed entity is an entry or protected operation. For those
2331                --  cases an explicit body is built (at the point of freezing of
2332                --  this entity) that contains a call to the renamed entity.
2333
2334                --  This is not allowed for renaming as body if the renamed
2335                --  spec is already frozen (see RM 8.5.4(5) for details).
2336
2337                if Present (Rename_Spec)
2338                  and then Is_Frozen (Rename_Spec)
2339                then
2340                   Error_Msg_N
2341                     ("renaming-as-body cannot rename entry as subprogram", N);
2342                   Error_Msg_NE
2343                     ("\since & is already frozen (RM 8.5.4(5))",
2344                      N, Rename_Spec);
2345                else
2346                   Analyze_Renamed_Entry (N, New_S, Present (Rename_Spec));
2347                end if;
2348
2349                return;
2350             end if;
2351          end;
2352
2353       elsif Nkind (Nam) = N_Explicit_Dereference then
2354
2355          --  Renamed entity is designated by access_to_subprogram expression.
2356          --  Must build body to encapsulate call, as in the entry case.
2357
2358          Analyze_Renamed_Dereference (N, New_S, Present (Rename_Spec));
2359          return;
2360
2361       elsif Nkind (Nam) = N_Indexed_Component then
2362          Analyze_Renamed_Family_Member (N, New_S, Present (Rename_Spec));
2363          return;
2364
2365       elsif Nkind (Nam) = N_Character_Literal then
2366          Analyze_Renamed_Character (N, New_S, Present (Rename_Spec));
2367          return;
2368
2369       elsif not Is_Entity_Name (Nam)
2370         or else not Is_Overloadable (Entity (Nam))
2371       then
2372          Error_Msg_N ("expect valid subprogram name in renaming", N);
2373          return;
2374       end if;
2375
2376       --  Find the renamed entity that matches the given specification. Disable
2377       --  Ada_83 because there is no requirement of full conformance between
2378       --  renamed entity and new entity, even though the same circuit is used.
2379
2380       --  This is a bit of a kludge, which introduces a really irregular use of
2381       --  Ada_Version[_Explicit]. Would be nice to find cleaner way to do this
2382       --  ???
2383
2384       Ada_Version := Ada_Version_Type'Max (Ada_Version, Ada_95);
2385       Ada_Version_Explicit := Ada_Version;
2386
2387       if No (Old_S) then
2388          Old_S := Find_Renamed_Entity (N, Name (N), New_S, Is_Actual);
2389
2390          --  The visible operation may be an inherited abstract operation that
2391          --  was overridden in the private part, in which case a call will
2392          --  dispatch to the overriding operation. Use the overriding one in
2393          --  the renaming declaration, to prevent spurious errors below.
2394
2395          if Is_Overloadable (Old_S)
2396            and then Is_Abstract_Subprogram (Old_S)
2397            and then No (DTC_Entity (Old_S))
2398            and then Present (Alias (Old_S))
2399            and then not Is_Abstract_Subprogram (Alias (Old_S))
2400            and then Present (Overridden_Operation (Alias (Old_S)))
2401          then
2402             Old_S := Alias (Old_S);
2403          end if;
2404
2405          --  When the renamed subprogram is overloaded and used as an actual
2406          --  of a generic, its entity is set to the first available homonym.
2407          --  We must first disambiguate the name, then set the proper entity.
2408
2409          if Is_Actual and then Is_Overloaded (Nam) then
2410             Set_Entity (Nam, Old_S);
2411          end if;
2412       end if;
2413
2414       --  Most common case: subprogram renames subprogram. No body is generated
2415       --  in this case, so we must indicate the declaration is complete as is.
2416       --  and inherit various attributes of the renamed subprogram.
2417
2418       if No (Rename_Spec) then
2419          Set_Has_Completion   (New_S);
2420          Set_Is_Imported      (New_S, Is_Imported      (Entity (Nam)));
2421          Set_Is_Pure          (New_S, Is_Pure          (Entity (Nam)));
2422          Set_Is_Preelaborated (New_S, Is_Preelaborated (Entity (Nam)));
2423
2424          --  Ada 2005 (AI-423): Check the consistency of null exclusions
2425          --  between a subprogram and its correct renaming.
2426
2427          --  Note: the Any_Id check is a guard that prevents compiler crashes
2428          --  when performing a null exclusion check between a renaming and a
2429          --  renamed subprogram that has been found to be illegal.
2430
2431          if Ada_Version >= Ada_2005
2432            and then Entity (Nam) /= Any_Id
2433          then
2434             Check_Null_Exclusion
2435               (Ren => New_S,
2436                Sub => Entity (Nam));
2437          end if;
2438
2439          --  Enforce the Ada 2005 rule that the renamed entity cannot require
2440          --  overriding. The flag Requires_Overriding is set very selectively
2441          --  and misses some other illegal cases. The additional conditions
2442          --  checked below are sufficient but not necessary ???
2443
2444          --  The rule does not apply to the renaming generated for an actual
2445          --  subprogram in an instance.
2446
2447          if Is_Actual then
2448             null;
2449
2450          --  Guard against previous errors, and omit renamings of predefined
2451          --  operators.
2452
2453          elsif not Ekind_In (Old_S, E_Function, E_Procedure) then
2454             null;
2455
2456          elsif Requires_Overriding (Old_S)
2457            or else
2458               (Is_Abstract_Subprogram (Old_S)
2459                  and then Present (Find_Dispatching_Type (Old_S))
2460                  and then
2461                    not Is_Abstract_Type (Find_Dispatching_Type (Old_S)))
2462          then
2463             Error_Msg_N
2464               ("renamed entity cannot be "
2465                & "subprogram that requires overriding (RM 8.5.4 (5.1))", N);
2466          end if;
2467       end if;
2468
2469       if Old_S /= Any_Id then
2470          if Is_Actual and then From_Default (N) then
2471
2472             --  This is an implicit reference to the default actual
2473
2474             Generate_Reference (Old_S, Nam, Typ => 'i', Force => True);
2475
2476          else
2477             Generate_Reference (Old_S, Nam);
2478          end if;
2479
2480          --  For a renaming-as-body, require subtype conformance, but if the
2481          --  declaration being completed has not been frozen, then inherit the
2482          --  convention of the renamed subprogram prior to checking conformance
2483          --  (unless the renaming has an explicit convention established; the
2484          --  rule stated in the RM doesn't seem to address this ???).
2485
2486          if Present (Rename_Spec) then
2487             Generate_Reference (Rename_Spec, Defining_Entity (Spec), 'b');
2488             Style.Check_Identifier (Defining_Entity (Spec), Rename_Spec);
2489
2490             if not Is_Frozen (Rename_Spec) then
2491                if not Has_Convention_Pragma (Rename_Spec) then
2492                   Set_Convention (New_S, Convention (Old_S));
2493                end if;
2494
2495                if Ekind (Old_S) /= E_Operator then
2496                   Check_Mode_Conformant (New_S, Old_S, Spec);
2497                end if;
2498
2499                if Original_Subprogram (Old_S) = Rename_Spec then
2500                   Error_Msg_N ("unfrozen subprogram cannot rename itself ", N);
2501                end if;
2502             else
2503                Check_Subtype_Conformant (New_S, Old_S, Spec);
2504             end if;
2505
2506             Check_Frozen_Renaming (N, Rename_Spec);
2507
2508             --  Check explicitly that renamed entity is not intrinsic, because
2509             --  in a generic the renamed body is not built. In this case,
2510             --  the renaming_as_body is a completion.
2511
2512             if Inside_A_Generic then
2513                if Is_Frozen (Rename_Spec)
2514                  and then Is_Intrinsic_Subprogram (Old_S)
2515                then
2516                   Error_Msg_N
2517                     ("subprogram in renaming_as_body cannot be intrinsic",
2518                        Name (N));
2519                end if;
2520
2521                Set_Has_Completion (Rename_Spec);
2522             end if;
2523
2524          elsif Ekind (Old_S) /= E_Operator then
2525
2526             --  If this a defaulted subprogram for a class-wide actual there is
2527             --  no check for mode conformance,  given that the signatures don't
2528             --  match (the source mentions T but the actual mentions T'Class).
2529
2530             if CW_Actual then
2531                null;
2532             else
2533                Check_Mode_Conformant (New_S, Old_S);
2534             end if;
2535
2536             if Is_Actual
2537               and then Error_Posted (New_S)
2538             then
2539                Error_Msg_NE ("invalid actual subprogram: & #!", N, Old_S);
2540             end if;
2541          end if;
2542
2543          if No (Rename_Spec) then
2544
2545             --  The parameter profile of the new entity is that of the renamed
2546             --  entity: the subtypes given in the specification are irrelevant.
2547
2548             Inherit_Renamed_Profile (New_S, Old_S);
2549
2550             --  A call to the subprogram is transformed into a call to the
2551             --  renamed entity. This is transitive if the renamed entity is
2552             --  itself a renaming.
2553
2554             if Present (Alias (Old_S)) then
2555                Set_Alias (New_S, Alias (Old_S));
2556             else
2557                Set_Alias (New_S, Old_S);
2558             end if;
2559
2560             --  Note that we do not set Is_Intrinsic_Subprogram if we have a
2561             --  renaming as body, since the entity in this case is not an
2562             --  intrinsic (it calls an intrinsic, but we have a real body for
2563             --  this call, and it is in this body that the required intrinsic
2564             --  processing will take place).
2565
2566             --  Also, if this is a renaming of inequality, the renamed operator
2567             --  is intrinsic, but what matters is the corresponding equality
2568             --  operator, which may be user-defined.
2569
2570             Set_Is_Intrinsic_Subprogram
2571               (New_S,
2572                 Is_Intrinsic_Subprogram (Old_S)
2573                   and then
2574                     (Chars (Old_S) /= Name_Op_Ne
2575                        or else Ekind (Old_S) = E_Operator
2576                        or else
2577                          Is_Intrinsic_Subprogram
2578                             (Corresponding_Equality (Old_S))));
2579
2580             if Ekind (Alias (New_S)) = E_Operator then
2581                Set_Has_Delayed_Freeze (New_S, False);
2582             end if;
2583
2584             --  If the renaming corresponds to an association for an abstract
2585             --  formal subprogram, then various attributes must be set to
2586             --  indicate that the renaming is an abstract dispatching operation
2587             --  with a controlling type.
2588
2589             if Is_Actual and then Is_Abstract_Subprogram (Formal_Spec) then
2590
2591                --  Mark the renaming as abstract here, so Find_Dispatching_Type
2592                --  see it as corresponding to a generic association for a
2593                --  formal abstract subprogram
2594
2595                Set_Is_Abstract_Subprogram (New_S);
2596
2597                declare
2598                   New_S_Ctrl_Type : constant Entity_Id :=
2599                                       Find_Dispatching_Type (New_S);
2600                   Old_S_Ctrl_Type : constant Entity_Id :=
2601                                       Find_Dispatching_Type (Old_S);
2602
2603                begin
2604                   if Old_S_Ctrl_Type /= New_S_Ctrl_Type then
2605                      Error_Msg_NE
2606                        ("actual must be dispatching subprogram for type&",
2607                         Nam, New_S_Ctrl_Type);
2608
2609                   else
2610                      Set_Is_Dispatching_Operation (New_S);
2611                      Check_Controlling_Formals (New_S_Ctrl_Type, New_S);
2612
2613                      --  If the actual in the formal subprogram is itself a
2614                      --  formal abstract subprogram association, there's no
2615                      --  dispatch table component or position to inherit.
2616
2617                      if Present (DTC_Entity (Old_S)) then
2618                         Set_DTC_Entity  (New_S, DTC_Entity (Old_S));
2619                         Set_DT_Position (New_S, DT_Position (Old_S));
2620                      end if;
2621                   end if;
2622                end;
2623             end if;
2624          end if;
2625
2626          if not Is_Actual
2627            and then (Old_S = New_S
2628                       or else (Nkind (Nam) /= N_Expanded_Name
2629                         and then  Chars (Old_S) = Chars (New_S)))
2630          then
2631             Error_Msg_N ("subprogram cannot rename itself", N);
2632          end if;
2633
2634          Set_Convention (New_S, Convention (Old_S));
2635
2636          if Is_Abstract_Subprogram (Old_S) then
2637             if Present (Rename_Spec) then
2638                Error_Msg_N
2639                  ("a renaming-as-body cannot rename an abstract subprogram",
2640                   N);
2641                Set_Has_Completion (Rename_Spec);
2642             else
2643                Set_Is_Abstract_Subprogram (New_S);
2644             end if;
2645          end if;
2646
2647          Check_Library_Unit_Renaming (N, Old_S);
2648
2649          --  Pathological case: procedure renames entry in the scope of its
2650          --  task. Entry is given by simple name, but body must be built for
2651          --  procedure. Of course if called it will deadlock.
2652
2653          if Ekind (Old_S) = E_Entry then
2654             Set_Has_Completion (New_S, False);
2655             Set_Alias (New_S, Empty);
2656          end if;
2657
2658          if Is_Actual then
2659             Freeze_Before (N, Old_S);
2660             Set_Has_Delayed_Freeze (New_S, False);
2661             Freeze_Before (N, New_S);
2662
2663             --  An abstract subprogram is only allowed as an actual in the case
2664             --  where the formal subprogram is also abstract.
2665
2666             if (Ekind (Old_S) = E_Procedure or else Ekind (Old_S) = E_Function)
2667               and then Is_Abstract_Subprogram (Old_S)
2668               and then not Is_Abstract_Subprogram (Formal_Spec)
2669             then
2670                Error_Msg_N
2671                  ("abstract subprogram not allowed as generic actual", Nam);
2672             end if;
2673          end if;
2674
2675       else
2676          --  A common error is to assume that implicit operators for types are
2677          --  defined in Standard, or in the scope of a subtype. In those cases
2678          --  where the renamed entity is given with an expanded name, it is
2679          --  worth mentioning that operators for the type are not declared in
2680          --  the scope given by the prefix.
2681
2682          if Nkind (Nam) = N_Expanded_Name
2683            and then Nkind (Selector_Name (Nam)) = N_Operator_Symbol
2684            and then Scope (Entity (Nam)) = Standard_Standard
2685          then
2686             declare
2687                T : constant Entity_Id :=
2688                      Base_Type (Etype (First_Formal (New_S)));
2689             begin
2690                Error_Msg_Node_2 := Prefix (Nam);
2691                Error_Msg_NE
2692                  ("operator for type& is not declared in&", Prefix (Nam), T);
2693             end;
2694
2695          else
2696             Error_Msg_NE
2697               ("no visible subprogram matches the specification for&",
2698                 Spec, New_S);
2699          end if;
2700
2701          if Present (Candidate_Renaming) then
2702             declare
2703                F1 : Entity_Id;
2704                F2 : Entity_Id;
2705                T1 : Entity_Id;
2706
2707             begin
2708                F1 := First_Formal (Candidate_Renaming);
2709                F2 := First_Formal (New_S);
2710                T1 := First_Subtype (Etype (F1));
2711
2712                while Present (F1) and then Present (F2) loop
2713                   Next_Formal (F1);
2714                   Next_Formal (F2);
2715                end loop;
2716
2717                if Present (F1) and then Present (Default_Value (F1)) then
2718                   if Present (Next_Formal (F1)) then
2719                      Error_Msg_NE
2720                        ("\missing specification for &" &
2721                           " and other formals with defaults", Spec, F1);
2722                   else
2723                      Error_Msg_NE
2724                     ("\missing specification for &", Spec, F1);
2725                   end if;
2726                end if;
2727
2728                if Nkind (Nam) = N_Operator_Symbol
2729                  and then From_Default (N)
2730                then
2731                   Error_Msg_Node_2 := T1;
2732                   Error_Msg_NE
2733                     ("default & on & is not directly visible",
2734                       Nam, Nam);
2735                end if;
2736             end;
2737          end if;
2738       end if;
2739
2740       --  Ada 2005 AI 404: if the new subprogram is dispatching, verify that
2741       --  controlling access parameters are known non-null for the renamed
2742       --  subprogram. Test also applies to a subprogram instantiation that
2743       --  is dispatching. Test is skipped if some previous error was detected
2744       --  that set Old_S to Any_Id.
2745
2746       if Ada_Version >= Ada_2005
2747         and then Old_S /= Any_Id
2748         and then not Is_Dispatching_Operation (Old_S)
2749         and then Is_Dispatching_Operation (New_S)
2750       then
2751          declare
2752             Old_F : Entity_Id;
2753             New_F : Entity_Id;
2754
2755          begin
2756             Old_F := First_Formal (Old_S);
2757             New_F := First_Formal (New_S);
2758             while Present (Old_F) loop
2759                if Ekind (Etype (Old_F)) = E_Anonymous_Access_Type
2760                  and then Is_Controlling_Formal (New_F)
2761                  and then not Can_Never_Be_Null (Old_F)
2762                then
2763                   Error_Msg_N ("access parameter is controlling,", New_F);
2764                   Error_Msg_NE
2765                     ("\corresponding parameter of& "
2766                      & "must be explicitly null excluding", New_F, Old_S);
2767                end if;
2768
2769                Next_Formal (Old_F);
2770                Next_Formal (New_F);
2771             end loop;
2772          end;
2773       end if;
2774
2775       --  A useful warning, suggested by Ada Bug Finder (Ada-Europe 2005)
2776       --  is to warn if an operator is being renamed as a different operator.
2777       --  If the operator is predefined, examine the kind of the entity, not
2778       --  the abbreviated declaration in Standard.
2779
2780       if Comes_From_Source (N)
2781         and then Present (Old_S)
2782         and then
2783           (Nkind (Old_S) = N_Defining_Operator_Symbol
2784             or else Ekind (Old_S) = E_Operator)
2785         and then Nkind (New_S) = N_Defining_Operator_Symbol
2786         and then Chars (Old_S) /= Chars (New_S)
2787       then
2788          Error_Msg_NE
2789            ("?& is being renamed as a different operator", N, Old_S);
2790       end if;
2791
2792       --  Check for renaming of obsolescent subprogram
2793
2794       Check_Obsolescent_2005_Entity (Entity (Nam), Nam);
2795
2796       --  Another warning or some utility: if the new subprogram as the same
2797       --  name as the old one, the old one is not hidden by an outer homograph,
2798       --  the new one is not a public symbol, and the old one is otherwise
2799       --  directly visible, the renaming is superfluous.
2800
2801       if Chars (Old_S) = Chars (New_S)
2802         and then Comes_From_Source (N)
2803         and then Scope (Old_S) /= Standard_Standard
2804         and then Warn_On_Redundant_Constructs
2805         and then
2806           (Is_Immediately_Visible (Old_S)
2807             or else Is_Potentially_Use_Visible (Old_S))
2808         and then Is_Overloadable (Current_Scope)
2809         and then Chars (Current_Scope) /= Chars (Old_S)
2810       then
2811          Error_Msg_N
2812           ("?redundant renaming, entity is directly visible", Name (N));
2813       end if;
2814
2815       Ada_Version := Save_AV;
2816       Ada_Version_Explicit := Save_AV_Exp;
2817    end Analyze_Subprogram_Renaming;
2818
2819    -------------------------
2820    -- Analyze_Use_Package --
2821    -------------------------
2822
2823    --  Resolve the package names in the use clause, and make all the visible
2824    --  entities defined in the package potentially use-visible. If the package
2825    --  is already in use from a previous use clause, its visible entities are
2826    --  already use-visible. In that case, mark the occurrence as a redundant
2827    --  use. If the package is an open scope, i.e. if the use clause occurs
2828    --  within the package itself, ignore it.
2829
2830    procedure Analyze_Use_Package (N : Node_Id) is
2831       Pack_Name : Node_Id;
2832       Pack      : Entity_Id;
2833
2834    --  Start of processing for Analyze_Use_Package
2835
2836    begin
2837       Check_SPARK_Restriction ("use clause is not allowed", N);
2838
2839       Set_Hidden_By_Use_Clause (N, No_Elist);
2840
2841       --  Use clause not allowed in a spec of a predefined package declaration
2842       --  except that packages whose file name starts a-n are OK (these are
2843       --  children of Ada.Numerics, which are never loaded by Rtsfind).
2844
2845       if Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
2846         and then Name_Buffer (1 .. 3) /= "a-n"
2847         and then
2848           Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Declaration
2849       then
2850          Error_Msg_N ("use clause not allowed in predefined spec", N);
2851       end if;
2852
2853       --  Chain clause to list of use clauses in current scope
2854
2855       if Nkind (Parent (N)) /= N_Compilation_Unit then
2856          Chain_Use_Clause (N);
2857       end if;
2858
2859       --  Loop through package names to identify referenced packages
2860
2861       Pack_Name := First (Names (N));
2862       while Present (Pack_Name) loop
2863          Analyze (Pack_Name);
2864
2865          if Nkind (Parent (N)) = N_Compilation_Unit
2866            and then Nkind (Pack_Name) = N_Expanded_Name
2867          then
2868             declare
2869                Pref : Node_Id;
2870
2871             begin
2872                Pref := Prefix (Pack_Name);
2873                while Nkind (Pref) = N_Expanded_Name loop
2874                   Pref := Prefix (Pref);
2875                end loop;
2876
2877                if Entity (Pref) = Standard_Standard then
2878                   Error_Msg_N
2879                    ("predefined package Standard cannot appear"
2880                      & " in a context clause", Pref);
2881                end if;
2882             end;
2883          end if;
2884
2885          Next (Pack_Name);
2886       end loop;
2887
2888       --  Loop through package names to mark all entities as potentially
2889       --  use visible.
2890
2891       Pack_Name := First (Names (N));
2892       while Present (Pack_Name) loop
2893          if Is_Entity_Name (Pack_Name) then
2894             Pack := Entity (Pack_Name);
2895
2896             if Ekind (Pack) /= E_Package
2897               and then Etype (Pack) /= Any_Type
2898             then
2899                if Ekind (Pack) = E_Generic_Package then
2900                   Error_Msg_N  -- CODEFIX
2901                    ("a generic package is not allowed in a use clause",
2902                       Pack_Name);
2903                else
2904                   Error_Msg_N ("& is not a usable package", Pack_Name);
2905                end if;
2906
2907             else
2908                if Nkind (Parent (N)) = N_Compilation_Unit then
2909                   Check_In_Previous_With_Clause (N, Pack_Name);
2910                end if;
2911
2912                if Applicable_Use (Pack_Name) then
2913                   Use_One_Package (Pack, N);
2914                end if;
2915             end if;
2916
2917          --  Report error because name denotes something other than a package
2918
2919          else
2920             Error_Msg_N ("& is not a package", Pack_Name);
2921          end if;
2922
2923          Next (Pack_Name);
2924       end loop;
2925    end Analyze_Use_Package;
2926
2927    ----------------------
2928    -- Analyze_Use_Type --
2929    ----------------------
2930
2931    procedure Analyze_Use_Type (N : Node_Id) is
2932       E  : Entity_Id;
2933       Id : Node_Id;
2934
2935    begin
2936       Set_Hidden_By_Use_Clause (N, No_Elist);
2937
2938       --  Chain clause to list of use clauses in current scope
2939
2940       if Nkind (Parent (N)) /= N_Compilation_Unit then
2941          Chain_Use_Clause (N);
2942       end if;
2943
2944       --  If the Used_Operations list is already initialized, the clause has
2945       --  been analyzed previously, and it is begin reinstalled, for example
2946       --  when the clause appears in a package spec and we are compiling the
2947       --  corresponding package body. In that case, make the entities on the
2948       --  existing list use_visible, and mark the corresponding types In_Use.
2949
2950       if Present (Used_Operations (N)) then
2951          declare
2952             Mark : Node_Id;
2953             Elmt : Elmt_Id;
2954
2955          begin
2956             Mark := First (Subtype_Marks (N));
2957             while Present (Mark) loop
2958                Use_One_Type (Mark, Installed => True);
2959                Next (Mark);
2960             end loop;
2961
2962             Elmt := First_Elmt (Used_Operations (N));
2963             while Present (Elmt) loop
2964                Set_Is_Potentially_Use_Visible (Node (Elmt));
2965                Next_Elmt (Elmt);
2966             end loop;
2967          end;
2968
2969          return;
2970       end if;
2971
2972       --  Otherwise, create new list and attach to it the operations that
2973       --  are made use-visible by the clause.
2974
2975       Set_Used_Operations (N, New_Elmt_List);
2976       Id := First (Subtype_Marks (N));
2977       while Present (Id) loop
2978          Find_Type (Id);
2979          E := Entity (Id);
2980
2981          if E /= Any_Type then
2982             Use_One_Type (Id);
2983
2984             if Nkind (Parent (N)) = N_Compilation_Unit then
2985                if Nkind (Id) = N_Identifier then
2986                   Error_Msg_N ("type is not directly visible", Id);
2987
2988                elsif Is_Child_Unit (Scope (E))
2989                  and then Scope (E) /= System_Aux_Id
2990                then
2991                   Check_In_Previous_With_Clause (N, Prefix (Id));
2992                end if;
2993             end if;
2994
2995          else
2996             --  If the use_type_clause appears in a compilation unit context,
2997             --  check whether it comes from a unit that may appear in a
2998             --  limited_with_clause, for a better error message.
2999
3000             if Nkind (Parent (N)) = N_Compilation_Unit
3001               and then Nkind (Id) /= N_Identifier
3002             then
3003                declare
3004                   Item : Node_Id;
3005                   Pref : Node_Id;
3006
3007                   function Mentioned (Nam : Node_Id) return Boolean;
3008                   --  Check whether the prefix of expanded name for the type
3009                   --  appears in the prefix of some limited_with_clause.
3010
3011                   ---------------
3012                   -- Mentioned --
3013                   ---------------
3014
3015                   function Mentioned (Nam : Node_Id) return Boolean is
3016                   begin
3017                      return Nkind (Name (Item)) = N_Selected_Component
3018                               and then
3019                             Chars (Prefix (Name (Item))) = Chars (Nam);
3020                   end Mentioned;
3021
3022                begin
3023                   Pref := Prefix (Id);
3024                   Item := First (Context_Items (Parent (N)));
3025
3026                   while Present (Item) and then Item /= N loop
3027                      if Nkind (Item) = N_With_Clause
3028                        and then Limited_Present (Item)
3029                        and then Mentioned (Pref)
3030                      then
3031                         Change_Error_Text
3032                           (Get_Msg_Id, "premature usage of incomplete type");
3033                      end if;
3034
3035                      Next (Item);
3036                   end loop;
3037                end;
3038             end if;
3039          end if;
3040
3041          Next (Id);
3042       end loop;
3043    end Analyze_Use_Type;
3044
3045    --------------------
3046    -- Applicable_Use --
3047    --------------------
3048
3049    function Applicable_Use (Pack_Name : Node_Id) return Boolean is
3050       Pack : constant Entity_Id := Entity (Pack_Name);
3051
3052    begin
3053       if In_Open_Scopes (Pack) then
3054          if Warn_On_Redundant_Constructs
3055            and then Pack = Current_Scope
3056          then
3057             Error_Msg_NE -- CODEFIX
3058               ("& is already use-visible within itself?", Pack_Name, Pack);
3059          end if;
3060
3061          return False;
3062
3063       elsif In_Use (Pack) then
3064          Note_Redundant_Use (Pack_Name);
3065          return False;
3066
3067       elsif Present (Renamed_Object (Pack))
3068         and then In_Use (Renamed_Object (Pack))
3069       then
3070          Note_Redundant_Use (Pack_Name);
3071          return False;
3072
3073       else
3074          return True;
3075       end if;
3076    end Applicable_Use;
3077
3078    ------------------------
3079    -- Attribute_Renaming --
3080    ------------------------
3081
3082    procedure Attribute_Renaming (N : Node_Id) is
3083       Loc        : constant Source_Ptr := Sloc (N);
3084       Nam        : constant Node_Id    := Name (N);
3085       Spec       : constant Node_Id    := Specification (N);
3086       New_S      : constant Entity_Id  := Defining_Unit_Name (Spec);
3087       Aname      : constant Name_Id    := Attribute_Name (Nam);
3088
3089       Form_Num   : Nat      := 0;
3090       Expr_List  : List_Id  := No_List;
3091
3092       Attr_Node  : Node_Id;
3093       Body_Node  : Node_Id;
3094       Param_Spec : Node_Id;
3095
3096    begin
3097       Generate_Definition (New_S);
3098
3099       --  This procedure is called in the context of subprogram renaming, and
3100       --  thus the attribute must be one that is a subprogram. All of those
3101       --  have at least one formal parameter, with the singular exception of
3102       --  AST_Entry (which is a real oddity, it is odd that this can be renamed
3103       --  at all!)
3104
3105       if not Is_Non_Empty_List (Parameter_Specifications (Spec)) then
3106          if Aname /= Name_AST_Entry then
3107             Error_Msg_N
3108               ("subprogram renaming an attribute must have formals", N);
3109             return;
3110          end if;
3111
3112       else
3113          Param_Spec := First (Parameter_Specifications (Spec));
3114          while Present (Param_Spec) loop
3115             Form_Num := Form_Num + 1;
3116
3117             if Nkind (Parameter_Type (Param_Spec)) /= N_Access_Definition then
3118                Find_Type (Parameter_Type (Param_Spec));
3119
3120                --  The profile of the new entity denotes the base type (s) of
3121                --  the types given in the specification. For access parameters
3122                --  there are no subtypes involved.
3123
3124                Rewrite (Parameter_Type (Param_Spec),
3125                 New_Reference_To
3126                   (Base_Type (Entity (Parameter_Type (Param_Spec))), Loc));
3127             end if;
3128
3129             if No (Expr_List) then
3130                Expr_List := New_List;
3131             end if;
3132
3133             Append_To (Expr_List,
3134               Make_Identifier (Loc,
3135                 Chars => Chars (Defining_Identifier (Param_Spec))));
3136
3137             --  The expressions in the attribute reference are not freeze
3138             --  points. Neither is the attribute as a whole, see below.
3139
3140             Set_Must_Not_Freeze (Last (Expr_List));
3141             Next (Param_Spec);
3142          end loop;
3143       end if;
3144
3145       --  Immediate error if too many formals. Other mismatches in number or
3146       --  types of parameters are detected when we analyze the body of the
3147       --  subprogram that we construct.
3148
3149       if Form_Num > 2 then
3150          Error_Msg_N ("too many formals for attribute", N);
3151
3152       --  Error if the attribute reference has expressions that look like
3153       --  formal parameters.
3154
3155       elsif Present (Expressions (Nam)) then
3156          Error_Msg_N ("illegal expressions in attribute reference", Nam);
3157
3158       elsif
3159         Aname = Name_Compose      or else
3160         Aname = Name_Exponent     or else
3161         Aname = Name_Leading_Part or else
3162         Aname = Name_Pos          or else
3163         Aname = Name_Round        or else
3164         Aname = Name_Scaling      or else
3165         Aname = Name_Val
3166       then
3167          if Nkind (N) = N_Subprogram_Renaming_Declaration
3168            and then Present (Corresponding_Formal_Spec (N))
3169          then
3170             Error_Msg_N
3171               ("generic actual cannot be attribute involving universal type",
3172                Nam);
3173          else
3174             Error_Msg_N
3175               ("attribute involving a universal type cannot be renamed",
3176                Nam);
3177          end if;
3178       end if;
3179
3180       --  AST_Entry is an odd case. It doesn't really make much sense to allow
3181       --  it to be renamed, but that's the DEC rule, so we have to do it right.
3182       --  The point is that the AST_Entry call should be made now, and what the
3183       --  function will return is the returned value.
3184
3185       --  Note that there is no Expr_List in this case anyway
3186
3187       if Aname = Name_AST_Entry then
3188          declare
3189             Ent  : constant Entity_Id := Make_Temporary (Loc, 'R', Nam);
3190             Decl : Node_Id;
3191
3192          begin
3193             Decl :=
3194               Make_Object_Declaration (Loc,
3195                 Defining_Identifier => Ent,
3196                 Object_Definition   =>
3197                   New_Occurrence_Of (RTE (RE_AST_Handler), Loc),
3198                 Expression          => Nam,
3199                 Constant_Present    => True);
3200
3201             Set_Assignment_OK (Decl, True);
3202             Insert_Action (N, Decl);
3203             Attr_Node := Make_Identifier (Loc, Chars (Ent));
3204          end;
3205
3206       --  For all other attributes, we rewrite the attribute node to have
3207       --  a list of expressions corresponding to the subprogram formals.
3208       --  A renaming declaration is not a freeze point, and the analysis of
3209       --  the attribute reference should not freeze the type of the prefix.
3210
3211       else
3212          Attr_Node :=
3213            Make_Attribute_Reference (Loc,
3214              Prefix         => Prefix (Nam),
3215              Attribute_Name => Aname,
3216              Expressions    => Expr_List);
3217
3218          Set_Must_Not_Freeze (Attr_Node);
3219          Set_Must_Not_Freeze (Prefix (Nam));
3220       end if;
3221
3222       --  Case of renaming a function
3223
3224       if Nkind (Spec) = N_Function_Specification then
3225          if Is_Procedure_Attribute_Name (Aname) then
3226             Error_Msg_N ("attribute can only be renamed as procedure", Nam);
3227             return;
3228          end if;
3229
3230          Find_Type (Result_Definition (Spec));
3231          Rewrite (Result_Definition (Spec),
3232              New_Reference_To (
3233                Base_Type (Entity (Result_Definition (Spec))), Loc));
3234
3235          Body_Node :=
3236            Make_Subprogram_Body (Loc,
3237              Specification => Spec,
3238              Declarations => New_List,
3239              Handled_Statement_Sequence =>
3240                Make_Handled_Sequence_Of_Statements (Loc,
3241                    Statements => New_List (
3242                      Make_Simple_Return_Statement (Loc,
3243                        Expression => Attr_Node))));
3244
3245       --  Case of renaming a procedure
3246
3247       else
3248          if not Is_Procedure_Attribute_Name (Aname) then
3249             Error_Msg_N ("attribute can only be renamed as function", Nam);
3250             return;
3251          end if;
3252
3253          Body_Node :=
3254            Make_Subprogram_Body (Loc,
3255              Specification => Spec,
3256              Declarations => New_List,
3257              Handled_Statement_Sequence =>
3258                Make_Handled_Sequence_Of_Statements (Loc,
3259                    Statements => New_List (Attr_Node)));
3260       end if;
3261
3262       --  In case of tagged types we add the body of the generated function to
3263       --  the freezing actions of the type (because in the general case such
3264       --  type is still not frozen). We exclude from this processing generic
3265       --  formal subprograms found in instantiations and AST_Entry renamings.
3266
3267       --  We must exclude VM targets because entity AST_Handler is defined in
3268       --  package System.Aux_Dec which is not available in those platforms.
3269
3270       if VM_Target = No_VM
3271         and then not Present (Corresponding_Formal_Spec (N))
3272         and then Etype (Nam) /= RTE (RE_AST_Handler)
3273       then
3274          declare
3275             P : constant Entity_Id := Prefix (Nam);
3276
3277          begin
3278             Find_Type (P);
3279
3280             if Is_Tagged_Type (Etype (P)) then
3281                Ensure_Freeze_Node (Etype (P));
3282                Append_Freeze_Action (Etype (P), Body_Node);
3283             else
3284                Rewrite (N, Body_Node);
3285                Analyze (N);
3286                Set_Etype (New_S, Base_Type (Etype (New_S)));
3287             end if;
3288          end;
3289
3290       --  Generic formal subprograms or AST_Handler renaming
3291
3292       else
3293          Rewrite (N, Body_Node);
3294          Analyze (N);
3295          Set_Etype (New_S, Base_Type (Etype (New_S)));
3296       end if;
3297
3298       if Is_Compilation_Unit (New_S) then
3299          Error_Msg_N
3300            ("a library unit can only rename another library unit", N);
3301       end if;
3302
3303       --  We suppress elaboration warnings for the resulting entity, since
3304       --  clearly they are not needed, and more particularly, in the case
3305       --  of a generic formal subprogram, the resulting entity can appear
3306       --  after the instantiation itself, and thus look like a bogus case
3307       --  of access before elaboration.
3308
3309       Set_Suppress_Elaboration_Warnings (New_S);
3310
3311    end Attribute_Renaming;
3312
3313    ----------------------
3314    -- Chain_Use_Clause --
3315    ----------------------
3316
3317    procedure Chain_Use_Clause (N : Node_Id) is
3318       Pack : Entity_Id;
3319       Level : Int := Scope_Stack.Last;
3320
3321    begin
3322       if not Is_Compilation_Unit (Current_Scope)
3323         or else not Is_Child_Unit (Current_Scope)
3324       then
3325          null;   --  Common case
3326
3327       elsif Defining_Entity (Parent (N)) = Current_Scope then
3328          null;   --  Common case for compilation unit
3329
3330       else
3331          --  If declaration appears in some other scope, it must be in some
3332          --  parent unit when compiling a child.
3333
3334          Pack := Defining_Entity (Parent (N));
3335          if not In_Open_Scopes (Pack) then
3336             null;  --  default as well
3337
3338          else
3339             --  Find entry for parent unit in scope stack
3340
3341             while Scope_Stack.Table (Level).Entity /= Pack loop
3342                Level := Level - 1;
3343             end loop;
3344          end if;
3345       end if;
3346
3347       Set_Next_Use_Clause (N,
3348         Scope_Stack.Table (Level).First_Use_Clause);
3349       Scope_Stack.Table (Level).First_Use_Clause := N;
3350    end Chain_Use_Clause;
3351
3352    ---------------------------
3353    -- Check_Frozen_Renaming --
3354    ---------------------------
3355
3356    procedure Check_Frozen_Renaming (N : Node_Id; Subp : Entity_Id) is
3357       B_Node : Node_Id;
3358       Old_S  : Entity_Id;
3359
3360    begin
3361       if Is_Frozen (Subp)
3362         and then not Has_Completion (Subp)
3363       then
3364          B_Node :=
3365            Build_Renamed_Body
3366              (Parent (Declaration_Node (Subp)), Defining_Entity (N));
3367
3368          if Is_Entity_Name (Name (N)) then
3369             Old_S := Entity (Name (N));
3370
3371             if not Is_Frozen (Old_S)
3372               and then Operating_Mode /= Check_Semantics
3373             then
3374                Append_Freeze_Action (Old_S, B_Node);
3375             else
3376                Insert_After (N, B_Node);
3377                Analyze (B_Node);
3378             end if;
3379
3380             if Is_Intrinsic_Subprogram (Old_S)
3381               and then not In_Instance
3382             then
3383                Error_Msg_N
3384                  ("subprogram used in renaming_as_body cannot be intrinsic",
3385                     Name (N));
3386             end if;
3387
3388          else
3389             Insert_After (N, B_Node);
3390             Analyze (B_Node);
3391          end if;
3392       end if;
3393    end Check_Frozen_Renaming;
3394
3395    -------------------------------
3396    -- Set_Entity_Or_Discriminal --
3397    -------------------------------
3398
3399    procedure Set_Entity_Or_Discriminal (N : Node_Id; E : Entity_Id) is
3400       P : Node_Id;
3401
3402    begin
3403       --  If the entity is not a discriminant, or else expansion is disabled,
3404       --  simply set the entity.
3405
3406       if not In_Spec_Expression
3407         or else Ekind (E) /= E_Discriminant
3408         or else Inside_A_Generic
3409       then
3410          Set_Entity_With_Style_Check (N, E);
3411
3412       --  The replacement of a discriminant by the corresponding discriminal
3413       --  is not done for a task discriminant that appears in a default
3414       --  expression of an entry parameter. See Exp_Ch2.Expand_Discriminant
3415       --  for details on their handling.
3416
3417       elsif Is_Concurrent_Type (Scope (E)) then
3418
3419          P := Parent (N);
3420          while Present (P)
3421            and then not Nkind_In (P, N_Parameter_Specification,
3422                                   N_Component_Declaration)
3423          loop
3424             P := Parent (P);
3425          end loop;
3426
3427          if Present (P)
3428            and then Nkind (P) = N_Parameter_Specification
3429          then
3430             null;
3431
3432          else
3433             Set_Entity (N, Discriminal (E));
3434          end if;
3435
3436          --  Otherwise, this is a discriminant in a context in which
3437          --  it is a reference to the corresponding parameter of the
3438          --  init proc for the enclosing type.
3439
3440       else
3441          Set_Entity (N, Discriminal (E));
3442       end if;
3443    end Set_Entity_Or_Discriminal;
3444
3445    -----------------------------------
3446    -- Check_In_Previous_With_Clause --
3447    -----------------------------------
3448
3449    procedure Check_In_Previous_With_Clause
3450      (N   : Node_Id;
3451       Nam : Entity_Id)
3452    is
3453       Pack : constant Entity_Id := Entity (Original_Node (Nam));
3454       Item : Node_Id;
3455       Par  : Node_Id;
3456
3457    begin
3458       Item := First (Context_Items (Parent (N)));
3459
3460       while Present (Item)
3461         and then Item /= N
3462       loop
3463          if Nkind (Item) = N_With_Clause
3464
3465             --  Protect the frontend against previous critical errors
3466
3467            and then Nkind (Name (Item)) /= N_Selected_Component
3468            and then Entity (Name (Item)) = Pack
3469          then
3470             Par := Nam;
3471
3472             --  Find root library unit in with_clause
3473
3474             while Nkind (Par) = N_Expanded_Name loop
3475                Par := Prefix (Par);
3476             end loop;
3477
3478             if Is_Child_Unit (Entity (Original_Node (Par))) then
3479                Error_Msg_NE ("& is not directly visible", Par, Entity (Par));
3480             else
3481                return;
3482             end if;
3483          end if;
3484
3485          Next (Item);
3486       end loop;
3487
3488       --  On exit, package is not mentioned in a previous with_clause.
3489       --  Check if its prefix is.
3490
3491       if Nkind (Nam) = N_Expanded_Name then
3492          Check_In_Previous_With_Clause (N, Prefix (Nam));
3493
3494       elsif Pack /= Any_Id then
3495          Error_Msg_NE ("& is not visible", Nam, Pack);
3496       end if;
3497    end Check_In_Previous_With_Clause;
3498
3499    ---------------------------------
3500    -- Check_Library_Unit_Renaming --
3501    ---------------------------------
3502
3503    procedure Check_Library_Unit_Renaming (N : Node_Id; Old_E : Entity_Id) is
3504       New_E : Entity_Id;
3505
3506    begin
3507       if Nkind (Parent (N)) /= N_Compilation_Unit then
3508          return;
3509
3510       --  Check for library unit. Note that we used to check for the scope
3511       --  being Standard here, but that was wrong for Standard itself.
3512
3513       elsif not Is_Compilation_Unit (Old_E)
3514         and then not Is_Child_Unit (Old_E)
3515       then
3516          Error_Msg_N ("renamed unit must be a library unit", Name (N));
3517
3518       --  Entities defined in Standard (operators and boolean literals) cannot
3519       --  be renamed as library units.
3520
3521       elsif Scope (Old_E) = Standard_Standard
3522         and then Sloc (Old_E) = Standard_Location
3523       then
3524          Error_Msg_N ("renamed unit must be a library unit", Name (N));
3525
3526       elsif Present (Parent_Spec (N))
3527         and then Nkind (Unit (Parent_Spec (N))) = N_Generic_Package_Declaration
3528         and then not Is_Child_Unit (Old_E)
3529       then
3530          Error_Msg_N
3531            ("renamed unit must be a child unit of generic parent", Name (N));
3532
3533       elsif Nkind (N) in N_Generic_Renaming_Declaration
3534          and then  Nkind (Name (N)) = N_Expanded_Name
3535          and then Is_Generic_Instance (Entity (Prefix (Name (N))))
3536          and then Is_Generic_Unit (Old_E)
3537       then
3538          Error_Msg_N
3539            ("renamed generic unit must be a library unit", Name (N));
3540
3541       elsif Is_Package_Or_Generic_Package (Old_E) then
3542
3543          --  Inherit categorization flags
3544
3545          New_E := Defining_Entity (N);
3546          Set_Is_Pure                  (New_E, Is_Pure           (Old_E));
3547          Set_Is_Preelaborated         (New_E, Is_Preelaborated  (Old_E));
3548          Set_Is_Remote_Call_Interface (New_E,
3549                                        Is_Remote_Call_Interface (Old_E));
3550          Set_Is_Remote_Types          (New_E, Is_Remote_Types   (Old_E));
3551          Set_Is_Shared_Passive        (New_E, Is_Shared_Passive (Old_E));
3552       end if;
3553    end Check_Library_Unit_Renaming;
3554
3555    ---------------
3556    -- End_Scope --
3557    ---------------
3558
3559    procedure End_Scope is
3560       Id    : Entity_Id;
3561       Prev  : Entity_Id;
3562       Outer : Entity_Id;
3563
3564    begin
3565       Id := First_Entity (Current_Scope);
3566       while Present (Id) loop
3567          --  An entity in the current scope is not necessarily the first one
3568          --  on its homonym chain. Find its predecessor if any,
3569          --  If it is an internal entity, it will not be in the visibility
3570          --  chain altogether,  and there is nothing to unchain.
3571
3572          if Id /= Current_Entity (Id) then
3573             Prev := Current_Entity (Id);
3574             while Present (Prev)
3575               and then Present (Homonym (Prev))
3576               and then Homonym (Prev) /= Id
3577             loop
3578                Prev := Homonym (Prev);
3579             end loop;
3580
3581             --  Skip to end of loop if Id is not in the visibility chain
3582
3583             if No (Prev) or else Homonym (Prev) /= Id then
3584                goto Next_Ent;
3585             end if;
3586
3587          else
3588             Prev := Empty;
3589          end if;
3590
3591          Set_Is_Immediately_Visible (Id, False);
3592
3593          Outer := Homonym (Id);
3594          while Present (Outer) and then Scope (Outer) = Current_Scope loop
3595             Outer := Homonym (Outer);
3596          end loop;
3597
3598          --  Reset homonym link of other entities, but do not modify link
3599          --  between entities in current scope, so that the back-end can have
3600          --  a proper count of local overloadings.
3601
3602          if No (Prev) then
3603             Set_Name_Entity_Id (Chars (Id), Outer);
3604
3605          elsif Scope (Prev) /= Scope (Id) then
3606             Set_Homonym (Prev,  Outer);
3607          end if;
3608
3609          <<Next_Ent>>
3610             Next_Entity (Id);
3611       end loop;
3612
3613       --  If the scope generated freeze actions, place them before the
3614       --  current declaration and analyze them. Type declarations and
3615       --  the bodies of initialization procedures can generate such nodes.
3616       --  We follow the parent chain until we reach a list node, which is
3617       --  the enclosing list of declarations. If the list appears within
3618       --  a protected definition, move freeze nodes outside the protected
3619       --  type altogether.
3620
3621       if Present
3622          (Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Actions)
3623       then
3624          declare
3625             Decl : Node_Id;
3626             L    : constant List_Id := Scope_Stack.Table
3627                     (Scope_Stack.Last).Pending_Freeze_Actions;
3628
3629          begin
3630             if Is_Itype (Current_Scope) then
3631                Decl := Associated_Node_For_Itype (Current_Scope);
3632             else
3633                Decl := Parent (Current_Scope);
3634             end if;
3635
3636             Pop_Scope;
3637
3638             while not (Is_List_Member (Decl))
3639               or else Nkind_In (Parent (Decl), N_Protected_Definition,
3640                                                N_Task_Definition)
3641             loop
3642                Decl := Parent (Decl);
3643             end loop;
3644
3645             Insert_List_Before_And_Analyze (Decl, L);
3646          end;
3647
3648       else
3649          Pop_Scope;
3650       end if;
3651
3652    end End_Scope;
3653
3654    ---------------------
3655    -- End_Use_Clauses --
3656    ---------------------
3657
3658    procedure End_Use_Clauses (Clause : Node_Id) is
3659       U   : Node_Id;
3660
3661    begin
3662       --  Remove Use_Type clauses first, because they affect the
3663       --  visibility of operators in subsequent used packages.
3664
3665       U := Clause;
3666       while Present (U) loop
3667          if Nkind (U) = N_Use_Type_Clause then
3668             End_Use_Type (U);
3669          end if;
3670
3671          Next_Use_Clause (U);
3672       end loop;
3673
3674       U := Clause;
3675       while Present (U) loop
3676          if Nkind (U) = N_Use_Package_Clause then
3677             End_Use_Package (U);
3678          end if;
3679
3680          Next_Use_Clause (U);
3681       end loop;
3682    end End_Use_Clauses;
3683
3684    ---------------------
3685    -- End_Use_Package --
3686    ---------------------
3687
3688    procedure End_Use_Package (N : Node_Id) is
3689       Pack_Name : Node_Id;
3690       Pack      : Entity_Id;
3691       Id        : Entity_Id;
3692       Elmt      : Elmt_Id;
3693
3694       function Is_Primitive_Operator_In_Use
3695         (Op : Entity_Id;
3696          F  : Entity_Id) return Boolean;
3697       --  Check whether Op is a primitive operator of a use-visible type
3698
3699       ----------------------------------
3700       -- Is_Primitive_Operator_In_Use --
3701       ----------------------------------
3702
3703       function Is_Primitive_Operator_In_Use
3704         (Op : Entity_Id;
3705          F  : Entity_Id) return Boolean
3706       is
3707          T : constant Entity_Id := Base_Type (Etype (F));
3708       begin
3709          return In_Use (T) and then Scope (T) = Scope (Op);
3710       end Is_Primitive_Operator_In_Use;
3711
3712    --  Start of processing for End_Use_Package
3713
3714    begin
3715       Pack_Name := First (Names (N));
3716       while Present (Pack_Name) loop
3717
3718          --  Test that Pack_Name actually denotes a package before processing
3719
3720          if Is_Entity_Name (Pack_Name)
3721            and then Ekind (Entity (Pack_Name)) = E_Package
3722          then
3723             Pack := Entity (Pack_Name);
3724
3725             if In_Open_Scopes (Pack) then
3726                null;
3727
3728             elsif not Redundant_Use (Pack_Name) then
3729                Set_In_Use (Pack, False);
3730                Set_Current_Use_Clause (Pack, Empty);
3731
3732                Id := First_Entity (Pack);
3733                while Present (Id) loop
3734
3735                   --  Preserve use-visibility of operators that are primitive
3736                   --  operators of a type that is use-visible through an active
3737                   --  use_type clause.
3738
3739                   if Nkind (Id) = N_Defining_Operator_Symbol
3740                        and then
3741                          (Is_Primitive_Operator_In_Use
3742                            (Id, First_Formal (Id))
3743                             or else
3744                           (Present (Next_Formal (First_Formal (Id)))
3745                              and then
3746                                Is_Primitive_Operator_In_Use
3747                                  (Id, Next_Formal (First_Formal (Id)))))
3748                   then
3749                      null;
3750
3751                   else
3752                      Set_Is_Potentially_Use_Visible (Id, False);
3753                   end if;
3754
3755                   if Is_Private_Type (Id)
3756                     and then Present (Full_View (Id))
3757                   then
3758                      Set_Is_Potentially_Use_Visible (Full_View (Id), False);
3759                   end if;
3760
3761                   Next_Entity (Id);
3762                end loop;
3763
3764                if Present (Renamed_Object (Pack)) then
3765                   Set_In_Use (Renamed_Object (Pack), False);
3766                   Set_Current_Use_Clause (Renamed_Object (Pack), Empty);
3767                end if;
3768
3769                if Chars (Pack) = Name_System
3770                  and then Scope (Pack) = Standard_Standard
3771                  and then Present_System_Aux
3772                then
3773                   Id := First_Entity (System_Aux_Id);
3774                   while Present (Id) loop
3775                      Set_Is_Potentially_Use_Visible (Id, False);
3776
3777                      if Is_Private_Type (Id)
3778                        and then Present (Full_View (Id))
3779                      then
3780                         Set_Is_Potentially_Use_Visible (Full_View (Id), False);
3781                      end if;
3782
3783                      Next_Entity (Id);
3784                   end loop;
3785
3786                   Set_In_Use (System_Aux_Id, False);
3787                end if;
3788
3789             else
3790                Set_Redundant_Use (Pack_Name, False);
3791             end if;
3792          end if;
3793
3794          Next (Pack_Name);
3795       end loop;
3796
3797       if Present (Hidden_By_Use_Clause (N)) then
3798          Elmt := First_Elmt (Hidden_By_Use_Clause (N));
3799          while Present (Elmt) loop
3800             declare
3801                E : constant Entity_Id := Node (Elmt);
3802
3803             begin
3804                --  Reset either Use_Visibility or Direct_Visibility, depending
3805                --  on how the entity was hidden by the use clause.
3806
3807                if In_Use (Scope (E))
3808                  and then Used_As_Generic_Actual (Scope (E))
3809                then
3810                   Set_Is_Potentially_Use_Visible (Node (Elmt));
3811                else
3812                   Set_Is_Immediately_Visible (Node (Elmt));
3813                end if;
3814
3815                Next_Elmt (Elmt);
3816             end;
3817          end loop;
3818
3819          Set_Hidden_By_Use_Clause (N, No_Elist);
3820       end if;
3821    end End_Use_Package;
3822
3823    ------------------
3824    -- End_Use_Type --
3825    ------------------
3826
3827    procedure End_Use_Type (N : Node_Id) is
3828       Elmt    : Elmt_Id;
3829       Id      : Entity_Id;
3830       T       : Entity_Id;
3831
3832    --  Start of processing for End_Use_Type
3833
3834    begin
3835       Id := First (Subtype_Marks (N));
3836       while Present (Id) loop
3837
3838          --  A call to Rtsfind may occur while analyzing a use_type clause,
3839          --  in which case the type marks are not resolved yet, and there is
3840          --  nothing to remove.
3841
3842          if not Is_Entity_Name (Id) or else No (Entity (Id)) then
3843             goto Continue;
3844          end if;
3845
3846          T := Entity (Id);
3847
3848          if T = Any_Type or else From_With_Type (T) then
3849             null;
3850
3851          --  Note that the use_type clause may mention a subtype of the type
3852          --  whose primitive operations have been made visible. Here as
3853          --  elsewhere, it is the base type that matters for visibility.
3854
3855          elsif In_Open_Scopes (Scope (Base_Type (T))) then
3856             null;
3857
3858          elsif not Redundant_Use (Id) then
3859             Set_In_Use (T, False);
3860             Set_In_Use (Base_Type (T), False);
3861             Set_Current_Use_Clause (T, Empty);
3862             Set_Current_Use_Clause (Base_Type (T), Empty);
3863          end if;
3864
3865          <<Continue>>
3866             Next (Id);
3867       end loop;
3868
3869       if Is_Empty_Elmt_List (Used_Operations (N)) then
3870          return;
3871
3872       else
3873          Elmt := First_Elmt (Used_Operations (N));
3874          while Present (Elmt) loop
3875             Set_Is_Potentially_Use_Visible (Node (Elmt), False);
3876             Next_Elmt (Elmt);
3877          end loop;
3878       end if;
3879    end End_Use_Type;
3880
3881    ----------------------
3882    -- Find_Direct_Name --
3883    ----------------------
3884
3885    procedure Find_Direct_Name (N : Node_Id) is
3886       E    : Entity_Id;
3887       E2   : Entity_Id;
3888       Msg  : Boolean;
3889
3890       Inst : Entity_Id := Empty;
3891       --  Enclosing instance, if any
3892
3893       Homonyms : Entity_Id;
3894       --  Saves start of homonym chain
3895
3896       Nvis_Entity : Boolean;
3897       --  Set True to indicate that there is at least one entity on the homonym
3898       --  chain which, while not visible, is visible enough from the user point
3899       --  of view to warrant an error message of "not visible" rather than
3900       --  undefined.
3901
3902       Nvis_Is_Private_Subprg : Boolean := False;
3903       --  Ada 2005 (AI-262): Set True to indicate that a form of Beaujolais
3904       --  effect concerning library subprograms has been detected. Used to
3905       --  generate the precise error message.
3906
3907       function From_Actual_Package (E : Entity_Id) return Boolean;
3908       --  Returns true if the entity is declared in a package that is
3909       --  an actual for a formal package of the current instance. Such an
3910       --  entity requires special handling because it may be use-visible
3911       --  but hides directly visible entities defined outside the instance.
3912
3913       function Is_Actual_Parameter return Boolean;
3914       --  This function checks if the node N is an identifier that is an actual
3915       --  parameter of a procedure call. If so it returns True, otherwise it
3916       --  return False. The reason for this check is that at this stage we do
3917       --  not know what procedure is being called if the procedure might be
3918       --  overloaded, so it is premature to go setting referenced flags or
3919       --  making calls to Generate_Reference. We will wait till Resolve_Actuals
3920       --  for that processing
3921
3922       function Known_But_Invisible (E : Entity_Id) return Boolean;
3923       --  This function determines whether the entity E (which is not
3924       --  visible) can reasonably be considered to be known to the writer
3925       --  of the reference. This is a heuristic test, used only for the
3926       --  purposes of figuring out whether we prefer to complain that an
3927       --  entity is undefined or invisible (and identify the declaration
3928       --  of the invisible entity in the latter case). The point here is
3929       --  that we don't want to complain that something is invisible and
3930       --  then point to something entirely mysterious to the writer.
3931
3932       procedure Nvis_Messages;
3933       --  Called if there are no visible entries for N, but there is at least
3934       --  one non-directly visible, or hidden declaration. This procedure
3935       --  outputs an appropriate set of error messages.
3936
3937       procedure Undefined (Nvis : Boolean);
3938       --  This function is called if the current node has no corresponding
3939       --  visible entity or entities. The value set in Msg indicates whether
3940       --  an error message was generated (multiple error messages for the
3941       --  same variable are generally suppressed, see body for details).
3942       --  Msg is True if an error message was generated, False if not. This
3943       --  value is used by the caller to determine whether or not to output
3944       --  additional messages where appropriate. The parameter is set False
3945       --  to get the message "X is undefined", and True to get the message
3946       --  "X is not visible".
3947
3948       -------------------------
3949       -- From_Actual_Package --
3950       -------------------------
3951
3952       function From_Actual_Package (E : Entity_Id) return Boolean is
3953          Scop : constant Entity_Id := Scope (E);
3954          Act  : Entity_Id;
3955
3956       begin
3957          if not In_Instance then
3958             return False;
3959          else
3960             Inst := Current_Scope;
3961             while Present (Inst)
3962               and then Ekind (Inst) /= E_Package
3963               and then not Is_Generic_Instance (Inst)
3964             loop
3965                Inst := Scope (Inst);
3966             end loop;
3967
3968             if No (Inst) then
3969                return False;
3970             end if;
3971
3972             Act := First_Entity (Inst);
3973             while Present (Act) loop
3974                if Ekind (Act) = E_Package then
3975
3976                   --  Check for end of actuals list
3977
3978                   if Renamed_Object (Act) = Inst then
3979                      return False;
3980
3981                   elsif Present (Associated_Formal_Package (Act))
3982                     and then Renamed_Object (Act) = Scop
3983                   then
3984                      --  Entity comes from (instance of) formal package
3985
3986                      return True;
3987
3988                   else
3989                      Next_Entity (Act);
3990                   end if;
3991
3992                else
3993                   Next_Entity (Act);
3994                end if;
3995             end loop;
3996
3997             return False;
3998          end if;
3999       end From_Actual_Package;
4000
4001       -------------------------
4002       -- Is_Actual_Parameter --
4003       -------------------------
4004
4005       function Is_Actual_Parameter return Boolean is
4006       begin
4007          return
4008            Nkind (N) = N_Identifier
4009              and then
4010                (Nkind (Parent (N)) = N_Procedure_Call_Statement
4011                   or else
4012                     (Nkind (Parent (N)) = N_Parameter_Association
4013                        and then N = Explicit_Actual_Parameter (Parent (N))
4014                        and then Nkind (Parent (Parent (N))) =
4015                                           N_Procedure_Call_Statement));
4016       end Is_Actual_Parameter;
4017
4018       -------------------------
4019       -- Known_But_Invisible --
4020       -------------------------
4021
4022       function Known_But_Invisible (E : Entity_Id) return Boolean is
4023          Fname : File_Name_Type;
4024
4025       begin
4026          --  Entities in Standard are always considered to be known
4027
4028          if Sloc (E) <= Standard_Location then
4029             return True;
4030
4031          --  An entity that does not come from source is always considered
4032          --  to be unknown, since it is an artifact of code expansion.
4033
4034          elsif not Comes_From_Source (E) then
4035             return False;
4036
4037          --  In gnat internal mode, we consider all entities known
4038
4039          elsif GNAT_Mode then
4040             return True;
4041          end if;
4042
4043          --  Here we have an entity that is not from package Standard, and
4044          --  which comes from Source. See if it comes from an internal file.
4045
4046          Fname := Unit_File_Name (Get_Source_Unit (E));
4047
4048          --  Case of from internal file
4049
4050          if Is_Internal_File_Name (Fname) then
4051
4052             --  Private part entities in internal files are never considered
4053             --  to be known to the writer of normal application code.
4054
4055             if Is_Hidden (E) then
4056                return False;
4057             end if;
4058
4059             --  Entities from System packages other than System and
4060             --  System.Storage_Elements are not considered to be known.
4061             --  System.Auxxxx files are also considered known to the user.
4062
4063             --  Should refine this at some point to generally distinguish
4064             --  between known and unknown internal files ???
4065
4066             Get_Name_String (Fname);
4067
4068             return
4069               Name_Len < 2
4070                 or else
4071               Name_Buffer (1 .. 2) /= "s-"
4072                 or else
4073               Name_Buffer (3 .. 8) = "stoele"
4074                 or else
4075               Name_Buffer (3 .. 5) = "aux";
4076
4077          --  If not an internal file, then entity is definitely known,
4078          --  even if it is in a private part (the message generated will
4079          --  note that it is in a private part)
4080
4081          else
4082             return True;
4083          end if;
4084       end Known_But_Invisible;
4085
4086       -------------------
4087       -- Nvis_Messages --
4088       -------------------
4089
4090       procedure Nvis_Messages is
4091          Comp_Unit : Node_Id;
4092          Ent       : Entity_Id;
4093          Found     : Boolean := False;
4094          Hidden    : Boolean := False;
4095          Item      : Node_Id;
4096
4097       begin
4098          --  Ada 2005 (AI-262): Generate a precise error concerning the
4099          --  Beaujolais effect that was previously detected
4100
4101          if Nvis_Is_Private_Subprg then
4102
4103             pragma Assert (Nkind (E2) = N_Defining_Identifier
4104                             and then Ekind (E2) = E_Function
4105                             and then Scope (E2) = Standard_Standard
4106                             and then Has_Private_With (E2));
4107
4108             --  Find the sloc corresponding to the private with'ed unit
4109
4110             Comp_Unit := Cunit (Current_Sem_Unit);
4111             Error_Msg_Sloc := No_Location;
4112
4113             Item := First (Context_Items (Comp_Unit));
4114             while Present (Item) loop
4115                if Nkind (Item) = N_With_Clause
4116                  and then Private_Present (Item)
4117                  and then Entity (Name (Item)) = E2
4118                then
4119                   Error_Msg_Sloc := Sloc (Item);
4120                   exit;
4121                end if;
4122
4123                Next (Item);
4124             end loop;
4125
4126             pragma Assert (Error_Msg_Sloc /= No_Location);
4127
4128             Error_Msg_N ("(Ada 2005): hidden by private with clause #", N);
4129             return;
4130          end if;
4131
4132          Undefined (Nvis => True);
4133
4134          if Msg then
4135
4136             --  First loop does hidden declarations
4137
4138             Ent := Homonyms;
4139             while Present (Ent) loop
4140                if Is_Potentially_Use_Visible (Ent) then
4141                   if not Hidden then
4142                      Error_Msg_N -- CODEFIX
4143                        ("multiple use clauses cause hiding!", N);
4144                      Hidden := True;
4145                   end if;
4146
4147                   Error_Msg_Sloc := Sloc (Ent);
4148                   Error_Msg_N -- CODEFIX
4149                     ("hidden declaration#!", N);
4150                end if;
4151
4152                Ent := Homonym (Ent);
4153             end loop;
4154
4155             --  If we found hidden declarations, then that's enough, don't
4156             --  bother looking for non-visible declarations as well.
4157
4158             if Hidden then
4159                return;
4160             end if;
4161
4162             --  Second loop does non-directly visible declarations
4163
4164             Ent := Homonyms;
4165             while Present (Ent) loop
4166                if not Is_Potentially_Use_Visible (Ent) then
4167
4168                   --  Do not bother the user with unknown entities
4169
4170                   if not Known_But_Invisible (Ent) then
4171                      goto Continue;
4172                   end if;
4173
4174                   Error_Msg_Sloc := Sloc (Ent);
4175
4176                   --  Output message noting that there is a non-visible
4177                   --  declaration, distinguishing the private part case.
4178
4179                   if Is_Hidden (Ent) then
4180                      Error_Msg_N ("non-visible (private) declaration#!", N);
4181
4182                   --  If the entity is declared in a generic package, it
4183                   --  cannot be visible, so there is no point in adding it
4184                   --  to the list of candidates if another homograph from a
4185                   --  non-generic package has been seen.
4186
4187                   elsif Ekind (Scope (Ent)) = E_Generic_Package
4188                     and then Found
4189                   then
4190                      null;
4191
4192                   else
4193                      Error_Msg_N -- CODEFIX
4194                        ("non-visible declaration#!", N);
4195
4196                      if Ekind (Scope (Ent)) /= E_Generic_Package then
4197                         Found := True;
4198                      end if;
4199
4200                      if Is_Compilation_Unit (Ent)
4201                        and then
4202                          Nkind (Parent (Parent (N))) = N_Use_Package_Clause
4203                      then
4204                         Error_Msg_Qual_Level := 99;
4205                         Error_Msg_NE -- CODEFIX
4206                           ("\\missing `WITH &;`", N, Ent);
4207                         Error_Msg_Qual_Level := 0;
4208                      end if;
4209
4210                      if Ekind (Ent) = E_Discriminant
4211                        and then Present (Corresponding_Discriminant (Ent))
4212                        and then Scope (Corresponding_Discriminant (Ent)) =
4213                                                         Etype (Scope (Ent))
4214                      then
4215                         Error_Msg_N
4216                           ("inherited discriminant not allowed here" &
4217                             " (RM 3.8 (12), 3.8.1 (6))!", N);
4218                      end if;
4219                   end if;
4220
4221                   --  Set entity and its containing package as referenced. We
4222                   --  can't be sure of this, but this seems a better choice
4223                   --  to avoid unused entity messages.
4224
4225                   if Comes_From_Source (Ent) then
4226                      Set_Referenced (Ent);
4227                      Set_Referenced (Cunit_Entity (Get_Source_Unit (Ent)));
4228                   end if;
4229                end if;
4230
4231                <<Continue>>
4232                Ent := Homonym (Ent);
4233             end loop;
4234          end if;
4235       end Nvis_Messages;
4236
4237       ---------------
4238       -- Undefined --
4239       ---------------
4240
4241       procedure Undefined (Nvis : Boolean) is
4242          Emsg : Error_Msg_Id;
4243
4244       begin
4245          --  We should never find an undefined internal name. If we do, then
4246          --  see if we have previous errors. If so, ignore on the grounds that
4247          --  it is probably a cascaded message (e.g. a block label from a badly
4248          --  formed block). If no previous errors, then we have a real internal
4249          --  error of some kind so raise an exception.
4250
4251          if Is_Internal_Name (Chars (N)) then
4252             if Total_Errors_Detected /= 0 then
4253                return;
4254             else
4255                raise Program_Error;
4256             end if;
4257          end if;
4258
4259          --  A very specialized error check, if the undefined variable is
4260          --  a case tag, and the case type is an enumeration type, check
4261          --  for a possible misspelling, and if so, modify the identifier
4262
4263          --  Named aggregate should also be handled similarly ???
4264
4265          if Nkind (N) = N_Identifier
4266            and then Nkind (Parent (N)) = N_Case_Statement_Alternative
4267          then
4268             declare
4269                Case_Stm : constant Node_Id   := Parent (Parent (N));
4270                Case_Typ : constant Entity_Id := Etype (Expression (Case_Stm));
4271
4272                Lit : Node_Id;
4273
4274             begin
4275                if Is_Enumeration_Type (Case_Typ)
4276                  and then not Is_Standard_Character_Type (Case_Typ)
4277                then
4278                   Lit := First_Literal (Case_Typ);
4279                   Get_Name_String (Chars (Lit));
4280
4281                   if Chars (Lit) /= Chars (N)
4282                     and then Is_Bad_Spelling_Of (Chars (N), Chars (Lit)) then
4283                      Error_Msg_Node_2 := Lit;
4284                      Error_Msg_N -- CODEFIX
4285                        ("& is undefined, assume misspelling of &", N);
4286                      Rewrite (N, New_Occurrence_Of (Lit, Sloc (N)));
4287                      return;
4288                   end if;
4289
4290                   Lit := Next_Literal (Lit);
4291                end if;
4292             end;
4293          end if;
4294
4295          --  Normal processing
4296
4297          Set_Entity (N, Any_Id);
4298          Set_Etype  (N, Any_Type);
4299
4300          --  We use the table Urefs to keep track of entities for which we
4301          --  have issued errors for undefined references. Multiple errors
4302          --  for a single name are normally suppressed, however we modify
4303          --  the error message to alert the programmer to this effect.
4304
4305          for J in Urefs.First .. Urefs.Last loop
4306             if Chars (N) = Chars (Urefs.Table (J).Node) then
4307                if Urefs.Table (J).Err /= No_Error_Msg
4308                  and then Sloc (N) /= Urefs.Table (J).Loc
4309                then
4310                   Error_Msg_Node_1 := Urefs.Table (J).Node;
4311
4312                   if Urefs.Table (J).Nvis then
4313                      Change_Error_Text (Urefs.Table (J).Err,
4314                        "& is not visible (more references follow)");
4315                   else
4316                      Change_Error_Text (Urefs.Table (J).Err,
4317                        "& is undefined (more references follow)");
4318                   end if;
4319
4320                   Urefs.Table (J).Err := No_Error_Msg;
4321                end if;
4322
4323                --  Although we will set Msg False, and thus suppress the
4324                --  message, we also set Error_Posted True, to avoid any
4325                --  cascaded messages resulting from the undefined reference.
4326
4327                Msg := False;
4328                Set_Error_Posted (N, True);
4329                return;
4330             end if;
4331          end loop;
4332
4333          --  If entry not found, this is first undefined occurrence
4334
4335          if Nvis then
4336             Error_Msg_N ("& is not visible!", N);
4337             Emsg := Get_Msg_Id;
4338
4339          else
4340             Error_Msg_N ("& is undefined!", N);
4341             Emsg := Get_Msg_Id;
4342
4343             --  A very bizarre special check, if the undefined identifier
4344             --  is put or put_line, then add a special error message (since
4345             --  this is a very common error for beginners to make).
4346
4347             if Chars (N) = Name_Put or else Chars (N) = Name_Put_Line then
4348                Error_Msg_N -- CODEFIX
4349                  ("\\possible missing `WITH Ada.Text_'I'O; " &
4350                   "USE Ada.Text_'I'O`!", N);
4351
4352             --  Another special check if N is the prefix of a selected
4353             --  component which is a known unit, add message complaining
4354             --  about missing with for this unit.
4355
4356             elsif Nkind (Parent (N)) = N_Selected_Component
4357               and then N = Prefix (Parent (N))
4358               and then Is_Known_Unit (Parent (N))
4359             then
4360                Error_Msg_Node_2 := Selector_Name (Parent (N));
4361                Error_Msg_N -- CODEFIX
4362                  ("\\missing `WITH &.&;`", Prefix (Parent (N)));
4363             end if;
4364
4365             --  Now check for possible misspellings
4366
4367             declare
4368                E      : Entity_Id;
4369                Ematch : Entity_Id := Empty;
4370
4371                Last_Name_Id : constant Name_Id :=
4372                                 Name_Id (Nat (First_Name_Id) +
4373                                            Name_Entries_Count - 1);
4374
4375             begin
4376                for Nam in First_Name_Id .. Last_Name_Id loop
4377                   E := Get_Name_Entity_Id (Nam);
4378
4379                   if Present (E)
4380                      and then (Is_Immediately_Visible (E)
4381                                  or else
4382                                Is_Potentially_Use_Visible (E))
4383                   then
4384                      if Is_Bad_Spelling_Of (Chars (N), Nam) then
4385                         Ematch := E;
4386                         exit;
4387                      end if;
4388                   end if;
4389                end loop;
4390
4391                if Present (Ematch) then
4392                   Error_Msg_NE -- CODEFIX
4393                     ("\possible misspelling of&", N, Ematch);
4394                end if;
4395             end;
4396          end if;
4397
4398          --  Make entry in undefined references table unless the full errors
4399          --  switch is set, in which case by refraining from generating the
4400          --  table entry, we guarantee that we get an error message for every
4401          --  undefined reference.
4402
4403          if not All_Errors_Mode then
4404             Urefs.Append (
4405               (Node => N,
4406                Err  => Emsg,
4407                Nvis => Nvis,
4408                Loc  => Sloc (N)));
4409          end if;
4410
4411          Msg := True;
4412       end Undefined;
4413
4414    --  Start of processing for Find_Direct_Name
4415
4416    begin
4417       --  If the entity pointer is already set, this is an internal node, or
4418       --  a node that is analyzed more than once, after a tree modification.
4419       --  In such a case there is no resolution to perform, just set the type.
4420
4421       if Present (Entity (N)) then
4422          if Is_Type (Entity (N)) then
4423             Set_Etype (N, Entity (N));
4424
4425          else
4426             declare
4427                Entyp : constant Entity_Id := Etype (Entity (N));
4428
4429             begin
4430                --  One special case here. If the Etype field is already set,
4431                --  and references the packed array type corresponding to the
4432                --  etype of the referenced entity, then leave it alone. This
4433                --  happens for trees generated from Exp_Pakd, where expressions
4434                --  can be deliberately "mis-typed" to the packed array type.
4435
4436                if Is_Array_Type (Entyp)
4437                  and then Is_Packed (Entyp)
4438                  and then Present (Etype (N))
4439                  and then Etype (N) = Packed_Array_Type (Entyp)
4440                then
4441                   null;
4442
4443                --  If not that special case, then just reset the Etype
4444
4445                else
4446                   Set_Etype (N, Etype (Entity (N)));
4447                end if;
4448             end;
4449          end if;
4450
4451          return;
4452       end if;
4453
4454       --  Here if Entity pointer was not set, we need full visibility analysis
4455       --  First we generate debugging output if the debug E flag is set.
4456
4457       if Debug_Flag_E then
4458          Write_Str ("Looking for ");
4459          Write_Name (Chars (N));
4460          Write_Eol;
4461       end if;
4462
4463       Homonyms := Current_Entity (N);
4464       Nvis_Entity := False;
4465
4466       E := Homonyms;
4467       while Present (E) loop
4468
4469          --  If entity is immediately visible or potentially use visible, then
4470          --  process the entity and we are done.
4471
4472          if Is_Immediately_Visible (E) then
4473             goto Immediately_Visible_Entity;
4474
4475          elsif Is_Potentially_Use_Visible (E) then
4476             goto Potentially_Use_Visible_Entity;
4477
4478          --  Note if a known but invisible entity encountered
4479
4480          elsif Known_But_Invisible (E) then
4481             Nvis_Entity := True;
4482          end if;
4483
4484          --  Move to next entity in chain and continue search
4485
4486          E := Homonym (E);
4487       end loop;
4488
4489       --  If no entries on homonym chain that were potentially visible,
4490       --  and no entities reasonably considered as non-visible, then
4491       --  we have a plain undefined reference, with no additional
4492       --  explanation required!
4493
4494       if not Nvis_Entity then
4495          Undefined (Nvis => False);
4496
4497       --  Otherwise there is at least one entry on the homonym chain that
4498       --  is reasonably considered as being known and non-visible.
4499
4500       else
4501          Nvis_Messages;
4502       end if;
4503
4504       return;
4505
4506       --  Processing for a potentially use visible entry found. We must search
4507       --  the rest of the homonym chain for two reasons. First, if there is a
4508       --  directly visible entry, then none of the potentially use-visible
4509       --  entities are directly visible (RM 8.4(10)). Second, we need to check
4510       --  for the case of multiple potentially use-visible entries hiding one
4511       --  another and as a result being non-directly visible (RM 8.4(11)).
4512
4513       <<Potentially_Use_Visible_Entity>> declare
4514          Only_One_Visible : Boolean := True;
4515          All_Overloadable : Boolean := Is_Overloadable (E);
4516
4517       begin
4518          E2 := Homonym (E);
4519          while Present (E2) loop
4520             if Is_Immediately_Visible (E2) then
4521
4522                --  If the use-visible entity comes from the actual for a
4523                --  formal package, it hides a directly visible entity from
4524                --  outside the instance.
4525
4526                if From_Actual_Package (E)
4527                  and then Scope_Depth (E2) < Scope_Depth (Inst)
4528                then
4529                   goto Found;
4530                else
4531                   E := E2;
4532                   goto Immediately_Visible_Entity;
4533                end if;
4534
4535             elsif Is_Potentially_Use_Visible (E2) then
4536                Only_One_Visible := False;
4537                All_Overloadable := All_Overloadable and Is_Overloadable (E2);
4538
4539             --  Ada 2005 (AI-262): Protect against a form of Beaujolais effect
4540             --  that can occur in private_with clauses. Example:
4541
4542             --    with A;
4543             --    private with B;              package A is
4544             --    package C is                   function B return Integer;
4545             --      use A;                     end A;
4546             --      V1 : Integer := B;
4547             --    private                      function B return Integer;
4548             --      V2 : Integer := B;
4549             --    end C;
4550
4551             --  V1 resolves to A.B, but V2 resolves to library unit B
4552
4553             elsif Ekind (E2) = E_Function
4554               and then Scope (E2) = Standard_Standard
4555               and then Has_Private_With (E2)
4556             then
4557                Only_One_Visible       := False;
4558                All_Overloadable       := False;
4559                Nvis_Is_Private_Subprg := True;
4560                exit;
4561             end if;
4562
4563             E2 := Homonym (E2);
4564          end loop;
4565
4566          --  On falling through this loop, we have checked that there are no
4567          --  immediately visible entities. Only_One_Visible is set if exactly
4568          --  one potentially use visible entity exists. All_Overloadable is
4569          --  set if all the potentially use visible entities are overloadable.
4570          --  The condition for legality is that either there is one potentially
4571          --  use visible entity, or if there is more than one, then all of them
4572          --  are overloadable.
4573
4574          if Only_One_Visible or All_Overloadable then
4575             goto Found;
4576
4577          --  If there is more than one potentially use-visible entity and at
4578          --  least one of them non-overloadable, we have an error (RM 8.4(11).
4579          --  Note that E points to the first such entity on the homonym list.
4580          --  Special case: if one of the entities is declared in an actual
4581          --  package, it was visible in the generic, and takes precedence over
4582          --  other entities that are potentially use-visible. Same if it is
4583          --  declared in a local instantiation of the current instance.
4584
4585          else
4586             if In_Instance then
4587
4588                --  Find current instance
4589
4590                Inst := Current_Scope;
4591                while Present (Inst)
4592                  and then Inst /= Standard_Standard
4593                loop
4594                   if Is_Generic_Instance (Inst) then
4595                      exit;
4596                   end if;
4597
4598                   Inst := Scope (Inst);
4599                end loop;
4600
4601                E2 := E;
4602                while Present (E2) loop
4603                   if From_Actual_Package (E2)
4604                     or else
4605                       (Is_Generic_Instance (Scope (E2))
4606                         and then Scope_Depth (Scope (E2)) > Scope_Depth (Inst))
4607                   then
4608                      E := E2;
4609                      goto Found;
4610                   end if;
4611
4612                   E2 := Homonym (E2);
4613                end loop;
4614
4615                Nvis_Messages;
4616                return;
4617
4618             elsif
4619               Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
4620             then
4621                --  A use-clause in the body of a system file creates conflict
4622                --  with some entity in a user scope, while rtsfind is active.
4623                --  Keep only the entity coming from another predefined unit.
4624
4625                E2 := E;
4626                while Present (E2) loop
4627                   if Is_Predefined_File_Name
4628                     (Unit_File_Name (Get_Source_Unit (Sloc (E2))))
4629                   then
4630                      E := E2;
4631                      goto Found;
4632                   end if;
4633
4634                   E2 := Homonym (E2);
4635                end loop;
4636
4637                --  Entity must exist because predefined unit is correct
4638
4639                raise Program_Error;
4640
4641             else
4642                Nvis_Messages;
4643                return;
4644             end if;
4645          end if;
4646       end;
4647
4648       --  Come here with E set to the first immediately visible entity on
4649       --  the homonym chain. This is the one we want unless there is another
4650       --  immediately visible entity further on in the chain for an inner
4651       --  scope (RM 8.3(8)).
4652
4653       <<Immediately_Visible_Entity>> declare
4654          Level : Int;
4655          Scop  : Entity_Id;
4656
4657       begin
4658          --  Find scope level of initial entity. When compiling through
4659          --  Rtsfind, the previous context is not completely invisible, and
4660          --  an outer entity may appear on the chain, whose scope is below
4661          --  the entry for Standard that delimits the current scope stack.
4662          --  Indicate that the level for this spurious entry is outside of
4663          --  the current scope stack.
4664
4665          Level := Scope_Stack.Last;
4666          loop
4667             Scop := Scope_Stack.Table (Level).Entity;
4668             exit when Scop = Scope (E);
4669             Level := Level - 1;
4670             exit when Scop = Standard_Standard;
4671          end loop;
4672
4673          --  Now search remainder of homonym chain for more inner entry
4674          --  If the entity is Standard itself, it has no scope, and we
4675          --  compare it with the stack entry directly.
4676
4677          E2 := Homonym (E);
4678          while Present (E2) loop
4679             if Is_Immediately_Visible (E2) then
4680
4681                --  If a generic package contains a local declaration that
4682                --  has the same name as the generic, there may be a visibility
4683                --  conflict in an instance, where the local declaration must
4684                --  also hide the name of the corresponding package renaming.
4685                --  We check explicitly for a package declared by a renaming,
4686                --  whose renamed entity is an instance that is on the scope
4687                --  stack, and that contains a homonym in the same scope. Once
4688                --  we have found it, we know that the package renaming is not
4689                --  immediately visible, and that the identifier denotes the
4690                --  other entity (and its homonyms if overloaded).
4691
4692                if Scope (E) = Scope (E2)
4693                  and then Ekind (E) = E_Package
4694                  and then Present (Renamed_Object (E))
4695                  and then Is_Generic_Instance (Renamed_Object (E))
4696                  and then In_Open_Scopes (Renamed_Object (E))
4697                  and then Comes_From_Source (N)
4698                then
4699                   Set_Is_Immediately_Visible (E, False);
4700                   E := E2;
4701
4702                else
4703                   for J in Level + 1 .. Scope_Stack.Last loop
4704                      if Scope_Stack.Table (J).Entity = Scope (E2)
4705                        or else Scope_Stack.Table (J).Entity = E2
4706                      then
4707                         Level := J;
4708                         E := E2;
4709                         exit;
4710                      end if;
4711                   end loop;
4712                end if;
4713             end if;
4714
4715             E2 := Homonym (E2);
4716          end loop;
4717
4718          --  At the end of that loop, E is the innermost immediately
4719          --  visible entity, so we are all set.
4720       end;
4721
4722       --  Come here with entity found, and stored in E
4723
4724       <<Found>> begin
4725
4726          --  Check violation of No_Wide_Characters restriction
4727
4728          Check_Wide_Character_Restriction (E, N);
4729
4730          --  When distribution features are available (Get_PCS_Name /=
4731          --  Name_No_DSA), a remote access-to-subprogram type is converted
4732          --  into a record type holding whatever information is needed to
4733          --  perform a remote call on an RCI subprogram. In that case we
4734          --  rewrite any occurrence of the RAS type into the equivalent record
4735          --  type here. 'Access attribute references and RAS dereferences are
4736          --  then implemented using specific TSSs. However when distribution is
4737          --  not available (case of Get_PCS_Name = Name_No_DSA), we bypass the
4738          --  generation of these TSSs, and we must keep the RAS type in its
4739          --  original access-to-subprogram form (since all calls through a
4740          --  value of such type will be local anyway in the absence of a PCS).
4741
4742          if Comes_From_Source (N)
4743            and then Is_Remote_Access_To_Subprogram_Type (E)
4744            and then Expander_Active
4745            and then Get_PCS_Name /= Name_No_DSA
4746          then
4747             Rewrite (N,
4748               New_Occurrence_Of (Equivalent_Type (E), Sloc (N)));
4749             return;
4750          end if;
4751
4752          --  Set the entity. Note that the reason we call Set_Entity for the
4753          --  overloadable case, as opposed to Set_Entity_With_Style_Check is
4754          --  that in the overloaded case, the initial call can set the wrong
4755          --  homonym. The call that sets the right homonym is in Sem_Res and
4756          --  that call does use Set_Entity_With_Style_Check, so we don't miss
4757          --  a style check.
4758
4759          if Is_Overloadable (E) then
4760             Set_Entity (N, E);
4761          else
4762             Set_Entity_With_Style_Check (N, E);
4763          end if;
4764
4765          if Is_Type (E) then
4766             Set_Etype (N, E);
4767          else
4768             Set_Etype (N, Get_Full_View (Etype (E)));
4769          end if;
4770
4771          if Debug_Flag_E then
4772             Write_Str (" found  ");
4773             Write_Entity_Info (E, "      ");
4774          end if;
4775
4776          --  If the Ekind of the entity is Void, it means that all homonyms
4777          --  are hidden from all visibility (RM 8.3(5,14-20)). However, this
4778          --  test is skipped if the current scope is a record and the name is
4779          --  a pragma argument expression (case of Atomic and Volatile pragmas
4780          --  and possibly other similar pragmas added later, which are allowed
4781          --  to reference components in the current record).
4782
4783          if Ekind (E) = E_Void
4784            and then
4785              (not Is_Record_Type (Current_Scope)
4786                or else Nkind (Parent (N)) /= N_Pragma_Argument_Association)
4787          then
4788             Premature_Usage (N);
4789
4790          --  If the entity is overloadable, collect all interpretations of the
4791          --  name for subsequent overload resolution. We optimize a bit here to
4792          --  do this only if we have an overloadable entity that is not on its
4793          --  own on the homonym chain.
4794
4795          elsif Is_Overloadable (E)
4796            and then (Present (Homonym (E)) or else Current_Entity (N) /= E)
4797          then
4798             Collect_Interps (N);
4799
4800             --  If no homonyms were visible, the entity is unambiguous
4801
4802             if not Is_Overloaded (N) then
4803                if not Is_Actual_Parameter then
4804                   Generate_Reference (E, N);
4805                end if;
4806             end if;
4807
4808          --  Case of non-overloadable entity, set the entity providing that
4809          --  we do not have the case of a discriminant reference within a
4810          --  default expression. Such references are replaced with the
4811          --  corresponding discriminal, which is the formal corresponding to
4812          --  to the discriminant in the initialization procedure.
4813
4814          else
4815             --  Entity is unambiguous, indicate that it is referenced here
4816
4817             --  For a renaming of an object, always generate simple reference,
4818             --  we don't try to keep track of assignments in this case.
4819
4820             if Is_Object (E) and then Present (Renamed_Object (E)) then
4821                Generate_Reference (E, N);
4822
4823                --  If the renamed entity is a private protected component,
4824                --  reference the original component as well. This needs to be
4825                --  done because the private renamings are installed before any
4826                --  analysis has occurred. Reference to a private component will
4827                --  resolve to the renaming and the original component will be
4828                --  left unreferenced, hence the following.
4829
4830                if Is_Prival (E) then
4831                   Generate_Reference (Prival_Link (E), N);
4832                end if;
4833
4834             --  One odd case is that we do not want to set the Referenced flag
4835             --  if the entity is a label, and the identifier is the label in
4836             --  the source, since this is not a reference from the point of
4837             --  view of the user.
4838
4839             elsif Nkind (Parent (N)) = N_Label then
4840                declare
4841                   R : constant Boolean := Referenced (E);
4842
4843                begin
4844                   --  Generate reference unless this is an actual parameter
4845                   --  (see comment below)
4846
4847                   if Is_Actual_Parameter then
4848                      Generate_Reference (E, N);
4849                      Set_Referenced (E, R);
4850                   end if;
4851                end;
4852
4853             --  Normal case, not a label: generate reference
4854
4855             --    ??? It is too early to generate a reference here even if the
4856             --    entity is unambiguous, because the tree is not sufficiently
4857             --    typed at this point for Generate_Reference to determine
4858             --    whether this reference modifies the denoted object (because
4859             --    implicit dereferences cannot be identified prior to full type
4860             --    resolution).
4861
4862             --    The Is_Actual_Parameter routine takes care of one of these
4863             --    cases but there are others probably ???
4864
4865             --    If the entity is the LHS of an assignment, and is a variable
4866             --    (rather than a package prefix), we can mark it as a
4867             --    modification right away, to avoid duplicate references.
4868
4869             else
4870                if not Is_Actual_Parameter then
4871                   if Is_LHS (N)
4872                     and then Ekind (E) /= E_Package
4873                     and then Ekind (E) /= E_Generic_Package
4874                   then
4875                      Generate_Reference (E, N, 'm');
4876                   else
4877                      Generate_Reference (E, N);
4878                   end if;
4879                end if;
4880
4881                Check_Nested_Access (E);
4882             end if;
4883
4884             Set_Entity_Or_Discriminal (N, E);
4885
4886             if Ada_Version >= Ada_2012
4887               and then
4888                 (Nkind (Parent (N)) in N_Subexpr
4889                   or else Nkind (Parent (N)) = N_Object_Declaration)
4890             then
4891                Check_Implicit_Dereference (N, Etype (E));
4892             end if;
4893          end if;
4894       end;
4895    end Find_Direct_Name;
4896
4897    ------------------------
4898    -- Find_Expanded_Name --
4899    ------------------------
4900
4901    --  This routine searches the homonym chain of the entity until it finds
4902    --  an entity declared in the scope denoted by the prefix. If the entity
4903    --  is private, it may nevertheless be immediately visible, if we are in
4904    --  the scope of its declaration.
4905
4906    procedure Find_Expanded_Name (N : Node_Id) is
4907       Selector  : constant Node_Id := Selector_Name (N);
4908       Candidate : Entity_Id        := Empty;
4909       P_Name    : Entity_Id;
4910       O_Name    : Entity_Id;
4911       Id        : Entity_Id;
4912
4913    begin
4914       P_Name := Entity (Prefix (N));
4915       O_Name := P_Name;
4916
4917       --  If the prefix is a renamed package, look for the entity in the
4918       --  original package.
4919
4920       if Ekind (P_Name) = E_Package
4921         and then Present (Renamed_Object (P_Name))
4922       then
4923          P_Name := Renamed_Object (P_Name);
4924
4925          --  Rewrite node with entity field pointing to renamed object
4926
4927          Rewrite (Prefix (N), New_Copy (Prefix (N)));
4928          Set_Entity (Prefix (N), P_Name);
4929
4930       --  If the prefix is an object of a concurrent type, look for
4931       --  the entity in the associated task or protected type.
4932
4933       elsif Is_Concurrent_Type (Etype (P_Name)) then
4934          P_Name := Etype (P_Name);
4935       end if;
4936
4937       Id := Current_Entity (Selector);
4938
4939       declare
4940          Is_New_Candidate : Boolean;
4941
4942       begin
4943          while Present (Id) loop
4944             if Scope (Id) = P_Name then
4945                Candidate        := Id;
4946                Is_New_Candidate := True;
4947
4948             --  Ada 2005 (AI-217): Handle shadow entities associated with types
4949             --  declared in limited-withed nested packages. We don't need to
4950             --  handle E_Incomplete_Subtype entities because the entities in
4951             --  the limited view are always E_Incomplete_Type entities (see
4952             --  Build_Limited_Views). Regarding the expression used to evaluate
4953             --  the scope, it is important to note that the limited view also
4954             --  has shadow entities associated nested packages. For this reason
4955             --  the correct scope of the entity is the scope of the real entity
4956             --  The non-limited view may itself be incomplete, in which case
4957             --  get the full view if available.
4958
4959             elsif From_With_Type (Id)
4960               and then Is_Type (Id)
4961               and then Ekind (Id) = E_Incomplete_Type
4962               and then Present (Non_Limited_View (Id))
4963               and then Scope (Non_Limited_View (Id)) = P_Name
4964             then
4965                Candidate        := Get_Full_View (Non_Limited_View (Id));
4966                Is_New_Candidate := True;
4967
4968             else
4969                Is_New_Candidate := False;
4970             end if;
4971
4972             if Is_New_Candidate then
4973                if Is_Child_Unit (Id) then
4974                   exit when Is_Visible_Child_Unit (Id)
4975                     or else Is_Immediately_Visible (Id);
4976
4977                else
4978                   exit when not Is_Hidden (Id)
4979                     or else Is_Immediately_Visible (Id);
4980                end if;
4981             end if;
4982
4983             Id := Homonym (Id);
4984          end loop;
4985       end;
4986
4987       if No (Id)
4988         and then (Ekind (P_Name) = E_Procedure
4989                     or else
4990                   Ekind (P_Name) = E_Function)
4991         and then Is_Generic_Instance (P_Name)
4992       then
4993          --  Expanded name denotes entity in (instance of) generic subprogram.
4994          --  The entity may be in the subprogram instance, or may denote one of
4995          --  the formals, which is declared in the enclosing wrapper package.
4996
4997          P_Name := Scope (P_Name);
4998
4999          Id := Current_Entity (Selector);
5000          while Present (Id) loop
5001             exit when Scope (Id) = P_Name;
5002             Id := Homonym (Id);
5003          end loop;
5004       end if;
5005
5006       if No (Id) or else Chars (Id) /= Chars (Selector) then
5007          Set_Etype (N, Any_Type);
5008
5009          --  If we are looking for an entity defined in System, try to find it
5010          --  in the child package that may have been provided as an extension
5011          --  to System. The Extend_System pragma will have supplied the name of
5012          --  the extension, which may have to be loaded.
5013
5014          if Chars (P_Name) = Name_System
5015            and then Scope (P_Name) = Standard_Standard
5016            and then Present (System_Extend_Unit)
5017            and then Present_System_Aux (N)
5018          then
5019             Set_Entity (Prefix (N), System_Aux_Id);
5020             Find_Expanded_Name (N);
5021             return;
5022
5023          elsif Nkind (Selector) = N_Operator_Symbol
5024            and then Has_Implicit_Operator (N)
5025          then
5026             --  There is an implicit instance of the predefined operator in
5027             --  the given scope. The operator entity is defined in Standard.
5028             --  Has_Implicit_Operator makes the node into an Expanded_Name.
5029
5030             return;
5031
5032          elsif Nkind (Selector) = N_Character_Literal
5033            and then Has_Implicit_Character_Literal (N)
5034          then
5035             --  If there is no literal defined in the scope denoted by the
5036             --  prefix, the literal may belong to (a type derived from)
5037             --  Standard_Character, for which we have no explicit literals.
5038
5039             return;
5040
5041          else
5042             --  If the prefix is a single concurrent object, use its name in
5043             --  the error message, rather than that of the anonymous type.
5044
5045             if Is_Concurrent_Type (P_Name)
5046               and then Is_Internal_Name (Chars (P_Name))
5047             then
5048                Error_Msg_Node_2 := Entity (Prefix (N));
5049             else
5050                Error_Msg_Node_2 := P_Name;
5051             end if;
5052
5053             if P_Name = System_Aux_Id then
5054                P_Name := Scope (P_Name);
5055                Set_Entity (Prefix (N), P_Name);
5056             end if;
5057
5058             if Present (Candidate) then
5059
5060                --  If we know that the unit is a child unit we can give a more
5061                --  accurate error message.
5062
5063                if Is_Child_Unit (Candidate) then
5064
5065                   --  If the candidate is a private child unit and we are in
5066                   --  the visible part of a public unit, specialize the error
5067                   --  message. There might be a private with_clause for it,
5068                   --  but it is not currently active.
5069
5070                   if Is_Private_Descendant (Candidate)
5071                     and then Ekind (Current_Scope) = E_Package
5072                     and then not In_Private_Part (Current_Scope)
5073                     and then not Is_Private_Descendant (Current_Scope)
5074                   then
5075                      Error_Msg_N ("private child unit& is not visible here",
5076                                   Selector);
5077
5078                   --  Normal case where we have a missing with for a child unit
5079
5080                   else
5081                      Error_Msg_Qual_Level := 99;
5082                      Error_Msg_NE -- CODEFIX
5083                        ("missing `WITH &;`", Selector, Candidate);
5084                      Error_Msg_Qual_Level := 0;
5085                   end if;
5086
5087                   --  Here we don't know that this is a child unit
5088
5089                else
5090                   Error_Msg_NE ("& is not a visible entity of&", N, Selector);
5091                end if;
5092
5093             else
5094                --  Within the instantiation of a child unit, the prefix may
5095                --  denote the parent instance, but the selector has the name
5096                --  of the original child. Find whether we are within the
5097                --  corresponding instance, and get the proper entity, which
5098                --  can only be an enclosing scope.
5099
5100                if O_Name /= P_Name
5101                  and then In_Open_Scopes (P_Name)
5102                  and then Is_Generic_Instance (P_Name)
5103                then
5104                   declare
5105                      S : Entity_Id := Current_Scope;
5106                      P : Entity_Id;
5107
5108                   begin
5109                      for J in reverse 0 .. Scope_Stack.Last loop
5110                         S := Scope_Stack.Table (J).Entity;
5111
5112                         exit when S = Standard_Standard;
5113
5114                         if Ekind_In (S, E_Function,
5115                                         E_Package,
5116                                         E_Procedure)
5117                         then
5118                            P := Generic_Parent (Specification
5119                                   (Unit_Declaration_Node (S)));
5120
5121                            if Present (P)
5122                              and then Chars (Scope (P)) = Chars (O_Name)
5123                              and then Chars (P) = Chars (Selector)
5124                            then
5125                               Id := S;
5126                               goto Found;
5127                            end if;
5128                         end if;
5129
5130                      end loop;
5131                   end;
5132                end if;
5133
5134                --  If this is a selection from Ada, System or Interfaces, then
5135                --  we assume a missing with for the corresponding package.
5136
5137                if Is_Known_Unit (N) then
5138                   if not Error_Posted (N) then
5139                      Error_Msg_Node_2 := Selector;
5140                      Error_Msg_N -- CODEFIX
5141                        ("missing `WITH &.&;`", Prefix (N));
5142                   end if;
5143
5144                --  If this is a selection from a dummy package, then suppress
5145                --  the error message, of course the entity is missing if the
5146                --  package is missing!
5147
5148                elsif Sloc (Error_Msg_Node_2) = No_Location then
5149                   null;
5150
5151                --  Here we have the case of an undefined component
5152
5153                else
5154
5155                   --  The prefix may hide a homonym in the context that
5156                   --  declares the desired entity. This error can use a
5157                   --  specialized message.
5158
5159                   if In_Open_Scopes (P_Name)
5160                     and then Present (Homonym (P_Name))
5161                     and then Is_Compilation_Unit (Homonym (P_Name))
5162                     and then
5163                      (Is_Immediately_Visible (Homonym (P_Name))
5164                         or else Is_Visible_Child_Unit (Homonym (P_Name)))
5165                   then
5166                      declare
5167                         H : constant Entity_Id := Homonym (P_Name);
5168
5169                      begin
5170                         Id := First_Entity (H);
5171                         while Present (Id) loop
5172                            if Chars (Id) = Chars (Selector) then
5173                               Error_Msg_Qual_Level := 99;
5174                               Error_Msg_Name_1 := Chars (Selector);
5175                               Error_Msg_NE
5176                                 ("% not declared in&", N, P_Name);
5177                               Error_Msg_NE
5178                                 ("\use fully qualified name starting with"
5179                                   & " Standard to make& visible", N, H);
5180                               Error_Msg_Qual_Level := 0;
5181                               goto Done;
5182                            end if;
5183
5184                            Next_Entity (Id);
5185                         end loop;
5186
5187                         --  If not found, standard error message
5188
5189                         Error_Msg_NE ("& not declared in&", N, Selector);
5190
5191                         <<Done>> null;
5192                      end;
5193
5194                   else
5195                      Error_Msg_NE ("& not declared in&", N, Selector);
5196                   end if;
5197
5198                   --  Check for misspelling of some entity in prefix
5199
5200                   Id := First_Entity (P_Name);
5201                   while Present (Id) loop
5202                      if Is_Bad_Spelling_Of (Chars (Id), Chars (Selector))
5203                        and then not Is_Internal_Name (Chars (Id))
5204                      then
5205                         Error_Msg_NE -- CODEFIX
5206                           ("possible misspelling of&", Selector, Id);
5207                         exit;
5208                      end if;
5209
5210                      Next_Entity (Id);
5211                   end loop;
5212
5213                   --  Specialize the message if this may be an instantiation
5214                   --  of a child unit that was not mentioned in the context.
5215
5216                   if Nkind (Parent (N)) = N_Package_Instantiation
5217                     and then Is_Generic_Instance (Entity (Prefix (N)))
5218                     and then Is_Compilation_Unit
5219                                (Generic_Parent (Parent (Entity (Prefix (N)))))
5220                   then
5221                      Error_Msg_Node_2 := Selector;
5222                      Error_Msg_N -- CODEFIX
5223                        ("\missing `WITH &.&;`", Prefix (N));
5224                   end if;
5225                end if;
5226             end if;
5227
5228             Id := Any_Id;
5229          end if;
5230       end if;
5231
5232       <<Found>>
5233       if Comes_From_Source (N)
5234         and then Is_Remote_Access_To_Subprogram_Type (Id)
5235         and then Present (Equivalent_Type (Id))
5236       then
5237          --  If we are not actually generating distribution code (i.e. the
5238          --  current PCS is the dummy non-distributed version), then the
5239          --  Equivalent_Type will be missing, and Id should be treated as
5240          --  a regular access-to-subprogram type.
5241
5242          Id := Equivalent_Type (Id);
5243          Set_Chars (Selector, Chars (Id));
5244       end if;
5245
5246       --  Ada 2005 (AI-50217): Check usage of entities in limited withed units
5247
5248       if Ekind (P_Name) = E_Package
5249         and then From_With_Type (P_Name)
5250       then
5251          if From_With_Type (Id)
5252            or else Is_Type (Id)
5253            or else Ekind (Id) = E_Package
5254          then
5255             null;
5256          else
5257             Error_Msg_N
5258               ("limited withed package can only be used to access "
5259                & "incomplete types",
5260                 N);
5261          end if;
5262       end if;
5263
5264       if Is_Task_Type (P_Name)
5265         and then ((Ekind (Id) = E_Entry
5266                      and then Nkind (Parent (N)) /= N_Attribute_Reference)
5267                    or else
5268                     (Ekind (Id) = E_Entry_Family
5269                       and then
5270                         Nkind (Parent (Parent (N))) /= N_Attribute_Reference))
5271       then
5272          --  It is an entry call after all, either to the current task (which
5273          --  will deadlock) or to an enclosing task.
5274
5275          Analyze_Selected_Component (N);
5276          return;
5277       end if;
5278
5279       Change_Selected_Component_To_Expanded_Name (N);
5280
5281       --  Do style check and generate reference, but skip both steps if this
5282       --  entity has homonyms, since we may not have the right homonym set yet.
5283       --  The proper homonym will be set during the resolve phase.
5284
5285       if Has_Homonym (Id) then
5286          Set_Entity (N, Id);
5287       else
5288          Set_Entity_Or_Discriminal (N, Id);
5289
5290          if Is_LHS (N) then
5291             Generate_Reference (Id, N, 'm');
5292          else
5293             Generate_Reference (Id, N);
5294          end if;
5295       end if;
5296
5297       if Is_Type (Id) then
5298          Set_Etype (N, Id);
5299       else
5300          Set_Etype (N, Get_Full_View (Etype (Id)));
5301       end if;
5302
5303       --  Check for violation of No_Wide_Characters
5304
5305       Check_Wide_Character_Restriction (Id, N);
5306
5307       --  If the Ekind of the entity is Void, it means that all homonyms are
5308       --  hidden from all visibility (RM 8.3(5,14-20)).
5309
5310       if Ekind (Id) = E_Void then
5311          Premature_Usage (N);
5312
5313       elsif Is_Overloadable (Id)
5314         and then Present (Homonym (Id))
5315       then
5316          declare
5317             H : Entity_Id := Homonym (Id);
5318
5319          begin
5320             while Present (H) loop
5321                if Scope (H) = Scope (Id)
5322                  and then
5323                    (not Is_Hidden (H)
5324                       or else Is_Immediately_Visible (H))
5325                then
5326                   Collect_Interps (N);
5327                   exit;
5328                end if;
5329
5330                H := Homonym (H);
5331             end loop;
5332
5333             --  If an extension of System is present, collect possible explicit
5334             --  overloadings declared in the extension.
5335
5336             if Chars (P_Name) = Name_System
5337               and then Scope (P_Name) = Standard_Standard
5338               and then Present (System_Extend_Unit)
5339               and then Present_System_Aux (N)
5340             then
5341                H := Current_Entity (Id);
5342
5343                while Present (H) loop
5344                   if Scope (H) = System_Aux_Id then
5345                      Add_One_Interp (N, H, Etype (H));
5346                   end if;
5347
5348                   H := Homonym (H);
5349                end loop;
5350             end if;
5351          end;
5352       end if;
5353
5354       if Nkind (Selector_Name (N)) = N_Operator_Symbol
5355         and then Scope (Id) /= Standard_Standard
5356       then
5357          --  In addition to user-defined operators in the given scope, there
5358          --  may be an implicit instance of the predefined operator. The
5359          --  operator (defined in Standard) is found in Has_Implicit_Operator,
5360          --  and added to the interpretations. Procedure Add_One_Interp will
5361          --  determine which hides which.
5362
5363          if Has_Implicit_Operator (N) then
5364             null;
5365          end if;
5366       end if;
5367    end Find_Expanded_Name;
5368
5369    -------------------------
5370    -- Find_Renamed_Entity --
5371    -------------------------
5372
5373    function Find_Renamed_Entity
5374      (N         : Node_Id;
5375       Nam       : Node_Id;
5376       New_S     : Entity_Id;
5377       Is_Actual : Boolean := False) return Entity_Id
5378    is
5379       Ind   : Interp_Index;
5380       I1    : Interp_Index := 0; -- Suppress junk warnings
5381       It    : Interp;
5382       It1   : Interp;
5383       Old_S : Entity_Id;
5384       Inst  : Entity_Id;
5385
5386       function Enclosing_Instance return Entity_Id;
5387       --  If the renaming determines the entity for the default of a formal
5388       --  subprogram nested within another instance, choose the innermost
5389       --  candidate. This is because if the formal has a box, and we are within
5390       --  an enclosing instance where some candidate interpretations are local
5391       --  to this enclosing instance, we know that the default was properly
5392       --  resolved when analyzing the generic, so we prefer the local
5393       --  candidates to those that are external. This is not always the case
5394       --  but is a reasonable heuristic on the use of nested generics. The
5395       --  proper solution requires a full renaming model.
5396
5397       function Is_Visible_Operation (Op : Entity_Id) return Boolean;
5398       --  If the renamed entity is an implicit operator, check whether it is
5399       --  visible because its operand type is properly visible. This check
5400       --  applies to explicit renamed entities that appear in the source in a
5401       --  renaming declaration or a formal subprogram instance, but not to
5402       --  default generic actuals with a name.
5403
5404       function Report_Overload return Entity_Id;
5405       --  List possible interpretations, and specialize message in the
5406       --  case of a generic actual.
5407
5408       function Within (Inner, Outer : Entity_Id) return Boolean;
5409       --  Determine whether a candidate subprogram is defined within the
5410       --  enclosing instance. If yes, it has precedence over outer candidates.
5411
5412       ------------------------
5413       -- Enclosing_Instance --
5414       ------------------------
5415
5416       function Enclosing_Instance return Entity_Id is
5417          S : Entity_Id;
5418
5419       begin
5420          if not Is_Generic_Instance (Current_Scope)
5421            and then not Is_Actual
5422          then
5423             return Empty;
5424          end if;
5425
5426          S := Scope (Current_Scope);
5427          while S /= Standard_Standard loop
5428             if Is_Generic_Instance (S) then
5429                return S;
5430             end if;
5431
5432             S := Scope (S);
5433          end loop;
5434
5435          return Empty;
5436       end Enclosing_Instance;
5437
5438       --------------------------
5439       -- Is_Visible_Operation --
5440       --------------------------
5441
5442       function Is_Visible_Operation (Op : Entity_Id) return Boolean is
5443          Scop : Entity_Id;
5444          Typ  : Entity_Id;
5445          Btyp : Entity_Id;
5446
5447       begin
5448          if Ekind (Op) /= E_Operator
5449            or else Scope (Op) /= Standard_Standard
5450            or else (In_Instance
5451                       and then
5452                         (not Is_Actual
5453                            or else Present (Enclosing_Instance)))
5454          then
5455             return True;
5456
5457          else
5458             --  For a fixed point type operator, check the resulting type,
5459             --  because it may be a mixed mode integer * fixed operation.
5460
5461             if Present (Next_Formal (First_Formal (New_S)))
5462               and then Is_Fixed_Point_Type (Etype (New_S))
5463             then
5464                Typ := Etype (New_S);
5465             else
5466                Typ := Etype (First_Formal (New_S));
5467             end if;
5468
5469             Btyp := Base_Type (Typ);
5470
5471             if Nkind (Nam) /= N_Expanded_Name then
5472                return (In_Open_Scopes (Scope (Btyp))
5473                         or else Is_Potentially_Use_Visible (Btyp)
5474                         or else In_Use (Btyp)
5475                         or else In_Use (Scope (Btyp)));
5476
5477             else
5478                Scop := Entity (Prefix (Nam));
5479
5480                if Ekind (Scop) = E_Package
5481                  and then Present (Renamed_Object (Scop))
5482                then
5483                   Scop := Renamed_Object (Scop);
5484                end if;
5485
5486                --  Operator is visible if prefix of expanded name denotes
5487                --  scope of type, or else type is defined in System_Aux
5488                --  and the prefix denotes System.
5489
5490                return Scope (Btyp) = Scop
5491                  or else (Scope (Btyp) = System_Aux_Id
5492                            and then Scope (Scope (Btyp)) = Scop);
5493             end if;
5494          end if;
5495       end Is_Visible_Operation;
5496
5497       ------------
5498       -- Within --
5499       ------------
5500
5501       function Within (Inner, Outer : Entity_Id) return Boolean is
5502          Sc : Entity_Id;
5503
5504       begin
5505          Sc := Scope (Inner);
5506          while Sc /= Standard_Standard loop
5507             if Sc = Outer then
5508                return True;
5509             else
5510                Sc := Scope (Sc);
5511             end if;
5512          end loop;
5513
5514          return False;
5515       end Within;
5516
5517       ---------------------
5518       -- Report_Overload --
5519       ---------------------
5520
5521       function Report_Overload return Entity_Id is
5522       begin
5523          if Is_Actual then
5524             Error_Msg_NE -- CODEFIX
5525               ("ambiguous actual subprogram&, " &
5526                  "possible interpretations:", N, Nam);
5527          else
5528             Error_Msg_N -- CODEFIX
5529               ("ambiguous subprogram, " &
5530                  "possible interpretations:", N);
5531          end if;
5532
5533          List_Interps (Nam, N);
5534          return Old_S;
5535       end Report_Overload;
5536
5537    --  Start of processing for Find_Renamed_Entity
5538
5539    begin
5540       Old_S := Any_Id;
5541       Candidate_Renaming := Empty;
5542
5543       if not Is_Overloaded (Nam) then
5544          if Entity_Matches_Spec (Entity (Nam), New_S) then
5545             Candidate_Renaming := New_S;
5546
5547             if Is_Visible_Operation (Entity (Nam)) then
5548                Old_S := Entity (Nam);
5549             end if;
5550
5551          elsif
5552            Present (First_Formal (Entity (Nam)))
5553              and then Present (First_Formal (New_S))
5554              and then (Base_Type (Etype (First_Formal (Entity (Nam))))
5555                         = Base_Type (Etype (First_Formal (New_S))))
5556          then
5557             Candidate_Renaming := Entity (Nam);
5558          end if;
5559
5560       else
5561          Get_First_Interp (Nam, Ind, It);
5562          while Present (It.Nam) loop
5563             if Entity_Matches_Spec (It.Nam, New_S)
5564                and then Is_Visible_Operation (It.Nam)
5565             then
5566                if Old_S /= Any_Id then
5567
5568                   --  Note: The call to Disambiguate only happens if a
5569                   --  previous interpretation was found, in which case I1
5570                   --  has received a value.
5571
5572                   It1 := Disambiguate (Nam, I1, Ind, Etype (Old_S));
5573
5574                   if It1 = No_Interp then
5575                      Inst := Enclosing_Instance;
5576
5577                      if Present (Inst) then
5578                         if Within (It.Nam, Inst) then
5579                            if Within (Old_S, Inst) then
5580
5581                               --  Choose the innermost subprogram, which would
5582                               --  have hidden the outer one in the generic.
5583
5584                               if Scope_Depth (It.Nam) <
5585                                 Scope_Depth (Old_S)
5586                               then
5587                                  return Old_S;
5588                               else
5589                                  return It.Nam;
5590                               end if;
5591                            end if;
5592
5593                         elsif Within (Old_S, Inst) then
5594                            return (Old_S);
5595
5596                         else
5597                            return Report_Overload;
5598                         end if;
5599
5600                      --  If not within an instance, ambiguity is real
5601
5602                      else
5603                         return Report_Overload;
5604                      end if;
5605
5606                   else
5607                      Old_S := It1.Nam;
5608                      exit;
5609                   end if;
5610
5611                else
5612                   I1 := Ind;
5613                   Old_S := It.Nam;
5614                end if;
5615
5616             elsif
5617               Present (First_Formal (It.Nam))
5618                 and then Present (First_Formal (New_S))
5619                 and then  (Base_Type (Etype (First_Formal (It.Nam)))
5620                             = Base_Type (Etype (First_Formal (New_S))))
5621             then
5622                Candidate_Renaming := It.Nam;
5623             end if;
5624
5625             Get_Next_Interp (Ind, It);
5626          end loop;
5627
5628          Set_Entity (Nam, Old_S);
5629
5630          if Old_S /= Any_Id then
5631             Set_Is_Overloaded (Nam, False);
5632          end if;
5633       end if;
5634
5635       return Old_S;
5636    end Find_Renamed_Entity;
5637
5638    -----------------------------
5639    -- Find_Selected_Component --
5640    -----------------------------
5641
5642    procedure Find_Selected_Component (N : Node_Id) is
5643       P : constant Node_Id := Prefix (N);
5644
5645       P_Name : Entity_Id;
5646       --  Entity denoted by prefix
5647
5648       P_Type : Entity_Id;
5649       --  and its type
5650
5651       Nam : Node_Id;
5652
5653    begin
5654       Analyze (P);
5655
5656       if Nkind (P) = N_Error then
5657          return;
5658       end if;
5659
5660       --  Selector name cannot be a character literal or an operator symbol in
5661       --  SPARK, except for the operator symbol in a renaming.
5662
5663       if Restriction_Check_Required (SPARK) then
5664          if Nkind (Selector_Name (N)) = N_Character_Literal then
5665             Check_SPARK_Restriction
5666               ("character literal cannot be prefixed", N);
5667          elsif Nkind (Selector_Name (N)) = N_Operator_Symbol
5668            and then Nkind (Parent (N)) /= N_Subprogram_Renaming_Declaration
5669          then
5670             Check_SPARK_Restriction ("operator symbol cannot be prefixed", N);
5671          end if;
5672       end if;
5673
5674       --  If the selector already has an entity, the node has been constructed
5675       --  in the course of expansion, and is known to be valid. Do not verify
5676       --  that it is defined for the type (it may be a private component used
5677       --  in the expansion of record equality).
5678
5679       if Present (Entity (Selector_Name (N))) then
5680          if No (Etype (N))
5681            or else Etype (N) = Any_Type
5682          then
5683             declare
5684                Sel_Name : constant Node_Id   := Selector_Name (N);
5685                Selector : constant Entity_Id := Entity (Sel_Name);
5686                C_Etype  : Node_Id;
5687
5688             begin
5689                Set_Etype (Sel_Name, Etype (Selector));
5690
5691                if not Is_Entity_Name (P) then
5692                   Resolve (P);
5693                end if;
5694
5695                --  Build an actual subtype except for the first parameter
5696                --  of an init proc, where this actual subtype is by
5697                --  definition incorrect, since the object is uninitialized
5698                --  (and does not even have defined discriminants etc.)
5699
5700                if Is_Entity_Name (P)
5701                  and then Ekind (Entity (P)) = E_Function
5702                then
5703                   Nam := New_Copy (P);
5704
5705                   if Is_Overloaded (P) then
5706                      Save_Interps (P, Nam);
5707                   end if;
5708
5709                   Rewrite (P,
5710                     Make_Function_Call (Sloc (P), Name => Nam));
5711                   Analyze_Call (P);
5712                   Analyze_Selected_Component (N);
5713                   return;
5714
5715                elsif Ekind (Selector) = E_Component
5716                  and then (not Is_Entity_Name (P)
5717                             or else Chars (Entity (P)) /= Name_uInit)
5718                then
5719                   --  Do not build the subtype when referencing components of
5720                   --  dispatch table wrappers. Required to avoid generating
5721                   --  elaboration code with HI runtimes. JVM and .NET use a
5722                   --  modified version of Ada.Tags which does not contain RE_
5723                   --  Dispatch_Table_Wrapper and RE_No_Dispatch_Table_Wrapper.
5724                   --  Avoid raising RE_Not_Available exception in those cases.
5725
5726                   if VM_Target = No_VM
5727                     and then RTU_Loaded (Ada_Tags)
5728                     and then
5729                       ((RTE_Available (RE_Dispatch_Table_Wrapper)
5730                          and then Scope (Selector) =
5731                                      RTE (RE_Dispatch_Table_Wrapper))
5732                           or else
5733                        (RTE_Available (RE_No_Dispatch_Table_Wrapper)
5734                          and then Scope (Selector) =
5735                                      RTE (RE_No_Dispatch_Table_Wrapper)))
5736                   then
5737                      C_Etype := Empty;
5738
5739                   else
5740                      C_Etype :=
5741                        Build_Actual_Subtype_Of_Component
5742                          (Etype (Selector), N);
5743                   end if;
5744
5745                else
5746                   C_Etype := Empty;
5747                end if;
5748
5749                if No (C_Etype) then
5750                   C_Etype := Etype (Selector);
5751                else
5752                   Insert_Action (N, C_Etype);
5753                   C_Etype := Defining_Identifier (C_Etype);
5754                end if;
5755
5756                Set_Etype (N, C_Etype);
5757             end;
5758
5759             --  If this is the name of an entry or protected operation, and
5760             --  the prefix is an access type, insert an explicit dereference,
5761             --  so that entry calls are treated uniformly.
5762
5763             if Is_Access_Type (Etype (P))
5764               and then Is_Concurrent_Type (Designated_Type (Etype (P)))
5765             then
5766                declare
5767                   New_P : constant Node_Id :=
5768                             Make_Explicit_Dereference (Sloc (P),
5769                               Prefix => Relocate_Node (P));
5770                begin
5771                   Rewrite (P, New_P);
5772                   Set_Etype (P, Designated_Type (Etype (Prefix (P))));
5773                end;
5774             end if;
5775
5776          --  If the selected component appears within a default expression
5777          --  and it has an actual subtype, the pre-analysis has not yet
5778          --  completed its analysis, because Insert_Actions is disabled in
5779          --  that context. Within the init proc of the enclosing type we
5780          --  must complete this analysis, if an actual subtype was created.
5781
5782          elsif Inside_Init_Proc then
5783             declare
5784                Typ  : constant Entity_Id := Etype (N);
5785                Decl : constant Node_Id   := Declaration_Node (Typ);
5786             begin
5787                if Nkind (Decl) = N_Subtype_Declaration
5788                  and then not Analyzed (Decl)
5789                  and then Is_List_Member (Decl)
5790                  and then No (Parent (Decl))
5791                then
5792                   Remove (Decl);
5793                   Insert_Action (N, Decl);
5794                end if;
5795             end;
5796          end if;
5797
5798          return;
5799
5800       elsif Is_Entity_Name (P) then
5801          P_Name := Entity (P);
5802
5803          --  The prefix may denote an enclosing type which is the completion
5804          --  of an incomplete type declaration.
5805
5806          if Is_Type (P_Name) then
5807             Set_Entity (P, Get_Full_View (P_Name));
5808             Set_Etype  (P, Entity (P));
5809             P_Name := Entity (P);
5810          end if;
5811
5812          P_Type := Base_Type (Etype (P));
5813
5814          if Debug_Flag_E then
5815             Write_Str ("Found prefix type to be ");
5816             Write_Entity_Info (P_Type, "      "); Write_Eol;
5817          end if;
5818
5819          --  First check for components of a record object (not the
5820          --  result of a call, which is handled below).
5821
5822          if Is_Appropriate_For_Record (P_Type)
5823            and then not Is_Overloadable (P_Name)
5824            and then not Is_Type (P_Name)
5825          then
5826             --  Selected component of record. Type checking will validate
5827             --  name of selector.
5828             --  ??? could we rewrite an implicit dereference into an explicit
5829             --  one here?
5830
5831             Analyze_Selected_Component (N);
5832
5833          --  Reference to type name in predicate/invariant expression
5834
5835          elsif Is_Appropriate_For_Entry_Prefix (P_Type)
5836            and then not In_Open_Scopes (P_Name)
5837            and then (not Is_Concurrent_Type (Etype (P_Name))
5838                        or else not In_Open_Scopes (Etype (P_Name)))
5839          then
5840             --  Call to protected operation or entry. Type checking is
5841             --  needed on the prefix.
5842
5843             Analyze_Selected_Component (N);
5844
5845          elsif (In_Open_Scopes (P_Name)
5846                  and then Ekind (P_Name) /= E_Void
5847                  and then not Is_Overloadable (P_Name))
5848            or else (Is_Concurrent_Type (Etype (P_Name))
5849                      and then In_Open_Scopes (Etype (P_Name)))
5850          then
5851             --  Prefix denotes an enclosing loop, block, or task, i.e. an
5852             --  enclosing construct that is not a subprogram or accept.
5853
5854             Find_Expanded_Name (N);
5855
5856          elsif Ekind (P_Name) = E_Package then
5857             Find_Expanded_Name (N);
5858
5859          elsif Is_Overloadable (P_Name) then
5860
5861             --  The subprogram may be a renaming (of an enclosing scope) as
5862             --  in the case of the name of the generic within an instantiation.
5863
5864             if Ekind_In (P_Name, E_Procedure, E_Function)
5865               and then Present (Alias (P_Name))
5866               and then Is_Generic_Instance (Alias (P_Name))
5867             then
5868                P_Name := Alias (P_Name);
5869             end if;
5870
5871             if Is_Overloaded (P) then
5872
5873                --  The prefix must resolve to a unique enclosing construct
5874
5875                declare
5876                   Found : Boolean := False;
5877                   Ind   : Interp_Index;
5878                   It    : Interp;
5879
5880                begin
5881                   Get_First_Interp (P, Ind, It);
5882                   while Present (It.Nam) loop
5883                      if In_Open_Scopes (It.Nam) then
5884                         if Found then
5885                            Error_Msg_N (
5886                               "prefix must be unique enclosing scope", N);
5887                            Set_Entity (N, Any_Id);
5888                            Set_Etype  (N, Any_Type);
5889                            return;
5890
5891                         else
5892                            Found := True;
5893                            P_Name := It.Nam;
5894                         end if;
5895                      end if;
5896
5897                      Get_Next_Interp (Ind, It);
5898                   end loop;
5899                end;
5900             end if;
5901
5902             if In_Open_Scopes (P_Name) then
5903                Set_Entity (P, P_Name);
5904                Set_Is_Overloaded (P, False);
5905                Find_Expanded_Name (N);
5906
5907             else
5908                --  If no interpretation as an expanded name is possible, it
5909                --  must be a selected component of a record returned by a
5910                --  function call. Reformat prefix as a function call, the rest
5911                --  is done by type resolution. If the prefix is procedure or
5912                --  entry, as is P.X; this is an error.
5913
5914                if Ekind (P_Name) /= E_Function
5915                  and then (not Is_Overloaded (P)
5916                              or else
5917                            Nkind (Parent (N)) = N_Procedure_Call_Statement)
5918                then
5919                   --  Prefix may mention a package that is hidden by a local
5920                   --  declaration: let the user know. Scan the full homonym
5921                   --  chain, the candidate package may be anywhere on it.
5922
5923                   if Present (Homonym (Current_Entity (P_Name))) then
5924
5925                      P_Name := Current_Entity (P_Name);
5926
5927                      while Present (P_Name) loop
5928                         exit when Ekind (P_Name) = E_Package;
5929                         P_Name := Homonym (P_Name);
5930                      end loop;
5931
5932                      if Present (P_Name) then
5933                         Error_Msg_Sloc := Sloc (Entity (Prefix (N)));
5934
5935                         Error_Msg_NE
5936                           ("package& is hidden by declaration#",
5937                             N, P_Name);
5938
5939                         Set_Entity (Prefix (N), P_Name);
5940                         Find_Expanded_Name (N);
5941                         return;
5942                      else
5943                         P_Name := Entity (Prefix (N));
5944                      end if;
5945                   end if;
5946
5947                   Error_Msg_NE
5948                     ("invalid prefix in selected component&", N, P_Name);
5949                   Change_Selected_Component_To_Expanded_Name (N);
5950                   Set_Entity (N, Any_Id);
5951                   Set_Etype (N, Any_Type);
5952
5953                else
5954                   Nam := New_Copy (P);
5955                   Save_Interps (P, Nam);
5956                   Rewrite (P,
5957                     Make_Function_Call (Sloc (P), Name => Nam));
5958                   Analyze_Call (P);
5959                   Analyze_Selected_Component (N);
5960                end if;
5961             end if;
5962
5963          --  Remaining cases generate various error messages
5964
5965          else
5966             --  Format node as expanded name, to avoid cascaded errors
5967
5968             Change_Selected_Component_To_Expanded_Name (N);
5969             Set_Entity  (N, Any_Id);
5970             Set_Etype   (N, Any_Type);
5971
5972             --  Issue error message, but avoid this if error issued already.
5973             --  Use identifier of prefix if one is available.
5974
5975             if P_Name = Any_Id  then
5976                null;
5977
5978             elsif Ekind (P_Name) = E_Void then
5979                Premature_Usage (P);
5980
5981             elsif Nkind (P) /= N_Attribute_Reference then
5982                Error_Msg_N (
5983                 "invalid prefix in selected component&", P);
5984
5985                if Is_Access_Type (P_Type)
5986                  and then Ekind (Designated_Type (P_Type)) = E_Incomplete_Type
5987                then
5988                   Error_Msg_N
5989                     ("\dereference must not be of an incomplete type " &
5990                        "(RM 3.10.1)", P);
5991                end if;
5992
5993             else
5994                Error_Msg_N (
5995                 "invalid prefix in selected component", P);
5996             end if;
5997          end if;
5998
5999          --  Selector name is restricted in SPARK
6000
6001          if Nkind (N) = N_Expanded_Name
6002            and then Restriction_Check_Required (SPARK)
6003          then
6004             if Is_Subprogram (P_Name) then
6005                Check_SPARK_Restriction
6006                  ("prefix of expanded name cannot be a subprogram", P);
6007             elsif Ekind (P_Name) = E_Loop then
6008                Check_SPARK_Restriction
6009                  ("prefix of expanded name cannot be a loop statement", P);
6010             end if;
6011          end if;
6012
6013       else
6014          --  If prefix is not the name of an entity, it must be an expression,
6015          --  whose type is appropriate for a record. This is determined by
6016          --  type resolution.
6017
6018          Analyze_Selected_Component (N);
6019       end if;
6020    end Find_Selected_Component;
6021
6022    ---------------
6023    -- Find_Type --
6024    ---------------
6025
6026    procedure Find_Type (N : Node_Id) is
6027       C      : Entity_Id;
6028       Typ    : Entity_Id;
6029       T      : Entity_Id;
6030       T_Name : Entity_Id;
6031
6032    begin
6033       if N = Error then
6034          return;
6035
6036       elsif Nkind (N) = N_Attribute_Reference then
6037
6038          --  Class attribute. This is not valid in Ada 83 mode, but we do not
6039          --  need to enforce that at this point, since the declaration of the
6040          --  tagged type in the prefix would have been flagged already.
6041
6042          if Attribute_Name (N) = Name_Class then
6043             Check_Restriction (No_Dispatch, N);
6044             Find_Type (Prefix (N));
6045
6046             --  Propagate error from bad prefix
6047
6048             if Etype (Prefix (N)) = Any_Type then
6049                Set_Entity (N, Any_Type);
6050                Set_Etype  (N, Any_Type);
6051                return;
6052             end if;
6053
6054             T := Base_Type (Entity (Prefix (N)));
6055
6056             --  Case where type is not known to be tagged. Its appearance in
6057             --  the prefix of the 'Class attribute indicates that the full view
6058             --  will be tagged.
6059
6060             if not Is_Tagged_Type (T) then
6061                if Ekind (T) = E_Incomplete_Type then
6062
6063                   --  It is legal to denote the class type of an incomplete
6064                   --  type. The full type will have to be tagged, of course.
6065                   --  In Ada 2005 this usage is declared obsolescent, so we
6066                   --  warn accordingly. This usage is only legal if the type
6067                   --  is completed in the current scope, and not for a limited
6068                   --  view of a type.
6069
6070                   if not Is_Tagged_Type (T)
6071                     and then Ada_Version >= Ada_2005
6072                   then
6073                      if From_With_Type (T) then
6074                         Error_Msg_N
6075                           ("prefix of Class attribute must be tagged", N);
6076                         Set_Etype (N, Any_Type);
6077                         Set_Entity (N, Any_Type);
6078                         return;
6079
6080                   --  ??? This test is temporarily disabled (always False)
6081                   --  because it causes an unwanted warning on GNAT sources
6082                   --  (built with -gnatg, which includes Warn_On_Obsolescent_
6083                   --  Feature). Once this issue is cleared in the sources, it
6084                   --  can be enabled.
6085
6086                      elsif Warn_On_Obsolescent_Feature
6087                        and then False
6088                      then
6089                         Error_Msg_N
6090                           ("applying 'Class to an untagged incomplete type"
6091                            & " is an obsolescent feature  (RM J.11)", N);
6092                      end if;
6093                   end if;
6094
6095                   Set_Is_Tagged_Type (T);
6096                   Set_Direct_Primitive_Operations (T, New_Elmt_List);
6097                   Make_Class_Wide_Type (T);
6098                   Set_Entity (N, Class_Wide_Type (T));
6099                   Set_Etype  (N, Class_Wide_Type (T));
6100
6101                elsif Ekind (T) = E_Private_Type
6102                  and then not Is_Generic_Type (T)
6103                  and then In_Private_Part (Scope (T))
6104                then
6105                   --  The Class attribute can be applied to an untagged private
6106                   --  type fulfilled by a tagged type prior to the full type
6107                   --  declaration (but only within the parent package's private
6108                   --  part). Create the class-wide type now and check that the
6109                   --  full type is tagged later during its analysis. Note that
6110                   --  we do not mark the private type as tagged, unlike the
6111                   --  case of incomplete types, because the type must still
6112                   --  appear untagged to outside units.
6113
6114                   if No (Class_Wide_Type (T)) then
6115                      Make_Class_Wide_Type (T);
6116                   end if;
6117
6118                   Set_Entity (N, Class_Wide_Type (T));
6119                   Set_Etype  (N, Class_Wide_Type (T));
6120
6121                else
6122                   --  Should we introduce a type Any_Tagged and use Wrong_Type
6123                   --  here, it would be a bit more consistent???
6124
6125                   Error_Msg_NE
6126                     ("tagged type required, found}",
6127                      Prefix (N), First_Subtype (T));
6128                   Set_Entity (N, Any_Type);
6129                   return;
6130                end if;
6131
6132             --  Case of tagged type
6133
6134             else
6135                if Is_Concurrent_Type (T) then
6136                   if No (Corresponding_Record_Type (Entity (Prefix (N)))) then
6137
6138                      --  Previous error. Use current type, which at least
6139                      --  provides some operations.
6140
6141                      C := Entity (Prefix (N));
6142
6143                   else
6144                      C := Class_Wide_Type
6145                             (Corresponding_Record_Type (Entity (Prefix (N))));
6146                   end if;
6147
6148                else
6149                   C := Class_Wide_Type (Entity (Prefix (N)));
6150                end if;
6151
6152                Set_Entity_With_Style_Check (N, C);
6153                Generate_Reference (C, N);
6154                Set_Etype (N, C);
6155             end if;
6156
6157          --  Base attribute, not allowed in Ada 83
6158
6159          elsif Attribute_Name (N) = Name_Base then
6160             Error_Msg_Name_1 := Name_Base;
6161             Check_SPARK_Restriction
6162               ("attribute% is only allowed as prefix of another attribute", N);
6163
6164             if Ada_Version = Ada_83 and then Comes_From_Source (N) then
6165                Error_Msg_N
6166                  ("(Ada 83) Base attribute not allowed in subtype mark", N);
6167
6168             else
6169                Find_Type (Prefix (N));
6170                Typ := Entity (Prefix (N));
6171
6172                if Ada_Version >= Ada_95
6173                  and then not Is_Scalar_Type (Typ)
6174                  and then not Is_Generic_Type (Typ)
6175                then
6176                   Error_Msg_N
6177                     ("prefix of Base attribute must be scalar type",
6178                       Prefix (N));
6179
6180                elsif Warn_On_Redundant_Constructs
6181                  and then Base_Type (Typ) = Typ
6182                then
6183                   Error_Msg_NE -- CODEFIX
6184                     ("?redundant attribute, & is its own base type", N, Typ);
6185                end if;
6186
6187                T := Base_Type (Typ);
6188
6189                --  Rewrite attribute reference with type itself (see similar
6190                --  processing in Analyze_Attribute, case Base). Preserve prefix
6191                --  if present, for other legality checks.
6192
6193                if Nkind (Prefix (N)) = N_Expanded_Name then
6194                   Rewrite (N,
6195                      Make_Expanded_Name (Sloc (N),
6196                        Chars         => Chars (T),
6197                        Prefix        => New_Copy (Prefix (Prefix (N))),
6198                        Selector_Name => New_Reference_To (T, Sloc (N))));
6199
6200                else
6201                   Rewrite (N, New_Reference_To (T, Sloc (N)));
6202                end if;
6203
6204                Set_Entity (N, T);
6205                Set_Etype (N, T);
6206             end if;
6207
6208          elsif Attribute_Name (N) = Name_Stub_Type then
6209
6210             --  This is handled in Analyze_Attribute
6211
6212             Analyze (N);
6213
6214          --  All other attributes are invalid in a subtype mark
6215
6216          else
6217             Error_Msg_N ("invalid attribute in subtype mark", N);
6218          end if;
6219
6220       else
6221          Analyze (N);
6222
6223          if Is_Entity_Name (N) then
6224             T_Name := Entity (N);
6225          else
6226             Error_Msg_N ("subtype mark required in this context", N);
6227             Set_Etype (N, Any_Type);
6228             return;
6229          end if;
6230
6231          if T_Name  = Any_Id or else Etype (N) = Any_Type then
6232
6233             --  Undefined id. Make it into a valid type
6234
6235             Set_Entity (N, Any_Type);
6236
6237          elsif not Is_Type (T_Name)
6238            and then T_Name /= Standard_Void_Type
6239          then
6240             Error_Msg_Sloc := Sloc (T_Name);
6241             Error_Msg_N ("subtype mark required in this context", N);
6242             Error_Msg_NE ("\\found & declared#", N, T_Name);
6243             Set_Entity (N, Any_Type);
6244
6245          else
6246             --  If the type is an incomplete type created to handle
6247             --  anonymous access components of a record type, then the
6248             --  incomplete type is the visible entity and subsequent
6249             --  references will point to it. Mark the original full
6250             --  type as referenced, to prevent spurious warnings.
6251
6252             if Is_Incomplete_Type (T_Name)
6253               and then Present (Full_View (T_Name))
6254               and then not Comes_From_Source (T_Name)
6255             then
6256                Set_Referenced (Full_View (T_Name));
6257             end if;
6258
6259             T_Name := Get_Full_View (T_Name);
6260
6261             --  Ada 2005 (AI-251, AI-50217): Handle interfaces visible through
6262             --  limited-with clauses
6263
6264             if From_With_Type (T_Name)
6265               and then Ekind (T_Name) in Incomplete_Kind
6266               and then Present (Non_Limited_View (T_Name))
6267               and then Is_Interface (Non_Limited_View (T_Name))
6268             then
6269                T_Name := Non_Limited_View (T_Name);
6270             end if;
6271
6272             if In_Open_Scopes (T_Name) then
6273                if Ekind (Base_Type (T_Name)) = E_Task_Type then
6274
6275                   --  In Ada 2005, a task name can be used in an access
6276                   --  definition within its own body. It cannot be used
6277                   --  in the discriminant part of the task declaration,
6278                   --  nor anywhere else in the declaration because entries
6279                   --  cannot have access parameters.
6280
6281                   if Ada_Version >= Ada_2005
6282                     and then Nkind (Parent (N)) = N_Access_Definition
6283                   then
6284                      Set_Entity (N, T_Name);
6285                      Set_Etype  (N, T_Name);
6286
6287                      if Has_Completion (T_Name) then
6288                         return;
6289
6290                      else
6291                         Error_Msg_N
6292                           ("task type cannot be used as type mark " &
6293                            "within its own declaration", N);
6294                      end if;
6295
6296                   else
6297                      Error_Msg_N
6298                        ("task type cannot be used as type mark " &
6299                         "within its own spec or body", N);
6300                   end if;
6301
6302                elsif Ekind (Base_Type (T_Name)) = E_Protected_Type then
6303
6304                   --  In Ada 2005, a protected name can be used in an access
6305                   --  definition within its own body.
6306
6307                   if Ada_Version >= Ada_2005
6308                     and then Nkind (Parent (N)) = N_Access_Definition
6309                   then
6310                      Set_Entity (N, T_Name);
6311                      Set_Etype  (N, T_Name);
6312                      return;
6313
6314                   else
6315                      Error_Msg_N
6316                        ("protected type cannot be used as type mark " &
6317                         "within its own spec or body", N);
6318                   end if;
6319
6320                else
6321                   Error_Msg_N ("type declaration cannot refer to itself", N);
6322                end if;
6323
6324                Set_Etype (N, Any_Type);
6325                Set_Entity (N, Any_Type);
6326                Set_Error_Posted (T_Name);
6327                return;
6328             end if;
6329
6330             Set_Entity (N, T_Name);
6331             Set_Etype  (N, T_Name);
6332          end if;
6333       end if;
6334
6335       if Present (Etype (N)) and then Comes_From_Source (N) then
6336          if Is_Fixed_Point_Type (Etype (N)) then
6337             Check_Restriction (No_Fixed_Point, N);
6338          elsif Is_Floating_Point_Type (Etype (N)) then
6339             Check_Restriction (No_Floating_Point, N);
6340          end if;
6341       end if;
6342    end Find_Type;
6343
6344    ------------------------------------
6345    -- Has_Implicit_Character_Literal --
6346    ------------------------------------
6347
6348    function Has_Implicit_Character_Literal (N : Node_Id) return Boolean is
6349       Id      : Entity_Id;
6350       Found   : Boolean := False;
6351       P       : constant Entity_Id := Entity (Prefix (N));
6352       Priv_Id : Entity_Id := Empty;
6353
6354    begin
6355       if Ekind (P) = E_Package
6356         and then not In_Open_Scopes (P)
6357       then
6358          Priv_Id := First_Private_Entity (P);
6359       end if;
6360
6361       if P = Standard_Standard then
6362          Change_Selected_Component_To_Expanded_Name (N);
6363          Rewrite (N, Selector_Name (N));
6364          Analyze (N);
6365          Set_Etype (Original_Node (N), Standard_Character);
6366          return True;
6367       end if;
6368
6369       Id := First_Entity (P);
6370       while Present (Id)
6371         and then Id /= Priv_Id
6372       loop
6373          if Is_Standard_Character_Type (Id) and then Is_Base_Type (Id) then
6374
6375             --  We replace the node with the literal itself, resolve as a
6376             --  character, and set the type correctly.
6377
6378             if not Found then
6379                Change_Selected_Component_To_Expanded_Name (N);
6380                Rewrite (N, Selector_Name (N));
6381                Analyze (N);
6382                Set_Etype (N, Id);
6383                Set_Etype (Original_Node (N), Id);
6384                Found := True;
6385
6386             else
6387                --  More than one type derived from Character in given scope.
6388                --  Collect all possible interpretations.
6389
6390                Add_One_Interp (N, Id, Id);
6391             end if;
6392          end if;
6393
6394          Next_Entity (Id);
6395       end loop;
6396
6397       return Found;
6398    end Has_Implicit_Character_Literal;
6399
6400    ----------------------
6401    -- Has_Private_With --
6402    ----------------------
6403
6404    function Has_Private_With (E : Entity_Id) return Boolean is
6405       Comp_Unit : constant Node_Id := Cunit (Current_Sem_Unit);
6406       Item      : Node_Id;
6407
6408    begin
6409       Item := First (Context_Items (Comp_Unit));
6410       while Present (Item) loop
6411          if Nkind (Item) = N_With_Clause
6412            and then Private_Present (Item)
6413            and then Entity (Name (Item)) = E
6414          then
6415             return True;
6416          end if;
6417
6418          Next (Item);
6419       end loop;
6420
6421       return False;
6422    end Has_Private_With;
6423
6424    ---------------------------
6425    -- Has_Implicit_Operator --
6426    ---------------------------
6427
6428    function Has_Implicit_Operator (N : Node_Id) return Boolean is
6429       Op_Id   : constant Name_Id   := Chars (Selector_Name (N));
6430       P       : constant Entity_Id := Entity (Prefix (N));
6431       Id      : Entity_Id;
6432       Priv_Id : Entity_Id := Empty;
6433
6434       procedure Add_Implicit_Operator
6435         (T       : Entity_Id;
6436          Op_Type : Entity_Id := Empty);
6437       --  Add implicit interpretation to node N, using the type for which a
6438       --  predefined operator exists. If the operator yields a boolean type,
6439       --  the Operand_Type is implicitly referenced by the operator, and a
6440       --  reference to it must be generated.
6441
6442       ---------------------------
6443       -- Add_Implicit_Operator --
6444       ---------------------------
6445
6446       procedure Add_Implicit_Operator
6447         (T       : Entity_Id;
6448          Op_Type : Entity_Id := Empty)
6449       is
6450          Predef_Op : Entity_Id;
6451
6452       begin
6453          Predef_Op := Current_Entity (Selector_Name (N));
6454
6455          while Present (Predef_Op)
6456            and then Scope (Predef_Op) /= Standard_Standard
6457          loop
6458             Predef_Op := Homonym (Predef_Op);
6459          end loop;
6460
6461          if Nkind (N) = N_Selected_Component then
6462             Change_Selected_Component_To_Expanded_Name (N);
6463          end if;
6464
6465          --  If the context is an unanalyzed function call, determine whether
6466          --  a binary or unary interpretation is required.
6467
6468          if Nkind (Parent (N)) = N_Indexed_Component then
6469             declare
6470                Is_Binary_Call : constant Boolean :=
6471                                   Present
6472                                     (Next (First (Expressions (Parent (N)))));
6473                Is_Binary_Op   : constant Boolean :=
6474                                   First_Entity
6475                                     (Predef_Op) /= Last_Entity (Predef_Op);
6476                Predef_Op2     : constant Entity_Id := Homonym (Predef_Op);
6477
6478             begin
6479                if Is_Binary_Call then
6480                   if Is_Binary_Op then
6481                      Add_One_Interp (N, Predef_Op, T);
6482                   else
6483                      Add_One_Interp (N, Predef_Op2, T);
6484                   end if;
6485
6486                else
6487                   if not Is_Binary_Op then
6488                      Add_One_Interp (N, Predef_Op, T);
6489                   else
6490                      Add_One_Interp (N, Predef_Op2, T);
6491                   end if;
6492                end if;
6493             end;
6494
6495          else
6496             Add_One_Interp (N, Predef_Op, T);
6497
6498             --  For operators with unary and binary interpretations, if
6499             --  context is not a call, add both
6500
6501             if Present (Homonym (Predef_Op)) then
6502                Add_One_Interp (N, Homonym (Predef_Op), T);
6503             end if;
6504          end if;
6505
6506          --  The node is a reference to a predefined operator, and
6507          --  an implicit reference to the type of its operands.
6508
6509          if Present (Op_Type) then
6510             Generate_Operator_Reference (N, Op_Type);
6511          else
6512             Generate_Operator_Reference (N, T);
6513          end if;
6514       end Add_Implicit_Operator;
6515
6516    --  Start of processing for Has_Implicit_Operator
6517
6518    begin
6519       if Ekind (P) = E_Package
6520         and then not In_Open_Scopes (P)
6521       then
6522          Priv_Id := First_Private_Entity (P);
6523       end if;
6524
6525       Id := First_Entity (P);
6526
6527       case Op_Id is
6528
6529          --  Boolean operators: an implicit declaration exists if the scope
6530          --  contains a declaration for a derived Boolean type, or for an
6531          --  array of Boolean type.
6532
6533          when Name_Op_And | Name_Op_Not | Name_Op_Or  | Name_Op_Xor =>
6534             while Id  /= Priv_Id loop
6535                if Valid_Boolean_Arg (Id) and then Is_Base_Type (Id) then
6536                   Add_Implicit_Operator (Id);
6537                   return True;
6538                end if;
6539
6540                Next_Entity (Id);
6541             end loop;
6542
6543          --  Equality: look for any non-limited type (result is Boolean)
6544
6545          when Name_Op_Eq | Name_Op_Ne =>
6546             while Id  /= Priv_Id loop
6547                if Is_Type (Id)
6548                  and then not Is_Limited_Type (Id)
6549                  and then Is_Base_Type (Id)
6550                then
6551                   Add_Implicit_Operator (Standard_Boolean, Id);
6552                   return True;
6553                end if;
6554
6555                Next_Entity (Id);
6556             end loop;
6557
6558          --  Comparison operators: scalar type, or array of scalar
6559
6560          when Name_Op_Lt | Name_Op_Le | Name_Op_Gt | Name_Op_Ge =>
6561             while Id  /= Priv_Id loop
6562                if (Is_Scalar_Type (Id)
6563                     or else (Is_Array_Type (Id)
6564                               and then Is_Scalar_Type (Component_Type (Id))))
6565                  and then Is_Base_Type (Id)
6566                then
6567                   Add_Implicit_Operator (Standard_Boolean, Id);
6568                   return True;
6569                end if;
6570
6571                Next_Entity (Id);
6572             end loop;
6573
6574          --  Arithmetic operators: any numeric type
6575
6576          when Name_Op_Abs      |
6577               Name_Op_Add      |
6578               Name_Op_Mod      |
6579               Name_Op_Rem      |
6580               Name_Op_Subtract |
6581               Name_Op_Multiply |
6582               Name_Op_Divide   |
6583               Name_Op_Expon    =>
6584             while Id  /= Priv_Id loop
6585                if Is_Numeric_Type (Id) and then Is_Base_Type (Id) then
6586                   Add_Implicit_Operator (Id);
6587                   return True;
6588                end if;
6589
6590                Next_Entity (Id);
6591             end loop;
6592
6593          --  Concatenation: any one-dimensional array type
6594
6595          when Name_Op_Concat =>
6596             while Id  /= Priv_Id loop
6597                if Is_Array_Type (Id)
6598                  and then Number_Dimensions (Id) = 1
6599                  and then Is_Base_Type (Id)
6600                then
6601                   Add_Implicit_Operator (Id);
6602                   return True;
6603                end if;
6604
6605                Next_Entity (Id);
6606             end loop;
6607
6608          --  What is the others condition here? Should we be using a
6609          --  subtype of Name_Id that would restrict to operators ???
6610
6611          when others => null;
6612       end case;
6613
6614       --  If we fall through, then we do not have an implicit operator
6615
6616       return False;
6617
6618    end Has_Implicit_Operator;
6619
6620    -----------------------------------
6621    -- Has_Loop_In_Inner_Open_Scopes --
6622    -----------------------------------
6623
6624    function Has_Loop_In_Inner_Open_Scopes (S : Entity_Id) return Boolean is
6625    begin
6626       --  Several scope stacks are maintained by Scope_Stack. The base of the
6627       --  currently active scope stack is denoted by the Is_Active_Stack_Base
6628       --  flag in the scope stack entry. Note that the scope stacks used to
6629       --  simply be delimited implicitly by the presence of Standard_Standard
6630       --  at their base, but there now are cases where this is not sufficient
6631       --  because Standard_Standard actually may appear in the middle of the
6632       --  active set of scopes.
6633
6634       for J in reverse 0 .. Scope_Stack.Last loop
6635
6636          --  S was reached without seing a loop scope first
6637
6638          if Scope_Stack.Table (J).Entity = S then
6639             return False;
6640
6641          --  S was not yet reached, so it contains at least one inner loop
6642
6643          elsif Ekind (Scope_Stack.Table (J).Entity) = E_Loop then
6644             return True;
6645          end if;
6646
6647          --  Check Is_Active_Stack_Base to tell us when to stop, as there are
6648          --  cases where Standard_Standard appears in the middle of the active
6649          --  set of scopes. This affects the declaration and overriding of
6650          --  private inherited operations in instantiations of generic child
6651          --  units.
6652
6653          pragma Assert (not Scope_Stack.Table (J).Is_Active_Stack_Base);
6654       end loop;
6655
6656       raise Program_Error;    --  unreachable
6657    end Has_Loop_In_Inner_Open_Scopes;
6658
6659    --------------------
6660    -- In_Open_Scopes --
6661    --------------------
6662
6663    function In_Open_Scopes (S : Entity_Id) return Boolean is
6664    begin
6665       --  Several scope stacks are maintained by Scope_Stack. The base of the
6666       --  currently active scope stack is denoted by the Is_Active_Stack_Base
6667       --  flag in the scope stack entry. Note that the scope stacks used to
6668       --  simply be delimited implicitly by the presence of Standard_Standard
6669       --  at their base, but there now are cases where this is not sufficient
6670       --  because Standard_Standard actually may appear in the middle of the
6671       --  active set of scopes.
6672
6673       for J in reverse 0 .. Scope_Stack.Last loop
6674          if Scope_Stack.Table (J).Entity = S then
6675             return True;
6676          end if;
6677
6678          --  Check Is_Active_Stack_Base to tell us when to stop, as there are
6679          --  cases where Standard_Standard appears in the middle of the active
6680          --  set of scopes. This affects the declaration and overriding of
6681          --  private inherited operations in instantiations of generic child
6682          --  units.
6683
6684          exit when Scope_Stack.Table (J).Is_Active_Stack_Base;
6685       end loop;
6686
6687       return False;
6688    end In_Open_Scopes;
6689
6690    -----------------------------
6691    -- Inherit_Renamed_Profile --
6692    -----------------------------
6693
6694    procedure Inherit_Renamed_Profile (New_S : Entity_Id; Old_S : Entity_Id) is
6695       New_F : Entity_Id;
6696       Old_F : Entity_Id;
6697       Old_T : Entity_Id;
6698       New_T : Entity_Id;
6699
6700    begin
6701       if Ekind (Old_S) = E_Operator then
6702          New_F := First_Formal (New_S);
6703
6704          while Present (New_F) loop
6705             Set_Etype (New_F, Base_Type (Etype (New_F)));
6706             Next_Formal (New_F);
6707          end loop;
6708
6709          Set_Etype (New_S, Base_Type (Etype (New_S)));
6710
6711       else
6712          New_F := First_Formal (New_S);
6713          Old_F := First_Formal (Old_S);
6714
6715          while Present (New_F) loop
6716             New_T := Etype (New_F);
6717             Old_T := Etype (Old_F);
6718
6719             --  If the new type is a renaming of the old one, as is the
6720             --  case for actuals in instances, retain its name, to simplify
6721             --  later disambiguation.
6722
6723             if Nkind (Parent (New_T)) = N_Subtype_Declaration
6724               and then Is_Entity_Name (Subtype_Indication (Parent (New_T)))
6725               and then Entity (Subtype_Indication (Parent (New_T))) = Old_T
6726             then
6727                null;
6728             else
6729                Set_Etype (New_F, Old_T);
6730             end if;
6731
6732             Next_Formal (New_F);
6733             Next_Formal (Old_F);
6734          end loop;
6735
6736          if Ekind_In (Old_S, E_Function, E_Enumeration_Literal) then
6737             Set_Etype (New_S, Etype (Old_S));
6738          end if;
6739       end if;
6740    end Inherit_Renamed_Profile;
6741
6742    ----------------
6743    -- Initialize --
6744    ----------------
6745
6746    procedure Initialize is
6747    begin
6748       Urefs.Init;
6749    end Initialize;
6750
6751    -------------------------
6752    -- Install_Use_Clauses --
6753    -------------------------
6754
6755    procedure Install_Use_Clauses
6756      (Clause             : Node_Id;
6757       Force_Installation : Boolean := False)
6758    is
6759       U  : Node_Id;
6760       P  : Node_Id;
6761       Id : Entity_Id;
6762
6763    begin
6764       U := Clause;
6765       while Present (U) loop
6766
6767          --  Case of USE package
6768
6769          if Nkind (U) = N_Use_Package_Clause then
6770             P := First (Names (U));
6771             while Present (P) loop
6772                Id := Entity (P);
6773
6774                if Ekind (Id) = E_Package then
6775                   if In_Use (Id) then
6776                      Note_Redundant_Use (P);
6777
6778                   elsif Present (Renamed_Object (Id))
6779                     and then In_Use (Renamed_Object (Id))
6780                   then
6781                      Note_Redundant_Use (P);
6782
6783                   elsif Force_Installation or else Applicable_Use (P) then
6784                      Use_One_Package (Id, U);
6785
6786                   end if;
6787                end if;
6788
6789                Next (P);
6790             end loop;
6791
6792          --  Case of USE TYPE
6793
6794          else
6795             P := First (Subtype_Marks (U));
6796             while Present (P) loop
6797                if not Is_Entity_Name (P)
6798                  or else No (Entity (P))
6799                then
6800                   null;
6801
6802                elsif Entity (P) /= Any_Type then
6803                   Use_One_Type (P);
6804                end if;
6805
6806                Next (P);
6807             end loop;
6808          end if;
6809
6810          Next_Use_Clause (U);
6811       end loop;
6812    end Install_Use_Clauses;
6813
6814    -------------------------------------
6815    -- Is_Appropriate_For_Entry_Prefix --
6816    -------------------------------------
6817
6818    function Is_Appropriate_For_Entry_Prefix (T : Entity_Id) return Boolean is
6819       P_Type : Entity_Id := T;
6820
6821    begin
6822       if Is_Access_Type (P_Type) then
6823          P_Type := Designated_Type (P_Type);
6824       end if;
6825
6826       return Is_Task_Type (P_Type) or else Is_Protected_Type (P_Type);
6827    end Is_Appropriate_For_Entry_Prefix;
6828
6829    -------------------------------
6830    -- Is_Appropriate_For_Record --
6831    -------------------------------
6832
6833    function Is_Appropriate_For_Record (T : Entity_Id) return Boolean is
6834
6835       function Has_Components (T1 : Entity_Id) return Boolean;
6836       --  Determine if given type has components (i.e. is either a record
6837       --  type or a type that has discriminants).
6838
6839       --------------------
6840       -- Has_Components --
6841       --------------------
6842
6843       function Has_Components (T1 : Entity_Id) return Boolean is
6844       begin
6845          return Is_Record_Type (T1)
6846            or else (Is_Private_Type (T1) and then Has_Discriminants (T1))
6847            or else (Is_Task_Type (T1) and then Has_Discriminants (T1))
6848            or else (Is_Incomplete_Type (T1)
6849                      and then From_With_Type (T1)
6850                      and then Present (Non_Limited_View (T1))
6851                      and then Is_Record_Type
6852                                 (Get_Full_View (Non_Limited_View (T1))));
6853       end Has_Components;
6854
6855    --  Start of processing for Is_Appropriate_For_Record
6856
6857    begin
6858       return
6859         Present (T)
6860           and then (Has_Components (T)
6861                      or else (Is_Access_Type (T)
6862                                and then Has_Components (Designated_Type (T))));
6863    end Is_Appropriate_For_Record;
6864
6865    ------------------------
6866    -- Note_Redundant_Use --
6867    ------------------------
6868
6869    procedure Note_Redundant_Use (Clause : Node_Id) is
6870       Pack_Name : constant Entity_Id := Entity (Clause);
6871       Cur_Use   : constant Node_Id   := Current_Use_Clause (Pack_Name);
6872       Decl      : constant Node_Id   := Parent (Clause);
6873
6874       Prev_Use   : Node_Id := Empty;
6875       Redundant  : Node_Id := Empty;
6876       --  The Use_Clause which is actually redundant. In the simplest case it
6877       --  is Pack itself, but when we compile a body we install its context
6878       --  before that of its spec, in which case it is the use_clause in the
6879       --  spec that will appear to be redundant, and we want the warning to be
6880       --  placed on the body. Similar complications appear when the redundancy
6881       --  is between a child unit and one of its ancestors.
6882
6883    begin
6884       Set_Redundant_Use (Clause, True);
6885
6886       if not Comes_From_Source (Clause)
6887         or else In_Instance
6888         or else not Warn_On_Redundant_Constructs
6889       then
6890          return;
6891       end if;
6892
6893       if not Is_Compilation_Unit (Current_Scope) then
6894
6895          --  If the use_clause is in an inner scope, it is made redundant by
6896          --  some clause in the current context, with one exception: If we're
6897          --  compiling a nested package body, and the use_clause comes from the
6898          --  corresponding spec, the clause is not necessarily fully redundant,
6899          --  so we should not warn. If a warning was warranted, it would have
6900          --  been given when the spec was processed.
6901
6902          if Nkind (Parent (Decl)) = N_Package_Specification then
6903             declare
6904                Package_Spec_Entity : constant Entity_Id :=
6905                                        Defining_Unit_Name (Parent (Decl));
6906             begin
6907                if In_Package_Body (Package_Spec_Entity) then
6908                   return;
6909                end if;
6910             end;
6911          end if;
6912
6913          Redundant := Clause;
6914          Prev_Use  := Cur_Use;
6915
6916       elsif Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Body then
6917          declare
6918             Cur_Unit : constant Unit_Number_Type := Get_Source_Unit (Cur_Use);
6919             New_Unit : constant Unit_Number_Type := Get_Source_Unit (Clause);
6920             Scop     : Entity_Id;
6921
6922          begin
6923             if Cur_Unit = New_Unit then
6924
6925                --  Redundant clause in same body
6926
6927                Redundant := Clause;
6928                Prev_Use  := Cur_Use;
6929
6930             elsif Cur_Unit = Current_Sem_Unit then
6931
6932                --  If the new clause is not in the current unit it has been
6933                --  analyzed first, and it makes the other one redundant.
6934                --  However, if the new clause appears in a subunit, Cur_Unit
6935                --  is still the parent, and in that case the redundant one
6936                --  is the one appearing in the subunit.
6937
6938                if Nkind (Unit (Cunit (New_Unit))) = N_Subunit then
6939                   Redundant := Clause;
6940                   Prev_Use  := Cur_Use;
6941
6942                --  Most common case: redundant clause in body,
6943                --  original clause in spec. Current scope is spec entity.
6944
6945                elsif
6946                  Current_Scope =
6947                    Defining_Entity (
6948                      Unit (Library_Unit (Cunit (Current_Sem_Unit))))
6949                then
6950                   Redundant := Cur_Use;
6951                   Prev_Use  := Clause;
6952
6953                else
6954                   --  The new clause may appear in an unrelated unit, when
6955                   --  the parents of a generic are being installed prior to
6956                   --  instantiation. In this case there must be no warning.
6957                   --  We detect this case by checking whether the current top
6958                   --  of the stack is related to the current compilation.
6959
6960                   Scop := Current_Scope;
6961                   while Present (Scop)
6962                     and then Scop /= Standard_Standard
6963                   loop
6964                      if Is_Compilation_Unit (Scop)
6965                        and then not Is_Child_Unit (Scop)
6966                      then
6967                         return;
6968
6969                      elsif Scop = Cunit_Entity (Current_Sem_Unit) then
6970                         exit;
6971                      end if;
6972
6973                      Scop := Scope (Scop);
6974                   end loop;
6975
6976                   Redundant := Cur_Use;
6977                   Prev_Use  := Clause;
6978                end if;
6979
6980             elsif New_Unit = Current_Sem_Unit then
6981                Redundant := Clause;
6982                Prev_Use  := Cur_Use;
6983
6984             else
6985                --  Neither is the current unit, so they appear in parent or
6986                --  sibling units. Warning will be emitted elsewhere.
6987
6988                return;
6989             end if;
6990          end;
6991
6992       elsif Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Declaration
6993         and then Present (Parent_Spec (Unit (Cunit (Current_Sem_Unit))))
6994       then
6995          --  Use_clause is in child unit of current unit, and the child unit
6996          --  appears in the context of the body of the parent, so it has been
6997          --  installed first, even though it is the redundant one. Depending on
6998          --  their placement in the context, the visible or the private parts
6999          --  of the two units, either might appear as redundant, but the
7000          --  message has to be on the current unit.
7001
7002          if Get_Source_Unit (Cur_Use) = Current_Sem_Unit then
7003             Redundant := Cur_Use;
7004             Prev_Use  := Clause;
7005          else
7006             Redundant := Clause;
7007             Prev_Use  := Cur_Use;
7008          end if;
7009
7010          --  If the new use clause appears in the private part of a parent unit
7011          --  it may appear to be redundant w.r.t. a use clause in a child unit,
7012          --  but the previous use clause was needed in the visible part of the
7013          --  child, and no warning should be emitted.
7014
7015          if Nkind (Parent (Decl)) = N_Package_Specification
7016            and then
7017              List_Containing (Decl) = Private_Declarations (Parent (Decl))
7018          then
7019             declare
7020                Par : constant Entity_Id := Defining_Entity (Parent (Decl));
7021                Spec : constant Node_Id  :=
7022                         Specification (Unit (Cunit (Current_Sem_Unit)));
7023
7024             begin
7025                if Is_Compilation_Unit (Par)
7026                  and then Par /= Cunit_Entity (Current_Sem_Unit)
7027                  and then Parent (Cur_Use) = Spec
7028                  and then
7029                    List_Containing (Cur_Use) = Visible_Declarations (Spec)
7030                then
7031                   return;
7032                end if;
7033             end;
7034          end if;
7035
7036       --  Finally, if the current use clause is in the context then
7037       --  the clause is redundant when it is nested within the unit.
7038
7039       elsif Nkind (Parent (Cur_Use)) = N_Compilation_Unit
7040         and then Nkind (Parent (Parent (Clause))) /= N_Compilation_Unit
7041         and then Get_Source_Unit (Cur_Use) = Get_Source_Unit (Clause)
7042       then
7043          Redundant := Clause;
7044          Prev_Use  := Cur_Use;
7045
7046       else
7047          null;
7048       end if;
7049
7050       if Present (Redundant) then
7051          Error_Msg_Sloc := Sloc (Prev_Use);
7052          Error_Msg_NE -- CODEFIX
7053            ("& is already use-visible through previous use clause #?",
7054             Redundant, Pack_Name);
7055       end if;
7056    end Note_Redundant_Use;
7057
7058    ---------------
7059    -- Pop_Scope --
7060    ---------------
7061
7062    procedure Pop_Scope is
7063       SST : Scope_Stack_Entry renames Scope_Stack.Table (Scope_Stack.Last);
7064       S   : constant Entity_Id := SST.Entity;
7065
7066    begin
7067       if Debug_Flag_E then
7068          Write_Info;
7069       end if;
7070
7071       --  Set Default_Storage_Pool field of the library unit if necessary
7072
7073       if Ekind_In (S, E_Package, E_Generic_Package)
7074         and then
7075           Nkind (Parent (Unit_Declaration_Node (S))) = N_Compilation_Unit
7076       then
7077          declare
7078             Aux : constant Node_Id :=
7079                     Aux_Decls_Node (Parent (Unit_Declaration_Node (S)));
7080          begin
7081             if No (Default_Storage_Pool (Aux)) then
7082                Set_Default_Storage_Pool (Aux, Default_Pool);
7083             end if;
7084          end;
7085       end if;
7086
7087       Scope_Suppress           := SST.Save_Scope_Suppress;
7088       Local_Suppress_Stack_Top := SST.Save_Local_Suppress_Stack_Top;
7089       Check_Policy_List        := SST.Save_Check_Policy_List;
7090       Default_Pool             := SST.Save_Default_Storage_Pool;
7091
7092       if Debug_Flag_W then
7093          Write_Str ("<-- exiting scope: ");
7094          Write_Name (Chars (Current_Scope));
7095          Write_Str (", Depth=");
7096          Write_Int (Int (Scope_Stack.Last));
7097          Write_Eol;
7098       end if;
7099
7100       End_Use_Clauses (SST.First_Use_Clause);
7101
7102       --  If the actions to be wrapped are still there they will get lost
7103       --  causing incomplete code to be generated. It is better to abort in
7104       --  this case (and we do the abort even with assertions off since the
7105       --  penalty is incorrect code generation)
7106
7107       if SST.Actions_To_Be_Wrapped_Before /= No_List
7108            or else
7109          SST.Actions_To_Be_Wrapped_After  /= No_List
7110       then
7111          raise Program_Error;
7112       end if;
7113
7114       --  Free last subprogram name if allocated, and pop scope
7115
7116       Free (SST.Last_Subprogram_Name);
7117       Scope_Stack.Decrement_Last;
7118    end Pop_Scope;
7119
7120    ---------------
7121    -- Push_Scope --
7122    ---------------
7123
7124    procedure Push_Scope (S : Entity_Id) is
7125       E : constant Entity_Id := Scope (S);
7126
7127    begin
7128       if Ekind (S) = E_Void then
7129          null;
7130
7131       --  Set scope depth if not a non-concurrent type, and we have not yet set
7132       --  the scope depth. This means that we have the first occurrence of the
7133       --  scope, and this is where the depth is set.
7134
7135       elsif (not Is_Type (S) or else Is_Concurrent_Type (S))
7136         and then not Scope_Depth_Set (S)
7137       then
7138          if S = Standard_Standard then
7139             Set_Scope_Depth_Value (S, Uint_0);
7140
7141          elsif Is_Child_Unit (S) then
7142             Set_Scope_Depth_Value (S, Uint_1);
7143
7144          elsif not Is_Record_Type (Current_Scope) then
7145             if Ekind (S) = E_Loop then
7146                Set_Scope_Depth_Value (S, Scope_Depth (Current_Scope));
7147             else
7148                Set_Scope_Depth_Value (S, Scope_Depth (Current_Scope) + 1);
7149             end if;
7150          end if;
7151       end if;
7152
7153       Scope_Stack.Increment_Last;
7154
7155       declare
7156          SST : Scope_Stack_Entry renames Scope_Stack.Table (Scope_Stack.Last);
7157
7158       begin
7159          SST.Entity                        := S;
7160          SST.Save_Scope_Suppress           := Scope_Suppress;
7161          SST.Save_Local_Suppress_Stack_Top := Local_Suppress_Stack_Top;
7162          SST.Save_Check_Policy_List        := Check_Policy_List;
7163          SST.Save_Default_Storage_Pool     := Default_Pool;
7164
7165          if Scope_Stack.Last > Scope_Stack.First then
7166             SST.Component_Alignment_Default := Scope_Stack.Table
7167                                                  (Scope_Stack.Last - 1).
7168                                                    Component_Alignment_Default;
7169          end if;
7170
7171          SST.Last_Subprogram_Name           := null;
7172          SST.Is_Transient                   := False;
7173          SST.Node_To_Be_Wrapped             := Empty;
7174          SST.Pending_Freeze_Actions         := No_List;
7175          SST.Actions_To_Be_Wrapped_Before   := No_List;
7176          SST.Actions_To_Be_Wrapped_After    := No_List;
7177          SST.First_Use_Clause               := Empty;
7178          SST.Is_Active_Stack_Base           := False;
7179          SST.Previous_Visibility            := False;
7180       end;
7181
7182       if Debug_Flag_W then
7183          Write_Str ("--> new scope: ");
7184          Write_Name (Chars (Current_Scope));
7185          Write_Str (", Id=");
7186          Write_Int (Int (Current_Scope));
7187          Write_Str (", Depth=");
7188          Write_Int (Int (Scope_Stack.Last));
7189          Write_Eol;
7190       end if;
7191
7192       --  Deal with copying flags from the previous scope to this one. This is
7193       --  not necessary if either scope is standard, or if the new scope is a
7194       --  child unit.
7195
7196       if S /= Standard_Standard
7197         and then Scope (S) /= Standard_Standard
7198         and then not Is_Child_Unit (S)
7199       then
7200          if Nkind (E) not in N_Entity then
7201             return;
7202          end if;
7203
7204          --  Copy categorization flags from Scope (S) to S, this is not done
7205          --  when Scope (S) is Standard_Standard since propagation is from
7206          --  library unit entity inwards. Copy other relevant attributes as
7207          --  well (Discard_Names in particular).
7208
7209          --  We only propagate inwards for library level entities,
7210          --  inner level subprograms do not inherit the categorization.
7211
7212          if Is_Library_Level_Entity (S) then
7213             Set_Is_Preelaborated  (S, Is_Preelaborated (E));
7214             Set_Is_Shared_Passive (S, Is_Shared_Passive (E));
7215             Set_Discard_Names     (S, Discard_Names (E));
7216             Set_Suppress_Value_Tracking_On_Call
7217                                   (S, Suppress_Value_Tracking_On_Call (E));
7218             Set_Categorization_From_Scope (E => S, Scop => E);
7219          end if;
7220       end if;
7221
7222       if Is_Child_Unit (S)
7223         and then Present (E)
7224         and then Ekind_In (E, E_Package, E_Generic_Package)
7225         and then
7226           Nkind (Parent (Unit_Declaration_Node (E))) = N_Compilation_Unit
7227       then
7228          declare
7229             Aux : constant Node_Id :=
7230                     Aux_Decls_Node (Parent (Unit_Declaration_Node (E)));
7231          begin
7232             if Present (Default_Storage_Pool (Aux)) then
7233                Default_Pool := Default_Storage_Pool (Aux);
7234             end if;
7235          end;
7236       end if;
7237    end Push_Scope;
7238
7239    ---------------------
7240    -- Premature_Usage --
7241    ---------------------
7242
7243    procedure Premature_Usage (N : Node_Id) is
7244       Kind : constant Node_Kind := Nkind (Parent (Entity (N)));
7245       E    : Entity_Id := Entity (N);
7246
7247    begin
7248       --  Within an instance, the analysis of the actual for a formal object
7249       --  does not see the name of the object itself. This is significant only
7250       --  if the object is an aggregate, where its analysis does not do any
7251       --  name resolution on component associations. (see 4717-008). In such a
7252       --  case, look for the visible homonym on the chain.
7253
7254       if In_Instance
7255         and then Present (Homonym (E))
7256       then
7257          E := Homonym (E);
7258
7259          while Present (E)
7260            and then not In_Open_Scopes (Scope (E))
7261          loop
7262             E := Homonym (E);
7263          end loop;
7264
7265          if Present (E) then
7266             Set_Entity (N, E);
7267             Set_Etype (N, Etype (E));
7268             return;
7269          end if;
7270       end if;
7271
7272       if Kind  = N_Component_Declaration then
7273          Error_Msg_N
7274            ("component&! cannot be used before end of record declaration", N);
7275
7276       elsif Kind  = N_Parameter_Specification then
7277          Error_Msg_N
7278            ("formal parameter&! cannot be used before end of specification",
7279             N);
7280
7281       elsif Kind  = N_Discriminant_Specification then
7282          Error_Msg_N
7283            ("discriminant&! cannot be used before end of discriminant part",
7284             N);
7285
7286       elsif Kind  = N_Procedure_Specification
7287         or else Kind = N_Function_Specification
7288       then
7289          Error_Msg_N
7290            ("subprogram&! cannot be used before end of its declaration",
7291             N);
7292
7293       elsif Kind = N_Full_Type_Declaration then
7294          Error_Msg_N
7295            ("type& cannot be used before end of its declaration!", N);
7296
7297       else
7298          Error_Msg_N
7299            ("object& cannot be used before end of its declaration!", N);
7300       end if;
7301    end Premature_Usage;
7302
7303    ------------------------
7304    -- Present_System_Aux --
7305    ------------------------
7306
7307    function Present_System_Aux (N : Node_Id := Empty) return Boolean is
7308       Loc      : Source_Ptr;
7309       Aux_Name : Unit_Name_Type;
7310       Unum     : Unit_Number_Type;
7311       Withn    : Node_Id;
7312       With_Sys : Node_Id;
7313       The_Unit : Node_Id;
7314
7315       function Find_System (C_Unit : Node_Id) return Entity_Id;
7316       --  Scan context clause of compilation unit to find with_clause
7317       --  for System.
7318
7319       -----------------
7320       -- Find_System --
7321       -----------------
7322
7323       function Find_System (C_Unit : Node_Id) return Entity_Id is
7324          With_Clause : Node_Id;
7325
7326       begin
7327          With_Clause := First (Context_Items (C_Unit));
7328          while Present (With_Clause) loop
7329             if (Nkind (With_Clause) = N_With_Clause
7330               and then Chars (Name (With_Clause)) = Name_System)
7331               and then Comes_From_Source (With_Clause)
7332             then
7333                return With_Clause;
7334             end if;
7335
7336             Next (With_Clause);
7337          end loop;
7338
7339          return Empty;
7340       end Find_System;
7341
7342    --  Start of processing for Present_System_Aux
7343
7344    begin
7345       --  The child unit may have been loaded and analyzed already
7346
7347       if Present (System_Aux_Id) then
7348          return True;
7349
7350       --  If no previous pragma for System.Aux, nothing to load
7351
7352       elsif No (System_Extend_Unit) then
7353          return False;
7354
7355       --  Use the unit name given in the pragma to retrieve the unit.
7356       --  Verify that System itself appears in the context clause of the
7357       --  current compilation. If System is not present, an error will
7358       --  have been reported already.
7359
7360       else
7361          With_Sys := Find_System (Cunit (Current_Sem_Unit));
7362
7363          The_Unit := Unit (Cunit (Current_Sem_Unit));
7364
7365          if No (With_Sys)
7366            and then
7367              (Nkind (The_Unit) = N_Package_Body
7368                 or else (Nkind (The_Unit) = N_Subprogram_Body
7369                            and then
7370                              not Acts_As_Spec (Cunit (Current_Sem_Unit))))
7371          then
7372             With_Sys := Find_System (Library_Unit (Cunit (Current_Sem_Unit)));
7373          end if;
7374
7375          if No (With_Sys)
7376            and then Present (N)
7377          then
7378             --  If we are compiling a subunit, we need to examine its
7379             --  context as well (Current_Sem_Unit is the parent unit);
7380
7381             The_Unit := Parent (N);
7382             while Nkind (The_Unit) /= N_Compilation_Unit loop
7383                The_Unit := Parent (The_Unit);
7384             end loop;
7385
7386             if Nkind (Unit (The_Unit)) = N_Subunit then
7387                With_Sys := Find_System (The_Unit);
7388             end if;
7389          end if;
7390
7391          if No (With_Sys) then
7392             return False;
7393          end if;
7394
7395          Loc := Sloc (With_Sys);
7396          Get_Name_String (Chars (Expression (System_Extend_Unit)));
7397          Name_Buffer (8 .. Name_Len + 7) := Name_Buffer (1 .. Name_Len);
7398          Name_Buffer (1 .. 7) := "system.";
7399          Name_Buffer (Name_Len + 8) := '%';
7400          Name_Buffer (Name_Len + 9) := 's';
7401          Name_Len := Name_Len + 9;
7402          Aux_Name := Name_Find;
7403
7404          Unum :=
7405            Load_Unit
7406              (Load_Name  => Aux_Name,
7407               Required   => False,
7408               Subunit    => False,
7409               Error_Node => With_Sys);
7410
7411          if Unum /= No_Unit then
7412             Semantics (Cunit (Unum));
7413             System_Aux_Id :=
7414               Defining_Entity (Specification (Unit (Cunit (Unum))));
7415
7416             Withn :=
7417               Make_With_Clause (Loc,
7418                 Name =>
7419                   Make_Expanded_Name (Loc,
7420                     Chars  => Chars (System_Aux_Id),
7421                     Prefix => New_Reference_To (Scope (System_Aux_Id), Loc),
7422                     Selector_Name => New_Reference_To (System_Aux_Id, Loc)));
7423
7424             Set_Entity (Name (Withn), System_Aux_Id);
7425
7426             Set_Library_Unit       (Withn, Cunit (Unum));
7427             Set_Corresponding_Spec (Withn, System_Aux_Id);
7428             Set_First_Name         (Withn, True);
7429             Set_Implicit_With      (Withn, True);
7430
7431             Insert_After (With_Sys, Withn);
7432             Mark_Rewrite_Insertion (Withn);
7433             Set_Context_Installed (Withn);
7434
7435             return True;
7436
7437          --  Here if unit load failed
7438
7439          else
7440             Error_Msg_Name_1 := Name_System;
7441             Error_Msg_Name_2 := Chars (Expression (System_Extend_Unit));
7442             Error_Msg_N
7443               ("extension package `%.%` does not exist",
7444                Opt.System_Extend_Unit);
7445             return False;
7446          end if;
7447       end if;
7448    end Present_System_Aux;
7449
7450    -------------------------
7451    -- Restore_Scope_Stack --
7452    -------------------------
7453
7454    procedure Restore_Scope_Stack (Handle_Use : Boolean := True) is
7455       E         : Entity_Id;
7456       S         : Entity_Id;
7457       Comp_Unit : Node_Id;
7458       In_Child  : Boolean := False;
7459       Full_Vis  : Boolean := True;
7460       SS_Last   : constant Int := Scope_Stack.Last;
7461
7462    begin
7463       --  Restore visibility of previous scope stack, if any
7464
7465       for J in reverse 0 .. Scope_Stack.Last loop
7466          exit when  Scope_Stack.Table (J).Entity = Standard_Standard
7467             or else No (Scope_Stack.Table (J).Entity);
7468
7469          S := Scope_Stack.Table (J).Entity;
7470
7471          if not Is_Hidden_Open_Scope (S) then
7472
7473             --  If the parent scope is hidden, its entities are hidden as
7474             --  well, unless the entity is the instantiation currently
7475             --  being analyzed.
7476
7477             if not Is_Hidden_Open_Scope (Scope (S))
7478               or else not Analyzed (Parent (S))
7479               or else Scope (S) = Standard_Standard
7480             then
7481                Set_Is_Immediately_Visible (S, True);
7482             end if;
7483
7484             E := First_Entity (S);
7485             while Present (E) loop
7486                if Is_Child_Unit (E) then
7487                   if not From_With_Type (E) then
7488                      Set_Is_Immediately_Visible (E,
7489                        Is_Visible_Child_Unit (E) or else In_Open_Scopes (E));
7490
7491                   else
7492                      pragma Assert
7493                        (Nkind (Parent (E)) = N_Defining_Program_Unit_Name
7494                           and then
7495                         Nkind (Parent (Parent (E))) = N_Package_Specification);
7496                      Set_Is_Immediately_Visible (E,
7497                        Limited_View_Installed (Parent (Parent (E))));
7498                   end if;
7499                else
7500                   Set_Is_Immediately_Visible (E, True);
7501                end if;
7502
7503                Next_Entity (E);
7504
7505                if not Full_Vis
7506                  and then Is_Package_Or_Generic_Package (S)
7507                then
7508                   --  We are in the visible part of the package scope
7509
7510                   exit when E = First_Private_Entity (S);
7511                end if;
7512             end loop;
7513
7514             --  The visibility of child units (siblings of current compilation)
7515             --  must be restored in any case. Their declarations may appear
7516             --  after the private part of the parent.
7517
7518             if not Full_Vis then
7519                while Present (E) loop
7520                   if Is_Child_Unit (E) then
7521                      Set_Is_Immediately_Visible (E,
7522                        Is_Visible_Child_Unit (E) or else In_Open_Scopes (E));
7523                   end if;
7524
7525                   Next_Entity (E);
7526                end loop;
7527             end if;
7528          end if;
7529
7530          if Is_Child_Unit (S)
7531             and not In_Child     --  check only for current unit
7532          then
7533             In_Child := True;
7534
7535             --  Restore visibility of parents according to whether the child
7536             --  is private and whether we are in its visible part.
7537
7538             Comp_Unit := Parent (Unit_Declaration_Node (S));
7539
7540             if Nkind (Comp_Unit) = N_Compilation_Unit
7541               and then Private_Present (Comp_Unit)
7542             then
7543                Full_Vis := True;
7544
7545             elsif Is_Package_Or_Generic_Package (S)
7546               and then (In_Private_Part (S) or else In_Package_Body (S))
7547             then
7548                Full_Vis := True;
7549
7550             --  if S is the scope of some instance (which has already been
7551             --  seen on the stack) it does not affect the visibility of
7552             --  other scopes.
7553
7554             elsif Is_Hidden_Open_Scope (S) then
7555                null;
7556
7557             elsif (Ekind (S) = E_Procedure
7558                     or else Ekind (S) = E_Function)
7559               and then Has_Completion (S)
7560             then
7561                Full_Vis := True;
7562             else
7563                Full_Vis := False;
7564             end if;
7565          else
7566             Full_Vis := True;
7567          end if;
7568       end loop;
7569
7570       if SS_Last >= Scope_Stack.First
7571         and then Scope_Stack.Table (SS_Last).Entity /= Standard_Standard
7572         and then Handle_Use
7573       then
7574          Install_Use_Clauses (Scope_Stack.Table (SS_Last).First_Use_Clause);
7575       end if;
7576    end Restore_Scope_Stack;
7577
7578    ----------------------
7579    -- Save_Scope_Stack --
7580    ----------------------
7581
7582    procedure Save_Scope_Stack (Handle_Use : Boolean := True) is
7583       E       : Entity_Id;
7584       S       : Entity_Id;
7585       SS_Last : constant Int := Scope_Stack.Last;
7586
7587    begin
7588       if SS_Last >= Scope_Stack.First
7589         and then Scope_Stack.Table (SS_Last).Entity /= Standard_Standard
7590       then
7591          if Handle_Use then
7592             End_Use_Clauses (Scope_Stack.Table (SS_Last).First_Use_Clause);
7593          end if;
7594
7595          --  If the call is from within a compilation unit, as when called from
7596          --  Rtsfind, make current entries in scope stack invisible while we
7597          --  analyze the new unit.
7598
7599          for J in reverse 0 .. SS_Last loop
7600             exit when  Scope_Stack.Table (J).Entity = Standard_Standard
7601                or else No (Scope_Stack.Table (J).Entity);
7602
7603             S := Scope_Stack.Table (J).Entity;
7604             Set_Is_Immediately_Visible (S, False);
7605
7606             E := First_Entity (S);
7607             while Present (E) loop
7608                Set_Is_Immediately_Visible (E, False);
7609                Next_Entity (E);
7610             end loop;
7611          end loop;
7612
7613       end if;
7614    end Save_Scope_Stack;
7615
7616    -------------
7617    -- Set_Use --
7618    -------------
7619
7620    procedure Set_Use (L : List_Id) is
7621       Decl      : Node_Id;
7622       Pack_Name : Node_Id;
7623       Pack      : Entity_Id;
7624       Id        : Entity_Id;
7625
7626    begin
7627       if Present (L) then
7628          Decl := First (L);
7629          while Present (Decl) loop
7630             if Nkind (Decl) = N_Use_Package_Clause then
7631                Chain_Use_Clause (Decl);
7632
7633                Pack_Name := First (Names (Decl));
7634                while Present (Pack_Name) loop
7635                   Pack := Entity (Pack_Name);
7636
7637                   if Ekind (Pack) = E_Package
7638                     and then Applicable_Use (Pack_Name)
7639                   then
7640                      Use_One_Package (Pack, Decl);
7641                   end if;
7642
7643                   Next (Pack_Name);
7644                end loop;
7645
7646             elsif Nkind (Decl) = N_Use_Type_Clause  then
7647                Chain_Use_Clause (Decl);
7648
7649                Id := First (Subtype_Marks (Decl));
7650                while Present (Id) loop
7651                   if Entity (Id) /= Any_Type then
7652                      Use_One_Type (Id);
7653                   end if;
7654
7655                   Next (Id);
7656                end loop;
7657             end if;
7658
7659             Next (Decl);
7660          end loop;
7661       end if;
7662    end Set_Use;
7663
7664    ---------------------
7665    -- Use_One_Package --
7666    ---------------------
7667
7668    procedure Use_One_Package (P : Entity_Id; N : Node_Id) is
7669       Id               : Entity_Id;
7670       Prev             : Entity_Id;
7671       Current_Instance : Entity_Id := Empty;
7672       Real_P           : Entity_Id;
7673       Private_With_OK  : Boolean   := False;
7674
7675    begin
7676       if Ekind (P) /= E_Package then
7677          return;
7678       end if;
7679
7680       Set_In_Use (P);
7681       Set_Current_Use_Clause (P, N);
7682
7683       --  Ada 2005 (AI-50217): Check restriction
7684
7685       if From_With_Type (P) then
7686          Error_Msg_N ("limited withed package cannot appear in use clause", N);
7687       end if;
7688
7689       --  Find enclosing instance, if any
7690
7691       if In_Instance then
7692          Current_Instance := Current_Scope;
7693          while not Is_Generic_Instance (Current_Instance) loop
7694             Current_Instance := Scope (Current_Instance);
7695          end loop;
7696
7697          if No (Hidden_By_Use_Clause (N)) then
7698             Set_Hidden_By_Use_Clause (N, New_Elmt_List);
7699          end if;
7700       end if;
7701
7702       --  If unit is a package renaming, indicate that the renamed
7703       --  package is also in use (the flags on both entities must
7704       --  remain consistent, and a subsequent use of either of them
7705       --  should be recognized as redundant).
7706
7707       if Present (Renamed_Object (P)) then
7708          Set_In_Use (Renamed_Object (P));
7709          Set_Current_Use_Clause (Renamed_Object (P), N);
7710          Real_P := Renamed_Object (P);
7711       else
7712          Real_P := P;
7713       end if;
7714
7715       --  Ada 2005 (AI-262): Check the use_clause of a private withed package
7716       --  found in the private part of a package specification
7717
7718       if In_Private_Part (Current_Scope)
7719         and then Has_Private_With (P)
7720         and then Is_Child_Unit (Current_Scope)
7721         and then Is_Child_Unit (P)
7722         and then Is_Ancestor_Package (Scope (Current_Scope), P)
7723       then
7724          Private_With_OK := True;
7725       end if;
7726
7727       --  Loop through entities in one package making them potentially
7728       --  use-visible.
7729
7730       Id := First_Entity (P);
7731       while Present (Id)
7732         and then (Id /= First_Private_Entity (P)
7733                     or else Private_With_OK) -- Ada 2005 (AI-262)
7734       loop
7735          Prev := Current_Entity (Id);
7736          while Present (Prev) loop
7737             if Is_Immediately_Visible (Prev)
7738               and then (not Is_Overloadable (Prev)
7739                          or else not Is_Overloadable (Id)
7740                          or else (Type_Conformant (Id, Prev)))
7741             then
7742                if No (Current_Instance) then
7743
7744                   --  Potentially use-visible entity remains hidden
7745
7746                   goto Next_Usable_Entity;
7747
7748                --  A use clause within an instance hides outer global entities,
7749                --  which are not used to resolve local entities in the
7750                --  instance. Note that the predefined entities in Standard
7751                --  could not have been hidden in the generic by a use clause,
7752                --  and therefore remain visible. Other compilation units whose
7753                --  entities appear in Standard must be hidden in an instance.
7754
7755                --  To determine whether an entity is external to the instance
7756                --  we compare the scope depth of its scope with that of the
7757                --  current instance. However, a generic actual of a subprogram
7758                --  instance is declared in the wrapper package but will not be
7759                --  hidden by a use-visible entity. similarly, an entity that is
7760                --  declared in an enclosing instance will not be hidden by an
7761                --  an entity declared in a generic actual, which can only have
7762                --  been use-visible in the generic and will not have hidden the
7763                --  entity in the generic parent.
7764
7765                --  If Id is called Standard, the predefined package with the
7766                --  same name is in the homonym chain. It has to be ignored
7767                --  because it has no defined scope (being the only entity in
7768                --  the system with this mandated behavior).
7769
7770                elsif not Is_Hidden (Id)
7771                  and then Present (Scope (Prev))
7772                  and then not Is_Wrapper_Package (Scope (Prev))
7773                  and then Scope_Depth (Scope (Prev)) <
7774                           Scope_Depth (Current_Instance)
7775                  and then (Scope (Prev) /= Standard_Standard
7776                             or else Sloc (Prev) > Standard_Location)
7777                then
7778                   if In_Open_Scopes (Scope (Prev))
7779                     and then Is_Generic_Instance (Scope (Prev))
7780                     and then Present (Associated_Formal_Package (P))
7781                   then
7782                      null;
7783
7784                   else
7785                      Set_Is_Potentially_Use_Visible (Id);
7786                      Set_Is_Immediately_Visible (Prev, False);
7787                      Append_Elmt (Prev, Hidden_By_Use_Clause (N));
7788                   end if;
7789                end if;
7790
7791             --  A user-defined operator is not use-visible if the predefined
7792             --  operator for the type is immediately visible, which is the case
7793             --  if the type of the operand is in an open scope. This does not
7794             --  apply to user-defined operators that have operands of different
7795             --  types, because the predefined mixed mode operations (multiply
7796             --  and divide) apply to universal types and do not hide anything.
7797
7798             elsif Ekind (Prev) = E_Operator
7799               and then Operator_Matches_Spec (Prev, Id)
7800               and then In_Open_Scopes
7801                (Scope (Base_Type (Etype (First_Formal (Id)))))
7802               and then (No (Next_Formal (First_Formal (Id)))
7803                          or else Etype (First_Formal (Id))
7804                            = Etype (Next_Formal (First_Formal (Id)))
7805                          or else Chars (Prev) = Name_Op_Expon)
7806             then
7807                goto Next_Usable_Entity;
7808
7809             --  In an instance, two homonyms may become use_visible through the
7810             --  actuals of distinct formal packages. In the generic, only the
7811             --  current one would have been visible, so make the other one
7812             --  not use_visible.
7813
7814             elsif Present (Current_Instance)
7815               and then Is_Potentially_Use_Visible (Prev)
7816               and then not Is_Overloadable (Prev)
7817               and then Scope (Id) /= Scope (Prev)
7818               and then Used_As_Generic_Actual (Scope (Prev))
7819               and then Used_As_Generic_Actual (Scope (Id))
7820               and then not In_Same_List (Current_Use_Clause (Scope (Prev)),
7821                                          Current_Use_Clause (Scope (Id)))
7822             then
7823                Set_Is_Potentially_Use_Visible (Prev, False);
7824                Append_Elmt (Prev, Hidden_By_Use_Clause (N));
7825             end if;
7826
7827             Prev := Homonym (Prev);
7828          end loop;
7829
7830          --  On exit, we know entity is not hidden, unless it is private
7831
7832          if not Is_Hidden (Id)
7833            and then ((not Is_Child_Unit (Id))
7834                        or else Is_Visible_Child_Unit (Id))
7835          then
7836             Set_Is_Potentially_Use_Visible (Id);
7837
7838             if Is_Private_Type (Id)
7839               and then Present (Full_View (Id))
7840             then
7841                Set_Is_Potentially_Use_Visible (Full_View (Id));
7842             end if;
7843          end if;
7844
7845          <<Next_Usable_Entity>>
7846             Next_Entity (Id);
7847       end loop;
7848
7849       --  Child units are also made use-visible by a use clause, but they may
7850       --  appear after all visible declarations in the parent entity list.
7851
7852       while Present (Id) loop
7853          if Is_Child_Unit (Id)
7854            and then Is_Visible_Child_Unit (Id)
7855          then
7856             Set_Is_Potentially_Use_Visible (Id);
7857          end if;
7858
7859          Next_Entity (Id);
7860       end loop;
7861
7862       if Chars (Real_P) = Name_System
7863         and then Scope (Real_P) = Standard_Standard
7864         and then Present_System_Aux (N)
7865       then
7866          Use_One_Package (System_Aux_Id, N);
7867       end if;
7868
7869    end Use_One_Package;
7870
7871    ------------------
7872    -- Use_One_Type --
7873    ------------------
7874
7875    procedure Use_One_Type (Id : Node_Id; Installed : Boolean := False) is
7876       Elmt          : Elmt_Id;
7877       Is_Known_Used : Boolean;
7878       Op_List       : Elist_Id;
7879       T             : Entity_Id;
7880
7881       function Spec_Reloaded_For_Body return Boolean;
7882       --  Determine whether the compilation unit is a package body and the use
7883       --  type clause is in the spec of the same package. Even though the spec
7884       --  was analyzed first, its context is reloaded when analysing the body.
7885
7886       procedure Use_Class_Wide_Operations (Typ : Entity_Id);
7887       --  AI05-150: if the use_type_clause carries the "all" qualifier,
7888       --  class-wide operations of ancestor types are use-visible if the
7889       --  ancestor type is visible.
7890
7891       ----------------------------
7892       -- Spec_Reloaded_For_Body --
7893       ----------------------------
7894
7895       function Spec_Reloaded_For_Body return Boolean is
7896       begin
7897          if Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Body then
7898             declare
7899                Spec : constant Node_Id :=
7900                         Parent (List_Containing (Parent (Id)));
7901             begin
7902                return
7903                  Nkind (Spec) = N_Package_Specification
7904                    and then Corresponding_Body (Parent (Spec)) =
7905                               Cunit_Entity (Current_Sem_Unit);
7906             end;
7907          end if;
7908
7909          return False;
7910       end Spec_Reloaded_For_Body;
7911
7912       -------------------------------
7913       -- Use_Class_Wide_Operations --
7914       -------------------------------
7915
7916       procedure Use_Class_Wide_Operations (Typ : Entity_Id) is
7917          Scop : Entity_Id;
7918          Ent  : Entity_Id;
7919
7920          function Is_Class_Wide_Operation_Of
7921         (Op  : Entity_Id;
7922          T   : Entity_Id) return Boolean;
7923          --  Determine whether a subprogram has a class-wide parameter or
7924          --  result that is T'Class.
7925
7926          ---------------------------------
7927          --  Is_Class_Wide_Operation_Of --
7928          ---------------------------------
7929
7930          function Is_Class_Wide_Operation_Of
7931            (Op  : Entity_Id;
7932             T   : Entity_Id) return Boolean
7933          is
7934             Formal : Entity_Id;
7935
7936          begin
7937             Formal := First_Formal (Op);
7938             while Present (Formal) loop
7939                if Etype (Formal) = Class_Wide_Type (T) then
7940                   return True;
7941                end if;
7942                Next_Formal (Formal);
7943             end loop;
7944
7945             if Etype (Op) = Class_Wide_Type (T) then
7946                return True;
7947             end if;
7948
7949             return False;
7950          end Is_Class_Wide_Operation_Of;
7951
7952       --  Start of processing for Use_Class_Wide_Operations
7953
7954       begin
7955          Scop := Scope (Typ);
7956          if not Is_Hidden (Scop) then
7957             Ent := First_Entity (Scop);
7958             while Present (Ent) loop
7959                if Is_Overloadable (Ent)
7960                  and then Is_Class_Wide_Operation_Of (Ent, Typ)
7961                  and then not Is_Potentially_Use_Visible (Ent)
7962                then
7963                   Set_Is_Potentially_Use_Visible (Ent);
7964                   Append_Elmt (Ent, Used_Operations (Parent (Id)));
7965                end if;
7966
7967                Next_Entity (Ent);
7968             end loop;
7969          end if;
7970
7971          if Is_Derived_Type (Typ) then
7972             Use_Class_Wide_Operations (Etype (Base_Type (Typ)));
7973          end if;
7974       end Use_Class_Wide_Operations;
7975
7976    --  Start of processing for Use_One_Type;
7977
7978    begin
7979       --  It is the type determined by the subtype mark (8.4(8)) whose
7980       --  operations become potentially use-visible.
7981
7982       T := Base_Type (Entity (Id));
7983
7984       --  Either the type itself is used, the package where it is declared
7985       --  is in use or the entity is declared in the current package, thus
7986       --  use-visible.
7987
7988       Is_Known_Used :=
7989         In_Use (T)
7990           or else In_Use (Scope (T))
7991           or else Scope (T) = Current_Scope;
7992
7993       Set_Redundant_Use (Id,
7994         Is_Known_Used or else Is_Potentially_Use_Visible (T));
7995
7996       if Ekind (T) = E_Incomplete_Type then
7997          Error_Msg_N ("premature usage of incomplete type", Id);
7998
7999       elsif In_Open_Scopes (Scope (T)) then
8000          null;
8001
8002       --  A limited view cannot appear in a use_type clause. However, an access
8003       --  type whose designated type is limited has the flag but is not itself
8004       --  a limited view unless we only have a limited view of its enclosing
8005       --  package.
8006
8007       elsif From_With_Type (T)
8008         and then From_With_Type (Scope (T))
8009       then
8010          Error_Msg_N
8011            ("incomplete type from limited view "
8012              & "cannot appear in use clause", Id);
8013
8014       --  If the subtype mark designates a subtype in a different package,
8015       --  we have to check that the parent type is visible, otherwise the
8016       --  use type clause is a noop. Not clear how to do that???
8017
8018       elsif not Redundant_Use (Id) then
8019          Set_In_Use (T);
8020
8021          --  If T is tagged, primitive operators on class-wide operands
8022          --  are also available.
8023
8024          if Is_Tagged_Type (T) then
8025             Set_In_Use (Class_Wide_Type (T));
8026          end if;
8027
8028          Set_Current_Use_Clause (T, Parent (Id));
8029
8030          --  Iterate over primitive operations of the type. If an operation is
8031          --  already use_visible, it is the result of a previous use_clause,
8032          --  and already appears on the corresponding entity chain. If the
8033          --  clause is being reinstalled, operations are already use-visible.
8034
8035          if Installed then
8036             null;
8037
8038          else
8039             Op_List := Collect_Primitive_Operations (T);
8040             Elmt := First_Elmt (Op_List);
8041             while Present (Elmt) loop
8042                if (Nkind (Node (Elmt)) = N_Defining_Operator_Symbol
8043                     or else Chars (Node (Elmt)) in Any_Operator_Name)
8044                  and then not Is_Hidden (Node (Elmt))
8045                  and then not Is_Potentially_Use_Visible (Node (Elmt))
8046                then
8047                   Set_Is_Potentially_Use_Visible (Node (Elmt));
8048                   Append_Elmt (Node (Elmt), Used_Operations (Parent (Id)));
8049
8050                elsif Ada_Version >= Ada_2012
8051                  and then All_Present (Parent (Id))
8052                  and then not Is_Hidden (Node (Elmt))
8053                  and then not Is_Potentially_Use_Visible (Node (Elmt))
8054                then
8055                   Set_Is_Potentially_Use_Visible (Node (Elmt));
8056                   Append_Elmt (Node (Elmt), Used_Operations (Parent (Id)));
8057                end if;
8058
8059                Next_Elmt (Elmt);
8060             end loop;
8061          end if;
8062
8063          if Ada_Version >= Ada_2012
8064            and then All_Present (Parent (Id))
8065            and then Is_Tagged_Type (T)
8066          then
8067             Use_Class_Wide_Operations (T);
8068          end if;
8069       end if;
8070
8071       --  If warning on redundant constructs, check for unnecessary WITH
8072
8073       if Warn_On_Redundant_Constructs
8074         and then Is_Known_Used
8075
8076          --                     with P;         with P; use P;
8077          --    package P is     package X is    package body X is
8078          --       type T ...       use P.T;
8079
8080          --  The compilation unit is the body of X. GNAT first compiles the
8081          --  spec of X, then proceeds to the body. At that point P is marked
8082          --  as use visible. The analysis then reinstalls the spec along with
8083          --  its context. The use clause P.T is now recognized as redundant,
8084          --  but in the wrong context. Do not emit a warning in such cases.
8085          --  Do not emit a warning either if we are in an instance, there is
8086          --  no redundancy between an outer use_clause and one that appears
8087          --  within the generic.
8088
8089         and then not Spec_Reloaded_For_Body
8090         and then not In_Instance
8091       then
8092          --  The type already has a use clause
8093
8094          if In_Use (T) then
8095
8096             --  Case where we know the current use clause for the type
8097
8098             if Present (Current_Use_Clause (T)) then
8099                Use_Clause_Known : declare
8100                   Clause1 : constant Node_Id := Parent (Id);
8101                   Clause2 : constant Node_Id := Current_Use_Clause (T);
8102                   Ent1    : Entity_Id;
8103                   Ent2    : Entity_Id;
8104                   Err_No  : Node_Id;
8105                   Unit1   : Node_Id;
8106                   Unit2   : Node_Id;
8107
8108                   function Entity_Of_Unit (U : Node_Id) return Entity_Id;
8109                   --  Return the appropriate entity for determining which unit
8110                   --  has a deeper scope: the defining entity for U, unless U
8111                   --  is a package instance, in which case we retrieve the
8112                   --  entity of the instance spec.
8113
8114                   --------------------
8115                   -- Entity_Of_Unit --
8116                   --------------------
8117
8118                   function Entity_Of_Unit (U : Node_Id) return Entity_Id is
8119                   begin
8120                      if Nkind (U) =  N_Package_Instantiation
8121                        and then Analyzed (U)
8122                      then
8123                         return Defining_Entity (Instance_Spec (U));
8124                      else
8125                         return Defining_Entity (U);
8126                      end if;
8127                   end Entity_Of_Unit;
8128
8129                --  Start of processing for Use_Clause_Known
8130
8131                begin
8132                   --  If both current use type clause and the use type clause
8133                   --  for the type are at the compilation unit level, one of
8134                   --  the units must be an ancestor of the other, and the
8135                   --  warning belongs on the descendant.
8136
8137                   if Nkind (Parent (Clause1)) = N_Compilation_Unit
8138                        and then
8139                      Nkind (Parent (Clause2)) = N_Compilation_Unit
8140                   then
8141
8142                      --  If the unit is a subprogram body that acts as spec,
8143                      --  the context clause is shared with the constructed
8144                      --  subprogram spec. Clearly there is no redundancy.
8145
8146                      if Clause1 = Clause2 then
8147                         return;
8148                      end if;
8149
8150                      Unit1 := Unit (Parent (Clause1));
8151                      Unit2 := Unit (Parent (Clause2));
8152
8153                      --  If both clauses are on same unit, or one is the body
8154                      --  of the other, or one of them is in a subunit, report
8155                      --  redundancy on the later one.
8156
8157                      if Unit1 = Unit2 then
8158                         Error_Msg_Sloc := Sloc (Current_Use_Clause (T));
8159                         Error_Msg_NE -- CODEFIX
8160                           ("& is already use-visible through previous "
8161                            & "use_type_clause #?", Clause1, T);
8162                         return;
8163
8164                      elsif Nkind (Unit1) = N_Subunit then
8165                         Error_Msg_Sloc := Sloc (Current_Use_Clause (T));
8166                         Error_Msg_NE -- CODEFIX
8167                           ("& is already use-visible through previous "
8168                            & "use_type_clause #?", Clause1, T);
8169                         return;
8170
8171                      elsif Nkind_In (Unit2, N_Package_Body, N_Subprogram_Body)
8172                        and then Nkind (Unit1) /= Nkind (Unit2)
8173                        and then Nkind (Unit1) /= N_Subunit
8174                      then
8175                         Error_Msg_Sloc := Sloc (Clause1);
8176                         Error_Msg_NE -- CODEFIX
8177                           ("& is already use-visible through previous "
8178                            & "use_type_clause #?", Current_Use_Clause (T), T);
8179                         return;
8180                      end if;
8181
8182                      --  There is a redundant use type clause in a child unit.
8183                      --  Determine which of the units is more deeply nested.
8184                      --  If a unit is a package instance, retrieve the entity
8185                      --  and its scope from the instance spec.
8186
8187                      Ent1 := Entity_Of_Unit (Unit1);
8188                      Ent2 := Entity_Of_Unit (Unit2);
8189
8190                      if Scope (Ent2) = Standard_Standard  then
8191                         Error_Msg_Sloc := Sloc (Current_Use_Clause (T));
8192                         Err_No := Clause1;
8193
8194                      elsif Scope (Ent1) = Standard_Standard then
8195                         Error_Msg_Sloc := Sloc (Id);
8196                         Err_No := Clause2;
8197
8198                      --  If both units are child units, we determine which one
8199                      --  is the descendant by the scope distance to the
8200                      --  ultimate parent unit.
8201
8202                      else
8203                         declare
8204                            S1, S2 : Entity_Id;
8205
8206                         begin
8207                            S1 := Scope (Ent1);
8208                            S2 := Scope (Ent2);
8209                            while Present (S1)
8210                              and then Present (S2)
8211                              and then S1 /= Standard_Standard
8212                              and then S2 /= Standard_Standard
8213                            loop
8214                               S1 := Scope (S1);
8215                               S2 := Scope (S2);
8216                            end loop;
8217
8218                            if S1 = Standard_Standard then
8219                               Error_Msg_Sloc := Sloc (Id);
8220                               Err_No := Clause2;
8221                            else
8222                               Error_Msg_Sloc := Sloc (Current_Use_Clause (T));
8223                               Err_No := Clause1;
8224                            end if;
8225                         end;
8226                      end if;
8227
8228                      Error_Msg_NE -- CODEFIX
8229                        ("& is already use-visible through previous "
8230                         & "use_type_clause #?", Err_No, Id);
8231
8232                   --  Case where current use type clause and the use type
8233                   --  clause for the type are not both at the compilation unit
8234                   --  level. In this case we don't have location information.
8235
8236                   else
8237                      Error_Msg_NE -- CODEFIX
8238                        ("& is already use-visible through previous "
8239                         & "use type clause?", Id, T);
8240                   end if;
8241                end Use_Clause_Known;
8242
8243             --  Here if Current_Use_Clause is not set for T, another case
8244             --  where we do not have the location information available.
8245
8246             else
8247                Error_Msg_NE -- CODEFIX
8248                  ("& is already use-visible through previous "
8249                   & "use type clause?", Id, T);
8250             end if;
8251
8252          --  The package where T is declared is already used
8253
8254          elsif In_Use (Scope (T)) then
8255             Error_Msg_Sloc := Sloc (Current_Use_Clause (Scope (T)));
8256             Error_Msg_NE -- CODEFIX
8257               ("& is already use-visible through package use clause #?",
8258                Id, T);
8259
8260          --  The current scope is the package where T is declared
8261
8262          else
8263             Error_Msg_Node_2 := Scope (T);
8264             Error_Msg_NE -- CODEFIX
8265               ("& is already use-visible inside package &?", Id, T);
8266          end if;
8267       end if;
8268    end Use_One_Type;
8269
8270    ----------------
8271    -- Write_Info --
8272    ----------------
8273
8274    procedure Write_Info is
8275       Id : Entity_Id := First_Entity (Current_Scope);
8276
8277    begin
8278       --  No point in dumping standard entities
8279
8280       if Current_Scope = Standard_Standard then
8281          return;
8282       end if;
8283
8284       Write_Str ("========================================================");
8285       Write_Eol;
8286       Write_Str ("        Defined Entities in ");
8287       Write_Name (Chars (Current_Scope));
8288       Write_Eol;
8289       Write_Str ("========================================================");
8290       Write_Eol;
8291
8292       if No (Id) then
8293          Write_Str ("-- none --");
8294          Write_Eol;
8295
8296       else
8297          while Present (Id) loop
8298             Write_Entity_Info (Id, " ");
8299             Next_Entity (Id);
8300          end loop;
8301       end if;
8302
8303       if Scope (Current_Scope) = Standard_Standard then
8304
8305          --  Print information on the current unit itself
8306
8307          Write_Entity_Info (Current_Scope, " ");
8308       end if;
8309
8310       Write_Eol;
8311    end Write_Info;
8312
8313    --------
8314    -- ws --
8315    --------
8316
8317    procedure ws is
8318       S : Entity_Id;
8319    begin
8320       for J in reverse 1 .. Scope_Stack.Last loop
8321          S :=  Scope_Stack.Table (J).Entity;
8322          Write_Int (Int (S));
8323          Write_Str (" === ");
8324          Write_Name (Chars (S));
8325          Write_Eol;
8326       end loop;
8327    end ws;
8328
8329 end Sem_Ch8;