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_util.adb < prev    next >
Text File  |  1996-09-28  |  61KB  |  1,961 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ U T I L                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.233 $                            --
  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 Checks;   use Checks;
  27. with Debug;    use Debug;
  28. with Errout;   use Errout;
  29. with Elists;   use Elists;
  30. with Exp_Util; use Exp_Util;
  31. with Itypes;   use Itypes;
  32. with Lib;      use Lib;
  33. with Namet;    use Namet;
  34. with Nlists;   use Nlists;
  35. with Nmake;    use Nmake;
  36. with Output;   use Output;
  37. with Opt;      use Opt;
  38. with Scans;    use Scans;
  39. with Scn;      use Scn;
  40. with Sem;      use Sem;
  41. with Sem_Ch8;  use Sem_Ch8;
  42. with Sem_Eval; use Sem_Eval;
  43. with Sem_Prag; use Sem_Prag;
  44. with Sem_Res;  use Sem_Res;
  45. with Sem_Type; use Sem_Type;
  46. with Sinfo;    use Sinfo;
  47. with Sinput;   use Sinput;
  48. with Snames;   use Snames;
  49. with Stand;    use Stand;
  50. with Style;
  51. with Tbuild;   use Tbuild;
  52.  
  53. package body Sem_Util is
  54.  
  55.    --------------------------
  56.    -- Build_Actual_Subtype --
  57.    --------------------------
  58.  
  59.    --  ??? is there something special to do for the explicit deference
  60.    --  case (e.g. access string) ???
  61.  
  62.    function Build_Actual_Subtype
  63.      (T    : Entity_Id;
  64.       N    : Node_Or_Entity_Id)
  65.       return Node_Id
  66.    is
  67.       Obj : Node_Id;
  68.  
  69.       Loc         : constant Source_Ptr := Sloc (N);
  70.       Constraints : List_Id;
  71.       Decl        : Node_Id;
  72.       Discr       : Entity_Id;
  73.       Formal      : Entity_Id;
  74.       Hi          : Node_Id;
  75.       Lo          : Node_Id;
  76.       Subt        : Entity_Id;
  77.  
  78.    begin
  79.       if Nkind (N) = N_Defining_Identifier then
  80.          Obj := New_Reference_To (N, Loc);
  81.       else
  82.          Obj := N;
  83.       end if;
  84.  
  85.       if Is_Array_Type (T) then
  86.          Constraints := New_List;
  87.  
  88.          for J in 1 .. Number_Dimensions (T) loop
  89.  
  90.             --  Build an array subtype declaration with the nominal
  91.             --  subtype and the bounds of the actual. Add the declaration
  92.             --  in front of the local declarations for the subprogram,for
  93.             --  analysis before any reference to the formal in the body.
  94.  
  95.             Lo :=
  96.               Make_Attribute_Reference (Loc,
  97.                 Prefix => Duplicate_Subexpr (Obj, Name_Req => True),
  98.                 Attribute_Name => Name_First,
  99.                 Expressions => New_List (
  100.                     Make_Integer_Literal (Loc, UI_From_Int (J))));
  101.  
  102.             Hi :=
  103.               Make_Attribute_Reference (Loc,
  104.                 Prefix => Duplicate_Subexpr (Obj, Name_Req => True),
  105.                 Attribute_Name => Name_Last,
  106.                 Expressions => New_List (
  107.                     Make_Integer_Literal (Loc, UI_From_Int (J))));
  108.  
  109.             Append (Make_Range (Loc, Lo, Hi), Constraints);
  110.          end loop;
  111.  
  112.  
  113.       else
  114.          Constraints := New_List;
  115.          Discr := First_Discriminant (T);
  116.  
  117.          while Present (Discr) loop
  118.             Append_To (Constraints,
  119.               Make_Selected_Component (Loc,
  120.                 Prefix => Duplicate_Subexpr (Obj),
  121.                 Selector_Name => New_Occurrence_Of (Discr, Loc)));
  122.             Discr := Next_Discriminant (Discr);
  123.          end loop;
  124.       end if;
  125.  
  126.       Subt :=
  127.         Make_Defining_Identifier (Loc,
  128.           Chars => New_Internal_Name ('S'));
  129.  
  130.       Decl :=
  131.         Make_Subtype_Declaration (Loc,
  132.           Defining_Identifier => Subt,
  133.           Subtype_Indication => Make_Subtype_Indication (Loc,
  134.             Subtype_Mark => New_Reference_To (T,  Loc),
  135.             Constraint  =>
  136.               Make_Index_Or_Discriminant_Constraint (Loc,
  137.                 Constraints => Constraints)));
  138.  
  139.       return Decl;
  140.    end Build_Actual_Subtype;
  141.  
  142.    ---------------------------------------
  143.    -- Build_Actual_Subtype_Of_Component --
  144.    ---------------------------------------
  145.  
  146.    function Build_Actual_Subtype_Of_Component
  147.      (T    : Entity_Id;
  148.       N    : Node_Id)
  149.       return Node_Id
  150.    is
  151.       Loc  : constant Source_Ptr := Sloc (N);
  152.       P    : constant Node_Id    := Prefix (N);
  153.       D    : Elmt_Id;
  154.       Id   : Node_Id;
  155.       Subt : Entity_Id;
  156.  
  157.       function Denotes_Discriminant (N : Node_Id) return Boolean;
  158.       --  Check whether bound or discriminant constraint is a discriminant.
  159.  
  160.       function Build_Actual_Array_Constraint return List_Id;
  161.       --  If one or more of the bounds of the component depends on
  162.       --  discriminants, build  actual constraint using the discriminants
  163.       --  of the prefix.
  164.  
  165.       function Build_Actual_Record_Constraint return List_Id;
  166.       --  Similar to previous one, for discriminated components constrained
  167.       --  by the discriminant of the enclosing object.
  168.  
  169.       function Denotes_Discriminant (N : Node_Id) return Boolean is
  170.       begin
  171.          return Is_Entity_Name (N)
  172.            and then Ekind (Entity (N)) = E_Discriminant;
  173.       end Denotes_Discriminant;
  174.  
  175.       function Build_Subtype (C : List_Id) return Node_Id;
  176.       --  Build actual declaration for array or record subtype.
  177.  
  178.       function Build_Actual_Array_Constraint return List_Id is
  179.          Constraints : List_Id := New_List;
  180.          Indx        : Node_Id;
  181.          Hi          : Node_Id;
  182.          Lo          : Node_Id;
  183.          Old_Hi      : Node_Id;
  184.          Old_Lo      : Node_Id;
  185.  
  186.       begin
  187.          Indx := First_Index (T);
  188.          while Present (Indx) loop
  189.             Old_Lo := Type_Low_Bound  (Etype (Indx));
  190.             Old_Hi := Type_High_Bound (Etype (Indx));
  191.  
  192.             if Denotes_Discriminant (Old_Lo) then
  193.                Lo :=
  194.                  Make_Selected_Component (Loc,
  195.                    Prefix => New_Copy_Tree (P),
  196.                    Selector_Name => New_Occurrence_Of (Entity (Old_Lo), Loc));
  197.  
  198.             else
  199.                Lo := New_Copy_Tree (Old_Lo);
  200.             end if;
  201.  
  202.             if Denotes_Discriminant (Old_Hi) then
  203.                Hi :=
  204.                  Make_Selected_Component (Loc,
  205.                    Prefix => New_Copy_Tree (P),
  206.                    Selector_Name => New_Occurrence_Of (Entity (Old_Hi), Loc));
  207.  
  208.             else
  209.                Hi := New_Copy_Tree (Old_Hi);
  210.             end if;
  211.  
  212.             Append (Make_Range (Loc, Lo, Hi), Constraints);
  213.             Indx := Next_Index (Indx);
  214.          end loop;
  215.  
  216.          return Constraints;
  217.       end Build_Actual_Array_Constraint;
  218.  
  219.       function Build_Actual_Record_Constraint return List_Id is
  220.          Constraints     : List_Id := New_List;
  221.          D     : Elmt_Id;
  222.          D_Val : Node_Id;
  223.  
  224.       begin
  225.          D := First_Elmt (Discriminant_Constraint (T));
  226.          while Present (D) loop
  227.  
  228.             if Denotes_Discriminant (Node (D)) then
  229.                D_Val :=  Make_Selected_Component (Loc,
  230.                  Prefix => New_Copy_Tree (P),
  231.                 Selector_Name => New_Occurrence_Of (Entity (Node (D)), Loc));
  232.  
  233.             else
  234.                D_Val := New_Copy_Tree (Node (D));
  235.             end if;
  236.  
  237.             Append (D_Val, Constraints);
  238.             D := Next_Elmt (D);
  239.          end loop;
  240.  
  241.          return Constraints;
  242.       end Build_Actual_Record_Constraint;
  243.  
  244.       function Build_Subtype (C : List_Id) return Node_Id is
  245.          Subt : Entity_Id;
  246.          Decl : Node_Id;
  247.  
  248.       begin
  249.          Subt :=
  250.            Make_Defining_Identifier (Loc,
  251.              Chars => New_Internal_Name ('S'));
  252.  
  253.          Decl :=
  254.            Make_Subtype_Declaration (Loc,
  255.              Defining_Identifier => Subt,
  256.              Subtype_Indication => Make_Subtype_Indication (Loc,
  257.                Subtype_Mark => New_Reference_To (Base_Type (T),  Loc),
  258.                Constraint  =>
  259.                  Make_Index_Or_Discriminant_Constraint (Loc,
  260.                    Constraints => C)));
  261.  
  262.          return Decl;
  263.       end Build_Subtype;
  264.  
  265.    --  Start of processing for Build_Actual_Subtype_Of_Component
  266.  
  267.    begin
  268.       if Nkind (N) = N_Explicit_Dereference then
  269.          if Is_Composite_Type (T)
  270.            and then not Is_Constrained (T)
  271.            and then not (Is_Class_Wide_Type (T)
  272.                           and then Is_Constrained (Root_Type (T)))
  273.          then
  274.             return Build_Actual_Subtype (T, N);
  275.          else
  276.             return Empty;
  277.          end if;
  278.  
  279.       elsif Ekind (T) = E_Array_Subtype then
  280.  
  281.          Id := First_Index (T);
  282.  
  283.          while Present (Id) loop
  284.  
  285.             if Denotes_Discriminant (Type_Low_Bound  (Etype (Id))) or else
  286.                Denotes_Discriminant (Type_High_Bound (Etype (Id)))
  287.             then
  288.                return Build_Subtype (Build_Actual_Array_Constraint);
  289.             end if;
  290.  
  291.             Id := Next_Index (Id);
  292.          end loop;
  293.  
  294.       elsif Ekind (T) = E_Record_Subtype
  295.         and then Has_Discriminants (T)
  296.       then
  297.          D := First_Elmt (Discriminant_Constraint (T));
  298.          while Present (D) loop
  299.  
  300.             if Denotes_Discriminant (Node (D)) then
  301.                return Build_Subtype (Build_Actual_Record_Constraint);
  302.             end if;
  303.  
  304.             D := Next_Elmt (D);
  305.          end loop;
  306.       end if;
  307.  
  308.       --  If none of the above, the actual and nominal subtypes are the same.
  309.  
  310.       return Empty;
  311.  
  312.    end Build_Actual_Subtype_Of_Component;
  313.  
  314.    --------------------------
  315.    -- Check_Fully_Declared --
  316.    --------------------------
  317.  
  318.    procedure Check_Fully_Declared (T : Entity_Id; N : Node_Id) is
  319.    begin
  320.       if Ekind (T) = E_Incomplete_Type then
  321.          Error_Msg_NE ("premature usage of incomplete}", N, T);
  322.  
  323.       elsif Has_Private_Component (T)
  324.         and then not Is_Generic_Type (Root_Type (T))
  325.       then
  326.          Error_Msg_NE ("premature usage of incomplete}", N, T);
  327.       end if;
  328.    end Check_Fully_Declared;
  329.  
  330.    -----------------------------------
  331.    -- Compile_Time_Constraint_Error --
  332.    -----------------------------------
  333.  
  334.    procedure Compile_Time_Constraint_Error (N : Node_Id; Msg : String) is
  335.       Loc  : constant Source_Ptr := Sloc (N);
  336.       Typ  : constant Entity_Id  := Etype (N);
  337.       Stat : constant Boolean    := Is_Static_Expression (N);
  338.       Msgc : String (1 .. Msg'Length + 1);
  339.       Msgl : Natural;
  340.       Warn : Boolean;
  341.       P    : Node_Id;
  342.       Msgs : Boolean;
  343.  
  344.       function In_Instance_Body return Boolean;
  345.       --  A static constraint error in an instance body is not a fatal error.
  346.       --  we choose to inhibit the error altogether, because there is no
  347.       --  obvious node (for now) on which to post it.
  348.  
  349.       function In_Instance_Body return Boolean is
  350.          S : Entity_Id := Current_Scope;
  351.  
  352.       begin
  353.          while Present (S)
  354.            and then S /= Standard_Standard
  355.          loop
  356.             if (Ekind (S) = E_Function
  357.                  or else Ekind (S) = E_Procedure)
  358.               and then
  359.                 Present
  360.                   (Generic_Parent (Specification (Get_Declaration_Node (S))))
  361.             then
  362.                return True;
  363.  
  364.             elsif Ekind (S) = E_Package
  365.               and then In_Package_Body (S)
  366.               and then
  367.                 Present
  368.                   (Generic_Parent (Specification (Get_Declaration_Node (S))))
  369.             then
  370.                return True;
  371.             end if;
  372.  
  373.             S := Scope (S);
  374.          end loop;
  375.  
  376.          return False;
  377.       end In_Instance_Body;
  378.  
  379.    --  Start of processing for Compile_Time_Constraint_Error
  380.  
  381.    begin
  382.       if In_Instance_Body then
  383.          return;
  384.  
  385.       --  No messages are generated if we already posted an error on this node
  386.  
  387.       elsif not Error_Posted (N) then
  388.          Msgc (1 .. Msg'Length) := Msg;
  389.  
  390.          --  Message is a warning, even in Ada 95 case
  391.  
  392.          if Msg (Msg'Length) = '?' then
  393.             Warn := True;
  394.             Msgl := Msg'Length;
  395.  
  396.          --  In Ada 83, all messages are warnings
  397.  
  398.          elsif Ada_83 and then Comes_From_Source (N) then
  399.             Msgl := Msg'Length + 1;
  400.             Msgc (Msgl) := '?';
  401.             Warn := True;
  402.  
  403.          --  Otherwise we have a real error message (Ada 95 static case)
  404.  
  405.          else
  406.             Warn := False;
  407.             Msgl := Msg'Length;
  408.          end if;
  409.  
  410.          --  Should we generate a warning? The answer is not quite yes. The
  411.          --  very annoying exception occurs in the case of a short circuit
  412.          --  operator where the left operand is static and decisive. Climb
  413.          --  parents to see if that is the case we have here.
  414.  
  415.          Msgs := True;
  416.          P := N;
  417.  
  418.          loop
  419.             P := Parent (P);
  420.             exit when Nkind (P) not in N_Subexpr;
  421.  
  422.             if (Nkind (P) = N_And_Then
  423.                 and then Is_OK_Static_Expression (Left_Opnd (P))
  424.                 and then Is_False (Expr_Value (Left_Opnd (P))))
  425.               or else (Nkind (P) = N_Or_Else
  426.                 and then Is_OK_Static_Expression (Left_Opnd (P))
  427.                 and then Is_True (Expr_Value (Left_Opnd (P))))
  428.             then
  429.                Msgs := False;
  430.                exit;
  431.             end if;
  432.          end loop;
  433.  
  434.          if Msgs then
  435.             Error_Msg_NE (Msgc (1 .. Msgl), N, Typ);
  436.  
  437.             if Warn then
  438.                Error_Msg_NE
  439.                  ("& will be raised at runtime?!",
  440.                   N, Standard_Constraint_Error);
  441.             else
  442.                Error_Msg_NE
  443.                  ("static expression raises&!",
  444.                   N, Standard_Constraint_Error);
  445.             end if;
  446.          end if;
  447.       end if;
  448.  
  449.       --  Now we replace the node by an N_Raise_Constraint_Error node
  450.       --  This does not need reanalyzing, so set it as analyzed now.
  451.  
  452.       Rewrite_Substitute_Tree (N, Make_Raise_Constraint_Error (Loc));
  453.       Set_Analyzed (N, True);
  454.       Set_Etype (N, Typ);
  455.       Set_Raises_Constraint_Error (N);
  456.  
  457.       --  If the original expression was marked as static, the result is
  458.       --  still marked as static, but the Raises_Constraint_Error flag is
  459.       --  set so that further static evaluation is not attempted.
  460.  
  461.       if Stat then
  462.          Set_Is_Static_Expression (N);
  463.       end if;
  464.  
  465.    end Compile_Time_Constraint_Error;
  466.  
  467.    --------------------
  468.    -- Current_Entity --
  469.    --------------------
  470.  
  471.    --  The currently visible definition for a given identifier is the
  472.    --  one most chained at the start of the visibility chain, i.e. the
  473.    --  one that is referenced by the Node_Id value of the name of the
  474.    --  given identifier.
  475.  
  476.    function Current_Entity (N : Node_Id) return Entity_Id is
  477.    begin
  478.       return Get_Name_Entity_Id (Chars (N));
  479.    end Current_Entity;
  480.  
  481.    -----------------------------
  482.    -- Current_Entity_In_Scope --
  483.    -----------------------------
  484.  
  485.    function Current_Entity_In_Scope (N : Node_Id) return Entity_Id is
  486.       E : Entity_Id;
  487.  
  488.    begin
  489.       E := Get_Name_Entity_Id (Chars (N));
  490.  
  491.       while Present (E)
  492.         and then Scope (E) /= Current_Scope
  493.       loop
  494.          E := Homonym (E);
  495.       end loop;
  496.  
  497.       return E;
  498.    end Current_Entity_In_Scope;
  499.  
  500.    -------------------
  501.    -- Current_Scope --
  502.    -------------------
  503.  
  504.    function Current_Scope return Entity_Id is
  505.       C : constant Entity_Id := Scope_Stack.Table (Scope_Stack.last).Entity;
  506.  
  507.    begin
  508.       if Present (C) then
  509.          return C;
  510.       else
  511.          return Standard_Standard;
  512.       end if;
  513.    end Current_Scope;
  514.  
  515.    -------------------------------
  516.    -- Defining_Unit_Simple_Name --
  517.    -------------------------------
  518.  
  519.    function Defining_Unit_Simple_Name (N : Node_Id) return Entity_Id is
  520.       Nam : Node_Id := Defining_Unit_Name (N);
  521.  
  522.    begin
  523.       if Nkind (Nam) in N_Entity then
  524.          return Nam;
  525.       else
  526.          return Defining_Identifier (Nam);
  527.       end if;
  528.    end Defining_Unit_Simple_Name;
  529.  
  530.    -------------------------
  531.    -- Designate_Same_Unit --
  532.    -------------------------
  533.  
  534.    function Designate_Same_Unit
  535.      (Name1 : Node_Id;
  536.       Name2 : Node_Id)
  537.       return  Boolean
  538.    is
  539.       K1 : Node_Kind := Nkind (Name1);
  540.       K2 : Node_Kind := Nkind (Name2);
  541.  
  542.       function Prefix_Node (N : Node_Id) return Node_Id;
  543.       --  Returns the parent unit name node of a defining program unit name
  544.       --  or the prefix if N is a selected component or an expanded name.
  545.  
  546.       function Select_Node (N : Node_Id) return Node_Id;
  547.       --  Returns the defining identifier node of a defining program unit
  548.       --  name or  the selector node if N is a selected component or an
  549.       --  expanded name.
  550.  
  551.       function Prefix_Node (N : Node_Id) return Node_Id is
  552.       begin
  553.          if Nkind (N) = N_Defining_Program_Unit_Name then
  554.             return Name (N);
  555.  
  556.          else
  557.             return Prefix (N);
  558.          end if;
  559.       end Prefix_Node;
  560.  
  561.       function Select_Node (N : Node_Id) return Node_Id is
  562.       begin
  563.          if Nkind (N) = N_Defining_Program_Unit_Name then
  564.             return Defining_Identifier (N);
  565.  
  566.          else
  567.             return Selector_Name (N);
  568.          end if;
  569.       end Select_Node;
  570.  
  571.    --  Start of processing for Designate_Next_Unit
  572.  
  573.    begin
  574.       if (K1 = N_Identifier or else
  575.           K1 = N_Defining_Identifier)
  576.         and then
  577.          (K2 = N_Identifier or else
  578.           K2 = N_Defining_Identifier)
  579.       then
  580.          return Chars (Name1) = Chars (Name2);
  581.  
  582.       elsif
  583.          (K1 = N_Expanded_Name      or else
  584.           K1 = N_Selected_Component or else
  585.           K1 = N_Defining_Program_Unit_Name)
  586.         and then
  587.          (K2 = N_Expanded_Name      or else
  588.           K2 = N_Selected_Component or else
  589.           K2 = N_Defining_Program_Unit_Name)
  590.       then
  591.          return
  592.            (Chars (Select_Node (Name1)) = Chars (Select_Node (Name2)))
  593.              and then
  594.                Designate_Same_Unit (Prefix_Node (Name1), Prefix_Node (Name2));
  595.  
  596.       else
  597.          return False;
  598.       end if;
  599.    end Designate_Same_Unit;
  600.  
  601.    -----------------------------
  602.    -- Enclosing_Dynamic_Scope --
  603.    -----------------------------
  604.  
  605.    function Enclosing_Dynamic_Scope (E : Entity_Id) return Entity_Id is
  606.       S  : Entity_Id := E;
  607.  
  608.    begin
  609.       --  Chase up the scope links (equivalent to, but faster than moving
  610.       --  through entries stored on the scope stack, since no indexing).
  611.  
  612.  
  613.       while S /= Standard_Standard
  614.         and then Ekind (S) /= E_Block
  615.         and then Ekind (S) /= E_Function
  616.         and then Ekind (S) /= E_Procedure
  617.         and then Ekind (S) /= E_Task_Type
  618.         and then Ekind (S) /= E_Entry
  619.       loop
  620.          S := Scope (S);
  621.       end loop;
  622.  
  623.       return S;
  624.    end Enclosing_Dynamic_Scope;
  625.  
  626.    ----------------
  627.    -- Enter_Name --
  628.    ----------------
  629.  
  630.    procedure Enter_Name (Def_Id : Node_Id) is
  631.       C : constant Entity_Id := Current_Entity (Def_Id);
  632.       E : constant Entity_Id := Current_Entity_In_Scope (Def_Id);
  633.       S : constant Entity_Id := Current_Scope;
  634.  
  635.    begin
  636.       --  Add new name to current scope declarations. Check for duplicate
  637.       --  declaration, which may or may not be a genuine error.
  638.  
  639.       if Present (E) then
  640.  
  641.          --  Case of previous entity entered because of a missing declaration
  642.          --  or else a bad subtype indication. Best is to use the new entity,
  643.          --  and make the previous one invisible.
  644.  
  645.          if Etype (E) = Any_Type then
  646.             Set_Is_Immediately_Visible (E, False);
  647.  
  648.          --  Case of renaming declaration constructed for package instances.
  649.          --  if there is an explicit declaration with the same identifier,
  650.          --  the renaming is not immediately visible any longer, but remains
  651.          --  visible through selected component notation.
  652.  
  653.          elsif Nkind (Parent (E)) = N_Package_Renaming_Declaration
  654.            and then not Comes_From_Source (E)
  655.          then
  656.             Set_Is_Immediately_Visible (E, False);
  657.  
  658.          --  Case of genuine duplicate declaration
  659.  
  660.          else
  661.             Error_Msg_Sloc := Sloc (E);
  662.             Error_Msg_N ("& conflicts with declaration#", Def_Id);
  663.  
  664.             --  If entity is in standard, then we are in trouble, because
  665.             --  it means that we have a library package with a duplicated
  666.             --  name. That's hard to recover from, so abort!
  667.  
  668.             if S = Standard_Standard then
  669.                raise Unrecoverable_Error;
  670.  
  671.             --  Otherwise we continue with the declaration. Having two
  672.             --  identical declarations should not cause us too much trouble!
  673.  
  674.             else
  675.                null;
  676.             end if;
  677.          end if;
  678.       end if;
  679.  
  680.       --  If we fall through, declaration is OK , or OK enough to continue
  681.  
  682.       --  The kind E_Void insures that premature uses of the entity will be
  683.       --  detected. Any_Type insures that no cascaded errors will occur.
  684.  
  685.       Set_Ekind (Def_Id, E_Void);
  686.       Set_Etype (Def_Id, Any_Type);
  687.  
  688.       Set_Is_Immediately_Visible (Def_Id);
  689.       Set_Current_Entity         (Def_Id);
  690.       Set_Homonym                (Def_Id, C);
  691.       Append_Entity              (Def_Id, S);
  692.       Set_Public_Status          (Def_Id);
  693.  
  694.    end Enter_Name;
  695.  
  696.    ------------------
  697.    -- First_Actual --
  698.    ------------------
  699.  
  700.    function First_Actual (Node : Node_Id) return Node_Id is
  701.       N : Node_Id;
  702.  
  703.    begin
  704.       if No (Parameter_Associations (Node)) then
  705.          return Empty;
  706.       end if;
  707.  
  708.       N := First (Parameter_Associations (Node));
  709.  
  710.       if Nkind (N) = N_Parameter_Association then
  711.          return First_Named_Actual (Node);
  712.       else
  713.          return N;
  714.       end if;
  715.    end First_Actual;
  716.  
  717.    --------------------------
  718.    -- Get_Declaration_Node --
  719.    --------------------------
  720.  
  721.    function Get_Declaration_Node (Unit_Id : Entity_Id) return Node_Id is
  722.       N : Node_Id := Parent (Unit_Id);
  723.  
  724.    begin
  725.       --  Predefined operators do not have a full function declaration.
  726.  
  727.       if Ekind (Unit_Id) = E_Operator then
  728.          return N;
  729.       end if;
  730.  
  731.       while Nkind (N) /= N_Abstract_Subprogram_Declaration
  732.         and then Nkind (N) /= N_Formal_Subprogram_Declaration
  733.         and then Nkind (N) /= N_Generic_Package_Declaration
  734.         and then Nkind (N) /= N_Generic_Subprogram_Declaration
  735.         and then Nkind (N) /= N_Package_Declaration
  736.         and then Nkind (N) /= N_Package_Body
  737.         and then Nkind (N) /= N_Package_Renaming_Declaration
  738.         and then Nkind (N) /= N_Subprogram_Declaration
  739.         and then Nkind (N) /= N_Subprogram_Body
  740.         and then Nkind (N) /= N_Subprogram_Body_Stub
  741.         and then Nkind (N) /= N_Subprogram_Renaming_Declaration
  742.         and then Nkind (N) not in N_Generic_Renaming_Declaration
  743.       loop
  744.          N := Parent (N);
  745.          pragma Assert (Present (N));
  746.       end loop;
  747.  
  748.       return N;
  749.    end Get_Declaration_Node;
  750.  
  751.    ------------------------
  752.    -- Get_Actual_Subtype --
  753.    ------------------------
  754.  
  755.    function Get_Actual_Subtype (N : Node_Id) return Entity_Id is
  756.       Typ    : constant Entity_Id := Underlying_Type (Etype (N));
  757.       Decl   : Node_Id;
  758.  
  759.    begin
  760.       --  For all types other than constrained arrays the actual subtype
  761.       --  is the nominal subtype, and we return the argument unchanged.
  762.  
  763.       if not Is_Array_Type (Typ)
  764.         or else Ekind (Typ) = E_String_Literal_Subtype
  765.         or else Is_Constrained (Typ)
  766.       then
  767.          return Typ;
  768.  
  769.       --  Here for the unconstrained case, we must find actual subtype
  770.  
  771.       else
  772.          --  If what we have is an identifier that references a subprogram
  773.          --  formal, or a variable or constant object, then we get the actual
  774.          --  subtype from the referenced entity if one has been built.
  775.  
  776.          if Nkind (N) = N_Identifier
  777.            and then
  778.              (Ekind (Entity (N)) in Formal_Kind or else
  779.               Ekind (Entity (N)) = E_Constant     or else
  780.               Ekind (Entity (N)) = E_Variable)
  781.            and then Present (Actual_Subtype (Entity (N)))
  782.  
  783.          then
  784.             return Actual_Subtype (Entity (N));
  785.  
  786.          --  Here, we have an unconstrained array with no actual subtype in
  787.          --  sight so we build the actual subtype on the fly.
  788.  
  789.          else
  790.             Decl := Build_Actual_Subtype (Etype (N), N);
  791.             Insert_Action (N, Decl);
  792.             return Defining_Identifier (Decl);
  793.          end if;
  794.       end if;
  795.    end Get_Actual_Subtype;
  796.  
  797.    ----------------------
  798.    -- Get_Index_Bounds --
  799.    ----------------------
  800.  
  801.    procedure Get_Index_Bounds (I : Node_Id; L, H : out Node_Id) is
  802.       Kind : constant Node_Kind := Nkind (I);
  803.  
  804.    begin
  805.       if Kind = N_Range then
  806.          L := Low_Bound (I);
  807.          H := High_Bound (I);
  808.  
  809.       elsif Kind = N_Subtype_Indication then
  810.          L := Low_Bound  (Range_Expression (Constraint (I)));
  811.          H := High_Bound (Range_Expression (Constraint (I)));
  812.  
  813.       elsif Is_Entity_Name (I)
  814.         and then Is_Type (Entity (I))
  815.       then
  816.          L := Low_Bound  (Scalar_Range (Entity (I)));
  817.          H := High_Bound (Scalar_Range (Entity (I)));
  818.  
  819.       else
  820.          --  I is an expression, indicating a range with one value.
  821.  
  822.          L := I;
  823.          H := I;
  824.  
  825.       end if;
  826.  
  827.       --  ??? The bounds are copied around without any checks all over the
  828.       --  place in the agregate code. This is completely wrong... For now,
  829.       --  a partial fix (kludge?) is made to avoid to copy unnecessarily
  830.       --  the expression action that can be generated for 'range.  The proper
  831.       --  fix would be to compute L and H in the following manner
  832.       --   L --> T'first  (where T is Etype (I))
  833.       --   H --> T'Last and get rid of the New_Copy from the callers...
  834.  
  835.       if Nkind (L) = N_Expression_Actions then
  836.          L := Expression (L);
  837.       end if;
  838.    end Get_Index_Bounds;
  839.  
  840.    ------------------------
  841.    -- Get_Name_Entity_Id --
  842.    ------------------------
  843.  
  844.    function Get_Name_Entity_Id (Id : Name_Id) return Entity_Id is
  845.    begin
  846.       return Entity_Id (Get_Name_Table_Info (Id));
  847.    end Get_Name_Entity_Id;
  848.  
  849.    ---------------------------
  850.    -- Get_Referenced_Object --
  851.    ---------------------------
  852.  
  853.    function Get_Referenced_Object (N : Node_Id) return Node_Id is
  854.       R   : Node_Id := N;
  855.  
  856.    begin
  857.       while Is_Entity_Name (R)
  858.         and then Present (Renamed_Object (Entity (R)))
  859.       loop
  860.          R := Renamed_Object (Entity (R));
  861.       end loop;
  862.  
  863.       return R;
  864.    end Get_Referenced_Object;
  865.  
  866.    ---------------------------
  867.    -- Has_Private_Component --
  868.    ---------------------------
  869.  
  870.    function Has_Private_Component (Type_Id : Entity_Id) return Boolean is
  871.       Btype     : Entity_Id := Base_Type (Type_Id);
  872.       Component : Entity_Id;
  873.  
  874.    begin
  875.  
  876.       if Is_Class_Wide_Type (Btype) then
  877.          Btype := Root_Type (Btype);
  878.       end if;
  879.  
  880.       if Is_Private_Type (Btype) then
  881.          return No (Underlying_Type (Btype))
  882.            and then not Is_Generic_Type (Btype)
  883.            and then not Is_Generic_Type (Root_Type (Btype));
  884.  
  885.       elsif Is_Array_Type (Btype) then
  886.          return Has_Private_Component (Component_Type (Btype));
  887.  
  888.       elsif Is_Record_Type (Btype) then
  889.  
  890.          Component := First_Component (Btype);
  891.          while Present (Component) loop
  892.             if Has_Private_Component (Etype (Component)) then
  893.                return True;
  894.             end if;
  895.  
  896.             Component := Next_Component (Component);
  897.          end loop;
  898.  
  899.          return False;
  900.  
  901.       else
  902.          return False;
  903.       end if;
  904.    end Has_Private_Component;
  905.  
  906.    --------------------------
  907.    -- Has_Tagged_Component --
  908.    --------------------------
  909.  
  910.    function Has_Tagged_Component (Typ : Entity_Id) return Boolean is
  911.       Comp : Entity_Id;
  912.  
  913.    begin
  914.       if Is_Private_Type (Typ)
  915.         and then Present (Underlying_Type (Typ))
  916.       then
  917.          return Has_Tagged_Component (Underlying_Type (Typ));
  918.  
  919.       elsif Is_Array_Type (Typ) then
  920.          return Has_Tagged_Component (Component_Type (Typ));
  921.  
  922.       elsif Is_Tagged_Type (Typ) then
  923.          return True;
  924.  
  925.       elsif Is_Record_Type (Typ) then
  926.          Comp := First_Component (Typ);
  927.  
  928.          while Present (Comp) loop
  929.             if Has_Tagged_Component (Etype (Comp)) then
  930.                return True;
  931.             end if;
  932.  
  933.             Comp := Next_Component (Typ);
  934.          end loop;
  935.  
  936.          return False;
  937.  
  938.       else
  939.          return False;
  940.       end if;
  941.    end Has_Tagged_Component;
  942.  
  943.    ----------------------
  944.    -- Private_Ancestor --
  945.    ----------------------
  946.  
  947.    function Private_Ancestor (Type_Id : Entity_Id) return Entity_Id is
  948.       Btype     : constant Entity_Id := Base_Type (Type_Id);
  949.       Component : Entity_Id;
  950.       P         : Entity_Id;
  951.  
  952.    begin
  953.       if Is_Private_Type (Btype)
  954.         and then No (Underlying_Type (Btype))
  955.         and then not Is_Generic_Type (Btype)
  956.       then
  957.          return Btype;
  958.  
  959.       elsif Is_Array_Type (Btype) then
  960.          return Private_Ancestor (Component_Type (Btype));
  961.  
  962.       elsif Is_Record_Type (Btype) then
  963.          Component := First_Entity (Btype);
  964.          while Present (Component) loop
  965.             P := Private_Ancestor (Etype (Component));
  966.  
  967.             if Present (P) then
  968.                return P;
  969.             end if;
  970.  
  971.             Component := Next_Entity (Component);
  972.          end loop;
  973.  
  974.          return Empty;
  975.  
  976.       else
  977.          return Empty;
  978.       end if;
  979.    end Private_Ancestor;
  980.  
  981.    --------------------
  982.    -- In_Subrange_Of --
  983.    --------------------
  984.  
  985.    function In_Subrange_Of (T1 : Entity_Id; T2 : Entity_Id) return Boolean is
  986.    begin
  987.       if T1 = T2 or else Is_Subtype_Of (T1, T2) then
  988.          return True;
  989.  
  990.       --  For now consider mixed types to be in range so that no range checking
  991.       --  is done until all the cases are more understood. ???
  992.  
  993.       elsif Ekind (Base_Type (T1)) /= Ekind (Base_Type (T2)) then
  994.          return True;
  995.  
  996.       elsif not Is_OK_Static_Subtype (T1)
  997.         or else not Is_OK_Static_Subtype (T2)
  998.       then
  999.          return False;
  1000.  
  1001.       elsif Is_Discrete_Type (T1) then
  1002.          return
  1003.            Expr_Value (Type_Low_Bound (T2)) <=
  1004.            Expr_Value (Type_Low_Bound (T1))
  1005.              and then
  1006.            Expr_Value (Type_High_Bound (T2)) >=
  1007.            Expr_Value (Type_High_Bound (T1));
  1008.  
  1009.       elsif Is_Floating_Point_Type (T1) then
  1010.          return
  1011.            Expr_Value_R (Type_Low_Bound (T2))  <=
  1012.            Expr_Value_R (Type_Low_Bound (T1))
  1013.              and then
  1014.            Expr_Value_R (Type_High_Bound (T2)) >=
  1015.            Expr_Value_R (Type_High_Bound (T1));
  1016.  
  1017.       else
  1018.          return False;
  1019.       end if;
  1020.    end In_Subrange_Of;
  1021.  
  1022.    --------------------
  1023.    -- Is_Entity_Name --
  1024.    --------------------
  1025.  
  1026.    function Is_Entity_Name (N : Node_Id) return Boolean is
  1027.       Kind : constant Node_Kind := Nkind (N);
  1028.  
  1029.    begin
  1030.       --  Identifiers and expanded names are always entity names
  1031.  
  1032.       return Kind = N_Identifier
  1033.         or else Kind = N_Expanded_Name
  1034.  
  1035.       --  Attribute references are entity names if they refer to an entity.
  1036.       --  Note that we don't do this by testing for the presence of the
  1037.       --  Entity field in the N_Attribute_Reference node, since it may not
  1038.       --  have been set yet.
  1039.  
  1040.         or else (Kind = N_Attribute_Reference
  1041.                   and then Is_Entity_Attribute_Name (Attribute_Name (N)));
  1042.    end Is_Entity_Name;
  1043.  
  1044.    --------------
  1045.    -- Is_False --
  1046.    --------------
  1047.  
  1048.    function Is_False (U : Uint) return Boolean is
  1049.    begin
  1050.       return (U = 0);
  1051.    end Is_False;
  1052.  
  1053.    -----------------------------
  1054.    -- Is_Library_Level_Entity --
  1055.    -----------------------------
  1056.  
  1057.    function Is_Library_Level_Entity (E : Entity_Id) return Boolean is
  1058.       Decl      : constant Node_Id := Get_Declaration_Node (E);
  1059.       N         : Node_Id;
  1060.       Unum      : constant Unit_Number_Type := Get_Sloc_Unit_Number (Sloc (E));
  1061.       Unit_Node : constant Node_Id := Unit (Cunit (Unum));
  1062.  
  1063.    begin
  1064.       if E = Cunit_Entity (Unum) then
  1065.          return True;
  1066.  
  1067.       elsif Nkind (Unit_Node) = N_Package_Declaration then
  1068.          N := E;
  1069.  
  1070.          while N /= Unit_Node loop
  1071.  
  1072.             if Nkind (Parent (N)) = N_Package_Specification
  1073.               and then List_Containing (N) = Private_Declarations (Parent (N))
  1074.             then
  1075.                return False;
  1076.             else
  1077.                N := Parent (N);
  1078.             end if;
  1079.  
  1080.          end loop;
  1081.  
  1082.          return True;
  1083.  
  1084.       else
  1085.          return False;
  1086.       end if;
  1087.    end Is_Library_Level_Entity;
  1088.  
  1089.    -------------------------
  1090.    -- Is_Object_Reference --
  1091.    -------------------------
  1092.  
  1093.    function Is_Object_Reference (N : Node_Id) return Boolean is
  1094.    begin
  1095.       if Is_Entity_Name (N) then
  1096.          return Ekind (Entity (N)) in Object_Kind;
  1097.  
  1098.       else
  1099.          case Nkind (N) is
  1100.             when N_Indexed_Component | N_Slice =>
  1101.                return True;
  1102.  
  1103.             when N_Selected_Component =>
  1104.                return True;
  1105.  
  1106.             when N_Explicit_Dereference =>
  1107.                return True;
  1108.  
  1109.             --  An unchecked type conversion is considered to be an object if
  1110.             --  the operand is an object (this construction arises only as a
  1111.             --  result of expansion activities).
  1112.  
  1113.             when N_Unchecked_Type_Conversion =>
  1114.                return True;
  1115.  
  1116.             when others =>
  1117.                return False;
  1118.          end case;
  1119.       end if;
  1120.    end Is_Object_Reference;
  1121.  
  1122.    ----------------------
  1123.    -- Is_Selector_Name --
  1124.    ----------------------
  1125.  
  1126.    function Is_Selector_Name (N : Node_Id) return Boolean is
  1127.  
  1128.    begin
  1129.       if not Is_List_Member (N) then
  1130.          declare
  1131.             P : constant Node_Id   := Parent (N);
  1132.             K : constant Node_Kind := Nkind (P);
  1133.  
  1134.          begin
  1135.             return
  1136.               (K = N_Expanded_Name          or else
  1137.                K = N_Generic_Association    or else
  1138.                K = N_Parameter_Association  or else
  1139.                K = N_Selected_Component)
  1140.               and then Selector_Name (P) = N;
  1141.          end;
  1142.  
  1143.       else
  1144.          declare
  1145.             L : constant List_Id := List_Containing (N);
  1146.             P : constant Node_Id := Parent (L);
  1147.  
  1148.          begin
  1149.             return (Nkind (P) = N_Discriminant_Association
  1150.                      and then Selector_Names (P) = L)
  1151.               or else
  1152.                    (Nkind (P) = N_Component_Association
  1153.                      and then Choices (P) = L);
  1154.          end;
  1155.       end if;
  1156.    end Is_Selector_Name;
  1157.  
  1158.    -------------
  1159.    -- Is_True --
  1160.    -------------
  1161.  
  1162.    function Is_True (U : Uint) return Boolean is
  1163.    begin
  1164.       return (U /= 0);
  1165.    end Is_True;
  1166.  
  1167.    -----------------
  1168.    -- Is_Variable --
  1169.    -----------------
  1170.  
  1171.    function Is_Variable (N : Node_Id) return Boolean is
  1172.  
  1173.       function Is_Variable_Prefix (N : Node_Id) return Boolean;
  1174.       --  Prefixes can involve implicit dereferences, in which case we
  1175.       --  must test for the case of a reference of a constant access
  1176.       --  type, which can never be a variable.
  1177.  
  1178.       function Is_Variable_Prefix (N : Node_Id) return Boolean is
  1179.       begin
  1180.          if Is_Access_Type (Etype (N)) then
  1181.             return not Is_Access_Constant (Root_Type (Etype (N)));
  1182.          else
  1183.             return Is_Variable (N);
  1184.          end if;
  1185.       end Is_Variable_Prefix;
  1186.  
  1187.    --  Start of processing for Is_Variable
  1188.  
  1189.    begin
  1190.       if Assignment_OK (N) then
  1191.          return True;
  1192.  
  1193.       elsif Is_Entity_Name (N) then
  1194.          declare
  1195.             K : Entity_Kind := Ekind (Entity (N));
  1196.  
  1197.          begin
  1198.             return K = E_Variable
  1199.               or else  K = E_Component
  1200.               or else  K = E_Out_Parameter
  1201.               or else  K = E_In_Out_Parameter
  1202.               or else  K = E_Generic_In_Out_Parameter;
  1203.          end;
  1204.  
  1205.       else
  1206.          case Nkind (N) is
  1207.             when N_Indexed_Component | N_Slice =>
  1208.                return Is_Variable_Prefix (Prefix (N));
  1209.  
  1210.             when N_Selected_Component =>
  1211.                return Is_Variable_Prefix (Prefix (N))
  1212.                  and then Is_Variable (Selector_Name (N));
  1213.  
  1214.             --  For an explicit dereference, we must check whether the type
  1215.             --  is ACCESS CONSTANT, since if it is, then it is not a variable.
  1216.  
  1217.             when N_Explicit_Dereference =>
  1218.                return Is_Access_Type (Etype (Prefix (N)))
  1219.                  and then not
  1220.                    Is_Access_Constant (Root_Type (Etype (Prefix (N))));
  1221.  
  1222.             --  The type conversion is the case where we do not deal with the
  1223.             --  context dependent special case of an actual parameter. Thus
  1224.             --  the type conversion is only considered a variable for the
  1225.             --  purposes of this routine if the target type is tagged. However,
  1226.             --  a type conversion is considered to be a variable if it does not
  1227.             --  come from source (this deals for example with the conversions
  1228.             --  of expressions to their actual subtypes).
  1229.  
  1230.             when N_Type_Conversion =>
  1231.                return Is_Variable (Expression (N))
  1232.                  and then
  1233.                    (not Comes_From_Source (N)
  1234.                       or else (Is_Tagged_Type (Etype (Subtype_Mark (N)))
  1235.                                 and then
  1236.                                Is_Tagged_Type (Etype (Expression (N)))));
  1237.  
  1238.             --  GNAT allows an unchecked type conversion as a variable. This
  1239.             --  only affects the generation of internal expanded code, since
  1240.             --  calls to instantiations of Unchecked_Conversion are never
  1241.             --  considered variables (since they are function calls).
  1242.             --  This is also true for expression actions.
  1243.  
  1244.             when N_Unchecked_Type_Conversion |
  1245.                  N_Expression_Actions        =>
  1246.                return Is_Variable (Expression (N));
  1247.  
  1248.             when others =>
  1249.                return False;
  1250.          end case;
  1251.       end if;
  1252.    end Is_Variable;
  1253.  
  1254.    -------------------------
  1255.    -- New_External_Entity --
  1256.    -------------------------
  1257.  
  1258.    function New_External_Entity
  1259.      (Kind         : Entity_Kind;
  1260.       Scope_Id     : Entity_Id;
  1261.       Sloc_Value   : Source_Ptr;
  1262.       Related_Id   : Entity_Id;
  1263.       Suffix       : Character;
  1264.       Suffix_Index : Nat := 0;
  1265.       Prefix       : Character := ' ')
  1266.       return         Entity_Id
  1267.    is
  1268.       N : constant Entity_Id :=
  1269.             Make_Defining_Identifier (Sloc_Value,
  1270.               New_External_Name
  1271.                 (Chars (Related_Id), Suffix, Suffix_Index, Prefix));
  1272.  
  1273.    begin
  1274.       Set_Ekind          (N, Kind);
  1275.       Set_Is_Internal    (N, True);
  1276.       Append_Entity      (N, Scope_Id);
  1277.       Set_Public_Status  (N);
  1278.       Set_Current_Entity (N);
  1279.       return N;
  1280.    end New_External_Entity;
  1281.  
  1282.    -------------------------
  1283.    -- New_Internal_Entity --
  1284.    -------------------------
  1285.  
  1286.    function New_Internal_Entity
  1287.      (Kind       : Entity_Kind;
  1288.       Scope_Id   : Entity_Id;
  1289.       Sloc_Value : Source_Ptr;
  1290.       Id_Char    : Character)
  1291.       return       Entity_Id
  1292.    is
  1293.       N : constant Entity_Id :=
  1294.             Make_Defining_Identifier (Sloc_Value, New_Internal_Name (Id_Char));
  1295.  
  1296.    begin
  1297.       Set_Ekind          (N, Kind);
  1298.       Set_Is_Internal    (N, True);
  1299.       Append_Entity      (N, Scope_Id);
  1300.       Set_Current_Entity (N);
  1301.       return N;
  1302.    end New_Internal_Entity;
  1303.  
  1304.    -----------------
  1305.    -- Next_Actual --
  1306.    -----------------
  1307.  
  1308.    function Next_Actual (Actual_Id : Node_Id) return Node_Id is
  1309.       N  : Node_Id;
  1310.  
  1311.    begin
  1312.       --  If we are pointing at a positional parameter, it is a member of
  1313.       --  a node list (the list of parameters), and the next parameter
  1314.       --  is the next node on the list, unless we hit a parameter
  1315.       --  association, in which case we shift to using the chain whose
  1316.       --  head is the First_Named_Actual in the parent, and then is
  1317.       --  threaded using the Next_Named_Actual of the Parameter_Association.
  1318.       --  All this fiddling is because the original node list is in the
  1319.       --  textual call order, and what we need is the declaration order.
  1320.  
  1321.       if Is_List_Member (Actual_Id) then
  1322.          N := Next (Actual_Id);
  1323.  
  1324.          if Nkind (N) = N_Parameter_Association then
  1325.             return First_Named_Actual (Parent (Actual_Id));
  1326.          else
  1327.             return N;
  1328.          end if;
  1329.  
  1330.       else
  1331.          return Next_Named_Actual (Parent (Actual_Id));
  1332.       end if;
  1333.    end Next_Actual;
  1334.  
  1335.    -----------------------
  1336.    -- Normalize_Actuals --
  1337.    -----------------------
  1338.  
  1339.    --  Chain actuals according to formals of subprogram. If there are
  1340.    --  no named associations, the chain is simply the list of Parameter
  1341.    --  Associations, since the order is the same as the declaration order.
  1342.    --  If there are named associations, then the First_Named_Actual field
  1343.    --  in the N_Procedure_Call_Statement node or N_Function_Call node
  1344.    --  points to the Parameter_Association node for the parameter that
  1345.    --  comes first in declaration order. The remaining named parameters
  1346.    --  are then chained in declaration order using Next_Named_Actual.
  1347.  
  1348.    --  This routine also verifies that the number of actuals is compatible
  1349.    --  with the number and default values of formals, but performs no type
  1350.    --  checking (type checking is done by the caller).
  1351.  
  1352.    --  If the matching succeeds, Success is set to True, and the caller
  1353.    --  proceeds with type-checking. If the match is unsuccessful, then
  1354.    --  Success is set to False, and the caller attempts a different
  1355.    --  interpretation, if there is one.
  1356.  
  1357.    --  If the flag Report is on, the call is not overloaded, and a failure
  1358.    --  to match can be reported here, rather than in the caller.
  1359.  
  1360.    procedure Normalize_Actuals
  1361.      (N       : Node_Id;
  1362.       S       : Entity_Id;
  1363.       Report  : Boolean;
  1364.       Success : out Boolean)
  1365.    is
  1366.       Actuals     : constant List_Id := Parameter_Associations (N);
  1367.       Actual      : Node_Id   := Empty;
  1368.       Formal      : Entity_Id;
  1369.       Last        : Entity_Id := Empty;
  1370.       First_Named : Entity_Id := Empty;
  1371.       Found       : Boolean;
  1372.  
  1373.       Formals_To_Match : Integer := 0;
  1374.       Actuals_To_Match : Integer := 0;
  1375.  
  1376.       procedure Chain (A : Node_Id);
  1377.       --  Need some documentation on this spec ???
  1378.  
  1379.       procedure Chain (A : Node_Id) is
  1380.       begin
  1381.          if No (Last) then
  1382.  
  1383.             --  Call node points to first actual in list.
  1384.  
  1385.             Set_First_Named_Actual (N, Explicit_Actual_Parameter (A));
  1386.  
  1387.          else
  1388.             Set_Next_Named_Actual (Last, Explicit_Actual_Parameter (A));
  1389.          end if;
  1390.  
  1391.          Last := A;
  1392.          Set_Next_Named_Actual (Last, Empty);
  1393.       end Chain;
  1394.  
  1395.    --  Start of processing for Normalize_Actuals
  1396.  
  1397.    begin
  1398.       if Is_Access_Type (S) then
  1399.  
  1400.          --  The name in the call is a function call that returns an access
  1401.          --  to subprogram. The designated type has the list of formals.
  1402.  
  1403.          Formal := First_Formal (Designated_Type (S));
  1404.       else
  1405.          Formal := First_Formal (S);
  1406.       end if;
  1407.  
  1408.       while Present (Formal) loop
  1409.          Formals_To_Match := Formals_To_Match + 1;
  1410.          Formal := Next_Formal (Formal);
  1411.       end loop;
  1412.  
  1413.       --  Find if there is a named association, and verify that no positional
  1414.       --  associations appear after named ones.
  1415.  
  1416.       if Present (Actuals) then
  1417.          Actual := First (Actuals);
  1418.       end if;
  1419.  
  1420.       while Present (Actual)
  1421.         and then Nkind (Actual) /= N_Parameter_Association
  1422.       loop
  1423.          Actuals_To_Match := Actuals_To_Match + 1;
  1424.          Actual := Next (Actual);
  1425.       end loop;
  1426.  
  1427.       if No (Actual) and Actuals_To_Match = Formals_To_Match then
  1428.  
  1429.          --  Most common case: positional notation, no defaults
  1430.  
  1431.          Success := True;
  1432.          return;
  1433.  
  1434.       elsif Actuals_To_Match > Formals_To_Match then
  1435.  
  1436.          --  Too many actuals: will not work.
  1437.  
  1438.          if Report then
  1439.             Error_Msg_N ("too many arguments in call", N);
  1440.          end if;
  1441.  
  1442.          Success := False;
  1443.          return;
  1444.       end if;
  1445.  
  1446.       First_Named := Actual;
  1447.  
  1448.       while Present (Actual) loop
  1449.          if Nkind (Actual) /= N_Parameter_Association then
  1450.             Error_Msg_N
  1451.               ("positional parameters not allowed after named ones", Actual);
  1452.             Success := False;
  1453.             return;
  1454.  
  1455.          else
  1456.             Actuals_To_Match := Actuals_To_Match + 1;
  1457.          end if;
  1458.  
  1459.          Actual := Next (Actual);
  1460.       end loop;
  1461.  
  1462.       if Present (Actuals) then
  1463.          Actual := First (Actuals);
  1464.       end if;
  1465.  
  1466.       Formal := First_Formal (S);
  1467.  
  1468.       while Present (Formal) loop
  1469.  
  1470.          --  Match the formals in order. If the corresponding actual
  1471.          --  is positional,  nothing to do. Else scan the list of named
  1472.          --  actuals to find the one with the right name.
  1473.  
  1474.          if Present (Actual)
  1475.            and then Nkind (Actual) /= N_Parameter_Association
  1476.          then
  1477.             Actual := Next (Actual);
  1478.             Actuals_To_Match := Actuals_To_Match - 1;
  1479.             Formals_To_Match := Formals_To_Match - 1;
  1480.  
  1481.          else
  1482.             --  For named parameters, search the list of actuals to find
  1483.             --  one that matches the next formal name.
  1484.  
  1485.             Actual := First_Named;
  1486.             Found  := False;
  1487.  
  1488.             while Present (Actual) loop
  1489.                if Chars (Selector_Name (Actual)) = Chars (Formal) then
  1490.                   Found := True;
  1491.                   Chain (Actual);
  1492.                   Actuals_To_Match := Actuals_To_Match - 1;
  1493.                   Formals_To_Match := Formals_To_Match - 1;
  1494.                   exit;
  1495.                end if;
  1496.  
  1497.                Actual := Next (Actual);
  1498.             end loop;
  1499.  
  1500.             if not Found then
  1501.                if Ekind (Formal) /= E_In_Parameter
  1502.                  or else No (Default_Value (Formal))
  1503.                then
  1504.                   if Report then
  1505.                      Error_Msg_NE
  1506.                        ("missing argument for parameter &", N, Formal);
  1507.                   end if;
  1508.  
  1509.                   Success := False;
  1510.                   return;
  1511.  
  1512.                else
  1513.                   Formals_To_Match := Formals_To_Match - 1;
  1514.                end if;
  1515.             end if;
  1516.          end if;
  1517.  
  1518.          Formal := Next_Formal (Formal);
  1519.       end loop;
  1520.  
  1521.       if  Formals_To_Match = 0 and then Actuals_To_Match = 0 then
  1522.          Success := True;
  1523.          return;
  1524.  
  1525.       else
  1526.          if Report then
  1527.             Error_Msg_N ("too many arguments in call", N);
  1528.          end if;
  1529.  
  1530.          Success := False;
  1531.          return;
  1532.       end if;
  1533.    end Normalize_Actuals;
  1534.  
  1535.    -------------------------
  1536.    -- Object_Access_Level --
  1537.    -------------------------
  1538.  
  1539.    function Object_Access_Level (Obj : Node_Id) return Uint is
  1540.       E : Entity_Id;
  1541.  
  1542.    --  Returns the static accessibility level of the view denoted
  1543.    --  by Obj.  Note that the value returned is the result of a
  1544.    --  call to Scope_Depth.  Only scope depths associated with
  1545.    --  dynamic scopes can actually be returned.  Since only
  1546.    --  relative levels matter for accessibility checking, the fact
  1547.    --  that the distance between successive levels of accessibility
  1548.    --  is not always one is immaterial (invariant: if level(E2) is
  1549.    --  deeper than level(E1), then Scope_Depth(E1) < Scope_Depth(E2)).
  1550.  
  1551.    begin
  1552.       if Is_Entity_Name (Obj) then
  1553.          E := Entity (Obj);
  1554.  
  1555.          if Present (Renamed_Object (E)) then
  1556.             return Object_Access_Level (Renamed_Object (E));
  1557.          else
  1558.             return Scope_Depth (Enclosing_Dynamic_Scope (Scope (E)));
  1559.          end if;
  1560.  
  1561.       elsif Nkind (Obj) = N_Selected_Component then
  1562.          if Is_Access_Type (Etype (Prefix (Obj))) then
  1563.             return Type_Access_Level (Etype (Prefix (Obj)));
  1564.          else
  1565.             return Object_Access_Level (Prefix (Obj));
  1566.          end if;
  1567.  
  1568.       elsif Nkind (Obj) = N_Indexed_Component then
  1569.          if Is_Access_Type (Etype (Prefix (Obj))) then
  1570.             return Type_Access_Level (Etype (Prefix (Obj)));
  1571.          else
  1572.             return Object_Access_Level (Prefix (Obj));
  1573.          end if;
  1574.  
  1575.       elsif Nkind (Obj) = N_Explicit_Dereference then
  1576.          return Type_Access_Level (Etype (Prefix (Obj)));
  1577.  
  1578.       elsif Nkind (Obj) = N_Type_Conversion then
  1579.          return Object_Access_Level (Expression (Obj));
  1580.  
  1581.       elsif Nkind (Obj) = N_Expression_Actions then
  1582.          return Object_Access_Level (Expression (Obj));
  1583.  
  1584.       --  Otherwise return the scope level of Standard.
  1585.       --  (If there are cases that fall through
  1586.       --  to this point they will be treated as
  1587.       --  having global accessibility for now. ???)
  1588.  
  1589.       else
  1590.          return Scope_Depth (Standard_Standard);
  1591.       end if;
  1592.    end Object_Access_Level;
  1593.  
  1594.    ------------------
  1595.    -- Real_Convert --
  1596.    ------------------
  1597.  
  1598.    --  We do the conversion to get the value of the real string by using
  1599.    --  the scanner, see Sinput for details on use of the internal source
  1600.    --  buffer for scanning internal strings.
  1601.  
  1602.    function Real_Convert (S : String) return Node_Id is
  1603.       Negative : Boolean;
  1604.  
  1605.    begin
  1606.       Source := Internal_Source_Ptr;
  1607.       Scan_Ptr := 1;
  1608.  
  1609.       for J in S'Range loop
  1610.          Source (Source_Ptr (J)) := S (J);
  1611.       end loop;
  1612.  
  1613.       Source (S'Length + 1) := EOF;
  1614.  
  1615.       if Source (Scan_Ptr) = '-' then
  1616.          Negative := True;
  1617.          Scan_Ptr := Scan_Ptr + 1;
  1618.       else
  1619.          Negative := False;
  1620.       end if;
  1621.  
  1622.       Scan;
  1623.  
  1624.       if Negative then
  1625.          Set_Realval (Token_Node, UR_Negate (Realval (Token_Node)));
  1626.       end if;
  1627.  
  1628.       return Token_Node;
  1629.    end Real_Convert;
  1630.  
  1631.    ---------------
  1632.    -- Same_Name --
  1633.    ---------------
  1634.  
  1635.    function Same_Name (N1, N2 : Node_Id) return Boolean is
  1636.       K1 : constant Node_Kind := Nkind (N1);
  1637.       K2 : constant Node_Kind := Nkind (N2);
  1638.  
  1639.    begin
  1640.       if (K1 = N_Identifier or else K1 = N_Defining_Identifier)
  1641.         and then (K2 = N_Identifier or else K2 = N_Defining_Identifier)
  1642.       then
  1643.          return Chars (N1) = Chars (N2);
  1644.  
  1645.       elsif (K1 = N_Selected_Component or else K1 = N_Expanded_Name)
  1646.         and then (K2 = N_Selected_Component or else K2 = N_Expanded_Name)
  1647.       then
  1648.          return Same_Name (Selector_Name (N1), Selector_Name (N2))
  1649.            and then Same_Name (Prefix (N1), Prefix (N2));
  1650.  
  1651.       else
  1652.          return False;
  1653.       end if;
  1654.    end Same_Name;
  1655.  
  1656.    ------------------------
  1657.    -- Set_Current_Entity --
  1658.    ------------------------
  1659.  
  1660.    --  The given entity is to be set as the currently visible definition
  1661.    --  of its associated name (i.e. the Node_Id associated with its name).
  1662.    --  All we have to do is to get the name from the identifier, and
  1663.    --  then set the associated Node_Id to point to the given entity.
  1664.  
  1665.    procedure Set_Current_Entity (E : Entity_Id) is
  1666.    begin
  1667.       Set_Name_Entity_Id (Chars (E), E);
  1668.    end Set_Current_Entity;
  1669.  
  1670.    ---------------------------------
  1671.    -- Set_Entity_With_Style_Check --
  1672.    ---------------------------------
  1673.  
  1674.    procedure Set_Entity_With_Style_Check (N : Node_Id; Val : Entity_Id) is
  1675.       Val_Actual : Entity_Id;
  1676.  
  1677.    begin
  1678.       if Style_Check and then Nkind (N) = N_Identifier then
  1679.          Val_Actual := Val;
  1680.  
  1681.          --  A special situation arises for derived operations, where we want
  1682.          --  to do the check against the parent (since the Sloc of the derived
  1683.          --  operation points to the derived type declaration itself).
  1684.  
  1685.          while not Comes_From_Source (Val_Actual)
  1686.            and then Nkind (Val_Actual) in N_Entity
  1687.            and then (Ekind (Val_Actual) = E_Enumeration_Literal
  1688.                       or else Ekind (Val_Actual) = E_Function
  1689.                       or else Ekind (Val_Actual) = E_Generic_Function
  1690.                       or else Ekind (Val_Actual) = E_Procedure
  1691.                       or else Ekind (Val_Actual) = E_Generic_Procedure)
  1692.            and then Present (Alias (Val_Actual))
  1693.          loop
  1694.             Val_Actual := Alias (Val_Actual);
  1695.          end loop;
  1696.  
  1697.          Style.Check_Identifier (N, Val_Actual);
  1698.       end if;
  1699.  
  1700.       Set_Entity (N, Val);
  1701.    end Set_Entity_With_Style_Check;
  1702.  
  1703.    ------------------------
  1704.    -- Set_Name_Entity_Id --
  1705.    ------------------------
  1706.  
  1707.    procedure Set_Name_Entity_Id (Id : Name_Id; Val : Entity_Id) is
  1708.    begin
  1709.       Set_Name_Table_Info (Id, Int (Val));
  1710.    end Set_Name_Entity_Id;
  1711.  
  1712.    ---------------------
  1713.    -- Set_Next_Actual --
  1714.    ---------------------
  1715.  
  1716.    procedure Set_Next_Actual (Ass1_Id : Node_Id; Ass2_Id : Node_Id) is
  1717.    begin
  1718.       if Nkind (Parent (Ass1_Id)) = N_Parameter_Association then
  1719.          Set_First_Named_Actual (Parent (Ass1_Id), Ass2_Id);
  1720.       end if;
  1721.    end Set_Next_Actual;
  1722.  
  1723.    -----------------------
  1724.    -- Set_Public_Status --
  1725.    -----------------------
  1726.  
  1727.    procedure Set_Public_Status (Id : Entity_Id) is
  1728.       S : constant Entity_Id := Current_Scope;
  1729.  
  1730.    begin
  1731.       if S = Standard_Standard
  1732.         or else (Is_Public (S)
  1733.                   and then (Ekind (S) = E_Package
  1734.                              or else Is_Record_Type (S)
  1735.                              or else Ekind (S) = E_Void))
  1736.       then
  1737.          Set_Is_Public (Id);
  1738.       end if;
  1739.    end Set_Public_Status;
  1740.  
  1741.    --------------------
  1742.    -- Static_Integer --
  1743.    --------------------
  1744.  
  1745.    function Static_Integer (N : Node_Id) return Uint is
  1746.    begin
  1747.       Analyze (N);
  1748.       Resolve (N, Any_Integer);
  1749.  
  1750.       if Is_Static_Expression (N) then
  1751.          if not Raises_Constraint_Error (N) then
  1752.             return Expr_Value (N);
  1753.          else
  1754.             return No_Uint;
  1755.          end if;
  1756.  
  1757.       elsif Etype (N) = Any_Type then
  1758.          return No_Uint;
  1759.  
  1760.       else
  1761.          Error_Msg_N ("static integer expression required here", N);
  1762.          return No_Uint;
  1763.       end if;
  1764.    end Static_Integer;
  1765.  
  1766.    --------------------------
  1767.    -- Statically_Different --
  1768.    --------------------------
  1769.  
  1770.    function Statically_Different (E1, E2 : Node_Id) return Boolean is
  1771.       R1 : constant Node_Id := Get_Referenced_Object (E1);
  1772.       R2 : constant Node_Id := Get_Referenced_Object (E2);
  1773.  
  1774.    begin
  1775.       return     Is_Entity_Name (R1)
  1776.         and then Is_Entity_Name (R2)
  1777.         and then Entity (R1) /= Entity (R2);
  1778.    end Statically_Different;
  1779.  
  1780.    -----------------------------
  1781.    -- Subprogram_Access_Level --
  1782.    -----------------------------
  1783.  
  1784.    function Subprogram_Access_Level (Subp : Entity_Id) return Uint is
  1785.    begin
  1786.       if Present (Alias (Subp)) then
  1787.          return Subprogram_Access_Level (Alias (Subp));
  1788.       else
  1789.          return Scope_Depth (Enclosing_Dynamic_Scope (Scope (Subp)));
  1790.       end if;
  1791.    end Subprogram_Access_Level;
  1792.  
  1793.    -----------------
  1794.    -- Trace_Scope --
  1795.    -----------------
  1796.  
  1797.    procedure Trace_Scope (N : Node_Id; E : Entity_Id; Msg : String) is
  1798.    begin
  1799.       if Debug_Flag_W then
  1800.          for J in 0 .. Scope_Stack.Last loop
  1801.             Write_Str ("  ");
  1802.          end loop;
  1803.  
  1804.          Write_Str (Msg);
  1805.          Write_Name (Chars (E));
  1806.          Write_Str ("   line ");
  1807.          Write_Int (Int (Get_Line_Number (Sloc (N))));
  1808.          Write_Eol;
  1809.       end if;
  1810.    end Trace_Scope;
  1811.  
  1812.    -----------------------
  1813.    -- Transfer_Entities --
  1814.    -----------------------
  1815.  
  1816.    procedure Transfer_Entities (From : Entity_Id; To : Entity_Id) is
  1817.       Ent      : Entity_Id := First_Entity (From);
  1818.       Next_Ent : Entity_Id;
  1819.  
  1820.    begin
  1821.  
  1822.       if No (Ent) then
  1823.          return;
  1824.       end if;
  1825.  
  1826.       if (Last_Entity (To)) = Empty then
  1827.          Set_First_Entity (To, Ent);
  1828.       else
  1829.          Set_Next_Entity (Last_Entity (To), Ent);
  1830.       end if;
  1831.  
  1832.       Set_Last_Entity (To, Last_Entity (From));
  1833.  
  1834.       while Present (Ent) loop
  1835.          Set_Scope (Ent, To);
  1836.          Set_Public_Status (Ent);
  1837.          Ent := Next_Entity (Ent);
  1838.       end loop;
  1839.  
  1840.       Set_First_Entity (From, Empty);
  1841.       Set_Last_Entity (From, Empty);
  1842.    end Transfer_Entities;
  1843.  
  1844.    -----------------------
  1845.    -- Type_Access_Level --
  1846.    -----------------------
  1847.  
  1848.    function Type_Access_Level (Typ : Entity_Id) return Uint is
  1849.       Btyp : Entity_Id := Base_Type (Typ);
  1850.    begin
  1851.       --  If the type is an anonymous access type we treat
  1852.       --  it as being declared at the library level to ensure
  1853.       --  that names such as X.all'access don't fail static
  1854.       --  accessibility checks.
  1855.  
  1856.       if Ekind (Btyp) in Access_Kind then
  1857.          if Ekind (Btyp) = E_Anonymous_Access_Type then
  1858.             return Scope_Depth (Standard_Standard);
  1859.          end if;
  1860.          Btyp := Root_Type (Btyp);
  1861.       end if;
  1862.  
  1863.       return Scope_Depth (Enclosing_Dynamic_Scope (Scope (Btyp)));
  1864.    end Type_Access_Level;
  1865.  
  1866.    -------------------
  1867.    -- Unimplemented --
  1868.    -------------------
  1869.  
  1870.    procedure Unimplemented (N : Node_Id; Feature : String) is
  1871.       Msg1 : constant String := " not implemented yet";
  1872.       Msg2 : String (Feature'First .. Feature'Last + Msg1'Length);
  1873.  
  1874.    begin
  1875.       --  Note that we don't want to use dynamic concatenation in the compiler
  1876.       --  (to limit the number of runtime routines, and hence the possibility
  1877.       --  of bootstrap path problems is reduced).
  1878.  
  1879.       Msg2 (Feature'Range) := Feature;
  1880.       Msg2 (Feature'Last + 1 .. Msg2'Last) := Msg1;
  1881.       Error_Msg_N (Msg2, N);
  1882.    end Unimplemented;
  1883.  
  1884.    ----------------
  1885.    -- Wrong_Type --
  1886.    ----------------
  1887.  
  1888.    procedure Wrong_Type (Expr : Node_Id; Expected_Type : Entity_Id) is
  1889.       Found_Type : constant Entity_Id := Etype (Expr);
  1890.  
  1891.    begin
  1892.       --  Don't output message if either type is Any_Type, or if a message
  1893.       --  has already been posted for this node. We need to do the latter
  1894.       --  check explicitly (it is ordinarily done in Errout), because we
  1895.       --  are using ! to force the output of the error messages.
  1896.  
  1897.       if Expected_Type = Any_Type
  1898.         or else Found_Type = Any_Type
  1899.         or else Error_Posted (Expr)
  1900.       then
  1901.          return;
  1902.       end if;
  1903.  
  1904.       --  An interesting special check. If the expression is parenthesized
  1905.       --  and its type corresponds to the type of the sole component of the
  1906.       --  expected record type, or to the component type of the expected one
  1907.       --  dimensional array type, then assume we have a bad aggregate attempt.
  1908.  
  1909.       if Nkind (Expr) in N_Subexpr
  1910.         and then Paren_Count (Expr) /= 0
  1911.         and then
  1912.           ((Is_Record_Type (Expected_Type)
  1913.              and then not Has_Discriminants (Expected_Type)
  1914.              and then Present (First_Component (Expected_Type))
  1915.              and then
  1916.                Covers (Etype (First_Component (Expected_Type)), Found_Type)
  1917.              and then No (Next_Component (First_Component (Expected_Type))))
  1918.  
  1919.           or else
  1920.            (Is_Record_Type (Expected_Type)
  1921.              and then Has_Discriminants (Expected_Type)
  1922.              and then No (First_Component (Expected_Type))
  1923.              and then
  1924.                Covers (Etype (First_Discriminant (Expected_Type)), Found_Type)
  1925.              and then
  1926.                No (Next_Discriminant (First_Discriminant (Expected_Type))))
  1927.  
  1928.           or else
  1929.            (Is_Array_Type (Expected_Type)
  1930.              and then Number_Dimensions (Expected_Type) = 1
  1931.              and then
  1932.                Covers (Etype (Component_Type (Expected_Type)), Found_Type)))
  1933.  
  1934.       then
  1935.          Error_Msg_N ("positional aggregate cannot have one component", Expr);
  1936.  
  1937.       --  Another special check, if we are looking for a pool specific access
  1938.       --  type and we found an anonymous access type, then we probably have
  1939.       --  the case of a 'Access attribute being used in a context which needs
  1940.       --  a pool specific type, which is never allowed. The one extra check
  1941.       --  we make is that the designated types cover.
  1942.  
  1943.       elsif Is_Access_Type (Expected_Type)
  1944.         and then Ekind (Found_Type) = E_Anonymous_Access_Type
  1945.         and then Ekind (Base_Type (Expected_Type)) /= E_General_Access_Type
  1946.         and then Covers
  1947.           (Designated_Type (Expected_Type), Designated_Type (Found_Type))
  1948.       then
  1949.          Error_Msg_N ("result must be general access type!", Expr);
  1950.          Error_Msg_NE ("add ALL to }!", Expr, Expected_Type);
  1951.  
  1952.       --  Normal case of one type found, some other type expected
  1953.  
  1954.       else
  1955.          Error_Msg_NE ("expected}!", Expr, Expected_Type);
  1956.          Error_Msg_NE ("found}!", Expr, Found_Type);
  1957.       end if;
  1958.    end Wrong_Type;
  1959.  
  1960. end Sem_Util;
  1961.