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