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_ch4.adb < prev    next >
Text File  |  1996-09-28  |  90KB  |  2,829 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              S E M _ C H 4                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.319 $                            --
  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 Atree;    use Atree;
  26. with Debug;    use Debug;
  27. with Einfo;    use Einfo;
  28. with Errout;   use Errout;
  29. with Exp_Ch4;  use Exp_Ch4;
  30. with Exp_Util;  use Exp_Util;
  31. with Itypes;   use Itypes;
  32. with Namet;    use Namet;
  33. with Nlists;   use Nlists;
  34. with Nmake;    use Nmake;
  35. with Opt;      use Opt;
  36. with Output;   use Output;
  37. with Sem;      use Sem;
  38. with Sem_Ch3;  use Sem_Ch3;
  39. with Sem_Ch8;  use Sem_Ch8;
  40. with Sem_Dist; use Sem_Dist;
  41. with Sem_Res;  use Sem_Res;
  42. with Sem_Util; use Sem_Util;
  43. with Sem_Type; use Sem_Type;
  44. with Stand;    use Stand;
  45. with Sinfo;    use Sinfo;
  46. with Sinfo.CN; use Sinfo.CN;
  47. with Snames;   use Snames;
  48. with Tbuild;   use Tbuild;
  49.  
  50. package body Sem_Ch4 is
  51.  
  52.    -----------------------
  53.    -- Local Subprograms --
  54.    -----------------------
  55.  
  56.    procedure Analyze_Expression (N : Node_Id);
  57.    --  Used when a name in an expression context may need "deproceduring".
  58.    --  For expressions that are not names, this is just a call to analyze.
  59.    --  If the expression is a name, it may be a call to a parameterless
  60.    --  procedure, and if so must be converted into an explicit call node
  61.    --  and analyzed as such. Its use may be redundant with the code in sem_res,
  62.    --  but some bug reports suggest the need for this in the first pass of
  63.    --  overload resolution. Candidate for removal ???
  64.  
  65.    procedure Analyze_Operator_Call (N : Node_Id; Op_Id : Entity_Id);
  66.    --  Analyze a call of the form "+"(x, y), etc. The prefix of the call
  67.    --  is an operator name or an expanded name whose selector is an operator
  68.    --  name, and one possible interpretation is as a predefined operator.
  69.  
  70.    procedure Analyze_Overloaded_Selected_Component (N : Node_Id);
  71.    --  If the prefix of a selected_component is overloaded, the proper
  72.    --  interpretation that yields a record type with the proper selector
  73.    --  name must be selected.
  74.  
  75.    procedure Analyze_User_Defined_Binary_Op (N : Node_Id; Op_Id : Entity_Id);
  76.    --  Procedure to analyze a user defined binary operator, which is resolved
  77.    --  like a function, but instead of a list of actuals it is presented
  78.    --  with the left and right operands of an operator node.
  79.  
  80.    procedure Analyze_User_Defined_Unary_Op (N : Node_Id; Op_Id : Entity_Id);
  81.    --  Procedure to analyze a user defined unary operator, which is resolved
  82.    --  like a function, but instead of a list of actuals, it is presented with
  83.    --  the operand of the operator node.
  84.  
  85.    procedure Insert_Explicit_Dereference (N : Node_Id);
  86.    --  In a context that requires a composite or subprogram type and
  87.    --  where a prefix is an access type, insert an explicit dereference.
  88.  
  89.    procedure Analyze_One_Call (N : Node_Id; Nam : Entity_Id; Report : Boolean);
  90.    --  Check one interpretation of an overloaded subprogram name
  91.    --  for compatibility with the types of the actuals in a call.
  92.    --  If there is a single interpretation which does not match,
  93.    --  report error if Report is set to True.
  94.  
  95.    procedure Find_Arithmetic_Types
  96.      (L, R  : Node_Id;
  97.       Op_Id : Entity_Id;
  98.       N     : Node_Id);
  99.    --  L and R are the operands of an arithmetic operator. Find
  100.    --  consistent pairs of interpretations for L and R that have a
  101.    --  numeric type consistent with the semantics of the operator.
  102.  
  103.    procedure Find_Comparison_Types
  104.      (L, R  : Node_Id;
  105.       Op_Id : Entity_Id;
  106.       N     : Node_Id);
  107.    --  L and R are operands of a comparison operator. Find consistent
  108.    --  pairs of interpretations for L and R.
  109.  
  110.    procedure Find_Concatenation_Types
  111.      (L, R  : Node_Id;
  112.       Op_Id : Entity_Id;
  113.       N     : Node_Id);
  114.    --  For the four varieties of concatenation.
  115.  
  116.    procedure Find_Equality_Types
  117.      (L, R  : Node_Id;
  118.       Op_Id : Entity_Id;
  119.       N     : Node_Id);
  120.    --  Ditto for equality operators.
  121.  
  122.    procedure Find_Boolean_Types
  123.      (L, R  : Node_Id;
  124.       Op_Id : Entity_Id;
  125.       N     : Node_Id);
  126.    --  Ditto for binary logical operations.
  127.  
  128.    procedure Find_Negation_Types
  129.      (R     : Node_Id;
  130.       Op_Id : Entity_Id;
  131.       N     : Node_Id);
  132.    --  Find consistent interpretation for operand of negation operator.
  133.  
  134.    procedure Find_Unary_Types
  135.      (R     : Node_Id;
  136.       Op_Id : Entity_Id;
  137.       N     : Node_Id);
  138.    --  Unary arithmetic types: plus, minus, abs.
  139.  
  140.    procedure Check_Arithmetic_Pair
  141.      (T1, T2 : Entity_Id;
  142.       Op_Id  : Entity_Id;
  143.       N      : Node_Id);
  144.    --  Subsidiary procedure to Find_Arithmetic_Types. T1 and T2 are valid
  145.    --  types for left and right operand. Determine whether they constitute
  146.    --  a valid pair for the given operator, and record the corresponding
  147.    --  interpretation of the operator node. The node N may be an operator
  148.    --  node (the usual case) or a function call whose prefix is an operator
  149.    --  designator. In  both cases Op_Id is the operator name itself.
  150.  
  151.    procedure Operator_Check (N : Node_Id);
  152.    --  Verify that an operator has received some valid interpretation.
  153.    --  If none was found, determine whether a use clause would make the
  154.    --  operation legal. The variable Candidate_Type (defined in Sem_Type) is
  155.    --  set for every type compatible with the operator, even if the operator
  156.    --  for the type is not directly visible. The routine uses this type to emit
  157.    --  a more informative message.
  158.  
  159.    procedure Rewrite_Operator_As_Call (N : Node_Id; Nam : Entity_Id);
  160.    --  If an operator node resolves to a call to a user-defined operator,
  161.    --  rewrite the node as a function call.
  162.  
  163.    function Try_Indexed_Call
  164.      (N      : Node_Id;
  165.       Nam    : Entity_Id;
  166.       Typ    : Entity_Id)
  167.       return   Boolean;
  168.    --  If a function has defaults for all its actuals, a call to it may
  169.    --  in fact be an indexing on the result of the call. Try_Indexed_Call
  170.    --  attempts the interpretation as an indexing, prior to analysis as
  171.    --  a call. If both are possible,  the node is overloaded with both
  172.    --  interpretations (same symbol but two different types).
  173.  
  174.    -----------------------
  175.    -- Analyze_Aggregate --
  176.    -----------------------
  177.  
  178.    --  Most of the analysis of Aggregates requires that the type is known,
  179.    --  and is therefore put off until resolution.  A little processing
  180.    --  common to all aggregates and not requiring the type information
  181.    --  is done here. Specifically, a check is made that if an `others =>'
  182.    --  choice is present, it stands by itself and is in the last association.
  183.    --  If this is not the case the `Etype' of the aggregate is set to
  184.    --  `Any_Type' rather then `Any_Composite'. By looking at the `Etype' of
  185.    --  an aggregate, procedures invoked during resolution can check whether
  186.    --  the aggregate is correct in that respect.
  187.  
  188.    procedure Analyze_Aggregate (N : Node_Id) is
  189.       Choice       : Node_Id;
  190.       Expr         : Node_Id;
  191.       Association  : Node_Id;
  192.  
  193.    begin
  194.       Set_Etype (N, Any_Composite);
  195.  
  196.       if Nkind (N) = N_Extension_Aggregate then
  197.          Analyze (Ancestor_Part (N));
  198.       end if;
  199.  
  200.       --  All the component expressions are analyzed.  Here the positional
  201.       --  components are analyzed in a simple loop.
  202.  
  203.       if Present (Expressions (N)) then
  204.          Expr := First (Expressions (N));
  205.          while Present (Expr) loop
  206.             Analyze (Expr);
  207.             Expr := Next (Expr);
  208.          end loop;
  209.       end if;
  210.  
  211.       --  Two things are done while looping over the components association
  212.       --  list:  the expressions are analyzed (as above for the positional
  213.       --  components);  and a check is made that if an others choice is
  214.       --  present, it stands by itself and is in the last association.
  215.  
  216.       if Present (Component_Associations (N)) then
  217.          Association := First (Component_Associations (N));
  218.          while Present (Association) loop
  219.             Analyze (Expression (Association));
  220.  
  221.             Choice := First (Choices (Association));
  222.             while Present (Choice) loop
  223.                if Nkind (Choice) = N_Others_Choice then
  224.                   if Choice /= First (Choices (Association)) or else
  225.                     Present (Next (Choice)) then
  226.                      Error_Msg_N ("OTHERS must appear alone in a choice list",
  227.                                   Choice);
  228.                      Set_Etype (N, Any_Type);
  229.                   end if;
  230.  
  231.                   if Present (Next (Association)) then
  232.                      Error_Msg_N ("OTHERS must appear last in an aggregate",
  233.                                   Choice);
  234.                      Set_Etype (N, Any_Type);
  235.                   end if;
  236.                end if;
  237.  
  238.                Choice := Next (Choice);
  239.             end loop;
  240.  
  241.             Association := Next (Association);
  242.          end loop;
  243.       end if;
  244.    end Analyze_Aggregate;
  245.  
  246.    -----------------------
  247.    -- Analyze_Allocator --
  248.    -----------------------
  249.  
  250.    procedure Analyze_Allocator (N : Node_Id) is
  251.       Loc      : constant Source_Ptr := Sloc (N);
  252.       E        : Node_Id := Expression (N);
  253.       Acc_Type : Entity_Id;
  254.       Type_Id  : Entity_Id;
  255.  
  256.    begin
  257.       if Nkind (E) = N_Qualified_Expression then
  258.          Acc_Type := New_Itype (E_Allocator_Type, N);
  259.          Set_Etype (Acc_Type, Acc_Type);
  260.          Find_Type (Subtype_Mark (E));
  261.          Type_Id := Entity (Subtype_Mark (E));
  262.          Set_Directly_Designated_Type (Acc_Type, Type_Id);
  263.  
  264.          if Is_Limited_Type (Type_Id) then
  265.             Error_Msg_N ("initialization not allowed for limited types", N);
  266.          end if;
  267.  
  268.          Analyze (Expression (E));
  269.          Set_Etype  (E, Type_Id);
  270.  
  271.       else
  272.          declare
  273.             Def_Id       : Entity_Id;
  274.  
  275.          begin
  276.             --  If the allocator includes a N_Subtype_Indication then a
  277.             --  constraint is present, otherwise the node is a subtype mark.
  278.             --  Introduce an explicit subtype declaration into the tree
  279.             --  defining some anonymous subtype and rewrite the allocator to
  280.             --  use this subtype rather than the subtype indication.
  281.  
  282.             --  It is important to introduce the explicit subtype declaration
  283.             --  so that the bounds of the subtype indication are attached to
  284.             --  the tree in case the allocator is inside a generic unit.
  285.  
  286.             if Nkind (E) = N_Subtype_Indication then
  287.  
  288.                --  A constraint is only allowed for a composite type in Ada
  289.                --  9X.  In Ada 83, a constraint is also allowed for an
  290.                --  access-to-composite type, but the constraint is ignored.
  291.  
  292.                Find_Type (Subtype_Mark (E));
  293.                if Is_Elementary_Type (Entity (Subtype_Mark (E))) then
  294.                   if not (Ada_83 and then
  295.                           Is_Access_Type (Entity (Subtype_Mark (E)))) then
  296.                      Error_Msg_N ("constraint not allowed here", E);
  297.                   end if;
  298.                   --  Get rid of the bogus constraint:
  299.                   Rewrite_Substitute_Tree (E,
  300.                                            New_Copy_Tree (Subtype_Mark (E)));
  301.                   Analyze_Allocator (N);
  302.                   return;
  303.                end if;
  304.  
  305.                if not In_Default_Expression then
  306.                   Def_Id :=
  307.                     Make_Defining_Identifier (Loc, New_Internal_Name ('S'));
  308.  
  309.                   Insert_Action (E,
  310.                     Make_Subtype_Declaration (Loc,
  311.                       Defining_Identifier => Def_Id,
  312.                       Subtype_Indication  => Relocate_Node (E)));
  313.  
  314.                   E := New_Occurrence_Of (Def_Id, Loc);
  315.                   Rewrite_Substitute_Tree (Expression (N), E);
  316.                end if;
  317.             end if;
  318.  
  319.             Type_Id := Process_Subtype (E, N);
  320.             Acc_Type := New_Itype (E_Allocator_Type, N);
  321.             Set_Etype (Acc_Type, Acc_Type);
  322.             Set_Directly_Designated_Type (Acc_Type, Type_Id);
  323.             Check_Fully_Declared (Type_Id, N);
  324.  
  325.             if Is_Indefinite_Subtype (Type_Id) then
  326.                if Is_Class_Wide_Type (Type_Id) then
  327.                   Error_Msg_N
  328.                     ("initialization required in class-wide allocation", N);
  329.                else
  330.                   Error_Msg_N
  331.                     ("initialization required in unconstrained allocation", N);
  332.                end if;
  333.             end if;
  334.          end;
  335.       end if;
  336.  
  337.       if Is_Abstract (Type_Id) then
  338.          Error_Msg_N ("cannot allocate abstract object", E);
  339.       end if;
  340.  
  341.       Set_Etype (N, Acc_Type);
  342.    end Analyze_Allocator;
  343.  
  344.    ---------------------------
  345.    -- Analyze_Arithmetic_Op --
  346.    ---------------------------
  347.  
  348.    procedure Analyze_Arithmetic_Op (N : Node_Id) is
  349.       L     : constant Node_Id := Left_Opnd (N);
  350.       R     : constant Node_Id := Right_Opnd (N);
  351.       Op_Id : Entity_Id;
  352.  
  353.    begin
  354.       Candidate_Type := Empty;
  355.       Analyze_Expression (L);
  356.       Analyze_Expression (R);
  357.  
  358.       --  If the entity is already set, the node is the instantiation of
  359.       --  a generic node with a non-local reference, or was manufactured
  360.       --  by a call to Make_Op_xxx. In either case the entity is known to
  361.       --  be valid, and we do not need to collect interpretations, instead
  362.       --  we just get the single possible interpretation.
  363.  
  364.       Op_Id := Entity (N);
  365.  
  366.       if Present (Op_Id) then
  367.          if Ekind (Op_Id) = E_Operator then
  368.  
  369.             if (Nkind (N) = N_Op_Divide   or else
  370.                 Nkind (N) = N_Op_Mod      or else
  371.                 Nkind (N) = N_Op_Multiply or else
  372.                 Nkind (N) = N_Op_Rem)
  373.               and then Treat_Fixed_As_Integer (N)
  374.             then
  375.                null;
  376.             else
  377.                Set_Etype (N, Any_Type);
  378.                Find_Arithmetic_Types (L, R, Op_Id, N);
  379.             end if;
  380.  
  381.          else
  382.             Set_Etype (N, Any_Type);
  383.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  384.          end if;
  385.  
  386.       --  Entity is not already set, so we do need to collect interpretations
  387.  
  388.       else
  389.          Op_Id := Get_Name_Entity_Id (Chars (N));
  390.          Set_Etype (N, Any_Type);
  391.  
  392.          while Present (Op_Id) loop
  393.             if Ekind (Op_Id) = E_Operator
  394.               and then Present (Next_Entity (First_Entity (Op_Id)))
  395.             then
  396.                Find_Arithmetic_Types (L, R, Op_Id, N);
  397.             else
  398.                Analyze_User_Defined_Binary_Op (N, Op_Id);
  399.             end if;
  400.  
  401.             Op_Id := Homonym (Op_Id);
  402.          end loop;
  403.       end if;
  404.  
  405.       Operator_Check (N);
  406.    end Analyze_Arithmetic_Op;
  407.  
  408.    ------------------
  409.    -- Analyze_Call --
  410.    ------------------
  411.  
  412.    --  Function, procedure, and entry calls are checked here. E is the prefix
  413.    --  of the call (which may be overloaded). The actuals have been analyzed
  414.    --  and may themselves be overloaded. On exit from this procedure, the node
  415.    --  N may have zero, one or more interpretations. In the first case an error
  416.    --  message is produced. In the last case, the node is flagged as overloaded
  417.    --  and the interpretations are collected in All_Interp.
  418.  
  419.    --  If the prefix is an Access_To_Subprogram, it cannot be overloaded, but
  420.    --  the type-checking is similar to that of other calls.
  421.  
  422.    procedure Analyze_Call (N : Node_Id) is
  423.       Actuals : constant List_Id := Parameter_Associations (N);
  424.       Nam     : Node_Id := Name (N);
  425.       X       : Interp_Index;
  426.       It      : Interp;
  427.       Nam_Ent : Entity_Id;
  428.       Found   : Boolean := False;
  429.  
  430.       function Name_Denotes_Function return Boolean;
  431.       --  If the type of the name is an access to subprogram, this may be
  432.       --  the type of a name, or the return type of the function being called.
  433.       --  If the name is not an entity then it can denote a protected function.
  434.       --  Until we distinguish Etype from Return_Type, we must use this
  435.       --  routine to resolve the meaning of the name in the call.
  436.  
  437.       pragma Inline (Name_Denotes_Function);
  438.  
  439.       function Name_Denotes_Function return Boolean is
  440.       begin
  441.          if Is_Entity_Name (Nam) then
  442.             return Ekind (Entity (Nam)) = E_Function;
  443.  
  444.          elsif Nkind (Nam) = N_Selected_Component then
  445.             return Ekind (Entity (Selector_Name (Nam))) = E_Function;
  446.          else
  447.  
  448.             return False;
  449.          end if;
  450.       end Name_Denotes_Function;
  451.  
  452.    begin
  453.       --  Initialize the type of the result of the call to the error type,
  454.       --  which will be reset if the type is successfully resolved.
  455.  
  456.       Set_Etype (N, Any_Type);
  457.  
  458.       if not Is_Overloaded (Nam) then
  459.  
  460.          --  Only one interpretation to check
  461.  
  462.          if Ekind (Etype (Nam)) = E_Subprogram_Type then
  463.             Nam_Ent := Etype (Nam);
  464.  
  465.          elsif Is_Access_Type (Etype (Nam))
  466.            and then Ekind (Designated_Type (Etype (Nam))) = E_Subprogram_Type
  467.            and then not Name_Denotes_Function
  468.          then
  469.             Nam_Ent := Designated_Type (Etype (Nam));
  470.             Insert_Explicit_Dereference (Nam);
  471.  
  472.          --  Selected component case. Simple entry or protected operation,
  473.          --  where the entry name is given by the selector name.
  474.  
  475.          elsif Nkind (Nam) = N_Selected_Component then
  476.             Nam_Ent := Entity (Selector_Name (Nam));
  477.  
  478.          --  Indexed component case, Nam denotes an element of an entry family.
  479.          --  The prefix of Nam is known to be a selected component by now.
  480.  
  481.          elsif Nkind (Nam) = N_Indexed_Component then
  482.             Nam_Ent := Entity (Selector_Name (Prefix (Nam)));
  483.  
  484.          else
  485.             Nam_Ent := Entity (Nam);
  486.  
  487.             --  If no interpretations, give error message
  488.  
  489.             if not Is_Overloadable (Nam_Ent) then
  490.                declare
  491.                   L : constant Boolean   := Is_List_Member (N);
  492.                   K : constant Node_Kind := Nkind (Parent (N));
  493.  
  494.                begin
  495.                   --  If the node is in a list whose parent is not an
  496.                   --  expression then it must be an attempted procedure call.
  497.  
  498.                   if L and then K not in N_Subexpr then
  499.                      Error_Msg_N
  500.                        ("procedure or entry name expected", Nam);
  501.  
  502.                   --  Check for tasking cases where only an entry call will do
  503.  
  504.                   elsif not L
  505.                     and then (K = N_Entry_Call_Alternative
  506.                                or else K = N_Triggering_Alternative)
  507.                   then
  508.                      Error_Msg_N ("entry name expected", Nam);
  509.  
  510.                   --  Otherwise give general error message
  511.  
  512.                   else
  513.                      Error_Msg_N ("invalid prefix in call", Nam);
  514.                   end if;
  515.  
  516.                   return;
  517.                end;
  518.             end if;
  519.          end if;
  520.  
  521.          Analyze_One_Call (N, Nam_Ent, True);
  522.  
  523.       else
  524.          --  An overloaded selected component must denote overloaded
  525.          --  operations of a concurrent type. The interpretations are
  526.          --  attached to the simple name of those operations.
  527.  
  528.          if Nkind (Nam) = N_Selected_Component then
  529.             Nam := Selector_Name (Nam);
  530.          end if;
  531.  
  532.          Get_First_Interp (Nam, X, It);
  533.  
  534.          while Present (It.Nam) loop
  535.             Nam_Ent := It.Nam;
  536.  
  537.             --  Name may be call that returns an access to subprogram, or more
  538.             --  generally an overloaded expression one of whose interpretations
  539.             --  yields an access to subprogram.
  540.  
  541.             if Is_Access_Type (Nam_Ent) then
  542.                Nam_Ent := Designated_Type (Nam_Ent);
  543.  
  544.             elsif Is_Access_Type (Etype (Nam_Ent))
  545.               and then not Is_Entity_Name (Nam)
  546.               and then Nkind (Nam) /= N_Operator_Symbol
  547.               and then Ekind (Designated_Type (Etype (Nam_Ent)))
  548.                                                           = E_Subprogram_Type
  549.               and then (not Is_Entity_Name (Nam))
  550.             then
  551.                Nam_Ent := Designated_Type (Etype (Nam_Ent));
  552.             end if;
  553.  
  554.             Analyze_One_Call (N, Nam_Ent, False);
  555.             Get_Next_Interp (X, It);
  556.          end loop;
  557.  
  558.          --  If the name is the result of a function call, it can only
  559.          --  be a call to a function returning an access to subprogram.
  560.          --  Insert explicit dereference.
  561.  
  562.          if Nkind (Nam) = N_Function_Call then
  563.             Insert_Explicit_Dereference (Nam);
  564.          end if;
  565.  
  566.          if Etype (N) = Any_Type then
  567.  
  568.             --  None of the interpretations is compatible with the actuals
  569.  
  570.             Error_Msg_N ("invalid parameter list in call!", Nam);
  571.  
  572.             --  Special checks for uninstantiated put routines
  573.  
  574.             if Nkind (N) = N_Procedure_Call_Statement
  575.               and then Is_Entity_Name (Nam)
  576.               and then Chars (Nam) = Name_Put
  577.               and then List_Length (Actuals) = 1
  578.             then
  579.                declare
  580.                   Arg : constant Node_Id := First (Actuals);
  581.                   Typ : Entity_Id;
  582.  
  583.                begin
  584.                   if Nkind (Arg) = N_Parameter_Association then
  585.                      Typ := Etype (Explicit_Actual_Parameter (Arg));
  586.                   else
  587.                      Typ := Etype (Arg);
  588.                   end if;
  589.  
  590.                   if Is_Signed_Integer_Type (Typ) then
  591.                      Error_Msg_N
  592.                        ("possible missing instantiation of " &
  593.                           "'Text_'I'O.'Integer_'I'O!", Nam);
  594.  
  595.                   elsif Is_Modular_Integer_Type (Typ) then
  596.                      Error_Msg_N
  597.                        ("possible missing instantiation of " &
  598.                           "'Text_'I'O.'Modular_'I'O!", Nam);
  599.  
  600.                   elsif Is_Floating_Point_Type (Typ) then
  601.                      Error_Msg_N
  602.                        ("possible missing instantiation of " &
  603.                           "'Text_'I'O.'Float_'I'O!", Nam);
  604.  
  605.                   elsif Is_Ordinary_Fixed_Point_Type (Typ) then
  606.                      Error_Msg_N
  607.                        ("possible missing instantiation of " &
  608.                           "'Text_'I'O.'Fixed_'I'O!", Nam);
  609.  
  610.                   elsif Is_Decimal_Fixed_Point_Type (Typ) then
  611.                      Error_Msg_N
  612.                        ("possible missing instantiation of " &
  613.                           "'Text_'I'O.'Decimal_'I'O!", Nam);
  614.  
  615.                   elsif Is_Enumeration_Type (Typ) then
  616.                      Error_Msg_N
  617.                        ("possible missing instantiation of " &
  618.                           "'Text_'I'O.'Enumeration_'I'O!", Nam);
  619.                   end if;
  620.                end;
  621.             end if;
  622.  
  623.          elsif not Is_Overloaded (N)
  624.            and then Is_Entity_Name (Nam)
  625.          then
  626.             --  Resolution yields a single interpretation. Verify that
  627.             --  is has the proper capitalization.
  628.  
  629.             Set_Entity_With_Style_Check (Nam, Entity (Nam));
  630.             Set_Etype (Nam, Etype (Entity (Nam)));
  631.          end if;
  632.  
  633.          End_Interp_List;
  634.       end if;
  635.    end Analyze_Call;
  636.  
  637.    ---------------------------
  638.    -- Analyze_Comparison_Op --
  639.    ---------------------------
  640.  
  641.    procedure Analyze_Comparison_Op (N : Node_Id) is
  642.       L     : constant Node_Id := Left_Opnd (N);
  643.       R     : constant Node_Id := Right_Opnd (N);
  644.       Op_Id : Entity_Id        := Entity (N);
  645.  
  646.    begin
  647.       Set_Etype (N, Any_Type);
  648.       Candidate_Type := Empty;
  649.  
  650.       Analyze_Expression (L);
  651.       Analyze_Expression (R);
  652.  
  653.       if Present (Op_Id) then
  654.  
  655.          if Ekind (Op_Id) = E_Operator then
  656.             Find_Comparison_Types (L, R, Op_Id, N);
  657.          else
  658.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  659.          end if;
  660.  
  661.       else
  662.          Op_Id := Get_Name_Entity_Id (Chars (N));
  663.  
  664.          while Present (Op_Id) loop
  665.  
  666.             if Ekind (Op_Id) = E_Operator then
  667.                Find_Comparison_Types (L, R, Op_Id, N);
  668.             else
  669.                Analyze_User_Defined_Binary_Op (N, Op_Id);
  670.             end if;
  671.  
  672.             Op_Id := Homonym (Op_Id);
  673.          end loop;
  674.       end if;
  675.  
  676.       Operator_Check (N);
  677.    end Analyze_Comparison_Op;
  678.  
  679.    ---------------------------
  680.    -- Analyze_Concatenation --
  681.    ---------------------------
  682.  
  683.    --  If the only one-dimensional array type in scope is String,
  684.    --  this is the resulting type of the operation. Otherwise there
  685.    --  will be a concatenation operation defined for each user-defined
  686.    --  one-dimensional array.
  687.  
  688.    procedure Analyze_Concatenation (N : Node_Id) is
  689.       L     : constant Node_Id := Left_Opnd (N);
  690.       R     : constant Node_Id := Right_Opnd (N);
  691.       Op_Id : Entity_Id := Entity (N);
  692.  
  693.    begin
  694.       Set_Etype (N, Any_Type);
  695.       Candidate_Type := Empty;
  696.  
  697.       Analyze_Expression (L);
  698.       Analyze_Expression (R);
  699.  
  700.       if Present (Op_Id) then
  701.          if Ekind (Op_Id) = E_Operator then
  702.             Find_Concatenation_Types (L, R, Op_Id, N);
  703.          else
  704.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  705.          end if;
  706.  
  707.       else
  708.          Op_Id  := Get_Name_Entity_Id (Name_Op_Concat);
  709.  
  710.          while Present (Op_Id) loop
  711.             if Ekind (Op_Id) = E_Operator then
  712.                Find_Concatenation_Types (L, R, Op_Id, N);
  713.             else
  714.                Analyze_User_Defined_Binary_Op (N, Op_Id);
  715.             end if;
  716.  
  717.             Op_Id := Homonym (Op_Id);
  718.          end loop;
  719.       end if;
  720.  
  721.       Operator_Check (N);
  722.    end Analyze_Concatenation;
  723.  
  724.    ------------------------------------
  725.    -- Analyze_Conditional_Expression --
  726.    ------------------------------------
  727.  
  728.    procedure Analyze_Conditional_Expression (N : Node_Id) is
  729.       Condition : constant Node_Id := First (Expressions (N));
  730.       Then_Expr : constant Node_Id := Next (Condition);
  731.       Else_Expr : constant Node_Id := Next (Then_Expr);
  732.  
  733.    begin
  734.       Analyze_Expression (Condition);
  735.       Analyze_Expression (Then_Expr);
  736.       Analyze_Expression (Else_Expr);
  737.       Set_Etype (N, Etype (Then_Expr));
  738.    end Analyze_Conditional_Expression;
  739.  
  740.    -------------------------
  741.    -- Analyze_Equality_Op --
  742.    -------------------------
  743.  
  744.    procedure Analyze_Equality_Op (N : Node_Id) is
  745.       L      : constant Node_Id := Left_Opnd (N);
  746.       R      : constant Node_Id := Right_Opnd (N);
  747.       Op_Id  : Entity_Id;
  748.       Neg    : Node_Id;
  749.       Eq     : Node_Id;
  750.  
  751.    begin
  752.       Set_Etype (N, Any_Type);
  753.       Candidate_Type := Empty;
  754.  
  755.       Analyze_Expression (L);
  756.       Analyze_Expression (R);
  757.  
  758.       if Present (Entity (N)) then
  759.  
  760.          Op_Id := Entity (N);
  761.  
  762.          if Ekind (Op_Id) = E_Operator then
  763.             Find_Equality_Types (L, R, Op_Id, N);
  764.          else
  765.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  766.          end if;
  767.  
  768.       else
  769.          Op_Id := Get_Name_Entity_Id (Chars (N));
  770.  
  771.          while Present (Op_Id) loop
  772.  
  773.             if Ekind (Op_Id) = E_Operator then
  774.                Find_Equality_Types (L, R, Op_Id, N);
  775.             else
  776.                Analyze_User_Defined_Binary_Op (N, Op_Id);
  777.             end if;
  778.  
  779.             Op_Id := Homonym (Op_Id);
  780.          end loop;
  781.       end if;
  782.  
  783.       Operator_Check (N);
  784.    end Analyze_Equality_Op;
  785.  
  786.    ----------------------------------
  787.    -- Analyze_Explicit_Dereference --
  788.    ----------------------------------
  789.  
  790.    procedure Analyze_Explicit_Dereference (N : Node_Id) is
  791.       P  : constant Node_Id := Prefix (N);
  792.       UA : Node_Id := Copy_Separate_Tree (N);
  793.       T  : Entity_Id;
  794.       I  : Interp_Index;
  795.       It : Interp;
  796.  
  797.    begin
  798.       Analyze (P);
  799.       Set_Etype (N, Any_Type);
  800.  
  801.       --  Test for remote access to subprogram type, and if so return
  802.       --  after rewriting the original tree.
  803.  
  804.       if Remote_AST_E_Dereference (P, UA) then
  805.          return;
  806.       end if;
  807.  
  808.       --  Normal processing for other than remote access to subprogram type
  809.  
  810.       if not Is_Overloaded (P) then
  811.          if Is_Access_Type (Etype (P)) then
  812.             Set_Etype (N, Designated_Type (Etype (P)));
  813.  
  814.          elsif Etype (P) /= Any_Type then
  815.             Error_Msg_N ("prefix of dereference must be an access type", N);
  816.             return;
  817.          end if;
  818.  
  819.       else
  820.          Get_First_Interp (P, I, It);
  821.  
  822.          while Present (It.Nam) loop
  823.             T := It.Typ;
  824.  
  825.             if Is_Access_Type (T) then
  826.                Add_One_Interp (N, Designated_Type (T), Designated_Type (T));
  827.             end if;
  828.  
  829.             Get_Next_Interp (I, It);
  830.          end loop;
  831.  
  832.          End_Interp_List;
  833.  
  834.          --  Error if no interpretation of the prefix has an access type.
  835.  
  836.          if Etype (N) = Any_Type then
  837.             Error_Msg_N
  838.               ("access type required in prefix of explicit dereference", P);
  839.             Set_Etype (N, Any_Type);
  840.             return;
  841.          end if;
  842.       end if;
  843.  
  844.       if Ekind (Etype (N)) = E_Subprogram_Type
  845.         and then Nkind (Parent (N)) /= N_Indexed_Component
  846.         and then Nkind (Parent (N)) /= N_Function_Call
  847.         and then Nkind (Parent (N)) /= N_Procedure_Call_Statement
  848.         and then Nkind (Parent (N)) /= N_Subprogram_Renaming_Declaration
  849.       then
  850.          --  Name is a function call with no actuals, in a context that
  851.          --  requires deproceduring. We can conceive of pathological cases
  852.          --  where the prefix might include functions that return access to
  853.          --  subprograms and others that return a regular type. Disambiguation
  854.          --  of those will have to take place in Resolve.
  855.  
  856.          Change_Node (N,  N_Function_Call);
  857.          Set_Name (N, P);
  858.          Set_Parameter_Associations (N, New_List);
  859.          Analyze_Call (N);
  860.       end if;
  861.  
  862.       --  A value of remote access-to-class-wide must not be explicitly
  863.       --  dereferenced (RM E.2.3(21)).
  864.  
  865.       Validate_Remote_Access_To_Class_Wide_Type (N);
  866.  
  867.    end Analyze_Explicit_Dereference;
  868.  
  869.    ------------------------
  870.    -- Analyze_Expression --
  871.    ------------------------
  872.  
  873.    procedure Analyze_Expression (N : Node_Id) is
  874.       Nam : Node_Id;
  875.  
  876.    begin
  877.       Analyze (N);
  878.  
  879.       if Is_Entity_Name (N)
  880.         and then Is_Overloadable (Entity (N))
  881.         and then (Ekind (Entity (N)) /= E_Enumeration_Literal
  882.                     or else Is_Overloaded (N))
  883.       then
  884.          Nam := New_Copy (N);
  885.  
  886.          --  If overloaded, overload set belongs to new copy.
  887.  
  888.          Save_Interps (N,  Nam);
  889.  
  890.          --  Change node to parameterless function call
  891.  
  892.          Change_Node (N, N_Function_Call);
  893.          Set_Name (N, Nam);
  894.          Set_Sloc (N, Sloc (Nam));
  895.          Analyze_Call (N);
  896.       end if;
  897.  
  898.    end Analyze_Expression;
  899.  
  900.    --------------------------------
  901.    -- Analyze_Expression_Actions --
  902.    --------------------------------
  903.  
  904.    procedure Analyze_Expression_Actions (N : Node_Id) is
  905.    begin
  906.       Analyze_List (Actions (N));
  907.       Analyze (Expression (N));
  908.       Set_Etype (N, Etype (Expression (N)));
  909.    end Analyze_Expression_Actions;
  910.  
  911.    ------------------------------------
  912.    -- Analyze_Indexed_Component_Form --
  913.    ------------------------------------
  914.  
  915.    procedure Analyze_Indexed_Component_Form (N : Node_Id) is
  916.       P   : constant Node_Id := Prefix (N);
  917.       Exp : constant List_Id := Expressions (N);
  918.       UAN : Node_Id := Copy_Separate_Tree (N);
  919.       P_T : Entity_Id;
  920.       E   : Node_Id;
  921.       U_N : Entity_Id;
  922.  
  923.       procedure Process_Function_Call;
  924.       --  Prefix in indexed component form is an overloadable entity,
  925.       --  so the node is a function call. Reformat it as such.
  926.  
  927.       procedure Process_Indexed_Component;
  928.       --  Prefix in indexed component form is actually an indexed component.
  929.       --  This routine processes it, knowing that the prefix is already
  930.       --  resolved.
  931.  
  932.       procedure Process_Indexed_Component_Or_Slice;
  933.       --  An indexed component with a single index may designate a slice if
  934.       --  the index is a subtype mark. This routine disambiguates these two
  935.       --  cases by resolving the prefix to see if it is a subtype mark.
  936.  
  937.       procedure Process_Overloaded_Indexed_Component;
  938.       --  If the prefix of an indexed component is overloaded, the proper
  939.       --  interpretation is selected by the index types and the context.
  940.  
  941.       ---------------------------
  942.       -- Process_Function_Call --
  943.       ---------------------------
  944.  
  945.       procedure Process_Function_Call is
  946.       begin
  947.          Change_Node (N, N_Function_Call);
  948.          Set_Name (N, P);
  949.          Set_Parameter_Associations (N, Exp);
  950.          Analyze_Call (N);
  951.       end Process_Function_Call;
  952.  
  953.       -------------------------------
  954.       -- Process_Indexed_Component --
  955.       -------------------------------
  956.  
  957.       procedure Process_Indexed_Component is
  958.          Expr         : Node_Id;
  959.          Array_Type   : Entity_Id;
  960.          Index        : Node_Id;
  961.          Entry_Family : Entity_Id;
  962.  
  963.       begin
  964.          Expr := First (Exp);
  965.  
  966.          if Is_Overloaded (P) then
  967.             Process_Overloaded_Indexed_Component;
  968.  
  969.          else
  970.             Array_Type := Etype (P);
  971.  
  972.             --  Prefix must be appropriate for an array type.
  973.             --  Dereference the prefix if it is an access type.
  974.  
  975.             if Is_Access_Type (Array_Type) then
  976.                Array_Type := Designated_Type (Array_Type);
  977.             end if;
  978.  
  979.             if Is_Array_Type (Array_Type) then
  980.                null;
  981.  
  982.             elsif (Is_Entity_Name (P)
  983.                      and then
  984.                    Ekind (Entity (P)) = E_Entry_Family)
  985.                or else
  986.                  (Nkind (P) = N_Selected_Component
  987.                     and then
  988.                   Is_Entity_Name (Selector_Name (P))
  989.                     and then
  990.                   Ekind (Entity (Selector_Name (P))) = E_Entry_Family)
  991.             then
  992.                if Is_Entity_Name (P) then
  993.                   Entry_Family := Entity (P);
  994.                else
  995.                   Entry_Family := Entity (Selector_Name (P));
  996.                end if;
  997.  
  998.                Analyze (Expr);
  999.                Set_Etype (N, Any_Type);
  1000.  
  1001.                if not Has_Compatible_Type
  1002.                  (Expr, Entry_Index_Type (Entry_Family))
  1003.                then
  1004.                   Error_Msg_N ("invalid index type in entry name", N);
  1005.  
  1006.                elsif Present (Next (Expr)) then
  1007.                   Error_Msg_N ("too many indices in entry name", N);
  1008.  
  1009.                else
  1010.                   Set_Etype (N,  Etype (P));
  1011.                end if;
  1012.  
  1013.                return;
  1014.  
  1015.             elsif Array_Type = Any_Type then
  1016.                Set_Etype (N, Any_Type);
  1017.                return;
  1018.  
  1019.             --  Here we definitely have a bad indexing. Test for special
  1020.             --  (error) case of a requeue used with redundant parameters
  1021.  
  1022.             else
  1023.                if Nkind (Parent (N)) = N_Requeue_Statement
  1024.                  and then
  1025.                    ((Is_Entity_Name (P)
  1026.                         and then Ekind (Entity (P)) = E_Entry)
  1027.                     or else
  1028.                      (Nkind (P) = N_Selected_Component
  1029.                        and then Is_Entity_Name (Selector_Name (P))
  1030.                        and then Ekind (Entity (Selector_Name (P))) = E_Entry))
  1031.                then
  1032.                   Error_Msg_N
  1033.                     ("REQUEUE does not permit parameters", First (Exp));
  1034.  
  1035.                else
  1036.                   Error_Msg_N ("array type required in indexed component", P);
  1037.                end if;
  1038.  
  1039.                Set_Etype (N, Any_Type);
  1040.                return;
  1041.             end if;
  1042.  
  1043.             Index := First_Index (Array_Type);
  1044.  
  1045.             while Present (Index) and then Present (Expr) loop
  1046.                if not Has_Compatible_Type (Expr, Etype (Index)) then
  1047.                   Wrong_Type (Expr, Etype (Index));
  1048.                   Set_Etype (N, Any_Type);
  1049.                   return;
  1050.                end if;
  1051.  
  1052.                Index := Next_Index (Index);
  1053.                Expr  := Next (Expr);
  1054.             end loop;
  1055.  
  1056.             Set_Etype (N, Component_Type (Array_Type));
  1057.  
  1058.             if No (Index) and then No (Expr) then
  1059.                null;
  1060.             else
  1061.                Error_Msg_N (
  1062.                  "incorrect number of indices in indexed component", N);
  1063.             end if;
  1064.          end if;
  1065.  
  1066.       end Process_Indexed_Component;
  1067.  
  1068.       ----------------------------------------
  1069.       -- Process_Indexed_Component_Or_Slice --
  1070.       ----------------------------------------
  1071.  
  1072.       procedure Process_Indexed_Component_Or_Slice is
  1073.          E : constant Node_Id := First (Exp);
  1074.  
  1075.       begin
  1076.          --  If one index is present, and it is a subtype name, then the
  1077.          --  node denotes a slice (note that the case of an explicit range
  1078.          --  for a slice was already built as an N_Slice node in the first
  1079.          --  place, so that case is not handled here.
  1080.  
  1081.          if No (Next (E))
  1082.            and then Is_Entity_Name (E)
  1083.            and then Is_Type (Entity (E))
  1084.          then
  1085.             Rewrite_Substitute_Tree (N,
  1086.                Make_Slice (Sloc (N),
  1087.                  Prefix => P,
  1088.                  Discrete_Range => New_Copy (E)));
  1089.             Analyze (N);
  1090.  
  1091.          --  Otherwise (more than one index present, or single index is not
  1092.          --  a subtype name), then we have the indexed component case.
  1093.  
  1094.          else
  1095.             Process_Indexed_Component;
  1096.          end if;
  1097.       end Process_Indexed_Component_Or_Slice;
  1098.  
  1099.       ------------------------------------------
  1100.       -- Process_Overloaded_Indexed_Component --
  1101.       ------------------------------------------
  1102.  
  1103.       procedure Process_Overloaded_Indexed_Component is
  1104.          Expr  : Node_Id;
  1105.          I     : Interp_Index;
  1106.          It    : Interp;
  1107.          Typ   : Entity_Id;
  1108.          Index : Node_Id;
  1109.          Found : Boolean;
  1110.  
  1111.       begin
  1112.          Set_Etype (N, Any_Type);
  1113.          Get_First_Interp (P, I, It);
  1114.  
  1115.          while Present (It.Nam) loop
  1116.             Typ := It.Typ;
  1117.  
  1118.             if Is_Access_Type (Typ) then
  1119.                Typ := Designated_Type (Typ);
  1120.             end if;
  1121.  
  1122.             if Is_Array_Type (Typ) then
  1123.  
  1124.                --  Got a candidate: verify that index types are compatible
  1125.  
  1126.                Index := First_Index (Typ);
  1127.                Found := True;
  1128.  
  1129.                Expr := First (Expressions (N));
  1130.  
  1131.                while Present (Index) and then Present (Expr) loop
  1132.                   if Has_Compatible_Type (Expr, Etype (Index)) then
  1133.                      null;
  1134.                   else
  1135.                      Found := False;
  1136.                      Remove_Interp (I);
  1137.                      exit;
  1138.                   end if;
  1139.  
  1140.                   Index := Next_Index (Index);
  1141.                   Expr  := Next (Expr);
  1142.                end loop;
  1143.  
  1144.                if Found and then No (Index) and then No (Expr) then
  1145.                   Add_One_Interp (N,
  1146.                      Etype (Component_Type (Typ)),
  1147.                      Etype (Component_Type (Typ)));
  1148.                end if;
  1149.             end if;
  1150.  
  1151.             Get_Next_Interp (I, It);
  1152.          end loop;
  1153.  
  1154.          if Etype (N) = Any_Type then
  1155.             Error_Msg_N ("no legal interpetation for indexed component", N);
  1156.             Set_Is_Overloaded (N, False);
  1157.          end if;
  1158.  
  1159.          End_Interp_List;
  1160.       end Process_Overloaded_Indexed_Component;
  1161.  
  1162.    ------------------------------------
  1163.    -- Analyze_Indexed_Component_Form --
  1164.    ------------------------------------
  1165.  
  1166.    begin
  1167.       --  Get name of array, function or type
  1168.  
  1169.       Analyze (P);
  1170.       P_T := Base_Type (Etype (P));
  1171.  
  1172.       --  Test for remove access to subprogram type, and if so return after
  1173.       --  rewriting the original tree.
  1174.  
  1175.       if Remote_AST_I_Dereference (P, UAN) then
  1176.          return;
  1177.       end if;
  1178.  
  1179.       --  Analyze expressions if present (array indices or actuals in call)
  1180.  
  1181.       if Present (Exp) then
  1182.          E := First (Exp);
  1183.  
  1184.          while Present (E) loop
  1185.             Analyze (E);
  1186.             E := Next (E);
  1187.          end loop;
  1188.       end if;
  1189.  
  1190.       if Is_Entity_Name (P)
  1191.         or else Nkind (P) = N_Operator_Symbol
  1192.       then
  1193.          U_N := Entity (P);
  1194.  
  1195.          if Ekind (U_N) in  Type_Kind then
  1196.  
  1197.             --  Reformat node as a type conversion.
  1198.  
  1199.             E := Remove_Head (Exp);
  1200.  
  1201.             if Present (First (Exp)) then
  1202.                Error_Msg_N
  1203.                 ("argument of type conversion must be single expression", N);
  1204.             end if;
  1205.  
  1206.             Change_Node (N, N_Type_Conversion);
  1207.             Set_Subtype_Mark (N, P);
  1208.             Set_Etype (N, U_N);
  1209.             Set_Expression (N, E);
  1210.  
  1211.             --  After changing the node, call for the specific Analysis
  1212.             --  routine directly, to avoid a double call to the expander.
  1213.  
  1214.             Analyze_Type_Conversion (N);
  1215.  
  1216.          elsif Is_Overloadable (U_N) then
  1217.             Process_Function_Call;
  1218.  
  1219.          elsif Ekind (Etype (P)) = E_Subprogram_Type
  1220.            or else (Ekind (Etype (P)) = E_Access_Subprogram_Type
  1221.                       and then
  1222.                     Ekind (Designated_Type (Etype (P))) = E_Subprogram_Type)
  1223.          then
  1224.             --  Call to access_to-subprogram with possible implicit dereference
  1225.  
  1226.             Process_Function_Call;
  1227.  
  1228.          else
  1229.             Process_Indexed_Component_Or_Slice;
  1230.          end if;
  1231.  
  1232.       --  If not an entity name, prefix is an expression that may denote
  1233.       --  an array or an access-to-subprogram.
  1234.  
  1235.       else
  1236.          if (Ekind (P_T) = E_Subprogram_Type)
  1237.            or else (Ekind (P_T) = E_Access_Subprogram_Type
  1238.                      and then
  1239.                     Ekind (Designated_Type (P_T)) = E_Subprogram_Type)
  1240.          then
  1241.             Process_Function_Call;
  1242.  
  1243.          elsif Nkind (P) = N_Selected_Component
  1244.            and then Ekind (Entity (Selector_Name (P))) = E_Entry_Family
  1245.          then
  1246.             Process_Indexed_Component_Or_Slice;
  1247.  
  1248.          elsif Nkind (P) = N_Selected_Component
  1249.            and then Ekind (Entity (Selector_Name (P))) = E_Function
  1250.          then
  1251.             Process_Function_Call;
  1252.  
  1253.          else
  1254.             Process_Indexed_Component_Or_Slice;
  1255.          end if;
  1256.       end if;
  1257.    end Analyze_Indexed_Component_Form;
  1258.  
  1259.    ------------------------
  1260.    -- Analyze_Logical_Op --
  1261.    ------------------------
  1262.  
  1263.    procedure Analyze_Logical_Op (N : Node_Id) is
  1264.       L     : constant Node_Id := Left_Opnd (N);
  1265.       R     : constant Node_Id := Right_Opnd (N);
  1266.       Op_Id : Entity_Id := Entity (N);
  1267.  
  1268.    begin
  1269.       Set_Etype (N, Any_Type);
  1270.       Candidate_Type := Empty;
  1271.  
  1272.       Analyze_Expression (L);
  1273.       Analyze_Expression (R);
  1274.  
  1275.       if Present (Op_Id) then
  1276.  
  1277.          if Ekind (Op_Id) = E_Operator then
  1278.             Find_Boolean_Types (L, R, Op_Id, N);
  1279.          else
  1280.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  1281.          end if;
  1282.  
  1283.       else
  1284.          Op_Id := Get_Name_Entity_Id (Chars (N));
  1285.  
  1286.          while Present (Op_Id) loop
  1287.             if Ekind (Op_Id) = E_Operator then
  1288.                Find_Boolean_Types (L, R, Op_Id, N);
  1289.             else
  1290.                Analyze_User_Defined_Binary_Op (N, Op_Id);
  1291.             end if;
  1292.  
  1293.             Op_Id := Homonym (Op_Id);
  1294.          end loop;
  1295.       end if;
  1296.  
  1297.       Operator_Check (N);
  1298.    end Analyze_Logical_Op;
  1299.  
  1300.    ---------------------------
  1301.    -- Analyze_Membership_Op --
  1302.    ---------------------------
  1303.  
  1304.    procedure Analyze_Membership_Op (N : Node_Id) is
  1305.       L     : constant Node_Id := Left_Opnd (N);
  1306.       R     : constant Node_Id := Right_Opnd (N);
  1307.       Typ   : Entity_Id;
  1308.       Index : Interp_Index;
  1309.       It    : Interp;
  1310.  
  1311.    begin
  1312.       Analyze_Expression (L);
  1313.  
  1314.       if Nkind (R) = N_Range
  1315.         or else (Nkind (R) = N_Attribute_Reference
  1316.                   and then Attribute_Name (R) = Name_Range)
  1317.       then
  1318.          Analyze (R);
  1319.  
  1320.       --  If not a range, it can only be a subtype mark
  1321.  
  1322.       else
  1323.          Find_Type (R);
  1324.       end if;
  1325.  
  1326.       --  Compatibility between expression and subtype mark or range is
  1327.       --  checked during resolution. The result of the operation is boolean
  1328.       --  in any case.
  1329.  
  1330.       Set_Etype (N, Standard_Boolean);
  1331.    end Analyze_Membership_Op;
  1332.  
  1333.    ----------------------
  1334.    -- Analyze_Negation --
  1335.    ----------------------
  1336.  
  1337.    procedure Analyze_Negation (N : Node_Id) is
  1338.       R     : constant Node_Id := Right_Opnd (N);
  1339.       Op_Id : Entity_Id := Entity (N);
  1340.  
  1341.    begin
  1342.       Set_Etype (N, Any_Type);
  1343.       Candidate_Type := Empty;
  1344.  
  1345.       Analyze_Expression (R);
  1346.  
  1347.       if Present (Op_Id) then
  1348.          if Ekind (Op_Id) = E_Operator then
  1349.             Find_Negation_Types (R, Op_Id, N);
  1350.          else
  1351.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  1352.          end if;
  1353.  
  1354.       else
  1355.          Op_Id := Get_Name_Entity_Id (Chars (N));
  1356.  
  1357.          while Present (Op_Id) loop
  1358.             if Ekind (Op_Id) = E_Operator then
  1359.                Find_Negation_Types (R, Op_Id, N);
  1360.             else
  1361.                Analyze_User_Defined_Unary_Op (N, Op_Id);
  1362.             end if;
  1363.  
  1364.             Op_Id := Homonym (Op_Id);
  1365.          end loop;
  1366.       end if;
  1367.  
  1368.       Operator_Check (N);
  1369.    end Analyze_Negation;
  1370.  
  1371.    -------------------
  1372.    --  Analyze_Null --
  1373.    -------------------
  1374.  
  1375.    procedure Analyze_Null (N : Node_Id) is
  1376.    begin
  1377.       Set_Etype (N, Any_Access);
  1378.    end Analyze_Null;
  1379.  
  1380.    ----------------------
  1381.    -- Analyze_One_Call --
  1382.    ----------------------
  1383.  
  1384.    procedure Analyze_One_Call
  1385.      (N      : Node_Id;
  1386.       Nam    : Entity_Id;
  1387.       Report : Boolean)
  1388.    is
  1389.       Actuals    : constant List_Id   := Parameter_Associations (N);
  1390.       Prev_T     : constant Entity_Id := Etype (N);
  1391.       Formal     : Entity_Id;
  1392.       Actual     : Node_Id;
  1393.       Is_Indexed : Boolean := False;
  1394.       Norm_OK    : Boolean;
  1395.  
  1396.    begin
  1397.       --  If the subprogram has no formals, or if all the formals have
  1398.       --  defaults, and the return type is an array type, the node may
  1399.       --  denote an indexing of the result of a parameterless call.
  1400.  
  1401.       if Needs_No_Actuals (Nam)
  1402.         and then Present (Actuals)
  1403.       then
  1404.          if Is_Array_Type (Etype (Nam)) then
  1405.             Is_Indexed := Try_Indexed_Call (N, Nam, Etype (Nam));
  1406.          elsif Is_Access_Type (Etype (Nam))
  1407.            and then Is_Array_Type (Designated_Type (Etype (Nam)))
  1408.          then
  1409.             Is_Indexed :=
  1410.               Try_Indexed_Call (N, Nam, Designated_Type (Etype (Nam)));
  1411.          end if;
  1412.       end if;
  1413.  
  1414.       Normalize_Actuals (N, Nam, (Report and not Is_Indexed), Norm_OK);
  1415.  
  1416.       if not Norm_OK then
  1417.  
  1418.          --  Mismatch in number or names of parameters
  1419.  
  1420.          if Debug_Flag_E then
  1421.             Write_Str (" normalization fails in call ");
  1422.             Write_Int (Int (N));
  1423.             Write_Str (" with subprogram ");
  1424.             Write_Int (Int (Nam));
  1425.             Write_Eol;
  1426.          end if;
  1427.  
  1428.       elsif not Present (Actuals) then
  1429.  
  1430.          --  If Normalize succeeds, then there are default parameters for
  1431.          --  all formals.
  1432.  
  1433.          Add_One_Interp (N, Nam, Etype (Nam));
  1434.  
  1435.          --  Set the entity pointer,  unless it is an indirect call, in
  1436.          --  which case the prefix is an expression without a unique name.
  1437.  
  1438.          if not Is_Type (Nam)
  1439.             and then Is_Entity_Name (Name (N))
  1440.          then
  1441.             Set_Entity (Name (N), Nam);
  1442.          end if;
  1443.  
  1444.          if Debug_Flag_E and not Report then
  1445.             Write_Str (" Overloaded call ");
  1446.             Write_Int (Int (N));
  1447.             Write_Str (" compatible with ");
  1448.             Write_Int (Int (Nam));
  1449.             Write_Eol;
  1450.          end if;
  1451.  
  1452.       elsif Ekind (Nam) = E_Operator then
  1453.  
  1454.          --  This can occur when the prefix of the call is an operator
  1455.          --  name or an expanded name whose selector is an operator name.
  1456.  
  1457.          Analyze_Operator_Call (N, Nam);
  1458.  
  1459.          if Etype (N) /= Prev_T then
  1460.  
  1461.             --  If operator matches formals, record its name on the call.
  1462.             --  If the operator is overloaded, Resolve will select the
  1463.             --  correct one from the list of interpretations. The call
  1464.             --  node itself carries the first candidate.
  1465.  
  1466.             Set_Entity (Name (N), Nam);
  1467.  
  1468.          elsif Report and then Etype (N) = Any_Type then
  1469.             Error_Msg_N ("incompatible arguments for operator", N);
  1470.          end if;
  1471.  
  1472.       else
  1473.          --  Normalize_Actuals has chained the named associations in the
  1474.          --  correct order of the formals.
  1475.  
  1476.          Actual := First_Actual (N);
  1477.          Formal := First_Formal (Nam);
  1478.  
  1479.          while Present (Actual) and then Present (Formal) loop
  1480.             if (Nkind (Parent (Actual)) /= N_Parameter_Association
  1481.               or else Chars (Selector_Name (Parent (Actual))) = Chars (Formal))
  1482.             then
  1483.                if Has_Compatible_Type (Actual, Etype (Formal)) then
  1484.                   Actual := Next_Actual (Actual);
  1485.                   Formal := Next_Formal (Formal);
  1486.  
  1487.                else
  1488.                   if Debug_Flag_E then
  1489.                      Write_Str (" type checking fails in call ");
  1490.                      Write_Int (Int (N));
  1491.                      Write_Str (" with formal ");
  1492.                      Write_Int (Int (Formal));
  1493.                      Write_Str (" in subprogram ");
  1494.                      Write_Int (Int (Nam));
  1495.                      Write_Eol;
  1496.                   end if;
  1497.  
  1498.                   if Report and not Is_Indexed then
  1499.                      Wrong_Type (Actual, Etype (Formal));
  1500.                   end if;
  1501.  
  1502.                   return;
  1503.                end if;
  1504.  
  1505.             else
  1506.                --  Normalize_Actuals has verified that a default value exists
  1507.                --  for this formal. Current actual names a subsequent formal.
  1508.  
  1509.                Formal := Next_Formal (Formal);
  1510.             end if;
  1511.          end loop;
  1512.  
  1513.          --  On exit, all actuals match.
  1514.  
  1515.          Add_One_Interp (N, Nam, Etype (Nam));
  1516.  
  1517.          --  If the prefix of the call is a name, indicate the entity
  1518.          --  being called. If it is not a name,  it is an expression that
  1519.          --  denotes an access to subprogram or else an entry or family. In
  1520.          --  the latter case, the name is a selected component, and the entity
  1521.          --  being called is noted on the selector.
  1522.  
  1523.          if not Is_Type (Nam) then
  1524.             if Is_Entity_Name (Name (N))
  1525.               or else Nkind (Name (N)) = N_Operator_Symbol
  1526.             then
  1527.                Set_Entity (Name (N), Nam);
  1528.  
  1529.             elsif Nkind (Name (N)) = N_Selected_Component then
  1530.                Set_Entity (Selector_Name (Name (N)),  Nam);
  1531.             end if;
  1532.          end if;
  1533.  
  1534.          if Debug_Flag_E and not Report then
  1535.             Write_Str (" Overloaded call ");
  1536.             Write_Int (Int (N));
  1537.             Write_Str (" compatible with ");
  1538.             Write_Int (Int (Nam));
  1539.             Write_Eol;
  1540.          end if;
  1541.  
  1542.       end if;
  1543.    end Analyze_One_Call;
  1544.  
  1545.    ----------------------------
  1546.    --  Analyze_Operator_Call --
  1547.    ----------------------------
  1548.  
  1549.    procedure Analyze_Operator_Call (N : Node_Id; Op_Id : Entity_Id) is
  1550.       Op_Name : constant Name_Id := Chars (Op_Id);
  1551.       Act1    : constant Node_Id := First_Actual (N);
  1552.       Act2    : constant Node_Id := Next_Actual (Act1);
  1553.  
  1554.    begin
  1555.       if Present (Act2) then
  1556.  
  1557.          --  Maybe binary operators
  1558.  
  1559.          if Present (Next_Actual (Act2)) then
  1560.  
  1561.             --  Too many actuals for an operator
  1562.  
  1563.             return;
  1564.  
  1565.          elsif Op_Name = Name_Op_Add
  1566.            or else Op_Name = Name_Op_Subtract
  1567.            or else Op_Name = Name_Op_Multiply
  1568.            or else Op_Name = Name_Op_Divide
  1569.            or else Op_Name = Name_Op_Mod
  1570.            or else Op_Name = Name_Op_Rem
  1571.            or else Op_Name = Name_Op_Expon
  1572.          then
  1573.             Find_Arithmetic_Types (Act1, Act2, Op_Id, N);
  1574.  
  1575.          elsif Op_Name =  Name_Op_And
  1576.            or else Op_Name = Name_Op_Or
  1577.            or else Op_Name = Name_Op_Xor
  1578.          then
  1579.             Find_Boolean_Types (Act1, Act2, Op_Id, N);
  1580.  
  1581.          elsif Op_Name = Name_Op_Lt
  1582.            or else Op_Name = Name_Op_Le
  1583.            or else Op_Name = Name_Op_Gt
  1584.            or else Op_Name = Name_Op_Ge
  1585.          then
  1586.             Find_Comparison_Types (Act1, Act2, Op_Id,  N);
  1587.  
  1588.          elsif Op_Name = Name_Op_Eq
  1589.            or else Op_Name = Name_Op_Ne
  1590.          then
  1591.             Find_Equality_Types (Act1, Act2, Op_Id,  N);
  1592.  
  1593.          elsif Op_Name = Name_Op_Concat then
  1594.             Find_Concatenation_Types (Act1, Act2, Op_Id, N);
  1595.          end if;
  1596.  
  1597.       else
  1598.          --  Unary operators
  1599.  
  1600.          if Op_Name = Name_Op_Subtract
  1601.            or else Op_Name = Name_Op_Add
  1602.            or else Op_Name = Name_Op_Abs
  1603.          then
  1604.             Find_Unary_Types (Act1, Op_Id, N);
  1605.  
  1606.          elsif Op_Name = Name_Op_Not then
  1607.             Find_Negation_Types (Act1, Op_Id, N);
  1608.  
  1609.          end if;
  1610.       end if;
  1611.    end Analyze_Operator_Call;
  1612.  
  1613.    -------------------------------------------
  1614.    -- Analyze_Overloaded_Selected_Component --
  1615.    -------------------------------------------
  1616.  
  1617.    procedure Analyze_Overloaded_Selected_Component (N : Node_Id) is
  1618.       Comp  : Entity_Id;
  1619.       Nam   : Node_Id := Prefix (N);
  1620.       Sel   : Node_Id := Selector_Name (N);
  1621.       I     : Interp_Index;
  1622.       It    : Interp;
  1623.       T     : Entity_Id;
  1624.  
  1625.    begin
  1626.       Get_First_Interp (Nam, I, It);
  1627.  
  1628.       while Present (It.Typ) loop
  1629.          if Is_Access_Type (It.Typ) then
  1630.             T := Designated_Type (It.Typ);
  1631.          else
  1632.             T := It.Typ;
  1633.          end if;
  1634.  
  1635.          if Is_Record_Type (T) then
  1636.             Comp := First_Entity (T);
  1637.  
  1638.             while Present (Comp) loop
  1639.  
  1640.                if Chars (Comp) = Chars (Sel)
  1641.                  and then Is_Visible_Component (Comp)
  1642.                then
  1643.                   Set_Entity_With_Style_Check (Sel, Comp);
  1644.                   Set_Etype (Sel, Etype (Comp));
  1645.                   Add_One_Interp (N, Etype (Comp), Etype (Comp));
  1646.  
  1647.                   --  This also specifies a candidate to resolve the name.
  1648.                   --  Further overloading will be resolved from context.
  1649.  
  1650.                   Set_Etype (Nam, It.Typ);
  1651.                end if;
  1652.  
  1653.                Comp := Next_Entity (Comp);
  1654.             end loop;
  1655.  
  1656.          end if;
  1657.  
  1658.          Get_Next_Interp (I, It);
  1659.       end loop;
  1660.  
  1661.       if Etype (N) = Any_Type then
  1662.          Error_Msg_N ("undefined selector for overloaded prefix", N);
  1663.          Set_Entity (Sel, Any_Id);
  1664.          Set_Etype  (Sel, Any_Type);
  1665.       end if;
  1666.  
  1667.    end Analyze_Overloaded_Selected_Component;
  1668.  
  1669.    ----------------------------------
  1670.    -- Analyze_Qualified_Expression --
  1671.    ----------------------------------
  1672.  
  1673.    procedure Analyze_Qualified_Expression (N : Node_Id) is
  1674.       Mark : constant Entity_Id := Subtype_Mark (N);
  1675.       T    : Entity_Id;
  1676.  
  1677.    begin
  1678.       Set_Etype (N, Any_Type);
  1679.       Find_Type (Mark);
  1680.       T := Entity (Mark);
  1681.  
  1682.       if T = Any_Type then
  1683.          return;
  1684.       end if;
  1685.       Check_Fully_Declared (T, N);
  1686.  
  1687.       Analyze_Expression (Expression (N));
  1688.       Set_Etype  (N, T);
  1689.    end Analyze_Qualified_Expression;
  1690.  
  1691.    -------------------
  1692.    -- Analyze_Range --
  1693.    -------------------
  1694.  
  1695.    procedure Analyze_Range (N : Node_Id) is
  1696.       L          : constant Node_Id := Low_Bound (N);
  1697.       H          : constant Node_Id := High_Bound (N);
  1698.       I1, I2     : Interp_Index;
  1699.       It1, It2   : Interp;
  1700.       Typ1, Typ2 : Entity_Id;
  1701.  
  1702.       procedure Check_Common_Type (T1, T2 : Entity_Id);
  1703.       --  Verify the compatibility of two types,  and choose the
  1704.       --  non universal one if the other is universal.
  1705.  
  1706.       procedure Check_High_Bound (T : Entity_Id);
  1707.       --  Test one interpretation of the low bound against all those
  1708.       --  of the high bound.
  1709.  
  1710.       procedure Check_Common_Type (T1, T2 : Entity_Id) is
  1711.       begin
  1712.          if Covers (T1, T2)
  1713.            or else Covers (T2, T1)
  1714.          then
  1715.             if T1 = Universal_Integer
  1716.               or else T1 = Universal_Real
  1717.               or else T1 = Any_Character
  1718.             then
  1719.                Add_One_Interp (N, T2, T2);
  1720.             else
  1721.                Add_One_Interp (N, T1, T1);
  1722.             end if;
  1723.          end if;
  1724.       end Check_Common_Type;
  1725.  
  1726.       procedure Check_High_Bound (T : Entity_Id) is
  1727.       begin
  1728.          if not Is_Overloaded (H) then
  1729.             Check_Common_Type (T, Etype (H));
  1730.          else
  1731.             Get_First_Interp (H, I2, It2);
  1732.  
  1733.             while Present (It2.Typ) loop
  1734.                Check_Common_Type (T, It2.Typ);
  1735.                Get_Next_Interp (I2, It2);
  1736.             end loop;
  1737.          end if;
  1738.       end Check_High_Bound;
  1739.  
  1740.    --  Start of processing for Analyze_Range
  1741.  
  1742.    begin
  1743.       Set_Etype (N, Any_Type);
  1744.       Analyze_Expression (L);
  1745.       Analyze_Expression (H);
  1746.  
  1747.       if Etype (L) = Any_Type or else Etype (H) = Any_Type then
  1748.          return;
  1749.  
  1750.       else
  1751.          if not Is_Overloaded (L) then
  1752.             Check_High_Bound (Etype (L));
  1753.          else
  1754.             Get_First_Interp (L, I1, It1);
  1755.  
  1756.             while Present (It1.Typ) loop
  1757.                Check_High_Bound (It1.Typ);
  1758.                Get_Next_Interp (I1, It1);
  1759.             end loop;
  1760.          end if;
  1761.  
  1762.          --  If result is Any_Type, then we did not find a compatible pair
  1763.  
  1764.          if Etype (N) = Any_Type then
  1765.             Error_Msg_N ("incompatible types in range ", N);
  1766.          end if;
  1767.       end if;
  1768.    end Analyze_Range;
  1769.  
  1770.    -----------------------
  1771.    -- Analyze_Reference --
  1772.    -----------------------
  1773.  
  1774.    procedure Analyze_Reference (N : Node_Id) is
  1775.       P        : constant Node_Id := Prefix (N);
  1776.       Acc_Type : Entity_Id;
  1777.  
  1778.    begin
  1779.       Analyze (P);
  1780.       Acc_Type := New_Itype (E_Allocator_Type, N);
  1781.       Set_Etype (Acc_Type,  Acc_Type);
  1782.       Set_Directly_Designated_Type (Acc_Type, Etype (P));
  1783.       Set_Etype (N, Acc_Type);
  1784.    end Analyze_Reference;
  1785.  
  1786.    --------------------------------
  1787.    -- Analyze_Selected_Component --
  1788.    --------------------------------
  1789.  
  1790.    --  Prefix is a record type or a task or protected type. In the
  1791.    --  later case, the selector must denote a visible entry.
  1792.  
  1793.    procedure Analyze_Selected_Component (N : Node_Id) is
  1794.       Name        : constant Node_Id := Prefix (N);
  1795.       Sel         : constant Node_Id := Selector_Name (N);
  1796.       Comp        : Entity_Id;
  1797.       Prefix_Type : Entity_Id;
  1798.       Expr_Type   : Entity_Id;
  1799.       Act_Decl    : Node_Id;
  1800.       New_N       : Node_Id;
  1801.  
  1802.  
  1803.    --  Start of processing for Analyze_Selected_Component
  1804.  
  1805.    begin
  1806.       Set_Etype (N, Any_Type);
  1807.  
  1808.       if Is_Overloaded (Name) then
  1809.          Analyze_Overloaded_Selected_Component (N);
  1810.          return;
  1811.  
  1812.       elsif Etype (Name) = Any_Type then
  1813.          Set_Entity (Sel, Any_Id);
  1814.          Set_Etype (Sel, Any_Type);
  1815.          return;
  1816.  
  1817.       else
  1818.          Prefix_Type := Etype (Name);
  1819.  
  1820.          if Is_Entity_Name (Name)
  1821.            and then (Ekind (Entity (Name)) = E_Variable
  1822.                        or else Ekind (Entity (Name)) = E_Constant
  1823.                        or else Ekind (Entity (Name))
  1824.                                  in E_In_Parameter .. E_In_Out_Parameter)
  1825.            and then Present (Actual_Subtype (Entity (Name)))
  1826.          then
  1827.             Prefix_Type := Actual_Subtype (Entity (Name));
  1828.          end if;
  1829.       end if;
  1830.  
  1831.       if Is_Access_Type (Prefix_Type) then
  1832.          Prefix_Type := Designated_Type (Prefix_Type);
  1833.       end if;
  1834.  
  1835.       --  For class-wide types, use the entity list of the root type. This
  1836.       --  indirection is specially important for private extensions because
  1837.       --  only the root type get switched (not the class-wide type).
  1838.  
  1839.       if Is_Class_Wide_Type (Prefix_Type) then
  1840.          Comp := First_Entity (Root_Type (Prefix_Type));
  1841.       else
  1842.          Comp := First_Entity (Prefix_Type);
  1843.       end if;
  1844.  
  1845.       if Is_Record_Type (Prefix_Type) then
  1846.  
  1847.          --  Find component with given name
  1848.  
  1849.          while Present (Comp) loop
  1850.  
  1851.             if Chars (Comp) = Chars (Sel)
  1852.               and then Is_Visible_Component (Comp)
  1853.             then
  1854.                Set_Entity_With_Style_Check (Sel, Comp);
  1855.                Set_Etype (Sel, Etype (Comp));
  1856.  
  1857.                Act_Decl := Build_Actual_Subtype_Of_Component (Etype (Comp), N);
  1858.                Insert_Action (N, Act_Decl);
  1859.  
  1860.                if No (Act_Decl) then
  1861.                   Set_Etype (N, Etype (Comp));
  1862.  
  1863.                else
  1864.                   --  Component type depends on discriminants.
  1865.  
  1866.                   Set_Etype (N, Defining_Identifier (Act_Decl));
  1867.                end if;
  1868.  
  1869.                return;
  1870.             end if;
  1871.  
  1872.             Comp := Next_Entity (Comp);
  1873.          end loop;
  1874.  
  1875.       elsif Is_Private_Type (Prefix_Type) then
  1876.  
  1877.          --  Allow access only to discriminants of the type
  1878.  
  1879.          while Present (Comp) loop
  1880.  
  1881.             if Chars (Comp) = Chars (Sel) then
  1882.                if Ekind (Comp) = E_Discriminant then
  1883.                   Set_Entity_With_Style_Check (Sel, Comp);
  1884.                   Set_Etype (Sel, Etype (Comp));
  1885.                   Set_Etype (N,   Etype (Comp));
  1886.                else
  1887.                   Error_Msg_NE ("invisible selector for }", N, Prefix_Type);
  1888.                   Set_Entity (Sel, Any_Id);
  1889.                   Set_Etype (N, Any_Type);
  1890.                end if;
  1891.  
  1892.                return;
  1893.             end if;
  1894.  
  1895.             Comp := Next_Entity (Comp);
  1896.          end loop;
  1897.  
  1898.       elsif Is_Concurrent_Type (Prefix_Type) then
  1899.          --  Prefix is concurrent type. Find visible operation with given name
  1900.          Set_Etype (Sel,  Any_Type);
  1901.  
  1902.          while Present (Comp)
  1903.            and then Comp /= First_Private_Entity (Prefix_Type)
  1904.          loop
  1905.             if Chars (Comp) = Chars (Sel) then
  1906.                if Is_Overloadable (Comp) then
  1907.                   Add_One_Interp (Sel, Comp, Etype (Comp));
  1908.                else
  1909.                   Set_Entity_With_Style_Check (Sel, Comp);
  1910.                end if;
  1911.  
  1912.                Set_Etype (Sel, Etype (Comp));
  1913.                Set_Etype (N,   Etype (Comp));
  1914.  
  1915.                --  For access type case, introduce explicit deference for
  1916.                --  more uniform treatment of entry calls.
  1917.  
  1918.                if Is_Access_Type (Etype (Name)) then
  1919.                   Insert_Explicit_Dereference (Name);
  1920.                end if;
  1921.             end if;
  1922.  
  1923.             Comp := Next_Entity (Comp);
  1924.          end loop;
  1925.  
  1926.          Set_Is_Overloaded (N, Is_Overloaded (Sel));
  1927.  
  1928.       else
  1929.          --  Invalid prefix
  1930.  
  1931.          Error_Msg_NE ("invalid prefix in selected component&", N, Sel);
  1932.       end if;
  1933.  
  1934.       --  If N still has no type, the component is not defined in the prefix.
  1935.  
  1936.       if Etype (N) = Any_Type then
  1937.          Error_Msg_NE ("undefined selector for }", N, Prefix_Type);
  1938.          Set_Entity (Sel, Any_Id);
  1939.          Set_Etype (Sel, Any_Type);
  1940.       end if;
  1941.    end Analyze_Selected_Component;
  1942.  
  1943.    ---------------------------
  1944.    -- Analyze_Short_Circuit --
  1945.    ---------------------------
  1946.  
  1947.    procedure Analyze_Short_Circuit (N : Node_Id) is
  1948.       L   : constant Node_Id := Left_Opnd (N);
  1949.       R   : constant Node_Id := Right_Opnd (N);
  1950.       Ltyp, Rtyp, Typ : Entity_Id;
  1951.  
  1952.    begin
  1953.       Analyze_Expression (L);
  1954.       Ltyp := Etype (L);
  1955.  
  1956.       if Is_Boolean_Type (Ltyp) or else Ltyp = Any_Type then
  1957.          null;
  1958.       elsif Is_Modular_Integer_Type (Ltyp) then
  1959.          Error_Msg_N ("short circuit forms not defined for modular types", L);
  1960.       else
  1961.          Wrong_Type (L, Any_Boolean);
  1962.       end if;
  1963.  
  1964.       Analyze_Expression (R);
  1965.       Rtyp := Etype (R);
  1966.  
  1967.       if Is_Boolean_Type (Rtyp) or else Rtyp = Any_Type then
  1968.          null;
  1969.       elsif Is_Modular_Integer_Type (Rtyp) then
  1970.          Error_Msg_N ("short circuit forms not defined for modular types", R);
  1971.       else
  1972.          Wrong_Type (R, Any_Boolean);
  1973.       end if;
  1974.  
  1975.       Typ := Intersect_Types (L, R);
  1976.  
  1977.       Set_Etype (N, Typ);
  1978.  
  1979.    end Analyze_Short_Circuit;
  1980.  
  1981.    -------------------
  1982.    -- Analyze_Slice --
  1983.    -------------------
  1984.  
  1985.    procedure Analyze_Slice (N : Node_Id) is
  1986.       P          : constant Node_Id := Prefix (N);
  1987.       D          : constant Node_Id := Discrete_Range (N);
  1988.       Array_Type : Entity_Id;
  1989.  
  1990.       procedure Analyze_Overloaded_Slice;
  1991.       --  If the prefix is overloaded, select those interpretations that
  1992.       --  yield a one-dimensional array type.
  1993.  
  1994.       procedure Analyze_Overloaded_Slice is
  1995.          I     : Interp_Index;
  1996.          It    : Interp;
  1997.          Typ   : Entity_Id;
  1998.          Index : Node_Id;
  1999.          Found : Boolean;
  2000.  
  2001.       begin
  2002.          Set_Etype (N, Any_Type);
  2003.          Get_First_Interp (P, I, It);
  2004.  
  2005.          while Present (It.Nam) loop
  2006.             Typ := It.Typ;
  2007.  
  2008.             if Is_Access_Type (Typ) then
  2009.                Typ := Designated_Type (Typ);
  2010.             end if;
  2011.  
  2012.             if Is_Array_Type (Typ)
  2013.               and then Number_Dimensions (Typ) = 1
  2014.               and then Has_Compatible_Type (D, Etype (First_Index (Typ)))
  2015.             then
  2016.                Add_One_Interp (N, Typ, Typ);
  2017.             end if;
  2018.  
  2019.             Get_Next_Interp (I, It);
  2020.          end loop;
  2021.  
  2022.          if Etype (N) = Any_Type then
  2023.             Error_Msg_N ("expect array type in prefix of slice",  N);
  2024.          end if;
  2025.       end Analyze_Overloaded_Slice;
  2026.  
  2027.    begin
  2028.       --  Analyze the prefix if not done already
  2029.  
  2030.       if No (Etype (P)) then
  2031.          Analyze (P);
  2032.       end if;
  2033.  
  2034.       Analyze (D);
  2035.  
  2036.       if Is_Overloaded (P) then
  2037.          Analyze_Overloaded_Slice;
  2038.  
  2039.       else
  2040.          Array_Type := Etype (P);
  2041.          Set_Etype (N, Any_Type);
  2042.  
  2043.          if Is_Access_Type (Array_Type) then
  2044.             Array_Type := Designated_Type (Array_Type);
  2045.          end if;
  2046.  
  2047.          if not Is_Array_Type (Array_Type) then
  2048.             Wrong_Type (P, Any_Array);
  2049.  
  2050.          elsif Number_Dimensions (Array_Type) > 1 then
  2051.             Error_Msg_N
  2052.               ("type is not one-dimensional array in slice prefix", N);
  2053.  
  2054.          elsif not
  2055.            Has_Compatible_Type (D, Etype (First_Index (Array_Type)))
  2056.          then
  2057.             Wrong_Type (D, Etype (First_Index (Array_Type)));
  2058.  
  2059.          else
  2060.             Set_Etype (N, Array_Type);
  2061.          end if;
  2062.       end if;
  2063.    end Analyze_Slice;
  2064.  
  2065.    -----------------------------
  2066.    -- Analyze_Type_Conversion --
  2067.    -----------------------------
  2068.  
  2069.    procedure Analyze_Type_Conversion (N : Node_Id) is
  2070.       Expr : constant Node_Id := Expression (N);
  2071.       T    : Entity_Id;
  2072.  
  2073.    begin
  2074.       --  If Conversion_OK is set, then the Etype is already set, and the
  2075.       --  only processing required is to analyze the expression. This is
  2076.       --  used to construct certain "illegal" conversions which are not
  2077.       --  allowed by Ada semantics, but can be handled OK by Gigi, see
  2078.       --  Sinfo for further details.
  2079.  
  2080.       if Conversion_OK (N) then
  2081.          Analyze (Expr);
  2082.          return;
  2083.       end if;
  2084.  
  2085.       --  Otherwise full type analysis is required, as well as some semantic
  2086.       --  checks to make sure the argument of the conversion is appropriate.
  2087.  
  2088.       Find_Type (Subtype_Mark (N));
  2089.       T := Entity (Subtype_Mark (N));
  2090.       Set_Etype (N, T);
  2091.       Check_Fully_Declared (T, N);
  2092.       Analyze (Expr);
  2093.       Validate_Remote_Type_Type_Conversion (N);
  2094.  
  2095.       if Nkind (Expr) = N_Aggregate then
  2096.          Error_Msg_N ("argument of conversion cannot be aggregate", N);
  2097.  
  2098.       elsif Nkind (Expr) = N_Allocator then
  2099.          Error_Msg_N ("argument of conversion cannot be an allocator", N);
  2100.  
  2101.       elsif Nkind (Expr) = N_String_Literal then
  2102.          Error_Msg_N ("argument of conversion cannot be string literal", N);
  2103.  
  2104.       elsif Nkind (Expr) = N_Attribute_Reference
  2105.         and then
  2106.           (Attribute_Name (Expr)  = Name_Access
  2107.              or else Attribute_Name (Expr) = Name_Unchecked_Access
  2108.              or else Attribute_Name (Expr) = Name_Unrestricted_Access)
  2109.       then
  2110.          Error_Msg_N ("argument of conversion cannot be access", N);
  2111.       end if;
  2112.    end Analyze_Type_Conversion;
  2113.  
  2114.    ----------------------
  2115.    -- Analyze_Unary_Op --
  2116.    ----------------------
  2117.  
  2118.    procedure Analyze_Unary_Op (N : Node_Id) is
  2119.       R     : constant Node_Id := Right_Opnd (N);
  2120.       Op_Id : Entity_Id := Entity (N);
  2121.  
  2122.    begin
  2123.       Set_Etype (N, Any_Type);
  2124.       Candidate_Type := Empty;
  2125.  
  2126.       Analyze_Expression (R);
  2127.  
  2128.       if Present (Op_Id) then
  2129.          if Ekind (Op_Id) = E_Operator then
  2130.             Find_Unary_Types (R, Op_Id,  N);
  2131.          else
  2132.             Add_One_Interp (N, Op_Id, Etype (Op_Id));
  2133.          end if;
  2134.  
  2135.       else
  2136.          Op_Id := Get_Name_Entity_Id (Chars (N));
  2137.  
  2138.          while Present (Op_Id) loop
  2139.  
  2140.             if Ekind (Op_Id) = E_Operator then
  2141.                if No (Next_Entity (First_Entity (Op_Id))) then
  2142.                   Find_Unary_Types (R, Op_Id,  N);
  2143.                end if;
  2144.  
  2145.             else
  2146.                Analyze_User_Defined_Unary_Op (N, Op_Id);
  2147.             end if;
  2148.  
  2149.             Op_Id := Homonym (Op_Id);
  2150.          end loop;
  2151.       end if;
  2152.  
  2153.       Operator_Check (N);
  2154.    end Analyze_Unary_Op;
  2155.  
  2156.    ---------------------------------------
  2157.    -- Analyze_Unchecked_Type_Conversion --
  2158.    ---------------------------------------
  2159.  
  2160.    procedure Analyze_Unchecked_Type_Conversion (N : Node_Id) is
  2161.    begin
  2162.       Find_Type (Subtype_Mark (N));
  2163.       Analyze_Expression (Expression (N));
  2164.       Set_Etype (N, Entity (Subtype_Mark (N)));
  2165.    end Analyze_Unchecked_Type_Conversion;
  2166.  
  2167.    ------------------------------------
  2168.    -- Analyze_User_Defined_Binary_Op --
  2169.    ------------------------------------
  2170.  
  2171.    procedure Analyze_User_Defined_Binary_Op
  2172.      (N     : Node_Id;
  2173.       Op_Id : Entity_Id)
  2174.    is
  2175.    begin
  2176.       --  Only do analysis if the operator Comes_From_Source, since otherwise
  2177.       --  the operator was generated by the expander, and all such operators
  2178.       --  always refer to the operators in package Standard.
  2179.  
  2180.       if Comes_From_Source (N) then
  2181.          declare
  2182.             F1 : constant Entity_Id := First_Formal (Op_Id);
  2183.             F2 : constant Entity_Id := Next_Formal (F1);
  2184.  
  2185.          begin
  2186.             --  Verify that Op_Id is a visible binary function. Note that since
  2187.             --  we know Op_Id is overloaded, potentially use visible means use
  2188.             --  visible for sure (RM 9.4(11)).
  2189.  
  2190.             if Ekind (Op_Id) = E_Function
  2191.               and then Present (F2)
  2192.               and then (Is_Immediately_Visible (Op_Id)
  2193.                          or else Is_Potentially_Use_Visible (Op_Id))
  2194.               and then Has_Compatible_Type (Left_Opnd (N), Etype (F1))
  2195.               and then Has_Compatible_Type (Right_Opnd (N), Etype (F2))
  2196.             then
  2197.                Add_One_Interp (N, Op_Id, Etype (Op_Id));
  2198.  
  2199.                if Debug_Flag_E then
  2200.                   Write_Str ("user defined operator ");
  2201.                   Write_Name (Chars (Op_Id));
  2202.                   Write_Str (" on node ");
  2203.                   Write_Int (Int (N));
  2204.                   Write_Eol;
  2205.                end if;
  2206.             end if;
  2207.          end;
  2208.       end if;
  2209.    end Analyze_User_Defined_Binary_Op;
  2210.  
  2211.    -----------------------------------
  2212.    -- Analyze_User_Defined_Unary_Op --
  2213.    -----------------------------------
  2214.  
  2215.    procedure Analyze_User_Defined_Unary_Op
  2216.      (N     : Node_Id;
  2217.       Op_Id : Entity_Id)
  2218.    is
  2219.    begin
  2220.       --  Only do analysis if the operator Comes_From_Source, since otherwise
  2221.       --  the operator was generated by the expander, and all such operators
  2222.       --  always refer to the operators in package Standard.
  2223.  
  2224.       if Comes_From_Source (N) then
  2225.          declare
  2226.             F : constant Entity_Id := First_Formal (Op_Id);
  2227.  
  2228.          begin
  2229.             --  Verify that Op_Id is a visible unary function. Note that since
  2230.             --  we know Op_Id is overloaded, potentially use visible means use
  2231.             --  visible for sure (RM 9.4(11)).
  2232.  
  2233.             if Ekind (Op_Id) = E_Function
  2234.               and then No (Next_Formal (F))
  2235.               and then (Is_Immediately_Visible (Op_Id)
  2236.                               or else Is_Potentially_Use_Visible (Op_Id))
  2237.               and then Has_Compatible_Type (Right_Opnd (N), Etype (F))
  2238.             then
  2239.                Add_One_Interp (N, Op_Id, Etype (Op_Id));
  2240.             end if;
  2241.          end;
  2242.       end if;
  2243.    end Analyze_User_Defined_Unary_Op;
  2244.  
  2245.    ---------------------------
  2246.    -- Check_Arithmetic_Pair --
  2247.    ---------------------------
  2248.  
  2249.    procedure Check_Arithmetic_Pair
  2250.      (T1, T2 : Entity_Id;
  2251.       Op_Id  : Entity_Id;
  2252.       N      : Node_Id)
  2253.    is
  2254.       Op_Name : constant Name_Id   := Chars (Op_Id);
  2255.  
  2256.       function Specific_Type (T1, T2 : Entity_Id) return Entity_Id;
  2257.       --  Get specific type (i.e. non-universal type if there is one)
  2258.  
  2259.       function Specific_Type (T1, T2 : Entity_Id) return Entity_Id is
  2260.       begin
  2261.          if T1 = Universal_Integer or else T1 = Universal_Real then
  2262.             return Base_Type (T2);
  2263.          else
  2264.             return Base_Type (T1);
  2265.          end if;
  2266.       end Specific_Type;
  2267.  
  2268.    --  Start of processing for Check_Arithmetic_Pair
  2269.  
  2270.    begin
  2271.       if Op_Name = Name_Op_Add or else Op_Name = Name_Op_Subtract then
  2272.          if Is_Numeric_Type (T1)
  2273.            and then (Covers (T1, T2) or else Covers (T2, T1))
  2274.          then
  2275.             Add_One_Interp (N, Op_Id, Specific_Type (T1, T2));
  2276.          end if;
  2277.  
  2278.       elsif Op_Name = Name_Op_Multiply or else Op_Name = Name_Op_Divide then
  2279.  
  2280.          if Is_Fixed_Point_Type (T1)
  2281.            and then (Is_Fixed_Point_Type (T2)
  2282.                        or else T2 = Universal_Real)
  2283.          then
  2284.             --  If Treat_Fixed_As_Integer is set then the Etype is already set
  2285.             --  and no further processing is required (this is the case of an
  2286.             --  operator constructed by Exp_Fixd for a fixed point operation)
  2287.             --  Otherwise add one interpretation with universal fixed result
  2288.             --  If the operator is given in  functional notation, it comes
  2289.             --  from source and Fixed_As_Integer cannot apply.
  2290.  
  2291.             if Nkind (N) not in N_Op
  2292.               or else not Treat_Fixed_As_Integer (N) then
  2293.                Add_One_Interp (N, Op_Id, Universal_Fixed);
  2294.             end if;
  2295.  
  2296.          elsif Is_Fixed_Point_Type (T2)
  2297.            and then (Nkind (N) not in N_Op
  2298.                       or else not Treat_Fixed_As_Integer (N))
  2299.            and then T1 = Universal_Real
  2300.          then
  2301.             Add_One_Interp (N, Op_Id, Universal_Fixed);
  2302.  
  2303.          elsif Is_Numeric_Type (T1)
  2304.            and then (Covers (T1, T2) or else Covers (T2, T1))
  2305.          then
  2306.             Add_One_Interp (N, Op_Id, Specific_Type (T1, T2));
  2307.  
  2308.          elsif Is_Fixed_Point_Type (T1)
  2309.            and then (Base_Type (T2) = Standard_Integer
  2310.                        or else T2 = Universal_Integer)
  2311.          then
  2312.             Add_One_Interp (N, Op_Id, T1);
  2313.  
  2314.          elsif T2 = Universal_Real
  2315.            and then Base_Type (T1) = Standard_Integer
  2316.            and then Op_Name = Name_Op_Multiply
  2317.          then
  2318.             Add_One_Interp (N, Op_Id, Universal_Real);
  2319.  
  2320.          elsif T1 = Universal_Real
  2321.            and then Base_Type (T2) = Standard_Integer
  2322.          then
  2323.             Add_One_Interp (N, Op_Id, Universal_Real);
  2324.  
  2325.          elsif Is_Fixed_Point_Type (T2)
  2326.            and then (Base_Type (T1) = Standard_Integer
  2327.                        or else T1 = Universal_Integer)
  2328.            and then Op_Name = Name_Op_Multiply
  2329.          then
  2330.             Add_One_Interp (N, Op_Id, T2);
  2331.  
  2332.          elsif T1 = Universal_Real and then T2 = Universal_Integer then
  2333.             Add_One_Interp (N, Op_Id, T1);
  2334.  
  2335.          elsif T2 = Universal_Real
  2336.            and then T1 = Universal_Integer
  2337.            and then Op_Name = Name_Op_Multiply
  2338.          then
  2339.             Add_One_Interp (N, Op_Id, T2);
  2340.          end if;
  2341.  
  2342.       elsif Op_Name = Name_Op_Mod or else Op_Name = Name_Op_Rem then
  2343.  
  2344.          --  Note: The fixed-point operands case with Treat_Fixed_As_Integer
  2345.          --  set does not require any special processing, since the Etype is
  2346.          --  already set (case of operation constructed by Exp_Fixed).
  2347.  
  2348.          if Is_Integer_Type (T1)
  2349.            and then (Covers (T1, T2) or else Covers (T2, T1))
  2350.          then
  2351.             Add_One_Interp (N, Op_Id, Specific_Type (T1, T2));
  2352.          end if;
  2353.  
  2354.       elsif Op_Name = Name_Op_Expon then
  2355.          if Is_Numeric_Type (T1)
  2356.            and then not Is_Fixed_Point_Type (T1)
  2357.            and then (Base_Type (T2) = Standard_Integer
  2358.                       or else T2 = Universal_Integer)
  2359.          then
  2360.             Add_One_Interp (N, Op_Id, Base_Type (T1));
  2361.          end if;
  2362.  
  2363.       elsif Nkind (N) in N_Op_Shift then
  2364.  
  2365.          --  If not one of the predefined operators, the node may be one
  2366.          --  of the intrinsic functions. Its kind is always specific, and
  2367.          --  we can use it directly, rather than the name of the operation.
  2368.  
  2369.          if Is_Integer_Type (T1)
  2370.            and then (Base_Type (T2) = Standard_Integer
  2371.                       or else T2 = Universal_Integer)
  2372.          then
  2373.             Add_One_Interp (N, Op_Id, Base_Type (T1));
  2374.          end if;
  2375.  
  2376.       else
  2377.          pragma Assert (False); null;
  2378.       end if;
  2379.    end Check_Arithmetic_Pair;
  2380.  
  2381.    ---------------------------
  2382.    -- Find_Arithmetic_Types --
  2383.    ---------------------------
  2384.  
  2385.    procedure Find_Arithmetic_Types
  2386.      (L, R  : Node_Id;
  2387.       Op_Id : Entity_Id;
  2388.       N     : Node_Id)
  2389.    is
  2390.       Index1, Index2 : Interp_Index;
  2391.       It1, It2 : Interp;
  2392.  
  2393.       procedure Check_Right_Argument (T : Entity_Id);
  2394.       --  Check right operand of operator
  2395.  
  2396.       procedure Check_Right_Argument (T : Entity_Id) is
  2397.       begin
  2398.          if not Is_Overloaded (R) then
  2399.             Check_Arithmetic_Pair (T, Etype (R), Op_Id,  N);
  2400.          else
  2401.             Get_First_Interp (R, Index2, It2);
  2402.  
  2403.             while Present (It2.Typ) loop
  2404.                Check_Arithmetic_Pair (T, It2.Typ, Op_Id, N);
  2405.                Get_Next_Interp (Index2, It2);
  2406.             end loop;
  2407.          end if;
  2408.       end Check_Right_Argument;
  2409.  
  2410.    --  Start processing for Find_Arithmetic_Types
  2411.  
  2412.    begin
  2413.       if not Is_Overloaded (L) then
  2414.          Check_Right_Argument (Etype (L));
  2415.  
  2416.       else
  2417.          Get_First_Interp (L, Index1, It1);
  2418.  
  2419.          while Present (It1.Typ) loop
  2420.             Check_Right_Argument (It1.Typ);
  2421.             Get_Next_Interp (Index1, It1);
  2422.          end loop;
  2423.       end if;
  2424.  
  2425.    end Find_Arithmetic_Types;
  2426.  
  2427.    ------------------------
  2428.    -- Find_Boolean_Types --
  2429.    ------------------------
  2430.  
  2431.    procedure Find_Boolean_Types
  2432.      (L, R  : Node_Id;
  2433.       Op_Id : Entity_Id;
  2434.       N     : Node_Id)
  2435.    is
  2436.       Index : Interp_Index;
  2437.       It    : Interp;
  2438.  
  2439.       procedure Check_Numeric_Argument (T : Entity_Id);
  2440.       --  Special case for logical operations one of whose operands is an
  2441.       --  integer literal.
  2442.  
  2443.       procedure Check_Numeric_Argument (T : Entity_Id) is
  2444.       begin
  2445.          if T = Universal_Integer
  2446.            or else Is_Modular_Integer_Type (T)
  2447.          then
  2448.             Add_One_Interp (N, Op_Id, T);
  2449.          end if;
  2450.       end Check_Numeric_Argument;
  2451.  
  2452.    begin
  2453.       if not Is_Overloaded (L) then
  2454.  
  2455.          if Etype (L) = Universal_Integer then
  2456.             if not Is_Overloaded (R) then
  2457.                Check_Numeric_Argument (Etype (R));
  2458.  
  2459.             else
  2460.                Get_First_Interp (R, Index, It);
  2461.  
  2462.                while Present (It.Typ) loop
  2463.                   Check_Numeric_Argument (It.Typ);
  2464.  
  2465.                   Get_Next_Interp (Index, It);
  2466.                end loop;
  2467.             end if;
  2468.  
  2469.          elsif Valid_Boolean_Arg (Etype (L))
  2470.            and then Has_Compatible_Type (R, Etype (L))
  2471.          then
  2472.             Add_One_Interp (N, Op_Id, Etype (L));
  2473.          end if;
  2474.  
  2475.       else
  2476.          Get_First_Interp (L, Index, It);
  2477.  
  2478.          while Present (It.Typ) loop
  2479.             if Valid_Boolean_Arg (It.Typ)
  2480.               and then Has_Compatible_Type (R, It.Typ)
  2481.             then
  2482.                Add_One_Interp (N, Op_Id, It.Typ);
  2483.             end if;
  2484.  
  2485.             Get_Next_Interp (Index, It);
  2486.          end loop;
  2487.       end if;
  2488.    end Find_Boolean_Types;
  2489.  
  2490.    ---------------------------
  2491.    -- Find_Comparison_Types --
  2492.    ---------------------------
  2493.  
  2494.    procedure Find_Comparison_Types
  2495.      (L, R  : Node_Id;
  2496.       Op_Id : Entity_Id;
  2497.       N     : Node_Id)
  2498.    is
  2499.       Index : Interp_Index;
  2500.       It    : Interp;
  2501.       Found : Boolean := False;
  2502.       T_F   : Entity_Id;
  2503.  
  2504.       procedure Try_One_Interp (T1 : Entity_Id);
  2505.       --  Routine to try one proposed interpretation. Note that the context
  2506.       --  of the operator plays no role in resolving the arguments, so that
  2507.       --  if there is more than one interpretation of the operands that is
  2508.       --  compatible with comparison, the operation is ambiguous.
  2509.  
  2510.       procedure Try_One_Interp (T1 : Entity_Id) is
  2511.       begin
  2512.          if Valid_Comparison_Arg (T1)
  2513.            and then Has_Compatible_Type (R, T1)
  2514.          then
  2515.             if Found
  2516.               and then Base_Type (T1) /= Base_Type (T_F)
  2517.             then
  2518.                Error_Msg_N ("ambiguous operands for comparison",  N);
  2519.                Set_Etype (L, Any_Type);
  2520.             else
  2521.                Found := True;
  2522.                T_F := T1;
  2523.                Set_Etype (L, T1);
  2524.                Add_One_Interp (N, Op_Id, Standard_Boolean);
  2525.             end if;
  2526.          end if;
  2527.       end Try_One_Interp;
  2528.  
  2529.    --  Start processing for Find_Comparison_Types
  2530.  
  2531.    begin
  2532.       if not Is_Overloaded (L) then
  2533.          Try_One_Interp (Etype (L));
  2534.  
  2535.       else
  2536.          Get_First_Interp (L, Index, It);
  2537.  
  2538.          while Present (It.Typ) loop
  2539.             Try_One_Interp (It.Typ);
  2540.             Get_Next_Interp (Index, It);
  2541.          end loop;
  2542.       end if;
  2543.    end Find_Comparison_Types;
  2544.  
  2545.    ------------------------------
  2546.    -- Find_Concatenation_Types --
  2547.    ------------------------------
  2548.  
  2549.    procedure Find_Concatenation_Types
  2550.      (L, R  : Node_Id;
  2551.       Op_Id : Entity_Id;
  2552.       N     : Node_Id)
  2553.    is
  2554.       Op_Type : constant Entity_Id := Etype (Op_Id);
  2555.  
  2556.    begin
  2557.       if Is_Array_Type (Op_Type)
  2558.         and then not Is_Limited_Type (Op_Type)
  2559.         and then (Has_Compatible_Type (L, Op_Type)
  2560.              or else Has_Compatible_Type (L, Component_Type (Op_Type)))
  2561.         and then
  2562.          (Has_Compatible_Type (R, Op_Type)
  2563.              or else Has_Compatible_Type (R, Component_Type (Op_Type)))
  2564.       then
  2565.          Add_One_Interp (N, Op_Id, Op_Type);
  2566.       end if;
  2567.    end Find_Concatenation_Types;
  2568.  
  2569.    -------------------------
  2570.    -- Find_Equality_Types --
  2571.    -------------------------
  2572.  
  2573.    procedure Find_Equality_Types
  2574.      (L, R  : Node_Id;
  2575.       Op_Id : Entity_Id;
  2576.       N     : Node_Id)
  2577.    is
  2578.       Index : Interp_Index;
  2579.       It    : Interp;
  2580.       Found : Boolean := False;
  2581.       T_F   : Entity_Id;
  2582.  
  2583.       procedure Try_One_Interp (T1 : Entity_Id);
  2584.       --  The context of the operator plays no role in resolving the
  2585.       --  arguments,  so that if there is more than one interpretation
  2586.       --  of the operands that is compatible with equality, the construct
  2587.       --  is ambiguous and an error can be emitted now.
  2588.  
  2589.       procedure Try_One_Interp (T1 : Entity_Id) is
  2590.       begin
  2591.          if not Is_Limited_Type (T1)
  2592.            and then T1 /= Standard_Void_Type
  2593.            and then Has_Compatible_Type (R, T1)
  2594.          then
  2595.             if Found
  2596.               and then Base_Type (T1) /= Base_Type (T_F)
  2597.             then
  2598.                Error_Msg_N ("ambiguous operands for equality",  N);
  2599.                Set_Etype (L, Any_Type);
  2600.  
  2601.             else
  2602.                Found := True;
  2603.                T_F := T1;
  2604.  
  2605.                if not Analyzed (L) then
  2606.                   Set_Etype (L, T1);
  2607.                end if;
  2608.  
  2609.                Add_One_Interp (N, Op_Id, Standard_Boolean);
  2610.             end if;
  2611.          end if;
  2612.       end Try_One_Interp;
  2613.  
  2614.    --  Start of processing for Find_Equality_Types
  2615.  
  2616.    begin
  2617.       if not Is_Overloaded (L) then
  2618.          Try_One_Interp (Etype (L));
  2619.  
  2620.       else
  2621.          Get_First_Interp (L, Index, It);
  2622.  
  2623.          while Present (It.Typ) loop
  2624.             Try_One_Interp (It.Typ);
  2625.             Get_Next_Interp (Index, It);
  2626.          end loop;
  2627.       end if;
  2628.    end Find_Equality_Types;
  2629.  
  2630.    -------------------------
  2631.    -- Find_Negation_Types --
  2632.    -------------------------
  2633.  
  2634.    procedure Find_Negation_Types
  2635.      (R     : Node_Id;
  2636.       Op_Id : Entity_Id;
  2637.       N     : Node_Id)
  2638.    is
  2639.       Index : Interp_Index;
  2640.       It    : Interp;
  2641.  
  2642.    begin
  2643.       if not Is_Overloaded (R) then
  2644.          if Valid_Boolean_Arg (Etype (R)) then
  2645.             Add_One_Interp (N, Op_Id, Etype (R));
  2646.          end if;
  2647.  
  2648.       else
  2649.          Get_First_Interp (R, Index, It);
  2650.  
  2651.          while Present (It.Typ) loop
  2652.             if Valid_Boolean_Arg (It.Typ) then
  2653.                Add_One_Interp (N, Op_Id, It.Typ);
  2654.             end if;
  2655.  
  2656.             Get_Next_Interp (Index, It);
  2657.          end loop;
  2658.       end if;
  2659.    end Find_Negation_Types;
  2660.  
  2661.    ----------------------
  2662.    -- Find_Unary_Types --
  2663.    ----------------------
  2664.  
  2665.    procedure Find_Unary_Types
  2666.      (R     : Node_Id;
  2667.       Op_Id : Entity_Id;
  2668.       N     : Node_Id)
  2669.    is
  2670.       Index : Interp_Index;
  2671.       It    : Interp;
  2672.  
  2673.    begin
  2674.       if not Is_Overloaded (R) then
  2675.          if Is_Numeric_Type (Etype (R)) then
  2676.             Add_One_Interp (N, Op_Id, Base_Type (Etype (R)));
  2677.          end if;
  2678.  
  2679.       else
  2680.          Get_First_Interp (R, Index, It);
  2681.  
  2682.          while Present (It.Typ) loop
  2683.             if Is_Numeric_Type (It.Typ) then
  2684.                Add_One_Interp (N, Op_Id, Base_Type (It.Typ));
  2685.             end if;
  2686.  
  2687.             Get_Next_Interp (Index, It);
  2688.          end loop;
  2689.       end if;
  2690.    end Find_Unary_Types;
  2691.  
  2692.    ---------------------------------
  2693.    -- Insert_Explicit_Dereference --
  2694.    ---------------------------------
  2695.  
  2696.    procedure Insert_Explicit_Dereference (N : Node_Id) is
  2697.       New_Prefix : Node_Id := New_Copy (N);
  2698.       I          : Interp_Index;
  2699.       It         : Interp;
  2700.       T          : Entity_Id;
  2701.  
  2702.    begin
  2703.       Save_Interps (N, New_Prefix);
  2704.       Rewrite_Substitute_Tree (N,
  2705.         Make_Explicit_Dereference (Sloc (N), Prefix => New_Prefix));
  2706.  
  2707.       Set_Etype (N, Designated_Type (Etype (New_Prefix)));
  2708.  
  2709.       if Is_Overloaded (New_Prefix) then
  2710.          --  The deference is also overloaded, and its interpretations are the
  2711.          --  designated types of the interpretations of the original node.
  2712.  
  2713.          Set_Is_Overloaded (N);
  2714.          Get_First_Interp (New_Prefix, I, It);
  2715.  
  2716.          while Present (It.Nam) loop
  2717.             T := It.Typ;
  2718.  
  2719.             if Is_Access_Type (T) then
  2720.                Add_One_Interp (N, Designated_Type (T), Designated_Type (T));
  2721.             end if;
  2722.             Get_Next_Interp (I, It);
  2723.          end loop;
  2724.  
  2725.          End_Interp_List;
  2726.       end if;
  2727.  
  2728.    end Insert_Explicit_Dereference;
  2729.  
  2730.    --------------------
  2731.    -- Operator_Check --
  2732.    --------------------
  2733.  
  2734.    procedure Operator_Check (N : Node_Id) is
  2735.    begin
  2736.       if Etype (N) = Any_Type then
  2737.  
  2738.          --  Looks bad, but don't complain if either operand has no type,
  2739.          --  since that simply means that we have a propagated error.
  2740.  
  2741.          if Etype (Right_Opnd (N)) = Any_Type
  2742.            or else (Nkind (N) in N_Binary_Op
  2743.                       and then Etype (Left_Opnd (N)) = Any_Type)
  2744.          then
  2745.             null;
  2746.          else
  2747.  
  2748.             if Present (Candidate_Type) then
  2749.                Error_Msg_NE
  2750.                  ("operator for} is not directly visible!", N, Candidate_Type);
  2751.                Error_Msg_N ("use clause would make operation legal!",  N);
  2752.  
  2753.             else
  2754.                Error_Msg_N ("invalid operand types for operator&", N);
  2755.             end if;
  2756.  
  2757.          end if;
  2758.       end if;
  2759.    end Operator_Check;
  2760.  
  2761.    ------------------------------
  2762.    -- Rewrite_Operator_As_Call --
  2763.    ------------------------------
  2764.  
  2765.    procedure Rewrite_Operator_As_Call
  2766.      (N   : Node_Id;
  2767.       Nam : Entity_Id)
  2768.    is
  2769.       L, R    : Node_Id;
  2770.       Actuals :  List_Id := New_List;
  2771.  
  2772.    begin
  2773.       if Nkind (N) in  N_Binary_Op then
  2774.          Append (Left_Opnd (N), Actuals);
  2775.       end if;
  2776.  
  2777.       Append (Right_Opnd (N), Actuals);
  2778.  
  2779.       Change_Node (N, N_Function_Call);
  2780.       Set_Etype   (N, Etype (Nam));
  2781.       Set_Name    (N, New_Occurrence_Of (Nam, Sloc (N)));
  2782.       Set_Parameter_Associations (N, Actuals);
  2783.    end Rewrite_Operator_As_Call;
  2784.  
  2785.    ----------------------
  2786.    -- Try_Indexed_Call --
  2787.    ----------------------
  2788.  
  2789.    function Try_Indexed_Call
  2790.      (N      : Node_Id;
  2791.       Nam    : Entity_Id;
  2792.       Typ    : Entity_Id)
  2793.       return   Boolean
  2794.    is
  2795.       Actuals    : List_Id := Parameter_Associations (N);
  2796.       Actual     : Node_Id := First (Actuals);
  2797.       Index      : Entity_Id := First_Index (Typ);
  2798.  
  2799.    begin
  2800.       while Present (Actual)
  2801.         and then Present (Index)
  2802.       loop
  2803.  
  2804.          --  If the parameter list has a named association, the expression
  2805.          --  is definitely a call and not an indexed component.
  2806.  
  2807.          if Nkind (Actual) = N_Parameter_Association then
  2808.             return False;
  2809.          end if;
  2810.  
  2811.          if not Has_Compatible_Type (Actual, Etype (Index)) then
  2812.             return False;
  2813.          end if;
  2814.  
  2815.          Actual := Next (Actual);
  2816.          Index := Next_Index (Index);
  2817.       end loop;
  2818.  
  2819.       if No (Actual) and then No (Index) then
  2820.          Add_One_Interp (N, Nam, Component_Type (Typ));
  2821.          return True;
  2822.       else
  2823.          return False;
  2824.       end if;
  2825.  
  2826.    end Try_Indexed_Call;
  2827.  
  2828. end Sem_Ch4;
  2829.