home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / sem_ch8.adb < prev    next >
Text File  |  1996-09-28  |  96KB  |  2,823 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              S E M . C H 8                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.276 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Treepr;   use Treepr;
  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 Expander; use Expander;
  32. with Features; use Features;
  33. with Freeze;   use Freeze;
  34. with Namet;    use Namet;
  35. with Nlists;   use Nlists;
  36. with Nmake;    use Nmake;
  37. with Opt;      use Opt;
  38. with Output;   use Output;
  39. with Rtsfind;  use Rtsfind;
  40. with Sem;      use Sem;
  41. with Sem_Attr; use Sem_Attr;
  42. with Sem_Ch2;  use Sem_Ch2;
  43. with Sem_Ch3;  use Sem_Ch3;
  44. with Sem_Ch4;  use Sem_Ch4;
  45. with Sem_Ch5;  use Sem_Ch5;
  46. with Sem_Ch6;  use Sem_Ch6;
  47. with Sem_Ch8;  use Sem_Ch8;
  48. with Sem_Dist; use Sem_Dist;
  49. with Sem_Res;  use Sem_Res;
  50. with Sem_Util; use Sem_Util;
  51. with Sem_Type; use Sem_Type;
  52. with Stand;    use Stand;
  53. with Sinfo;    use Sinfo;
  54. with Sinfo.CN; use Sinfo.CN;
  55. with Snames;   use Snames;
  56. with Table;
  57. with Tbuild;   use Tbuild;
  58. with Uintp;    use Uintp;
  59.  
  60. package body Sem_Ch8 is
  61.  
  62.    ------------------------------------
  63.    -- Visibility and Name Resolution --
  64.    ------------------------------------
  65.  
  66.    --  This package handles name resolution and the collection of
  67.    --  interpretations for overloaded names, prior to overload resolution.
  68.  
  69.    --  Name resolution is the process that establishes a mapping between source
  70.    --  identifiers and the entities they denote at each point in the program.
  71.    --  Each entity is represented by a defining occurrence. Each identifier
  72.    --  that denotes an entity points to the corresponding defining occurrence.
  73.    --  This is the entity of the applied occurrence. Each occurrence holds
  74.    --  an index into the names table, where source identifiers are stored.
  75.  
  76.    --  Each entry in the names table for an identifier or designator uses the
  77.    --  Info pointer to hold a link to the currently visible entity that has
  78.    --  this name (see subprograms Get_Name_Entity_Id and Set_Name_Entity_Id
  79.    --  in package Sem_Util). The visibility is initialized at the beginning of
  80.    --  semantic processing to make entities in package Standard immediately
  81.    --  visible. The visibility table is used in a more subtle way when
  82.    --  compiling subunits (see below).
  83.  
  84.    --  Entities that have the same name (i.e. homonyms) are chained. In the
  85.    --  case of overloaded entities, this chain holds all the possible meanings
  86.    --  of a given identifier. The process of overload resolution uses type
  87.    --  information to select from this chain the unique meaning of a given
  88.    --  identifier.
  89.  
  90.    --  Entities are also chained in their scope, through the Next_Entity link.
  91.    --  As a consequence, the name space is organized as a sparse matrix, where
  92.    --  each row corresponds to a scope, and each column to a source identifier.
  93.    --  Open scopes, that is to say scopes currently being compiled, have their
  94.    --  corresponding rows of entities in order, innermost scope first.
  95.  
  96.    --  The scopes of packages that are mentioned in  context clauses appear in
  97.    --  no particular order, interspersed among open scopes. This is because
  98.    --  in the course of analyzing the context of a compilation, a package
  99.    --  declaration is first an open scope, and subsequently an element of the
  100.    --  context. If subunits or child units are present, a parent unit may
  101.    --  appear under various guises at various times in the compilation.
  102.  
  103.    --  When the compilation of the innermost scope is complete, the entities
  104.    --  defined therein are no longer visible. If the scope is not a package
  105.    --  declaration, these entities are never visible subsequently, and can be
  106.    --  removed from visibility chains. If the scope is a package declaration,
  107.    --  its visible declarations may still be accessible. Therefore the entities
  108.    --  defined in such a scope are left on the visibility chains, and only
  109.    --  their visibility (immediately visibility or potential use-visibility)
  110.    --  is affected.
  111.  
  112.    --  The ordering of homonyms on their chain does not necessarily follow
  113.    --  the order of their corresponding scopes on the scope stack. For
  114.    --  example, if package P and the enclosing scope both contain entities
  115.    --  named E, then when compiling the package body the chain for E will
  116.    --  hold the global entity first,  and the local one (corresponding to
  117.    --  the current inner scope) next. As a result, name resolution routines
  118.    --  do not assume any relative ordering of the homonym chains, either
  119.    --  for scope nesting or to order of appearance of context clauses.
  120.  
  121.    --  When compiling a child unit, entities in the parent scope are always
  122.    --  immediately visible. When compiling the body of a child unit, private
  123.    --  entities in the parent must also be made immediately visible. There
  124.    --  are separate routines to make the visible and private declarations
  125.    --  visible at various times (see package Sem_Ch7).
  126.  
  127.    --              +--------+         +-----+
  128.    --              | In use |-------->| EU1 |-------------------------->
  129.    --              +--------+         +-----+
  130.    --                                    |                      |
  131.    --      +--------+                 +-----+                +-----+
  132.    --      | Stand. |---------------->| ES1 |--------------->| ES2 |--->
  133.    --      +--------+                 +-----+                +-----+
  134.    --                                    |                      |
  135.    --              +---------+           |                   +-----+
  136.    --              | with'ed |------------------------------>| EW2 |--->
  137.    --              +---------+           |                   +-----+
  138.    --                                    |                      |
  139.    --      +--------+                 +-----+                +-----+
  140.    --      | Scope2 |---------------->| E12 |--------------->| E22 |--->
  141.    --      +--------+                 +-----+                +-----+
  142.    --                                    |                      |
  143.    --      +--------+                 +-----+                +-----+
  144.    --      | Scope1 |---------------->| E11 |--------------->| E12 |--->
  145.    --      +--------+                 +-----+                +-----+
  146.    --          ^                         |                      |
  147.    --          |                         |                      |
  148.    --          |   +---------+           |                      |
  149.    --          |   | with'ed |----------------------------------------->
  150.    --          |   +---------+           |                      |
  151.    --          |                         |                      |
  152.    --      Scope stack                   |                      |
  153.    --      (innermost first)             |                      |
  154.    --                                 +----------------------------+
  155.    --      Names  table =>            | Id1 |     |    |     | Id2 |
  156.    --                                 +----------------------------+
  157.  
  158.    --  Name resolution must deal with several syntactic forms: simple names,
  159.    --  qualified names, indexed names, and various forms of calls.
  160.  
  161.    --  Each identifier points to an entry in the names table. The resolution
  162.    --  of a simple name consists in traversing the homonym chain, starting
  163.    --  from the names table. If an entry is immediately visible, it is the one
  164.    --  designated by the identifier. If only potemtially use-visible entities
  165.    --  are on the chain, we must verify that they do not hide each other. If
  166.    --  the entity we find is overloadable, we collect all other overloadable
  167.    --  entities on the chain as long as they are not hidden.
  168.    --
  169.    --  To resolve expanded names, we must find the entity at the intersection
  170.    --  of the entity chain for the scope (the prefix) and the homonym chain
  171.    --  for the selector. In general, homonym chains will be much shorter than
  172.    --  entity chains, so it is preferable to start from the names table as
  173.    --  well. If the entity found is overloadable, we must collect all other
  174.    --  interpretations that are defined in the scope denoted by the prefix.
  175.  
  176.    --  For records, protected types, and tasks, their local entities are
  177.    --  removed from visibility chains on exit from the corresponding scope.
  178.    --  From the outside, these entities are always accessed by selected
  179.    --  notation, and the entity chain for the record type, protected type,
  180.    --  etc. is traversed sequentially in  order to find the designated entity.
  181.  
  182.    --  The discriminants of a type and the operations of a protected type or
  183.    --  task are unchained on  exit from the first view of the type, (such as
  184.    --  a private or incomplete type declaration, or a protected type speci-
  185.    --  fication) and rechained when compiling the second view.
  186.  
  187.    --  In the case of operators,  we do not make operators on derived types
  188.    --  explicit. As a result, the notation P."+" may denote either a user-
  189.    --  defined function with name "+", or else an implicit declaration of the
  190.    --  operator "+" in package P. The resolution of expanded names always
  191.    --  tries to resolve an operator name as such an implicitly defined entity,
  192.    --  in addition to looking for explicit declarations.
  193.  
  194.    --  All forms of names that denote entities (simple names, expanded names,
  195.    --  character literals in some cases) have a Entity attribute, which
  196.    --  identifies the entity denoted by the name.
  197.  
  198.    ---------------------
  199.    -- The Scope Stack --
  200.    ---------------------
  201.  
  202.    --  The Scope stack keeps track of the scopes currently been compiled.
  203.    --  Every entity that contains declarations (including records) is placed
  204.    --  on the scope stack while it is being processed, and removed at the end.
  205.    --  Whenever a non-package scope is exited, the entities defined therein
  206.    --  are removed from the visibility table, so that entities in outer scopes
  207.    --  become visible (see previous description). On entry to Sem, the scope
  208.    --  stack only contains the package Standard. As usual, subunits complicate
  209.    --  this picture ever so slightly.
  210.  
  211.    --  The Rtsfind mechanism can force a call to Semantics while another
  212.    --  compilation is in progress. The unit retrieved by Rtsfind must be
  213.    --  compiled in  its own context, and has no access to the visibility of
  214.    --  the unit currently being compiled. The procedures Save_Scope_Stack and
  215.    --  Restore_Scope_Stack make entities in current open scopes invisible
  216.    --  before compiling the retrieved unit, and restore the compilation
  217.    --  environment afterwards.
  218.  
  219.    ------------------------
  220.    -- Compiling subunits --
  221.    ------------------------
  222.  
  223.    --  Subunits must be compiled in the environment of the corresponding
  224.    --  stub, that is to say with the same visibility into the parent (and its
  225.    --  context) that is available at the point of the stub declaration, but
  226.    --  with the additional visibility provided by the context clause of the
  227.    --  subunit itself. As a result, compilation of a subunit forces compilation
  228.    --  of the parent (see description in lib-). At the point of the stub
  229.    --  declaration, Analyze is called recursively to compile the proper body
  230.    --  of the subunit, but without reinitializing the names table, nor the
  231.    --  scope stack (i.e. standard is not pushed on the stack). In this fashion
  232.    --  the context of the subunit is added to the context of the parent, and
  233.    --  the subunit is compiled in the correct environment. Note that in the
  234.    --  course of processing the context of a subunit, Standard will appear
  235.    --  twice on the scope stack: once for the parent of the subunit, and
  236.    --  once for the unit in the context clause being compiled. However, the
  237.    --  two sets of entities are not linked by homonym chains, so that the
  238.    --  compilation of any context unit happens in a fresh visibility
  239.    --  environment.
  240.  
  241.    -------------------------------
  242.    -- Processing of USE Clauses --
  243.    -------------------------------
  244.  
  245.    --  Every defining occurrence has a flag indicating if it is potentially use
  246.    --  visible. Resolution of simple names examines this flag. The processing
  247.    --  of use clauses consists in setting this flag on all visible entities
  248.    --  defined in the corresponding package. On exit from the scope of the use
  249.    --  clause, the corresponding flag must be reset. However, a package may
  250.    --  appear in several nested use clauses (pathological but legal, alas!)
  251.    --  which forces us to use a slightly more involved scheme:
  252.  
  253.    --    a) The defining occurrence for a package holds a flag -In_Use- to
  254.    --    indicate that it is currently in the scope of a use clause. If a
  255.    --    redundant use clause is encountered, then the corresponding occurence
  256.    --    of the package name is flagged -Redundant_Use-.
  257.  
  258.    --    b) On exit from a scope, the use clauses in its declarative part are
  259.    --    scanned. The visibility flag is reset in all entities declared in
  260.    --    package named in a use clause, as long as the package is not flagged
  261.    --    as being in a redundant use clause (in which case the outer use
  262.    --    clause is still in effect, and the direct visibility of its entities
  263.    --    must be retained).
  264.  
  265.    --  Note that entities are not removed from their homonym chains on exit
  266.    --  from the package specification. A subsequent use clause does not need
  267.    --  to rechain the visible entities, but only to establish their direct
  268.    --  visibility.
  269.  
  270.    -----------------------------------
  271.    -- Handling private declarations --
  272.    -----------------------------------
  273.  
  274.    --  The principle that each entity has a single defining occurrence clashes
  275.    --  with the presence of two separate definitions for private types: the
  276.    --  first is the private type declaration, and second is the full type
  277.    --  declaration. It is important that all references to the type point to
  278.    --  the same defining occurence, namely the first one. To enforce the two
  279.    --  separate views of the entity, the corresponding information is swapped
  280.    --  between the two declarations. Outside of the package, the defining
  281.    --  occurence only contains the private declaration information, while in
  282.    --  the private part and the body of the package the defining occurrence
  283.    --  contains the full declaration. To simplify the swap, the defining
  284.    --  occurrence that currently holds the private declaration points to the
  285.    --  full declaration. During semantic processing the defining occurence
  286.    --  also points to a list of private dependents, that is to say access
  287.    --  types or composite types whose designated types or component types are
  288.    --  subtypes or derived types of the private type in question. After the
  289.    --  full declaration has been seen, the private dependents are updated to
  290.    --  indicate that they have full definitions.
  291.  
  292.    ------------------------------------
  293.    -- Handling of Undefined Messages --
  294.    ------------------------------------
  295.  
  296.    --  In normal mode, only the first use of an undefined identifier generates
  297.    --  a message. The table Urefs is used to record error messages that have
  298.    --  been issued so that second and subsequent ones do not generate further
  299.    --  messages. However, the second reference causes text to be added to the
  300.    --  original undefined message noting "(more references follow)". The
  301.    --  full error list option (-gnatf) forces messages to be generated for
  302.    --  every reference and disconnects the use of this table.
  303.  
  304.    type Uref_Entry is record
  305.       Node : Node_Id;
  306.       --  Node for identifier for which original message was posted. The
  307.       --  Chars field of this identifier is used to detect later references
  308.       --  to the same identifier.
  309.  
  310.       Err : Error_Msg_Id;
  311.       --  Records error message Id of original undefined message. Reset to
  312.       --  No_Error_Msg after the second occurrence, where it is used to add
  313.       --  text to the original message as described above.
  314.  
  315.       ND_Vis : Boolean;
  316.       --  Set if the message is not directly visible rather than undefined
  317.  
  318.    end record;
  319.  
  320.    package Urefs is new Table (
  321.      Table_Component_Type => Uref_Entry,
  322.      Table_Index_Type     => Nat,
  323.      Table_Low_Bound      => 1,
  324.      Table_Initial        => 10,
  325.      Table_Increment      => 100,
  326.      Table_Name           => "Urefs");
  327.  
  328.    -----------------------
  329.    -- Local Subprograms --
  330.    -----------------------
  331.  
  332.    procedure Analyze_Generic_Renaming
  333.      (N : Node_Id;
  334.       K : Entity_Kind);
  335.    --  Common processing for all three kinds of generic renaming declarations.
  336.    --  Enter new name and indicate that it renames the generic unit.
  337.  
  338.    procedure Analyze_Renamed_Dereference (N : Node_Id; New_S : Entity_Id);
  339.    --  Renamed entity is given by an explicit dereference. Prefix must be a
  340.    --  conformant access_to_subprogram type.
  341.  
  342.    procedure Analyze_Renamed_Entry (N : Node_Id; New_S : Entity_Id);
  343.    --  If the renamed entity in a subprogram renaming is an entry or protected
  344.    --  subprogram, build a body for the new entity whose only statement is a
  345.    --  call to the renamed entity.
  346.  
  347.    procedure Analyze_Renamed_Family_Member (N : Node_Id; New_S : Entity_Id);
  348.    --  Used when the renamed entity is an indexed component. The prefix must
  349.    --  denote an entry family.
  350.  
  351.    procedure Attribute_Renaming (N : Node_Id);
  352.    --  Analyze renaming of attribute as function. The renaming declaration
  353.    --  is rewritten as a function body that returns the attribute reference
  354.    --  applied to the formals of the function.
  355.  
  356.    procedure Build_Renamed_Body
  357.      (N     : Node_Id;
  358.       Old_S : Entity_Id;
  359.       New_S : Entity_Id);
  360.    --  Rewrite renaming declaration as a subprogram body, whose single
  361.    --  statement is a call to Old_S. Old_S may be a function,  a procedure,
  362.    --  or an entry of a concurrent object.
  363.  
  364.    procedure Chain_Use_Clause (N : Node_Id);
  365.    --  Chain use clause onto list of uses clauses headed by First_Use_Clause
  366.    --  in the top scope table entry.
  367.  
  368.    procedure End_Use_Clauses;
  369.    --  Invoked on scope exit, to undo the effect of local use clauses.
  370.  
  371.    function Find_Renamed_Entity
  372.      (N     : Node_Id;
  373.       Nam   : Node_Id;
  374.       New_S : Entity_Id) return Entity_Id;
  375.    --  Find the renamed entity that corresponds to the given parameter profile
  376.    --  in a subprogram renaming declaration. The renamed entity may be an
  377.    --  operator,  a subprogram,  an entry,  or a protected operation.
  378.  
  379.    procedure Inherit_Renamed_Profile (New_S : Entity_Id; Old_S : Entity_Id);
  380.    --  A subprogram defined by a renaming declaration inherits the parameter
  381.    --  profile of the renamed entity. The subtypes given in the subprogram
  382.    --  specification are discarded and replaced with those of the renamed
  383.    --  subprogram, which are then used to recheck the default values.
  384.  
  385.    procedure Use_One_Package (P : Entity_Id);
  386.    --  Make visible entities declarated in  package P potentially use-visible
  387.    --  in the current context.
  388.  
  389.    procedure Write_Info;
  390.    --  Write debugging information on entities declared in current scope
  391.  
  392.    --------------------------------
  393.    -- Analyze_Exception_Renaming --
  394.    --------------------------------
  395.  
  396.    --  The language only allows a single identifier, but the tree holds
  397.    --  an identifier list. The parser has already issued an error message
  398.    --  if there is more than one element in the list.
  399.  
  400.    procedure Analyze_Exception_Renaming (N : Node_Id) is
  401.       Id  : constant Node_Id   := Defining_Identifier (N);
  402.       Nam : constant Node_Id   := Name (N);
  403.  
  404.    begin
  405.       Enter_Name (Id);
  406.       Set_Ekind (Id,  E_Exception);
  407.       Set_Etype (Id, Standard_Exception_Type);
  408.       Analyze (Nam);
  409.  
  410.       --  Entities declared in Pure unit should be set Is_Pure
  411.       --  Since 'Partition_Id cannot be applied to such an entity
  412.  
  413.       Set_Is_Pure (Id, Is_Pure (Current_Scope));
  414.  
  415.       if Ekind (Entity (Nam)) /= E_Exception then
  416.          Error_Msg_N ("invalid exception name in renaming", Nam);
  417.       else
  418.          if Present (Renamed_Object (Entity (Nam))) then
  419.             Set_Renamed_Object (Id, Renamed_Object (Entity (Nam)));
  420.          else
  421.             Set_Renamed_Object (Id, Entity (Nam));
  422.          end if;
  423.       end if;
  424.    end Analyze_Exception_Renaming;
  425.  
  426.    ----------------------------------------
  427.    --  Analyze_Generic_Function_Renaming --
  428.    ----------------------------------------
  429.  
  430.    procedure Analyze_Generic_Function_Renaming  (N : Node_Id) is
  431.    begin
  432.       Analyze_Generic_Renaming (N, E_Generic_Function);
  433.    end Analyze_Generic_Function_Renaming;
  434.  
  435.    ---------------------------------------
  436.    --  Analyze_Generic_Package_Renaming --
  437.    ---------------------------------------
  438.  
  439.    procedure Analyze_Generic_Package_Renaming   (N : Node_Id) is
  440.    begin
  441.       --  Apply the Text_IO Kludge here, since we may be renaming
  442.       --  one of the subpackages of Text_IO, then join common routine.
  443.  
  444.       Text_IO_Kludge (Name (N));
  445.       Analyze_Generic_Renaming (N, E_Generic_Package);
  446.    end Analyze_Generic_Package_Renaming;
  447.  
  448.    -----------------------------------------
  449.    --  Analyze_Generic_Procedure_Renaming --
  450.    -----------------------------------------
  451.  
  452.    procedure Analyze_Generic_Procedure_Renaming (N : Node_Id) is
  453.    begin
  454.       Analyze_Generic_Renaming (N, E_Generic_Procedure);
  455.    end Analyze_Generic_Procedure_Renaming;
  456.  
  457.    -------------------------------
  458.    --  Analyze_Generic_Renaming --
  459.    -------------------------------
  460.  
  461.    procedure Analyze_Generic_Renaming
  462.      (N : Node_Id;
  463.       K : Entity_Kind)
  464.    is
  465.       New_P : Entity_Id          := Defining_Unit_Simple_Name (N);
  466.       Old_P : Entity_Id;
  467.    begin
  468.  
  469.       Validate_RCI_Nested_Generic_Declaration (N);
  470.  
  471.       --  Entities declared in Pure unit should be set Is_Pure
  472.       --  Since 'Partition_Id cannot be applied to such an entity
  473.  
  474.       if Current_Scope /= Standard_Standard then
  475.          Set_Is_Pure (New_P, Is_Pure (Current_Scope));
  476.       end if;
  477.  
  478.       Analyze (Name (N));
  479.       Old_P := Entity (Name (N));
  480.       Enter_Name (New_P);
  481.       Set_Ekind (New_P, K);
  482.  
  483.       if Etype (Old_P) = Any_Type then
  484.          null;
  485.  
  486.       elsif Ekind (Old_P) /= K then
  487.          Error_Msg_N ("invalid generic unit name", Name (N));
  488.  
  489.       else
  490.          if Present (Renamed_Object (Old_P)) then
  491.             Set_Renamed_Object (New_P,  Renamed_Object (Old_P));
  492.          else
  493.             Set_Renamed_Object (New_P,  Old_P);
  494.          end if;
  495.  
  496.          Set_Has_Completion (New_P);
  497.       end if;
  498.  
  499.    end Analyze_Generic_Renaming;
  500.  
  501.    -----------------------------
  502.    -- Analyze_Object_Renaming --
  503.    -----------------------------
  504.  
  505.    procedure Analyze_Object_Renaming (N : Node_Id) is
  506.       Id  : constant Entity_Id := Defining_Identifier (N);
  507.       Nam : constant Node_Id   := Name (N);
  508.       S   : constant Entity_Id := Subtype_Mark (N);
  509.       T   : Entity_Id;
  510.       T2  : Entity_Id;
  511.  
  512.    begin
  513.  
  514.       --  Entities declared in Pure unit should be set Is_Pure
  515.       --  Since 'Partition_Id cannot be applied to such an entity
  516.  
  517.       Set_Is_Pure (Id, Is_Pure (Current_Scope));
  518.  
  519.       Enter_Name (Id);
  520.       Analyze (Nam);
  521.       T2 := Etype (Nam);
  522.       Find_Type (S);
  523.       T := Entity (S);
  524.       Resolve (Nam, T);
  525.       Set_Ekind (Id, E_Variable);
  526.  
  527.       if T = Any_Type or else Etype (Nam) = Any_Type then
  528.          return;
  529.  
  530.       elsif not Is_Constrained (T) then
  531.  
  532.          --  The constraints are inherited from the renamed object, they
  533.          --  are not affected by the given subtype mark.
  534.  
  535.          Set_Etype (Id, T2);
  536.  
  537.       else
  538.          Set_Etype (Id, T);
  539.       end if;
  540.  
  541.       if not Is_Variable (Nam) then
  542.          Set_Ekind (Id, E_Constant);
  543.       end if;
  544.  
  545.       Set_Renamed_Object (Id, Nam);
  546.    end Analyze_Object_Renaming;
  547.  
  548.    ------------------------------
  549.    -- Analyze_Package_Renaming --
  550.    ------------------------------
  551.  
  552.    procedure Analyze_Package_Renaming (N : Node_Id) is
  553.       New_P : constant Entity_Id := Defining_Unit_Simple_Name (N);
  554.       Old_P : Entity_Id;
  555.  
  556.    begin
  557.       --  Apply Text_IO kludge here, since we may be renaming one of
  558.       --  the children of Text_IO
  559.  
  560.       Text_IO_Kludge (Name (N));
  561.  
  562.       --  Entities declared in Pure unit should be set Is_Pure
  563.       --  Since 'Partition_Id cannot be applied to such an entity
  564.  
  565.       if Current_Scope /= Standard_Standard then
  566.          Set_Is_Pure (New_P, Is_Pure (Current_Scope));
  567.       end if;
  568.  
  569.       Analyze (Name (N));
  570.       Old_P := Entity (Name (N));
  571.  
  572.       if Etype (Old_P) = Any_Type then
  573.          null;
  574.  
  575.       elsif Ekind (Old_P) /= E_Package
  576.         and then not (Ekind (Old_P) = E_Generic_Package
  577.                        and then In_Open_Scopes (Old_P))
  578.       then
  579.          Error_Msg_N ("expect package name in renaming", Name (N));
  580.  
  581.       else
  582.          --  Entities in the old package are accessible through the
  583.          --  renaming entity. The simplest implementation is to have
  584.          --  both packages share the entity list.
  585.  
  586.          Enter_Name (New_P);
  587.          Set_Ekind (New_P, E_Package);
  588.          Set_Etype (New_P, Standard_Void_Type);
  589.  
  590.          if Present (Renamed_Object (Old_P)) then
  591.             Set_Renamed_Object (New_P,  Renamed_Object (Old_P));
  592.          else
  593.             Set_Renamed_Object (New_P,  Old_P);
  594.          end if;
  595.  
  596.          Set_Has_Completion (New_P);
  597.  
  598.          Set_First_Entity (New_P,  First_Entity (Old_P));
  599.          Set_Last_Entity  (New_P,  Last_Entity  (Old_P));
  600.          Set_First_Private_Entity (New_P, First_Private_Entity (Old_P));
  601.  
  602.          --  If this is the renaming declaration of a package instantiation
  603.          --  within itself, it is the declaration that ends the list of actuals
  604.          --  for the instantiation. At this point, the subtypes that rename
  605.          --  the actuals are flagged as generic, to avoid spurious ambiguities
  606.          --  if the actuals for two distinct formals happen to coincide.
  607.          --  Resolution is identical to what is was in the original generic.
  608.          --  On exit from the generic instance, these are turned into regular
  609.          --  subtypes again, so they are compatible with types in their class.
  610.  
  611.          if Nkind (Parent (Old_P)) = N_Package_Specification
  612.            and then Present (Generic_Parent (Parent (Old_P)))
  613.            and then Old_P = Current_Scope
  614.            and then Chars (New_P) = Chars (Generic_Parent (Parent (Old_P)))
  615.          then
  616.             declare
  617.                E : Entity_Id := First_Entity (Old_P);
  618.             begin
  619.                while Present (E)
  620.                  and then E /= New_P
  621.                loop
  622.                   if Is_Type (E)
  623.                     and then Nkind (Parent (E)) = N_Subtype_Declaration
  624.                   then
  625.                      --  Set_Ekind (E, Ekind (Base_Type (E)));
  626.                      Set_Is_Generic_Actual_Type (E);
  627.                   end if;
  628.  
  629.                   E := Next_Entity (E);
  630.                end loop;
  631.             end;
  632.          end if;
  633.       end if;
  634.  
  635.    end Analyze_Package_Renaming;
  636.  
  637.    ---------------------------------
  638.    -- Analyze_Subprogram_Renaming --
  639.    ---------------------------------
  640.  
  641.    procedure Analyze_Subprogram_Renaming (N : Node_Id) is
  642.       Nam         : Node_Id  := Name (N);
  643.       Spec        : constant Node_Id := Specification (N);
  644.       New_S       : Entity_Id;
  645.       Old_S       : Entity_Id;
  646.       Prev        : Entity_Id;
  647.       In_Instance : Boolean := False;
  648.  
  649.    begin
  650.  
  651.       --  We must test for the attribute renaming case before the Analyze
  652.       --  call because otherwise Sem_Attr will complain that the attribute
  653.       --  is missing an argument when it is analyzed.
  654.  
  655.       if Nkind (Nam) = N_Attribute_Reference then
  656.          Attribute_Renaming (N);
  657.          return;
  658.       end if;
  659.  
  660.       --  Check whether this declaration corresponds to the instantiation
  661.       --  of a formal subprogram. This is indicated by the presence of a
  662.       --  Corresponding_Spec that is the formal subprogram declaration.
  663.       --  If this is an instantiation,  the corresponding actual is frozen
  664.       --  and error messages can be made more precise.
  665.  
  666.       if Present (Corresponding_Spec (N)) then
  667.          In_Instance := True;
  668.          Set_Corresponding_Spec (N, Empty);
  669.       end if;
  670.  
  671.       --  The renaming defines a new overloaded entity, which is analyzed
  672.       --  like a subprogram declaration.
  673.  
  674.       New_S := Analyze_Spec (Spec);
  675.  
  676.       --  Entities declared in Pure unit should be set Is_Pure
  677.       --  Since 'Partition_Id cannot be applied to such an entity
  678.  
  679.       if Current_Scope /= Standard_Standard then
  680.          Set_Is_Pure (New_S, Is_Pure (Current_Scope));
  681.       end if;
  682.  
  683.       Prev := Find_Corresponding_Spec (N);
  684.  
  685.       if Present (Prev) then
  686.  
  687.          --  Renaming_As_Body. Renaming declaration is the completion of
  688.          --  the declaration of Prev.
  689.  
  690.          Note_Feature (Subprogram_Bodies_By_Renaming, Sloc (N));
  691.          Check_Type_Conformant (New_S, Prev);
  692.  
  693.          if Ada_83 and then Comes_From_Source (N) then
  694.             Error_Msg_N ("(Ada 83) renaming cannot serve as a body", N);
  695.          end if;
  696.  
  697.          New_S := Prev;
  698.       end if;
  699.  
  700.       Set_Has_Completion (New_S);
  701.       Analyze (Nam);
  702.  
  703.       if Etype (Nam) = Any_Type then
  704.          return;
  705.  
  706.       elsif Nkind (Nam) = N_Selected_Component then
  707.  
  708.          --  Renamed entity is an entry or protected subprogram.
  709.  
  710.          Analyze_Renamed_Entry (N, New_S);
  711.          return;
  712.  
  713.       elsif Nkind (Nam) = N_Explicit_Dereference then
  714.  
  715.          --  Renamed entity is designated by access_to_subprogram expression.
  716.          --  Must build body to encapsulate call, as in the entry case.
  717.  
  718.          Analyze_Renamed_Dereference (N, New_S);
  719.          return;
  720.  
  721.       elsif Nkind (Nam) = N_Indexed_Component then
  722.          Analyze_Renamed_Family_Member (N, New_S);
  723.          return;
  724.  
  725.       elsif (not Is_Entity_Name (Nam)
  726.               and then Nkind (Nam) /= N_Operator_Symbol)
  727.         or else not Is_Overloadable (Entity (Nam))
  728.       then
  729.          Error_Msg_N ("expect valid subprogram name in renaming", N);
  730.          return;
  731.  
  732.       end if;
  733.  
  734.       --  Most common case: subprogram renames subprogram.
  735.  
  736.       if No (Prev) then
  737.          New_Overloaded_Entity (New_S);
  738.       end if;
  739.  
  740.       --  Find the renamed entity that matches the given specification.
  741.  
  742.       Old_S := Find_Renamed_Entity (N, Name (N), New_S);
  743.  
  744.       if Old_S /= Any_Id then
  745.  
  746.          if Ekind (Old_S) /= E_Operator then
  747.             Check_Mode_Conformant (New_S, Old_S);
  748.          end if;
  749.  
  750.          if Present (Prev) then
  751.             Build_Renamed_Body (N, Old_S, New_S);
  752.             Check_Subtype_Conformant (Old_S, New_S);
  753.  
  754.          else
  755.             --  The parameter profile of the new entity is that of the renamed
  756.             --  entity: the subtypes given in the specification are irrelevant.
  757.  
  758.             Inherit_Renamed_Profile (New_S, Old_S);
  759.             if Present (Alias (Old_S)) then
  760.                Set_Alias (New_S, Alias (Old_S));
  761.             else
  762.                Set_Alias (New_S, Old_S);
  763.             end if;
  764.  
  765.             if Old_S = New_S then
  766.                Error_Msg_N ("subprogram cannot rename itself", N);
  767.             end if;
  768.          end if;
  769.  
  770.          Set_Is_Intrinsic_Subprogram (New_S,
  771.              Is_Intrinsic_Subprogram (Old_S));
  772.          Set_Convention (New_S, Convention (Old_S));
  773.  
  774.          if In_Instance then
  775.             Freeze_Before (N, Old_S);
  776.          end if;
  777.  
  778.       else
  779.          Error_Msg_N
  780.            ("No visible subprogram matches this specification", Spec);
  781.       end if;
  782.    end Analyze_Subprogram_Renaming;
  783.  
  784.    ---------------------------------
  785.    -- Analyze_Renamed_Dereference --
  786.    ---------------------------------
  787.  
  788.    procedure Analyze_Renamed_Dereference (N : Node_Id; New_S : Entity_Id) is
  789.       Nam : constant Node_Id := Name (N);
  790.       P   : constant Node_Id := Prefix (Nam);
  791.       Typ : Entity_Id;
  792.       I   : Interp_Index;
  793.       It  : Interp;
  794.  
  795.    begin
  796.       if not Is_Overloaded (P) then
  797.  
  798.          if Ekind (Etype (Nam)) /= E_Subprogram_Type
  799.            or else not Type_Conformant (Etype (Nam), New_S) then
  800.             Error_Msg_N ("designated type does not match specification", P);
  801.          else
  802.             Resolve (P, Etype (P));
  803.             Build_Renamed_Body (N, Etype (Nam), New_S);
  804.          end if;
  805.  
  806.          return;
  807.  
  808.       else
  809.          Typ := Any_Type;
  810.          Get_First_Interp (Nam, I, It);
  811.  
  812.          while Present (It.Nam) loop
  813.  
  814.             if Ekind (It.Nam) = E_Subprogram_Type
  815.               and then Type_Conformant (It.Nam, New_S) then
  816.  
  817.                if Typ /= Any_Id then
  818.                   Error_Msg_N ("ambiguous renaming", P);
  819.                   return;
  820.                else
  821.                   Typ := It.Nam;
  822.                end if;
  823.             end if;
  824.  
  825.             Get_Next_Interp (I, It);
  826.          end loop;
  827.  
  828.          if Typ = Any_Type then
  829.             Error_Msg_N ("designated type does not match specification", P);
  830.          else
  831.             Resolve (N, Typ);
  832.             Build_Renamed_Body (N, Typ, New_S);
  833.          end if;
  834.       end if;
  835.    end Analyze_Renamed_Dereference;
  836.  
  837.    ----------------------------
  838.    --  Analyze_Renamed_Entry --
  839.    ----------------------------
  840.  
  841.    procedure Analyze_Renamed_Entry (N : Node_Id; New_S : Entity_Id) is
  842.       Nam   : Node_Id := Name (N);
  843.       Sel   : Node_Id := Selector_Name (Nam);
  844.       Old_S : Entity_Id;
  845.  
  846.    begin
  847.       if Entity (Sel) = Any_Id then
  848.  
  849.          --  Selector is undefined on prefix. Error emitted already.
  850.  
  851.          Set_Has_Completion (New_S);
  852.          return;
  853.       end if;
  854.  
  855.       --  Otherwise, find renamed entity, and build body of New_S as a call
  856.       --  to it.
  857.  
  858.       Old_S := Find_Renamed_Entity (N, Selector_Name (Nam), New_S);
  859.  
  860.       if Old_S /= Any_Id then
  861.          Build_Renamed_Body (N, Old_S, New_S);
  862.       else
  863.          Error_Msg_N (" no subprogram or entry matches specification",  N);
  864.       end if;
  865.    end Analyze_Renamed_Entry;
  866.  
  867.    ------------------------------------
  868.    --  Analyze_Renamed_Family_Member --
  869.    ------------------------------------
  870.  
  871.    procedure Analyze_Renamed_Family_Member (N : Node_Id; New_S : Entity_Id) is
  872.       Nam   : Node_Id := Name (N);
  873.       P     : Node_Id := Prefix (Nam);
  874.       Old_S : Entity_Id;
  875.  
  876.    begin
  877.       if (Is_Entity_Name (P) and then Ekind (Entity (P)) = E_Entry_Family)
  878.         or else (Nkind (P) = N_Selected_Component
  879.                    and then
  880.                  Ekind (Entity (Selector_Name (P))) = E_Entry_Family)
  881.       then
  882.          if Is_Entity_Name (P) then
  883.             Old_S := Entity (P);
  884.          else
  885.             Old_S := Entity (Selector_Name (P));
  886.          end if;
  887.  
  888.          if not Entity_Matches_Spec (Old_S, New_S) then
  889.             Error_Msg_N ("entry family does not match specification", N);
  890.          else
  891.             Build_Renamed_Body (N, Old_S, New_S);
  892.          end if;
  893.       else
  894.          Error_Msg_N ("no entry family matches specification", N);
  895.       end if;
  896.    end Analyze_Renamed_Family_Member;
  897.  
  898.    -------------------------
  899.    -- Analyze_Use_Package --
  900.    -------------------------
  901.  
  902.    --  Resolve the package names in the use clause, and make all the visible
  903.    --  entities defined in the package potentially use-visible. If the package
  904.    --  is already in use from a previous use clause, its visible entities are
  905.    --  already use-visible. In that case, mark the occurrence as a redundant
  906.    --  use. If the package is an open scope, i.e. if the use clause occurs
  907.    --  within the package itself, ignore it.
  908.  
  909.    procedure Analyze_Use_Package (N : Node_Id) is
  910.       Pack_Name : Node_Id;
  911.       Pack      : Entity_Id;
  912.  
  913.    begin
  914.       --  Chain clause to list of use clauses in  current scope.
  915.  
  916.       if Nkind (Parent (N)) /= N_Compilation_Unit then
  917.          Chain_Use_Clause (N);
  918.       end if;
  919.  
  920.       --  Loop through package names to identify referenced packages
  921.  
  922.       Pack_Name := First (Names (N));
  923.  
  924.       while Present (Pack_Name) loop
  925.          Analyze (Pack_Name);
  926.  
  927.          Pack_Name := Next (Pack_Name);
  928.       end loop;
  929.  
  930.       --  Loop through package names to mark all entities as potentially
  931.       --  use visible.
  932.  
  933.       Pack_Name := First (Names (N));
  934.  
  935.       while Present (Pack_Name) loop
  936.  
  937.          if Is_Entity_Name (Pack_Name) then
  938.             Pack := Entity (Pack_Name);
  939.  
  940.             if Ekind (Pack) /= E_Package
  941.               and then Etype (Pack) /= Any_Type
  942.             then
  943.                Error_Msg_N ("& is not a usable package", Pack_Name);
  944.  
  945.             else
  946.                if In_Open_Scopes (Pack) then
  947.                   null;
  948.  
  949.                elsif Present (Renamed_Object (Pack))
  950.                  and then In_Use (Renamed_Object (Pack))
  951.                then
  952.                   Set_Redundant_Use (Pack_Name, True);
  953.  
  954.                elsif not In_Use (Pack)
  955.                  or else Nkind (Parent (N)) = N_Compilation_Unit
  956.                then
  957.                   Use_One_Package (Pack);
  958.  
  959.                else
  960.                   Set_Redundant_Use (Pack_Name, True);
  961.                end if;
  962.             end if;
  963.          end if;
  964.  
  965.          Pack_Name := Next (Pack_Name);
  966.       end loop;
  967.  
  968.    end Analyze_Use_Package;
  969.  
  970.    ----------------------
  971.    -- Analyze_Use_Type --
  972.    ----------------------
  973.  
  974.    procedure Analyze_Use_Type (N : Node_Id) is
  975.       Id      : Entity_Id;
  976.       Op_List : Elist_Id;
  977.       Elmt    : Elmt_Id;
  978.  
  979.    begin
  980.       --  Chain clause to list of use clauses in current scope.
  981.  
  982.       if Nkind (Parent (N)) /= N_Compilation_Unit then
  983.          Chain_Use_Clause (N);
  984.       end if;
  985.  
  986.       Id := First (Subtype_Marks (N));
  987.       while Present (Id) loop
  988.          Find_Type (Id);
  989.  
  990.          if Entity (Id) /= Any_Type then
  991.  
  992.             --  Save current visibility status of type, before setting.
  993.  
  994.             Set_Redundant_Use (Id, Is_Potentially_Use_Visible (Entity (Id)));
  995.             Set_Is_Potentially_Use_Visible (Entity (Id));
  996.  
  997.             --  If the base type is anonymous this indicates that the entity
  998.             --  is really a first named subtype and we need to make the
  999.             --  base type of the entity "use type" visible as well. Otherwise,
  1000.             --  operators which are defined on the type, and which the user
  1001.             --  wanted to make directly visible by means of this use clause,
  1002.             --  would in fact not become visible.
  1003.  
  1004.             if not Comes_From_Source (Base_Type (Entity (Id))) then
  1005.                Set_Is_Potentially_Use_Visible (Base_Type (Entity (Id)));
  1006.             end if;
  1007.  
  1008.             if not Redundant_Use (Id) then
  1009.  
  1010.                Set_In_Use (Entity (Id));
  1011.                Op_List := Collect_Primitive_Operations (Entity (Id));
  1012.                Elmt := First_Elmt (Op_List);
  1013.  
  1014.                while Present (Elmt) loop
  1015.  
  1016.                   if Nkind (Node (Elmt)) = N_Defining_Operator_Symbol then
  1017.                      Set_Is_Potentially_Use_Visible (Node (Elmt));
  1018.                   end if;
  1019.  
  1020.                   Elmt := Next_Elmt (Elmt);
  1021.                end loop;
  1022.             end if;
  1023.          end if;
  1024.  
  1025.          Id := Next (Id);
  1026.       end loop;
  1027.    end Analyze_Use_Type;
  1028.  
  1029.    ------------------------
  1030.    -- Attribute_Renaming --
  1031.    ------------------------
  1032.  
  1033.    procedure Attribute_Renaming (N : Node_Id) is
  1034.       Loc        : constant Source_Ptr := Sloc (N);
  1035.       Nam        : constant Node_Id    := Name (N);
  1036.       Spec       : constant Node_Id    := Specification (N);
  1037.       New_S      : constant Entity_Id := Defining_Unit_Name (Spec);
  1038.       Attr_Node  : Node_Id;
  1039.       Body_Node  : Node_Id;
  1040.       Expr_List  : List_Id;
  1041.       Formal     : Entity_Id;
  1042.       Param_Spec : Node_Id;
  1043.  
  1044.    begin
  1045.       Param_Spec := First (Parameter_Specifications (Spec));
  1046.  
  1047.       if No (Param_Spec) then
  1048.          Error_Msg_N ("function renaming an attribute must have formals", N);
  1049.          return;
  1050.  
  1051.       else
  1052.          Find_Type (Parameter_Type (Param_Spec));
  1053.  
  1054.          --  The profile of the new entity denotes the base type (s) of the
  1055.          --  types given in the specification.
  1056.  
  1057.          Rewrite_Substitute_Tree (Parameter_Type (Param_Spec),
  1058.           New_Reference_To
  1059.             (Base_Type (Entity (Parameter_Type (Param_Spec))), Loc));
  1060.  
  1061.          Expr_List := New_List (
  1062.            Make_Identifier (Loc,
  1063.              Chars => Chars (Defining_Identifier (Param_Spec))));
  1064.       end if;
  1065.  
  1066.       Param_Spec := Next (Param_Spec);
  1067.  
  1068.       if Present (Param_Spec) then
  1069.          Find_Type (Parameter_Type (Param_Spec));
  1070.          Rewrite_Substitute_Tree (Parameter_Type (Param_Spec),
  1071.           New_Reference_To
  1072.             (Base_Type (Entity (Parameter_Type (Param_Spec))), Loc));
  1073.  
  1074.          Append_To (Expr_List,
  1075.            Make_Identifier (Loc,
  1076.              Chars => Chars (Defining_Identifier (Param_Spec))));
  1077.  
  1078.          if Present (Next (Param_Spec)) then
  1079.             Error_Msg_N ("too many formals for attribute", N);
  1080.          end if;
  1081.  
  1082.          --  Other mismatches in the number of parameters are detected
  1083.          --  in the subsequent analysis of the attribute reference.
  1084.  
  1085.       end if;
  1086.  
  1087.       Attr_Node :=
  1088.         Make_Attribute_Reference (Loc,
  1089.           Prefix => Prefix (Nam),
  1090.           Attribute_Name => Attribute_Name (Nam),
  1091.           Expressions => Expr_List);
  1092.  
  1093.       Body_Node :=
  1094.         Make_Subprogram_Body (Loc,
  1095.           Specification => Spec,
  1096.           Declarations => New_List,
  1097.           Handled_Statement_Sequence =>
  1098.             Make_Handled_Sequence_Of_Statements (Loc,
  1099.                 Statements => New_List (
  1100.                   Make_Return_Statement (Loc,
  1101.                     Expression => Attr_Node))));
  1102.  
  1103.       Rewrite_Substitute_Tree (N, Body_Node);
  1104.       Analyze (N);
  1105.  
  1106.       Set_Etype (New_S, Base_Type (Etype (New_S)));
  1107.  
  1108.    end Attribute_Renaming;
  1109.  
  1110.    ------------------------
  1111.    -- Build_Renamed_Body --
  1112.    ------------------------
  1113.  
  1114.    --  Rewrite renaming declaration as a subprogram body, whose single
  1115.    --  statement is a call to Old_S, or to the name in N whose entity
  1116.    --  or subprogram type is Old_S.
  1117.  
  1118.    procedure Build_Renamed_Body
  1119.      (N     : Node_Id;
  1120.       Old_S : Entity_Id;
  1121.       New_S : Entity_Id)
  1122.    is
  1123.       Loc       : constant Source_Ptr := Sloc (N);
  1124.       Spec      : constant Node_Id := New_Copy (Specification (N));
  1125.       Actuals   : List_Id := New_List;
  1126.       Call_Node : Node_Id;
  1127.       Call_Name : Node_Id;
  1128.       Body_Node : Node_Id;
  1129.       Formal    : Entity_Id;
  1130.  
  1131.    begin
  1132.       --  Reset completion flag, so this body is seen as the
  1133.       --  proper completion.
  1134.  
  1135.       Set_Has_Completion (New_S, False);
  1136.  
  1137.       Formal := First_Formal (New_S);
  1138.  
  1139.       while Present (Formal) loop
  1140.          Append (New_Reference_To (Formal, Loc), Actuals);
  1141.          Formal := Next_Formal (Formal);
  1142.       end loop;
  1143.  
  1144.       --  If the renamed entity is an entry or a protected operation, the
  1145.       --  prefix of the name is the enclosing object of the entry. This prefix
  1146.       --  is part of the full name of the renamed entity in the call.
  1147.  
  1148.       if Is_Entity_Name (Name (N))
  1149.         or else Nkind (Name (N)) = N_Operator_Symbol
  1150.       then
  1151.          Call_Name := New_Reference_To (Old_S, Loc);
  1152.  
  1153.       elsif Nkind (Name (N)) = N_Selected_Component then
  1154.          Call_Name := Make_Selected_Component (Loc,
  1155.            Prefix => Prefix (Name (N)),
  1156.            Selector_Name => New_Reference_To (Old_S,  Loc));
  1157.  
  1158.       elsif Nkind (Name (N)) = N_Indexed_Component then
  1159.          Call_Name := New_Copy (Name (N));
  1160.  
  1161.       elsif Nkind (Name (N)) = N_Explicit_Dereference then
  1162.          Call_Name := New_Copy (Name (N));
  1163.       end if;
  1164.  
  1165.       --  If the renamed entity is a function, the generated body contains a
  1166.       --  return statement. Otherwise, build a procedure call. If the entity is
  1167.       --  an entry, subsequent analysis of the call will transform it into the
  1168.       --  proper entry or protected operation call.
  1169.  
  1170.       if Ekind (Old_S) = E_Function
  1171.         or else (Ekind (Old_S) = E_Subprogram_Type
  1172.                   and then Etype (Old_S) /= Standard_Void_Type)
  1173.       then
  1174.          Call_Node := Make_Return_Statement (Loc,
  1175.             Expression =>
  1176.               Make_Function_Call (Loc,
  1177.                 Name => Call_Name,
  1178.                 Parameter_Associations => Actuals));
  1179.  
  1180.       else
  1181.          Call_Node := Make_Procedure_Call_Statement (Loc,
  1182.            Name => Call_Name,
  1183.            Parameter_Associations => Actuals);
  1184.       end if;
  1185.  
  1186.       Set_Defining_Unit_Name (Spec,
  1187.         Make_Defining_Identifier (Loc, Chars => Chars (New_S)));
  1188.  
  1189.       Body_Node := Make_Subprogram_Body (Loc,
  1190.         Specification => Spec,
  1191.         Declarations => New_List,
  1192.         Handled_Statement_Sequence =>
  1193.           Make_Handled_Sequence_Of_Statements (Loc,
  1194.             Statements => New_List (Call_Node)));
  1195.  
  1196.       Analyze (Body_Node);
  1197.       Rewrite_Substitute_Tree (N, Body_Node);
  1198.    end Build_Renamed_Body;
  1199.  
  1200.    ----------------------
  1201.    -- Chain_Use_Clause --
  1202.    ----------------------
  1203.  
  1204.    procedure Chain_Use_Clause (N : Node_Id) is
  1205.    begin
  1206.       Set_Next_Use_Clause (N,
  1207.         Scope_Stack.Table (Scope_Stack.Last).First_Use_Clause);
  1208.       Scope_Stack.Table (Scope_Stack.Last).First_Use_Clause := N;
  1209.    end Chain_Use_Clause;
  1210.  
  1211.    ---------------
  1212.    -- End_Scope --
  1213.    ---------------
  1214.  
  1215.    procedure End_Scope is
  1216.       Id    : Entity_Id;
  1217.       Prev  : Entity_Id;
  1218.       Outer : Entity_Id;
  1219.  
  1220.    begin
  1221.       Id := First_Entity (Current_Scope);
  1222.  
  1223.       while Present (Id) loop
  1224.          --  An entity in the current scope is not necessarily the first one
  1225.          --  on its homonym chain. Find its predecessor if any,
  1226.          --  If it is an internal entity, it will not be in the visibility
  1227.          --  chain altogether,  and there is nothing to unchain.
  1228.  
  1229.          if Id /= Current_Entity (Id) then
  1230.             Prev := Current_Entity (Id);
  1231.             while Present (Prev)
  1232.               and then Present (Homonym (Prev))
  1233.               and then Homonym (Prev) /= Id
  1234.             loop
  1235.                Prev := Homonym (Prev);
  1236.             end loop;
  1237.  
  1238.             --  Skip to end of loop if Id is not in the visibility chain
  1239.  
  1240.             if No (Prev) or else Homonym (Prev) /= Id then
  1241.                goto Next_Ent;
  1242.             end if;
  1243.  
  1244.          else
  1245.             Prev := Empty;
  1246.          end if;
  1247.  
  1248.          Outer := Homonym (Id);
  1249.          Set_Is_Immediately_Visible (Id, False);
  1250.  
  1251.          while Present (Outer) and then Scope (Outer) = Current_Scope loop
  1252.             Outer := Homonym (Outer);
  1253.          end loop;
  1254.  
  1255.          if No (Prev) then
  1256.             Set_Name_Entity_Id (Chars (Id), Outer);
  1257.          else
  1258.             Set_Homonym (Prev,  Outer);
  1259.          end if;
  1260.  
  1261.          <<Next_Ent>>
  1262.             Id  := Next_Entity (Id);
  1263.       end loop;
  1264.  
  1265.       --  If the scope generated freeze nodes, place them before the
  1266.       --  current declaration and analyze them. Type declarations and
  1267.       --  the bodies of initialization procedures can generate such nodes.
  1268.       --  We follow the parent chain until we reach a list node, which is
  1269.       --  the enclosing list of declarations.
  1270.  
  1271.       if Present
  1272.          (Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Nodes)
  1273.       then
  1274.          declare
  1275.             Decl : Node_Id := Parent (Current_Scope);
  1276.             L    : List_Id := Scope_Stack.Table
  1277.                                  (Scope_Stack.Last).Pending_Freeze_Nodes;
  1278.  
  1279.          begin
  1280.             Pop_Scope;
  1281.             while not (Is_List_Member (Decl)) loop
  1282.                Decl := Parent (Decl);
  1283.             end loop;
  1284.  
  1285.             Insert_List_Before_And_Analyze (Decl, L);
  1286.          end;
  1287.       else
  1288.          Pop_Scope;
  1289.       end if;
  1290.  
  1291.    end End_Scope;
  1292.  
  1293.    ---------------------
  1294.    -- End_Use_Clauses --
  1295.    ---------------------
  1296.  
  1297.    procedure End_Use_Clauses is
  1298.       U : Node_Id := Scope_Stack.Table (Scope_Stack.Last).First_Use_Clause;
  1299.    begin
  1300.       while Present (U) loop
  1301.  
  1302.          if Nkind (U) = N_Use_Package_Clause then
  1303.             End_Use_Package (U);
  1304.          else
  1305.             End_Use_Type (U);
  1306.          end if;
  1307.  
  1308.          U := Next_Use_Clause (U);
  1309.       end loop;
  1310.    end End_Use_Clauses;
  1311.  
  1312.    ---------------------
  1313.    -- End_Use_Package --
  1314.    ---------------------
  1315.  
  1316.    procedure End_Use_Package (N : Node_Id) is
  1317.       Pack_Name : Node_Id;
  1318.       Pack      : Entity_Id;
  1319.       Id        : Entity_Id;
  1320.  
  1321.    begin
  1322.       Pack_Name := First (Names (N));
  1323.  
  1324.       while Present (Pack_Name) loop
  1325.          Pack := Entity (Pack_Name);
  1326.  
  1327.          if Ekind (Pack) = E_Package then
  1328.  
  1329.             if In_Open_Scopes (Pack) then
  1330.                null;
  1331.  
  1332.             elsif not Redundant_Use (Pack_Name) then
  1333.                Set_In_Use (Pack, False);
  1334.                Id := First_Entity (Pack);
  1335.  
  1336.                while Present (Id) loop
  1337.                   Set_Is_Potentially_Use_Visible (Id, False);
  1338.                   Id := Next_Entity (Id);
  1339.                end loop;
  1340.  
  1341.                if Present (Renamed_Object (Pack)) then
  1342.                   Set_In_Use (Renamed_Object (Pack), False);
  1343.                end if;
  1344.  
  1345.             else
  1346.                Set_Redundant_Use (Pack_Name, False);
  1347.             end if;
  1348.  
  1349.          end if;
  1350.  
  1351.          Pack_Name := Next (Pack_Name);
  1352.       end loop;
  1353.    end End_Use_Package;
  1354.  
  1355.    ------------------
  1356.    -- End_Use_Type --
  1357.    ------------------
  1358.  
  1359.    procedure End_Use_Type (N : Node_Id) is
  1360.       Id      : Entity_Id;
  1361.       Op_List : Elist_Id;
  1362.       Elmt    : Elmt_Id;
  1363.  
  1364.    begin
  1365.       Id := First (Subtype_Marks (N));
  1366.  
  1367.       while Present (Id) loop
  1368.  
  1369.          if Entity (Id) /= Any_Type then
  1370.  
  1371.             --  Reset visibility status.
  1372.  
  1373.             Set_Is_Potentially_Use_Visible
  1374.               (Entity (Id), Redundant_Use (Id));
  1375.             Set_Is_Potentially_Use_Visible
  1376.               (Base_Type (Entity (Id)), Redundant_Use (Id));
  1377.          end if;
  1378.  
  1379.          if not Redundant_Use (Id) then
  1380.             Set_In_Use (Entity (Id), False);
  1381.             Op_List := Collect_Primitive_Operations (Entity (Id));
  1382.             Elmt := First_Elmt (Op_List);
  1383.  
  1384.             while Present (Elmt) loop
  1385.  
  1386.                if Nkind (Node (Elmt)) = N_Defining_Operator_Symbol then
  1387.                   Set_Is_Potentially_Use_Visible (Node (Elmt), False);
  1388.                end if;
  1389.  
  1390.                Elmt := Next_Elmt (Elmt);
  1391.             end loop;
  1392.          end if;
  1393.  
  1394.          Id := Next (Id);
  1395.       end loop;
  1396.    end End_Use_Type;
  1397.  
  1398.    ----------------------
  1399.    -- Find_Direct_Name --
  1400.    ----------------------
  1401.  
  1402.    procedure Find_Direct_Name (N : Node_Id) is
  1403.       E   : Entity_Id;
  1404.       E2  : Entity_Id;
  1405.       Msg : Boolean;
  1406.  
  1407.       Homonyms : Entity_Id;
  1408.       --  Saves start of homonym chain
  1409.  
  1410.       Multiple_Overloadable_Entities : Boolean := False;
  1411.       --  This flag is set only if there are multiple overloadable entities
  1412.       --  that match (used at the end of processing to determine whether it
  1413.       --  is necessary to collect overloaded interpretations).
  1414.       --  ??? not used for this purpose yet, pending resolving some open
  1415.       --  issues with how Collect_Interps operates.
  1416.  
  1417.       procedure ND_Vis_Messages;
  1418.       --  Called if there are no directly visible entries for N, but there
  1419.       --  is at least one non-directly visible, or hidden declaration. This
  1420.       --  procedure outputs an appropriate set of error messages.
  1421.  
  1422.       procedure Undefined (ND_Vis : Boolean);
  1423.       --  This function is called if the current node has no corresponding
  1424.       --  visible entity or entities. The value set in Msg indicates whether
  1425.       --  an error message was generated (multiple error messages for the
  1426.       --  same variable are generally suppressed, see body for details).
  1427.       --  Msg is True if an error message was generated, False if not. This
  1428.       --  value is used by the caller to determine whether or not to output
  1429.       --  additional messages where appropriate. The parameter is set False
  1430.       --  to get the message "X is undefined", and True to get the message
  1431.       --  "X is not directly visible".
  1432.  
  1433.       procedure ND_Vis_Messages is
  1434.          Ent : Entity_Id;
  1435.  
  1436.       begin
  1437.          Undefined (ND_Vis => True);
  1438.  
  1439.          if Msg then
  1440.  
  1441.             --  First loop does hidden declarations
  1442.  
  1443.             Ent := Homonyms;
  1444.             while Present (Ent) loop
  1445.                if Is_Potentially_Use_Visible (Ent) then
  1446.                   Error_Msg_Sloc := Sloc (Ent);
  1447.                   Error_Msg_N ("hidden declaration#!", N);
  1448.                end if;
  1449.  
  1450.                Ent := Homonym (Ent);
  1451.             end loop;
  1452.  
  1453.             --  Second loop does non-directly visible declarations
  1454.  
  1455.             Ent := Homonyms;
  1456.             while Present (Ent) loop
  1457.                if not Is_Potentially_Use_Visible (Ent) then
  1458.                   Error_Msg_Sloc := Sloc (Ent);
  1459.                   Error_Msg_N ("non-visible declaration#!", N);
  1460.                end if;
  1461.  
  1462.                Ent := Homonym (Ent);
  1463.             end loop;
  1464.  
  1465.          end if;
  1466.       end ND_Vis_Messages;
  1467.  
  1468.       procedure Undefined (ND_Vis : Boolean) is
  1469.       begin
  1470.          Set_Entity (N, Any_Id);
  1471.          Set_Etype  (N, Any_Type);
  1472.  
  1473.          --  We use the table Urefs to keep track of entities for which we
  1474.          --  have issued errors for undefined references. Multiple errors
  1475.          --  for a single name are normally suppressed, however we modify
  1476.          --  the error message to alert the programmer to this effect.
  1477.  
  1478.          for J in Urefs.First .. Urefs.Last loop
  1479.             if Chars (N) = Chars (Urefs.Table (J).Node) then
  1480.                if Urefs.Table (J).Err /= No_Error_Msg then
  1481.                   Error_Msg_Node_1 := Urefs.Table (J).Node;
  1482.  
  1483.                   if Urefs.Table (J).ND_Vis then
  1484.                      Change_Error_Text (Urefs.Table (J).Err,
  1485.                        "& is not directly visible (more references follow)");
  1486.                   else
  1487.                      Change_Error_Text (Urefs.Table (J).Err,
  1488.                        "& is undefined (more references follow)");
  1489.                   end if;
  1490.  
  1491.                   Urefs.Table (J).Err := No_Error_Msg;
  1492.                end if;
  1493.  
  1494.                --  Although we will set Msg False, and thus suppress the
  1495.                --  message, we also set Error_Posted True, to avoid any
  1496.                --  cascaded messages resulting from the undefined reference.
  1497.  
  1498.                Msg := False;
  1499.                Set_Error_Posted (N, True);
  1500.                return;
  1501.             end if;
  1502.          end loop;
  1503.  
  1504.          --  If entry not found, this is first undefined occurrence
  1505.  
  1506.          if ND_Vis then
  1507.             Error_Msg_N ("& is not directly visible!", N);
  1508.          else
  1509.             Error_Msg_N ("& is undefined!", N);
  1510.  
  1511.             --  A very bizarre special check, if the undefined identifier
  1512.             --  is put or put_line, then add a special error message (since
  1513.             --  this is a very common error for beginners to make).
  1514.  
  1515.             if Chars (N) = Name_Put or else Chars (N) = Name_Put_Line then
  1516.                Error_Msg_N ("possible missing with of 'Text_'I'O!", N);
  1517.             end if;
  1518.          end if;
  1519.  
  1520.          --  Make entry in undefined references table unless the full
  1521.          --  errors switch is set, in which case by refraining from
  1522.          --  generating the table entry, we guarantee that we get an
  1523.          --  error message for every undefined reference.
  1524.  
  1525.          if not All_Errors_Mode then
  1526.             Urefs.Increment_Last;
  1527.             Urefs.Table (Urefs.Last).Node   := N;
  1528.             Urefs.Table (Urefs.Last).Err    := Get_Msg_Id;
  1529.             Urefs.Table (Urefs.Last).ND_Vis := ND_Vis;
  1530.          end if;
  1531.  
  1532.          Msg := True;
  1533.       end Undefined;
  1534.  
  1535.    --  Start of processing for Find_Direct_Name
  1536.  
  1537.    begin
  1538.       --  If the entity pointer is already set, this is an internal node, or
  1539.       --  a node that is analyzed more than once, after a tree modification.
  1540.       --  In such a case there is no resolution to perform, just set the type.
  1541.  
  1542.       if Present (Entity (N)) then
  1543.          if Is_Type (Entity (N)) then
  1544.             Set_Etype (N, Entity (N));
  1545.          else
  1546.             Set_Etype (N, Etype (Entity (N)));
  1547.          end if;
  1548.  
  1549.          return;
  1550.       end if;
  1551.  
  1552.       --  Here if Entity pointer was not set, we need full visibility analysis
  1553.       --  First we generate debugging output if the debug E flag is set.
  1554.  
  1555.       if Debug_Flag_E then
  1556.          Write_Str ("Looking for ");
  1557.          Write_Name (Chars (N));
  1558.          Write_Eol;
  1559.       end if;
  1560.  
  1561.       Homonyms := Current_Entity (N);
  1562.  
  1563.       --  If no entries on homonym chain, then we have a simple undefined
  1564.       --  reference, with no additional explanation required!
  1565.  
  1566.       if No (Homonyms) then
  1567.          Undefined (ND_Vis => False);
  1568.          return;
  1569.  
  1570.       --  Otherwise search homonym chain for matching entry
  1571.  
  1572.       else
  1573.          E := Homonyms;
  1574.          loop
  1575.             if Is_Immediately_Visible (E) then
  1576.                goto Immediately_Visible_Entity;
  1577.  
  1578.             elsif Is_Potentially_Use_Visible (E) then
  1579.                goto Potentially_Use_Visible_Entity;
  1580.  
  1581.             else
  1582.                E := Homonym (E);
  1583.                exit when No (E);
  1584.             end if;
  1585.          end loop;
  1586.  
  1587.          --  We fall through the loop if there are entries on the homonynm
  1588.          --  chain, but none of them is currently visible.
  1589.  
  1590.          ND_Vis_Messages;
  1591.          return;
  1592.       end if;
  1593.  
  1594.       --  Processing for a potentially use visible entry found. We must search
  1595.       --  the rest of the homonym chain for two reasons. First, if there is a
  1596.       --  directly visible entry, then none of the potentially use-visible
  1597.       --  entities are directly visible (RM 8.4(10)). Second, we need to check
  1598.       --  for the case of multiple potentially use-visible entries hiding one
  1599.       --  another and as a result being non-directly visible (RM 8.4(11)).
  1600.  
  1601.       <<Potentially_Use_Visible_Entity>> declare
  1602.          Only_One_Visible : Boolean := True;
  1603.          All_Overloadable : Boolean := Is_Overloadable (E);
  1604.  
  1605.       begin
  1606.          E2 := Homonym (E);
  1607.  
  1608.          while Present (E2) loop
  1609.             if Is_Immediately_Visible (E2) then
  1610.                E := E2;
  1611.                goto Immediately_Visible_Entity;
  1612.  
  1613.             elsif Is_Potentially_Use_Visible (E2) then
  1614.                Only_One_Visible := False;
  1615.                All_Overloadable := All_Overloadable and Is_Overloadable (E2);
  1616.             end if;
  1617.  
  1618.             E2 := Homonym (E2);
  1619.          end loop;
  1620.  
  1621.          --  On falling through this loop, we have checked that there are no
  1622.          --  immediately visible entities. Only_One_Visible is set if exactly
  1623.          --  one potentially use visible entity exists. All_Overloadable is
  1624.          --  set if all the potentially use visible entities are overloadable.
  1625.          --  The condition for legality is that either there is one potentially
  1626.          --  use visible entity, or if there is more than one, then all of them
  1627.          --  are overloadable.
  1628.  
  1629.          if Only_One_Visible or All_Overloadable then
  1630.             goto Found;
  1631.  
  1632.          --  If there is more than one potentially use-visible entity and at
  1633.          --  least one of them non-overloadable, we have an error (RM 8.4(11).
  1634.          --  Note that E points to the first such entity on the homonym list.
  1635.  
  1636.          else
  1637.             ND_Vis_Messages;
  1638.             return;
  1639.          end if;
  1640.       end;
  1641.  
  1642.       --  Come here with E set to the first immediately visible entity on
  1643.       --  the homonym chain. This is the one we want unless there is another
  1644.       --  immediately visible entity further on in the chain for a more
  1645.       --  inner scope (RM 8.3(8)).
  1646.  
  1647.       <<Immediately_Visible_Entity>> declare
  1648.          Level : Int;
  1649.          Scop  : Entity_Id;
  1650.  
  1651.       begin
  1652.          --  Find scope level of initial entity
  1653.  
  1654.          Level := Scope_Stack.Last;
  1655.          loop
  1656.             Scop := Scope_Stack.Table (Level).Entity;
  1657.             exit when Scop = Scope (E) or else Scop = Standard_Standard;
  1658.             Level := Level - 1;
  1659.          end loop;
  1660.  
  1661.          --  Now search remainder of homonym chain for more inner entry
  1662.  
  1663.          E2 := Homonym (E);
  1664.          while Present (E2) loop
  1665.             if Is_Immediately_Visible (E2) then
  1666.                for J in Level + 1 .. Scope_Stack.Last loop
  1667.                   if Scope_Stack.Table (J).Entity = Scope (E2) then
  1668.                      Level := J;
  1669.                      E := E2;
  1670.                      exit;
  1671.                   end if;
  1672.                end loop;
  1673.             end if;
  1674.  
  1675.             E2 := Homonym (E2);
  1676.          end loop;
  1677.  
  1678.          --  At the end of that loop, E is the innermost immediately
  1679.          --  visible entity, so we are all set.
  1680.       end;
  1681.  
  1682.       --  Come here with entity found, and stored in E
  1683.  
  1684.       <<Found>> begin
  1685.          Set_Entity (N, E);
  1686.  
  1687.          if Is_Type (E) then
  1688.             Set_Etype (N, E);
  1689.          else
  1690.             Set_Etype (N, Get_Full_View (Etype (E)));
  1691.          end if;
  1692.  
  1693.          if Debug_Flag_E then
  1694.             Write_Str (" found  ");
  1695.             Write_Entity_Info (E, "      ");
  1696.          end if;
  1697.  
  1698.          --  If the Ekind of the entity is Void, it means that all homopnyms
  1699.          --  are hidden from all visibility (RM 8.3(5,14-20)). However, this
  1700.          --  test is skipped if the current scope is a record and the name is
  1701.          --  a pragma argument expression (case of Atomic and Volatile pragmas
  1702.          --  and possibly other similar pragmas added later, which are allowed
  1703.          --  to reference components in the current record).
  1704.  
  1705.          if Ekind (E) = E_Void
  1706.            and then
  1707.              (not Is_Record_Type (Current_Scope)
  1708.                or else Nkind (Parent (N)) /= N_Pragma_Argument_Association)
  1709.          then
  1710.             Error_Msg_N ("premature usage of&!", N);
  1711.  
  1712.          --  If the entity is overloadable, collect all interpretations
  1713.          --  of the name for subsequent overload resolution. We optimize
  1714.          --  a bit here to do this only if we have an overloadable entity
  1715.          --  that is not on its own on the homonym chain.
  1716.  
  1717.          elsif Is_Overloadable (E)
  1718.            and then (Present (Homonym (E)) or else Current_Entity (N) /= E)
  1719.          then
  1720.             Collect_Interps (N);
  1721.  
  1722.          --  Case of non-overloadable entity, set the entity providing that
  1723.          --  we do not have the case of a discriminant reference within a
  1724.          --  default expression. Such references are replaced with the
  1725.          --  corresponding discriminal, which is the formal corresponding to
  1726.          --  to the discriminant in the initialization procedure.
  1727.          --  As with other expansion transformations, this replacement must
  1728.          --  not be done if the expander is inactive, as in the compilation
  1729.          --  of a generic unit.
  1730.  
  1731.          else
  1732.             if not In_Default_Expression
  1733.               or else Ekind (E) /= E_Discriminant
  1734.               or else not Expander_Active
  1735.             then
  1736.                Set_Entity_With_Style_Check (N, E);
  1737.             else
  1738.                Set_Entity (N, Discriminal (E));
  1739.             end if;
  1740.          end if;
  1741.       end;
  1742.    end Find_Direct_Name;
  1743.  
  1744.    ------------------------
  1745.    -- Find_Expanded_Name --
  1746.    ------------------------
  1747.  
  1748.    --  This routine searches the homonym chain of the entity until it finds
  1749.    --  an entity declared in the scope denoted by the prefix. If the entity
  1750.    --  is private, it may nevertheless be immediately visible, if we are in
  1751.    --  the scope of its declaration.
  1752.  
  1753.    procedure Find_Expanded_Name (N : Node_Id) is
  1754.       Selector : constant Node_Id := Selector_Name (N);
  1755.       P_Name   : Entity_Id;
  1756.       Id       : Entity_Id;
  1757.  
  1758.    begin
  1759.       P_Name := Entity (Prefix (N));
  1760.  
  1761.       --  If the prefix is a renamed package, look for the entity
  1762.       --  in the original package.
  1763.  
  1764.       if Ekind (P_Name) = E_Package
  1765.         and then Present (Renamed_Object (P_Name))
  1766.       then
  1767.          P_Name := Renamed_Object (P_Name);
  1768.          Set_Entity (Prefix (N), P_Name);
  1769.       end if;
  1770.  
  1771.       Id := Current_Entity (Selector);
  1772.  
  1773.       while Present (Id) loop
  1774.          exit when  Scope (Id) = P_Name
  1775.            and then (not Is_Private (Id) or else Is_Immediately_Visible (Id));
  1776.          Id := Homonym (Id);
  1777.       end loop;
  1778.  
  1779.       if No (Id) or else Chars (Id) /=  Chars (Selector) then
  1780.          if (Nkind (Selector) = N_Operator_Symbol
  1781.            and then Has_Implicit_Operator (N))
  1782.          then
  1783.             --  There is an implicit instance of the predefined operator in the
  1784.             --  given scope. Find the predefined operator in scope Standard.
  1785.  
  1786.             Id := Current_Entity (Selector);
  1787.             while Present (Id) and then Scope (Id) /= Standard_Standard loop
  1788.                Id := Homonym (Id);
  1789.             end loop;
  1790.  
  1791.          elsif Nkind (Selector) = N_Character_Literal then
  1792.  
  1793.             --  If there is not literal defined in the scope denoted by the
  1794.             --  prefix, the literal may belong to (a type derived from)
  1795.             --  Standard_Character, for which we have no explicit literals.
  1796.             --  We replace the node with the literal itself, and mark the
  1797.             --  scope, for use in subsequent resolution. ???
  1798.  
  1799.             Rewrite_Substitute_Tree (N, Selector);
  1800.             Analyze (N);
  1801.             return;
  1802.          else
  1803.             Error_Msg_Node_2 := P_Name;
  1804.             Error_Msg_NE ("& not declared in&", N, Selector);
  1805.             Id := Any_Id;
  1806.          end if;
  1807.       end if;
  1808.  
  1809.       Change_Selected_Component_To_Expanded_Name (N);
  1810.       Set_Entity_With_Style_Check (N, Id);
  1811.  
  1812.       if Is_Type (Id) then
  1813.          Set_Etype (N, Id);
  1814.       else
  1815.          Set_Etype (N, Get_Full_View (Etype (Id)));
  1816.       end if;
  1817.  
  1818.       if Is_Overloadable (Id)
  1819.         and then Present (Homonym (Id))
  1820.       then
  1821.          declare
  1822.             H : Entity_Id := Homonym (Id);
  1823.  
  1824.          begin
  1825.             while Present (H) loop
  1826.                if Scope (H) = Scope (Id) then
  1827.                   Collect_Interps (N);
  1828.                   exit;
  1829.                end if;
  1830.  
  1831.                H := Homonym (H);
  1832.             end loop;
  1833.          end;
  1834.       end if;
  1835.  
  1836.       if (Nkind (Selector_Name (N)) = N_Operator_Symbol
  1837.         and then Has_Implicit_Operator (N)
  1838.         and then Scope (Id) /= Standard_Standard)
  1839.       then
  1840.          --  In addition to user-defined operators in the given scope,
  1841.          --  there is also an implicit instance of the predefined
  1842.          --  operator. Find the predefined operator in scope
  1843.          --  Standard, and add it as well to the interpretations.
  1844.          --  Procedure Add_One_Interp will determine which hides which.
  1845.  
  1846.          Id := Current_Entity (Selector);
  1847.  
  1848.          while Present (Id)
  1849.            and then Scope (Id) /= Standard_Standard
  1850.          loop
  1851.             Id := Homonym (Id);
  1852.          end loop;
  1853.  
  1854.          Add_One_Interp (N, Id,  Etype (Id));
  1855.       end if;
  1856.    end Find_Expanded_Name;
  1857.  
  1858.    -----------------------------
  1859.    -- Find_Selected_Component --
  1860.    -----------------------------
  1861.  
  1862.    procedure Find_Selected_Component (N : Node_Id) is
  1863.       P : Node_Id := Prefix (N);
  1864.  
  1865.       P_Name : Entity_Id;
  1866.       --  Entity denoted by prefix
  1867.  
  1868.       P_Type : Entity_Id;
  1869.       --  and its type
  1870.  
  1871.       Nam : Node_Id;
  1872.  
  1873.    begin
  1874.       Analyze (P);
  1875.  
  1876.       if Nkind (P) = N_Error then
  1877.          return;
  1878.  
  1879.       --  If the selector already has an entity, the node has been
  1880.       --  constructed in the course of expansion, and is known to be
  1881.       --  valid. Do not verify that it is defined for the type (it may
  1882.       --  be a private component used in the expansion of record equality).
  1883.  
  1884.       elsif Present (Entity (Selector_Name (N))) then
  1885.  
  1886.          if No (Etype (N))
  1887.            or else Etype (N) = Any_Type
  1888.          then
  1889.             Set_Etype (Selector_Name (N), Etype (Entity (Selector_Name (N))));
  1890.             Set_Etype (N, Etype (Entity (Selector_Name (N))));
  1891.  
  1892.             --  If this is the name of an entry or protected operation, and
  1893.             --  the prefix is an access type, insert an explicit dereference,
  1894.             --  so that entry calls are treated uniformly.
  1895.  
  1896.             if Is_Access_Type (Etype (P))
  1897.               and then Is_Concurrent_Type (Designated_Type (Etype (P)))
  1898.             then
  1899.                declare
  1900.                   New_P :  Node_Id :=
  1901.                     Make_Explicit_Dereference (Sloc (P),
  1902.                       Prefix => New_Copy (P));
  1903.                begin
  1904.                   Rewrite_Substitute_Tree (P, New_P);
  1905.                   Set_Etype (P, Designated_Type (Etype (Prefix (P))));
  1906.                end;
  1907.             end if;
  1908.          end if;
  1909.  
  1910.          return;
  1911.  
  1912.       elsif Is_Entity_Name (P) then
  1913.          P_Name := Entity (P);
  1914.          P_Type := Etype (P);
  1915.  
  1916.          if Debug_Flag_E then
  1917.             Write_Str ("Found prefix type to be ");
  1918.             Write_Entity_Info (P_Type, "      "); Write_Eol;
  1919.          end if;
  1920.  
  1921.          if Is_Appropriate_For_Record (P_Type) then
  1922.  
  1923.             --  Selected component of record. Type checking will validate
  1924.             --  name of selector.
  1925.  
  1926.             Analyze_Selected_Component (N);
  1927.  
  1928.          elsif Is_Appropriate_For_Entry_Prefix (P_Type)
  1929.            and then not In_Open_Scopes (P_Name)
  1930.          then
  1931.             --  Call to protected operation or entry. Type checking is
  1932.             --  needed on the prefix.
  1933.  
  1934.             Analyze_Selected_Component (N);
  1935.  
  1936.          elsif In_Open_Scopes (P_Name)
  1937.            and then (Ekind (P_Name) /= E_Void
  1938.            and then not Is_Overloadable (P_Name))
  1939.          then
  1940.             --  Prefix denotes an enclosing loop, block, or task, i.e. an
  1941.             --  enclosing construct that is not a subprogram or accept.
  1942.  
  1943.             Find_Expanded_Name (N);
  1944.  
  1945.          elsif Ekind (P_Name) = E_Package then
  1946.             Find_Expanded_Name (N);
  1947.  
  1948.          elsif Is_Overloadable (P_Name) then
  1949.  
  1950.             if Is_Overloaded (P) then
  1951.  
  1952.                --  The prefix must resolve to a unique enclosing construct.
  1953.  
  1954.                declare
  1955.                   Found : Boolean := False;
  1956.                   I     : Interp_Index;
  1957.                   It    : Interp;
  1958.                begin
  1959.                   Get_First_Interp (P, I, It);
  1960.  
  1961.                   while Present (It.Nam) loop
  1962.  
  1963.                      if In_Open_Scopes (It.Nam) then
  1964.                         if Found then
  1965.                            Error_Msg_N (
  1966.                               "prefix must be unique enclosing scope", N);
  1967.                            Set_Entity (N, Any_Id);
  1968.                            Set_Etype  (N, Any_Type);
  1969.                            return;
  1970.  
  1971.                         else
  1972.                            Found := True;
  1973.                            P_Name := It.Nam;
  1974.                         end if;
  1975.                      end if;
  1976.  
  1977.                      Get_Next_Interp (I, It);
  1978.                   end loop;
  1979.                end;
  1980.             end if;
  1981.  
  1982.             if In_Open_Scopes (P_Name) then
  1983.                Set_Entity (P, P_Name);
  1984.                Set_Is_Overloaded (P, False);
  1985.                Find_Expanded_Name (N);
  1986.  
  1987.             else
  1988.                --  If no interpretation as an expanded name is possible, it
  1989.                --  must be a selected component of a record returned by a
  1990.                --  function call. Reformat prefix as a function call, the
  1991.                --  rest is done by type resolution.
  1992.  
  1993.                Nam := New_Copy (P);
  1994.                Save_Interps (P, Nam);
  1995.                Rewrite_Substitute_Tree (P,
  1996.                  Make_Function_Call (Sloc (P), Name => Nam));
  1997.                Analyze_Call (P);
  1998.                Analyze_Selected_Component (N);
  1999.             end if;
  2000.  
  2001.          --  Remaining cases generate various error messages
  2002.  
  2003.          else
  2004.             --  Format node as expanded name, to avoid cascaded errors
  2005.  
  2006.             Change_Node (N, N_Expanded_Name);
  2007.             Set_Prefix  (N, P);
  2008.             Set_Entity  (N, Any_Id);
  2009.             Set_Etype   (N, Any_Type);
  2010.  
  2011.             --  Set_Selector_Name (N, Empty); ????
  2012.  
  2013.             --  Issue error message, but avoid this if error issued already
  2014.  
  2015.             if P_Name = Any_Id  then
  2016.                null;
  2017.  
  2018.             elsif Ekind (P_Name) = E_Void then
  2019.                Error_Msg_N ("premature usage of&", P);
  2020.  
  2021.             else
  2022.                Error_Msg_N (
  2023.                 "invalid prefix in selected component&", P);
  2024.             end if;
  2025.          end if;
  2026.  
  2027.       else
  2028.          --  If prefix is not the name of an entity, it must be an expression,
  2029.          --  whose type is appropriate for a record. This is determined by
  2030.          --  type resolution.
  2031.  
  2032.          Analyze_Selected_Component (N);
  2033.       end if;
  2034.    end Find_Selected_Component;
  2035.  
  2036.    ---------------
  2037.    -- Find_Type --
  2038.    ---------------
  2039.  
  2040.    procedure Find_Type (N : Node_Id) is
  2041.       C      : Entity_Id;
  2042.       T      : Entity_Id;
  2043.       T_Name : Entity_Id;
  2044.  
  2045.    begin
  2046.       if Nkind (N) = N_Attribute_Reference then
  2047.  
  2048.          --  Class attribute. This is only valid in Ada 95 mode, but we don't
  2049.          --  do a check, since the tagged type referenced could only exist if
  2050.          --  we were in 95 mode when it was declared (or, if we were in Ada
  2051.          --  83 mode, then an error message would already have been issued).
  2052.  
  2053.          if Attribute_Name (N) = Name_Class then
  2054.             Find_Type (Prefix (N));
  2055.             T := Base_Type (Entity (Prefix (N)));
  2056.  
  2057.             if not Is_Tagged_Type (T) then
  2058.                if Ekind (T) = E_Incomplete_Type then
  2059.  
  2060.                   --  It is legal to denote the class type of an incomplete
  2061.                   --  type. The full type will have to be tagged, of course.
  2062.  
  2063.                   Set_Is_Tagged_Type (T);
  2064.                   Make_Class_Wide_Type (T);
  2065.                   Set_Entity (N, Class_Wide_Type (T));
  2066.                   Set_Etype  (N, Class_Wide_Type (T));
  2067.  
  2068.                else
  2069.                   Error_Msg_NE
  2070.                     ("tagged type required, found}", Prefix (N), T);
  2071.                   Set_Entity (N, Any_Type);
  2072.                end if;
  2073.  
  2074.             else
  2075.                C := Class_Wide_Type (T);
  2076.                Set_Entity_With_Style_Check (N, C);
  2077.                Set_Etype (N, C);
  2078.             end if;
  2079.  
  2080.          --  Base attribute, allowed in Ada 95 mode only
  2081.  
  2082.          elsif Attribute_Name (N) = Name_Base then
  2083.             Note_Feature (Base_Attribute_In_Subtype_Mark, Sloc (N));
  2084.  
  2085.             if Ada_83 and then Comes_From_Source (N) then
  2086.                Error_Msg_N
  2087.                  ("(Ada 83) Base attribute not allowed in subtype mark", N);
  2088.  
  2089.             else
  2090.                Find_Type (Prefix (N));
  2091.                T := Base_Type (Entity (Prefix (N)));
  2092.                Set_Entity (N, T);
  2093.                Set_Etype (N, T);
  2094.  
  2095.                --  Rewrite attribute reference with type itself (see similar
  2096.                --  processing in Analyze_Attribute, case Base)
  2097.  
  2098.                Rewrite_Substitute_Tree (N,
  2099.                  New_Reference_To (Entity (N), Sloc (N)));
  2100.                Set_Etype (N, T);
  2101.             end if;
  2102.  
  2103.          --  All other attributes are invalid in a subtype mark
  2104.  
  2105.          else
  2106.             Error_Msg_N ("invalid attribute in subtype mark", N);
  2107.          end if;
  2108.  
  2109.       else
  2110.          Analyze (N);
  2111.  
  2112.          if Is_Entity_Name (N) then
  2113.             T_Name := Entity (N);
  2114.          else
  2115.             Error_Msg_N ("subtype mark required in this context", N);
  2116.             Set_Etype (N, Any_Type);
  2117.             return;
  2118.          end if;
  2119.  
  2120.          if T_Name  = Any_Id or else Etype (N) = Any_Type then
  2121.  
  2122.             --  Undefined id. Make it into a valid type
  2123.  
  2124.             Set_Entity (N, Any_Type);
  2125.  
  2126.          elsif not Is_Type (T_Name)
  2127.            and then T_Name /= Standard_Void_Type
  2128.          then
  2129.             Error_Msg_N ("subtype mark required in this context", N);
  2130.             Set_Entity (N, Any_Type);
  2131.  
  2132.          else
  2133.             T_Name := Get_Full_View (T_Name);
  2134.  
  2135.             if In_Open_Scopes (T_Name) then
  2136.                if Ekind (Base_Type (T_Name)) = E_Task_Type then
  2137.                   Error_Msg_N ("task type cannot be used as type mark " &
  2138.                      "within its own body", N);
  2139.                else
  2140.                   Error_Msg_N ("type declaration cannot refer to itself", N);
  2141.                end if;
  2142.                Set_Etype (N, Any_Type);
  2143.                Set_Entity (N, Any_Type);
  2144.                return;
  2145.             end if;
  2146.  
  2147.             Set_Entity (N, T_Name);
  2148.             Set_Etype  (N, T_Name);
  2149.          end if;
  2150.       end if;
  2151.    end Find_Type;
  2152.  
  2153.    -------------------
  2154.    -- Get_Full_View --
  2155.    -------------------
  2156.  
  2157.    function Get_Full_View (T_Name : Entity_Id) return Entity_Id is
  2158.    begin
  2159.       if (Ekind (T_Name) = E_Incomplete_Type
  2160.           and then Present (Full_View (T_Name)))
  2161.       then
  2162.          return Full_View (T_Name);
  2163.  
  2164.       elsif Is_Class_Wide_Type (T_Name)
  2165.         and then Ekind (Root_Type (T_Name)) = E_Incomplete_Type
  2166.         and then Present (Full_View (Root_Type (T_Name)))
  2167.       then
  2168.          return Class_Wide_Type (Full_View (Root_Type (T_Name)));
  2169.  
  2170.       else
  2171.          return T_Name;
  2172.       end if;
  2173.    end Get_Full_View;
  2174.  
  2175.    ---------------------------
  2176.    -- Has_Implicit_Operator --
  2177.    ---------------------------
  2178.  
  2179.    function Has_Implicit_Operator (N : Node_Id) return Boolean is
  2180.       Op_Id : constant Name_Id   := Chars (Selector_Name (N));
  2181.       P     : constant Entity_Id := Entity (Prefix (N));
  2182.       Id    : Entity_Id;
  2183.  
  2184.    begin
  2185.       Id := First_Entity (P);
  2186.  
  2187.       --  Boolean operators: implicit declaration exists if scope contains
  2188.       --  declaration for derived boolean type, or for array of boolean type.
  2189.  
  2190.       if Op_Id = Name_Op_And
  2191.         or else Op_Id = Name_Op_Not
  2192.         or else Op_Id = Name_Op_Or
  2193.         or else Op_Id = Name_Op_Xor
  2194.       then
  2195.          while Present (Id) loop
  2196.             if Valid_Boolean_Arg (Id) then
  2197.                return true;
  2198.             end if;
  2199.  
  2200.             Id := Next_Entity (Id);
  2201.          end loop;
  2202.  
  2203.       --  Equality: look for any non-limited type.
  2204.  
  2205.       elsif Op_Id = Name_Op_Eq
  2206.         or else Op_Id = Name_Op_Ne
  2207.       then
  2208.          while Present (Id) loop
  2209.             if Is_Type (Id) and not Is_Limited_Type (Id) then
  2210.                return true;
  2211.             end if;
  2212.  
  2213.             Id := Next_Entity (Id);
  2214.          end loop;
  2215.  
  2216.       --  Comparison operators: scalar type, or array of scalar.
  2217.  
  2218.       elsif Op_Id = Name_Op_Lt
  2219.         or else Op_Id = Name_Op_Le
  2220.         or else Op_Id = Name_Op_Gt
  2221.         or else Op_Id = Name_Op_Ge
  2222.       then
  2223.          while Present (Id) loop
  2224.             if Is_Scalar_Type (Id)
  2225.               or else (Is_Array_Type (Id)
  2226.                         and then Is_Scalar_Type (Component_Type (Id)))
  2227.             then
  2228.                return true;
  2229.             end if;
  2230.  
  2231.             Id := Next_Entity (Id);
  2232.          end loop;
  2233.  
  2234.       --  Arithmetic operators: any numeric type
  2235.  
  2236.       elsif Op_Id = Name_Op_Abs
  2237.         or else Op_Id = Name_Op_Add
  2238.         or else Op_Id = Name_Op_Mod
  2239.         or else Op_Id = Name_Op_Rem
  2240.         or else Op_Id = Name_Op_Subtract
  2241.         or else Op_Id = Name_Op_Multiply
  2242.         or else Op_Id = Name_Op_Divide
  2243.         or else Op_Id = Name_Op_Expon
  2244.       then
  2245.          while Present (Id) loop
  2246.             if Is_Numeric_Type (Id) then
  2247.                return True;
  2248.             end if;
  2249.  
  2250.             Id := Next_Entity (Id);
  2251.          end loop;
  2252.  
  2253.       --  Concatenation: any one-dimensional array type
  2254.  
  2255.       elsif Op_Id = Name_Op_Concat then
  2256.          while Present (Id) loop
  2257.             if Is_Array_Type (Id) and then Number_Dimensions (Id) = 1 then
  2258.                return true;
  2259.             end if;
  2260.  
  2261.             Id := Next_Entity (Id);
  2262.          end loop;
  2263.       else
  2264.          return False;
  2265.       end if;
  2266.  
  2267.       return False;
  2268.    end Has_Implicit_Operator;
  2269.  
  2270.    ------------------------------
  2271.    --  Inherit_Renamed_Profile --
  2272.    ------------------------------
  2273.  
  2274.    procedure Inherit_Renamed_Profile (New_S : Entity_Id; Old_S : Entity_Id) is
  2275.       New_F : Entity_Id;
  2276.       Old_F : Entity_Id;
  2277.  
  2278.    begin
  2279.       if Ekind (Old_S) = E_Operator then
  2280.  
  2281.          New_F := First_Formal (New_S);
  2282.  
  2283.          while Present (New_F) loop
  2284.             Set_Etype (New_F, Base_Type (Etype (New_F)));
  2285.             New_F := Next_Formal (New_F);
  2286.          end loop;
  2287.  
  2288.          Set_Etype (New_S, Base_Type (Etype (New_S)));
  2289.       else
  2290.          New_F := First_Formal (New_S);
  2291.          Old_F := First_Formal (Old_S);
  2292.  
  2293.          while Present (New_F) loop
  2294.             Set_Etype (New_F, Etype (Old_F));
  2295.             New_F := Next_Formal (New_F);
  2296.             Old_F := Next_Formal (Old_F);
  2297.          end loop;
  2298.       end if;
  2299.    end Inherit_Renamed_Profile;
  2300.  
  2301.    ----------------
  2302.    -- Initialize --
  2303.    ----------------
  2304.  
  2305.    procedure Initialize is
  2306.    begin
  2307.       Urefs.Init;
  2308.    end Initialize;
  2309.  
  2310.    --------------------
  2311.    -- In_Open_Scopes --
  2312.    --------------------
  2313.  
  2314.    function In_Open_Scopes (S : Entity_Id) return Boolean is
  2315.    begin
  2316.       --  Since there are several scope stacks maintained by Scope_Stack each
  2317.       --  delineated by Standard (see comments by definition of Scope_Stack)
  2318.       --  it is necessary to end the search when Standard is reached.
  2319.  
  2320.       for J in reverse 0 .. Scope_Stack.Last loop
  2321.          if Scope_Stack.Table (J).Entity = S then
  2322.             return True;
  2323.          end if;
  2324.  
  2325.          exit when Scope_Stack.Table (J).Entity = Standard_Standard;
  2326.       end loop;
  2327.  
  2328.       return False;
  2329.    end In_Open_Scopes;
  2330.  
  2331.    -------------------------------------
  2332.    -- Is_Appropriate_For_Entry_Prefix --
  2333.    -------------------------------------
  2334.  
  2335.    function Is_Appropriate_For_Entry_Prefix (T : Entity_Id) return Boolean is
  2336.       P_Type : Entity_Id := T;
  2337.  
  2338.    begin
  2339.       if Is_Access_Type (P_Type) then
  2340.          P_Type := Designated_Type (P_Type);
  2341.       end if;
  2342.  
  2343.       return Is_Task_Type (P_Type) or else Is_Protected_Type (P_Type);
  2344.    end Is_Appropriate_For_Entry_Prefix;
  2345.  
  2346.    -------------------------------
  2347.    -- Is_Appropriate_For_Record --
  2348.    -------------------------------
  2349.  
  2350.    function Is_Appropriate_For_Record
  2351.      (T    : Entity_Id)
  2352.       return Boolean
  2353.    is
  2354.       function Has_Components (T1 : Entity_Id) return Boolean;
  2355.       --  Determine if given type has components (i.e. is either a record
  2356.       --  type or a type that has discriminants).
  2357.  
  2358.       function Has_Components (T1 : Entity_Id) return Boolean is
  2359.       begin
  2360.          return Is_Record_Type (T1)
  2361.            or else (Is_Private_Type (T1) and then Has_Discriminants (T1))
  2362.            or else (Is_Task_Type (T1) and then Has_Discriminants (T1));
  2363.       end Has_Components;
  2364.  
  2365.    --  Start of processing for Is_Appropriate_For_Record
  2366.  
  2367.    begin
  2368.       return
  2369.         Present (T)
  2370.           and then (Has_Components (T)
  2371.                       or else (Is_Access_Type (T)
  2372.                                  and then
  2373.                                    Has_Components (Designated_Type (T))));
  2374.    end Is_Appropriate_For_Record;
  2375.  
  2376.    -------------------------
  2377.    -- Find_Renamed_Entity --
  2378.    -------------------------
  2379.  
  2380.    function Find_Renamed_Entity
  2381.      (N     : Node_Id;
  2382.       Nam   : Node_Id;
  2383.       New_S : Entity_Id) return Entity_Id
  2384.    is
  2385.       I     : Interp_Index;
  2386.       I1    : Interp_Index;
  2387.       It    : Interp;
  2388.       It1   : Interp;
  2389.       Old_S : Entity_Id;
  2390.  
  2391.    begin
  2392.       Old_S := Any_Id;
  2393.  
  2394.       if not Is_Overloaded (Nam) then
  2395.          if Entity_Matches_Spec (Entity (Nam), New_S) then
  2396.             Old_S := Entity (Nam);
  2397.          end if;
  2398.  
  2399.       else
  2400.          Get_First_Interp (Nam, I, It);
  2401.  
  2402.          while Present (It.Nam) loop
  2403.  
  2404.             if Entity_Matches_Spec (It.Nam, New_S) then
  2405.                if Old_S /= Any_Id then
  2406.                   It1 := Disambiguate (Nam, I1, I, Etype (Old_S));
  2407.  
  2408.                   if It1 = No_Interp then
  2409.                      Error_Msg_N ("ambiguous renaming", N);
  2410.                      return Old_S;
  2411.                   else
  2412.                      Old_S := It1.Nam;
  2413.                      exit;
  2414.                   end if;
  2415.  
  2416.                else
  2417.                   I1 := I;
  2418.                   Old_S := It.Nam;
  2419.                end if;
  2420.             end if;
  2421.  
  2422.             Get_Next_Interp (I, It);
  2423.          end loop;
  2424.  
  2425.          Set_Entity (Nam, Old_S);
  2426.          Set_Is_Overloaded (Nam, False);
  2427.       end if;
  2428.  
  2429.       return Old_S;
  2430.    end Find_Renamed_Entity;
  2431.  
  2432.    ---------------
  2433.    -- New_Scope --
  2434.    ---------------
  2435.  
  2436.    procedure New_Scope (S : Entity_Id) is
  2437.       E : Entity_Id;
  2438.    begin
  2439.       if Ekind (S) = E_Void then
  2440.          null;
  2441.  
  2442.       elsif not Is_Type (S)
  2443.         or else Is_Concurrent_Type (S)
  2444.       then
  2445.          if S = Standard_Standard then
  2446.             Set_Scope_Depth (S, Uint_0);
  2447.  
  2448.          elsif not Is_Record_Type (Current_Scope) then
  2449.             if Ekind (S) = E_Loop then
  2450.                Set_Scope_Depth (S, Scope_Depth (Current_Scope));
  2451.             else
  2452.                Set_Scope_Depth (S, Scope_Depth (Current_Scope) + 1);
  2453.             end if;
  2454.          end if;
  2455.       end if;
  2456.  
  2457.       Scope_Stack.Increment_Last;
  2458.  
  2459.       Scope_Stack.Table (Scope_Stack.Last).Entity := S;
  2460.  
  2461.       Scope_Stack.Table (Scope_Stack.Last).Save_Scope_Suppress  :=
  2462.         Scope_Suppress;
  2463.  
  2464.       Scope_Stack.Table (Scope_Stack.Last).Save_Entity_Suppress :=
  2465.         Entity_Suppress.Last;
  2466.  
  2467.       Scope_Stack.Table (Scope_Stack.Last).Is_Transient          := False;
  2468.       Scope_Stack.Table (Scope_Stack.Last).Node_To_Be_Wrapped    := Empty;
  2469.       Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Nodes  := No_List;
  2470.       Scope_Stack.Table (Scope_Stack.Last).Actions_To_Be_Wrapped := No_List;
  2471.       Scope_Stack.Table (Scope_Stack.Last).First_Use_Clause      := Empty;
  2472.  
  2473.       if Debug_Flag_W then
  2474.          Write_Str ("--> new scope: ");
  2475.          Write_Name (Chars (Current_Scope));
  2476.          Write_Int (Int (Current_Scope));
  2477.          Write_Eol;
  2478.       end if;
  2479.  
  2480.       --  Copy from Scope (S) the categorization flags to S, this is not
  2481.       --  done in case Scope (S) is Standard_Standard since propagation
  2482.       --  is from library unit entity inwards.
  2483.  
  2484.       if S /= Standard_Standard
  2485.         and then Scope (S) /= Standard_Standard
  2486.         and then not Is_Child_Unit (S)
  2487.       then
  2488.          E := Scope (S);
  2489.  
  2490.          if Nkind (E) not in N_Entity then
  2491.             return;
  2492.          end if;
  2493.  
  2494.          Set_Is_Pure (S, Is_Pure (E));
  2495.          Set_Is_Preelaborated (S, Is_Preelaborated (E));
  2496.          Set_Is_Remote_Call_Interface (S, Is_Remote_Call_Interface (E));
  2497.          Set_Is_Remote_Types (S, Is_Remote_Types (E));
  2498.          Set_Is_Shared_Passive (S, Is_Shared_Passive (E));
  2499.       end if;
  2500.    end New_Scope;
  2501.  
  2502.    ---------------
  2503.    -- Pop_Scope --
  2504.    ---------------
  2505.  
  2506.    procedure Pop_Scope is
  2507.       E : Entity_Id;
  2508.  
  2509.    begin
  2510.       if Debug_Flag_E then
  2511.          Write_Info;
  2512.       end if;
  2513.  
  2514.       Scope_Suppress :=
  2515.         Scope_Stack.Table (Scope_Stack.Last).Save_Scope_Suppress;
  2516.  
  2517.       while Entity_Suppress.Last >
  2518.                  Scope_Stack.Table (Scope_Stack.Last).Save_Entity_Suppress
  2519.       loop
  2520.          E := Entity_Suppress.Table (Entity_Suppress.Last).Entity;
  2521.  
  2522.          case Entity_Suppress.Table (Entity_Suppress.Last).Check is
  2523.  
  2524.             when Access_Check        =>
  2525.                Set_Suppress_Access_Checks        (E, False);
  2526.  
  2527.             when Accessibility_Check =>
  2528.                Set_Suppress_Accessibility_Checks (E, False);
  2529.  
  2530.             when Discriminant_Check  =>
  2531.                Set_Suppress_Discriminant_Checks  (E, False);
  2532.  
  2533.             when Division_Check      =>
  2534.                Set_Suppress_Division_Checks      (E, False);
  2535.  
  2536.             when Elaboration_Check   =>
  2537.                Set_Suppress_Elaboration_Checks   (E, False);
  2538.  
  2539.             when Index_Check         =>
  2540.                Set_Suppress_Index_Checks         (E, False);
  2541.  
  2542.             when Length_Check        =>
  2543.                Set_Suppress_Length_Checks        (E, False);
  2544.  
  2545.             when Overflow_Check      =>
  2546.                Set_Suppress_Overflow_Checks      (E, False);
  2547.  
  2548.             when Range_Check         =>
  2549.                Set_Suppress_Range_Checks         (E, False);
  2550.  
  2551.             when Storage_Check       =>
  2552.                Set_Suppress_Storage_Checks       (E, False);
  2553.  
  2554.             when Tag_Check           =>
  2555.                Set_Suppress_Tag_Checks           (E, False);
  2556.  
  2557.             --  All_Checks should not appear here (since it is entered as a
  2558.             --  series of its separate checks). Bomb if it is encountered
  2559.  
  2560.             when All_Checks =>
  2561.                pragma Assert (False); null;
  2562.          end case;
  2563.  
  2564.          Entity_Suppress.Decrement_Last;
  2565.       end loop;
  2566.  
  2567.       if Debug_Flag_W then
  2568.          Write_Str ("--> exiting scope: ");
  2569.          Write_Name (Chars (Current_Scope));
  2570.          Write_Eol;
  2571.       end if;
  2572.  
  2573.       End_Use_Clauses;
  2574.  
  2575.       --  If the actions to be wrapped are still there they will get lost
  2576.       --  causing incomplete code to be generated. It is better to abort in
  2577.       --  this case.
  2578.  
  2579.       pragma Assert (
  2580.         Scope_Stack.Table (Scope_Stack.Last).Actions_To_Be_Wrapped = No_List);
  2581.  
  2582.       Scope_Stack.Decrement_Last;
  2583.    end Pop_Scope;
  2584.  
  2585.    -------------------------
  2586.    -- Restore_Scope_Stack --
  2587.    -------------------------
  2588.  
  2589.    procedure Restore_Scope_Stack is
  2590.       E : Entity_Id;
  2591.       S : Entity_Id;
  2592.  
  2593.    begin
  2594.       --  Restore visibility of previous scope stack, if any.
  2595.  
  2596.       for J in reverse 0 .. Scope_Stack.Last loop
  2597.          exit when  Scope_Stack.Table (J).Entity = Standard_Standard
  2598.             or else No (Scope_Stack.Table (J).Entity);
  2599.  
  2600.          S := Scope_Stack.Table (J).Entity;
  2601.          Set_Is_Immediately_Visible (S, True);
  2602.          E := First_Entity (S);
  2603.  
  2604.          while Present (E) loop
  2605.             Set_Is_Immediately_Visible (E, True);
  2606.             E := Next_Entity (E);
  2607.          end loop;
  2608.       end loop;
  2609.    end Restore_Scope_Stack;
  2610.  
  2611.    ----------------------
  2612.    -- Save_Scope_Stack --
  2613.    ----------------------
  2614.  
  2615.    procedure Save_Scope_Stack is
  2616.       E       : Entity_Id;
  2617.       S       : Entity_Id;
  2618.       SS_Last : constant Int := Scope_Stack.Last;
  2619.  
  2620.    begin
  2621.  
  2622.       if SS_Last >= Scope_Stack.First
  2623.         and then Scope_Stack.Table (SS_Last).Entity /= Standard_Standard
  2624.       then
  2625.  
  2626.          --  If the call is from within a compilation unit, as when
  2627.          --  called from Rtsfind,  make current entries in scope stack
  2628.          --  invisible while we analyze the new unit.
  2629.  
  2630.          for J in reverse 0 .. SS_Last loop
  2631.             exit when  Scope_Stack.Table (J).Entity = Standard_Standard
  2632.                or else No (Scope_Stack.Table (J).Entity);
  2633.  
  2634.             S := Scope_Stack.Table (J).Entity;
  2635.             Set_Is_Immediately_Visible (S, False);
  2636.             E := First_Entity (S);
  2637.  
  2638.             while Present (E) loop
  2639.                Set_Is_Immediately_Visible (E, False);
  2640.                E := Next_Entity (E);
  2641.             end loop;
  2642.          end loop;
  2643.  
  2644.       end if;
  2645.    end Save_Scope_Stack;
  2646.  
  2647.    -------------
  2648.    -- Set_Use --
  2649.    -------------
  2650.  
  2651.    procedure Set_Use (L : List_Id) is
  2652.       Decl      : Node_Id;
  2653.       Pack_Name : Node_Id;
  2654.       Pack      : Entity_Id;
  2655.       Id        : Entity_Id;
  2656.  
  2657.    begin
  2658.       if Present (L) then
  2659.          Decl := First (L);
  2660.  
  2661.          while Present (Decl) loop
  2662.             if Nkind (Decl) = N_Use_Package_Clause then
  2663.                Chain_Use_Clause (Decl);
  2664.                Pack_Name := First (Names (Decl));
  2665.  
  2666.                while Present (Pack_Name) loop
  2667.                   Pack := Entity (Pack_Name);
  2668.  
  2669.                   if Ekind (Pack) = E_Package then
  2670.                      if In_Open_Scopes (Pack) then
  2671.                         null;
  2672.  
  2673.                      elsif not In_Use (Pack) then
  2674.                         Use_One_Package (Pack);
  2675.  
  2676.                      else
  2677.                         Set_Redundant_Use (Pack_Name, True);
  2678.                      end if;
  2679.                   end if;
  2680.  
  2681.                   Pack_Name := Next (Pack_Name);
  2682.                end loop;
  2683.  
  2684.             elsif Nkind (Decl) = N_Use_Type_Clause  then
  2685.                Chain_Use_Clause (Decl);
  2686.                Id := First (Subtype_Marks (Decl));
  2687.  
  2688.                while Present (Id) loop
  2689.                   if Entity (Id) /= Any_Type then
  2690.                      Set_Is_Potentially_Use_Visible (Entity (Id),  True);
  2691.  
  2692.                      --  If Id is a first-named subtype, indicate that
  2693.                      --  anonymous parent is also potentially use visible,
  2694.                      --  so that operators become accessible.
  2695.  
  2696.                      if not Comes_From_Source (Base_Type (Entity (Id))) then
  2697.                         Set_Is_Potentially_Use_Visible
  2698.                           (Base_Type (Entity (Id)));
  2699.                      end if;
  2700.  
  2701.                   end if;
  2702.  
  2703.                   Id := Next (Id);
  2704.                end loop;
  2705.             end if;
  2706.  
  2707.             Decl := Next (Decl);
  2708.          end loop;
  2709.       end if;
  2710.  
  2711.    end Set_Use;
  2712.  
  2713.    ---------------------
  2714.    -- Use_One_Package --
  2715.    ---------------------
  2716.  
  2717.    procedure Use_One_Package (P : Entity_Id) is
  2718.       Id   : Entity_Id;
  2719.       Prev : Entity_Id;
  2720.  
  2721.    begin
  2722.       Set_In_Use (P);
  2723.  
  2724.       --  If unit is a package renaming, indicate that the renamed
  2725.       --  package is also in use (the flags on both entities must
  2726.       --  remain consistent, and a subsequent use of either of them
  2727.       --  should be recognized as redundant).
  2728.  
  2729.       if Present (Renamed_Object (P)) then
  2730.          Set_In_Use (Renamed_Object (P));
  2731.       end if;
  2732.  
  2733.       --  Loop through entities in one package making them potentially
  2734.       --  use-visible.
  2735.  
  2736.       Id := First_Entity (P);
  2737.       while Present (Id)
  2738.         and then Id /= First_Private_Entity (P)
  2739.       loop
  2740.          Prev := Current_Entity (Id);
  2741.  
  2742.          while Present (Prev) loop
  2743.             if Is_Immediately_Visible (Prev)
  2744.               and then (not Is_Overloadable (Prev)
  2745.                          or else not Is_Overloadable (Id)
  2746.                          or else (Type_Conformant (Id, Prev)))
  2747.             then
  2748.                --  Potentially use-visible entity remains hidden
  2749.  
  2750.                goto Next_Usable_Entity;
  2751.             end if;
  2752.             Prev := Homonym (Prev);
  2753.          end loop;
  2754.  
  2755.          --  On exit, we know entity is not hidden, unless it is private.
  2756.  
  2757.          if not Is_Private (Id) then
  2758.             Set_Is_Potentially_Use_Visible (Id);
  2759.          end if;
  2760.  
  2761.          <<Next_Usable_Entity>>
  2762.             Id := Next_Entity (Id);
  2763.       end loop;
  2764.  
  2765.       --  Child units are also made use-visible by a use clause, but they
  2766.       --  may appear after all visible declarations in the parent entity list.
  2767.  
  2768.       while Present (Id) loop
  2769.  
  2770.          if Is_Child_Unit (Id) then
  2771.             Set_Is_Potentially_Use_Visible (Id);
  2772.          end if;
  2773.  
  2774.          Id := Next_Entity (Id);
  2775.       end loop;
  2776.  
  2777.    end Use_One_Package;
  2778.  
  2779.    ----------------
  2780.    -- Write_Info --
  2781.    ----------------
  2782.  
  2783.    procedure Write_Info is
  2784.       Id : Entity_Id := First_Entity (Current_Scope);
  2785.  
  2786.    begin
  2787.       --  No point in dumping standard entities
  2788.  
  2789.       if Current_Scope = Standard_Standard then
  2790.          return;
  2791.       end if;
  2792.  
  2793.       Write_Str ("========================================================");
  2794.       Write_Eol;
  2795.       Write_Str ("        Defined Entities in ");
  2796.       Write_Name (Chars (Current_Scope));
  2797.       Write_Eol;
  2798.       Write_Str ("========================================================");
  2799.       Write_Eol;
  2800.  
  2801.       if No (Id) then
  2802.          Write_Str ("-- none --");
  2803.          Write_Eol;
  2804.  
  2805.       else
  2806.          while Present (Id) loop
  2807.             Write_Entity_Info (Id, " ");
  2808.             Id := Next_Entity (Id);
  2809.          end loop;
  2810.       end if;
  2811.  
  2812.       if Scope (Current_Scope) = Standard_Standard then
  2813.  
  2814.          --  Print information on the current unit itself
  2815.  
  2816.          Write_Entity_Info (Current_Scope, " ");
  2817.       end if;
  2818.  
  2819.       Write_Eol;
  2820.    end Write_Info;
  2821.  
  2822. end Sem_Ch8;
  2823.