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_ch5.adb < prev    next >
Text File  |  1996-09-28  |  37KB  |  1,163 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              S E M _ C H 5                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.166 $                            --
  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 Einfo;    use Einfo;
  28. with Errout;   use Errout;
  29. with Exp_Ch7;  use Exp_Ch7;
  30. with Itypes;   use Itypes;
  31. with Namet;    use Namet;
  32. with Nlists;   use Nlists;
  33. with Output;   use Output;
  34. with Sem;      use Sem;
  35. with Sem_Ch3;  use Sem_Ch3;
  36. with Sem_Ch8;  use Sem_Ch8;
  37. with Sem_Eval; use Sem_Eval;
  38. with Sem_Disp; use Sem_Disp;
  39. with Sem_Res;  use Sem_Res;
  40. with Sem_Util; use Sem_Util;
  41. with Sem_Type; use Sem_Type;
  42. with Stand;    use Stand;
  43. with Sinfo;    use Sinfo;
  44. with Uintp;    use Uintp;
  45.  
  46. package body Sem_Ch5 is
  47.  
  48.    -----------------------
  49.    -- Local Subprograms --
  50.    -----------------------
  51.  
  52.    procedure Analyze_Elsif_Parts      (L : List_Id);
  53.    procedure Analyze_Iteration_Scheme (N : Node_Id);
  54.  
  55.    function Choice_Image (Value : Uint; Ctype : Entity_Id) return Name_Id;
  56.    --  Given a Pos value of enumeration type Ctype, returns the name
  57.    --  ID of an appropriate string to be used in error message output.
  58.  
  59.    ------------------------
  60.    -- Analyze_Statements --
  61.    ------------------------
  62.  
  63.    procedure Analyze_Statements (L : List_Id) is
  64.       S : Node_Id;
  65.  
  66.    begin
  67.       --  The labels declared in the statement list are reachable from
  68.       --  statements in the list.
  69.  
  70.       S := First (L);
  71.  
  72.       while Present (S) loop
  73.          if Nkind (S) = N_Label then
  74.             Analyze (Identifier (S));
  75.  
  76.             --  If we found a label mark it as reachable, if not ignore, since
  77.             --  it means there was a conflicting declaration which will already
  78.             --  have been diagnosed (from the explicit label declaration).
  79.  
  80.             if Ekind (Entity (Identifier (S))) = E_Label then
  81.                Set_Reachable (Entity (Identifier (S)));
  82.             end if;
  83.          end if;
  84.  
  85.          S := Next (S);
  86.       end loop;
  87.  
  88.       --  Perform semantic analysis on all statements
  89.  
  90.       S := First (L);
  91.  
  92.       while Present (S) loop
  93.  
  94.          if Nkind (S) /= N_Label then
  95.             Analyze (S);
  96.          end if;
  97.  
  98.          S := Next (S);
  99.       end loop;
  100.  
  101.       --  Make labels unreachable. Visibility is not sufficient, because
  102.       --  labels in one if-branch for example are not reachable from the
  103.       --  other branch, even though their declarations are in the enclosing
  104.       --  declarative part.
  105.  
  106.       S := First (L);
  107.  
  108.       while Present (S) loop
  109.          if Nkind (S) = N_Label then
  110.             Set_Reachable (Entity (Identifier (S)), False);
  111.          end if;
  112.          S := Next (S);
  113.       end loop;
  114.    end Analyze_Statements;
  115.  
  116.    ------------------------
  117.    -- Analyze_Assignment --
  118.    ------------------------
  119.  
  120.    procedure Analyze_Assignment (N : Node_Id) is
  121.       Lhs    : constant Node_Id := Name (N);
  122.       Rhs    : constant Node_Id := Expression (N);
  123.       T1, T2 : Entity_Id;
  124.       Decl   : Node_Id;
  125.  
  126.    begin
  127.       Analyze (Lhs);
  128.       Analyze (Rhs);
  129.       T1 := Etype (Lhs);
  130.  
  131.       --  In the most general case, both Lhs and Rhs can be overloaded, and we
  132.       --  must compute the intersection of the possible types on each side.
  133.  
  134.       if Is_Overloaded (Lhs) then
  135.          declare
  136.             I  : Interp_Index;
  137.             It : Interp;
  138.  
  139.          begin
  140.             T1 := Any_Type;
  141.             Get_First_Interp (Lhs, I, It);
  142.  
  143.             while Present (It.Typ) loop
  144.                if Has_Compatible_Type (Rhs, It.Typ) then
  145.                   if T1 /= Any_Type then
  146.                      Error_Msg_N
  147.                        ("ambiguous left-hand side in assignment", Lhs);
  148.                      exit;
  149.                   else
  150.                      T1 := It.Typ;
  151.                   end if;
  152.                end if;
  153.  
  154.                Get_Next_Interp (I, It);
  155.             end loop;
  156.          end;
  157.  
  158.          if T1 = Any_Type then
  159.             Error_Msg_N
  160.               ("no valid types for left-hand side for assignment", Lhs);
  161.             return;
  162.          end if;
  163.       end if;
  164.  
  165.       Resolve (Lhs, T1);
  166.  
  167.       --  Immediate exit with error if left side is procedure name or label,
  168.       --  since otherwise resolving the right side will generate a confusing
  169.       --  and useless error message.
  170.  
  171.       if Etype (Lhs) = Standard_Void_Type then
  172.          Error_Msg_N
  173.            ("left hand side of assignment must be a variable", Lhs);
  174.          return;
  175.       end if;
  176.  
  177.       if not Is_Variable (Lhs) then
  178.          if Is_Entity_Name (Lhs)
  179.            and then Ekind (Entity (Lhs)) = E_In_Parameter
  180.          then
  181.             Error_Msg_N ("assignment to IN mode parameter not allowed", Lhs);
  182.  
  183.          elsif Is_Entity_Name (Lhs)
  184.            and then Is_Protected_Type (Scope (Current_Scope))
  185.            and then Ekind (Current_Scope) = E_Function
  186.          then
  187.             Error_Msg_N
  188.               ("within a protected function the protected object is constant",
  189.                 Lhs);
  190.          else
  191.             Error_Msg_N
  192.               ("left hand side of assignment must be a variable", Lhs);
  193.          end if;
  194.  
  195.          return;
  196.  
  197.       elsif Is_Limited_Type (T1)
  198.         and then not Assignment_OK (Lhs)
  199.       then
  200.          Error_Msg_N
  201.            ("left hand of assignment must not be limited type", Lhs);
  202.          return;
  203.       end if;
  204.  
  205.       --  If the nominal subtype of the left-hand side is unconstrained,
  206.       --  use the actual subtype, or construct it if not available.
  207.  
  208.       if Is_Entity_Name (Lhs)
  209.         and then (Ekind (Entity (Lhs)) = E_Out_Parameter
  210.                    or else Ekind (Entity (Lhs)) = E_In_Out_Parameter
  211.                    or else Ekind (Entity (Lhs)) = E_Generic_In_Out_Parameter)
  212.       then
  213.          T1 := Actual_Subtype (Entity (Lhs));
  214.          --  should we be using Get_Actual_Subtype here ???
  215.  
  216.       elsif Nkind (Lhs) = N_Selected_Component
  217.         or else Nkind (Lhs) = N_Explicit_Dereference
  218.       then
  219.          Decl := Build_Actual_Subtype_Of_Component (T1, Lhs);
  220.  
  221.          if Present (Decl) then
  222.             Insert_Before (N, Decl);
  223.             Mark_Rewrite_Insertion (Decl);
  224.             Analyze (Decl);
  225.             T1 := Defining_Identifier (Decl);
  226.             Set_Etype (Lhs, T1);
  227.          end if;
  228.  
  229.       elsif Nkind (Lhs) = N_Slice then
  230.  
  231.          --  Use constrained subtype created for slice.
  232.  
  233.          T1 := Etype (Lhs);
  234.       end if;
  235.  
  236.       Resolve (Rhs, T1);
  237.  
  238.       T2 := Etype (Rhs);
  239.  
  240.       if Covers (T1, T2) then
  241.          null;
  242.       else
  243.          Wrong_Type (Rhs, Etype (Lhs));
  244.          return;
  245.       end if;
  246.  
  247.       if T1 = Any_Type or else T2 = Any_Type then
  248.          return;
  249.       end if;
  250.  
  251.       if Is_Class_Wide_Type (T1)
  252.         and then Is_Tag_Indeterminate (Rhs)
  253.       then
  254.          Propagate_Tag (Lhs, Rhs);
  255.       end if;
  256.  
  257.       Apply_Range_Check (Rhs, Etype (Rhs), Etype (Lhs));
  258.  
  259.       if not Length_Checks_Suppressed (Etype (Lhs)) then
  260.          Set_Do_Length_Check (N);
  261.       end if;
  262.  
  263.       Apply_Static_Length_Check (Rhs, Etype (Rhs), Etype (Lhs));
  264.    end Analyze_Assignment;
  265.  
  266.    -----------------------------
  267.    -- Analyze_Block_Statement --
  268.    -----------------------------
  269.  
  270.    procedure Analyze_Block_Statement (N : Node_Id) is
  271.       Decls : constant List_Id := Declarations (N);
  272.       Id    : Node_Id;
  273.  
  274.    begin
  275.       Id := Identifier (N);
  276.  
  277.       if Present (Id) then
  278.          Analyze (Id);
  279.          Id := Entity (Id);
  280.          Set_Ekind (Id, E_Block);
  281.       else
  282.          Id := New_Internal_Entity (E_Block, Current_Scope, Sloc (N), 'B');
  283.       end if;
  284.  
  285.       Set_Etype (Id, Standard_Void_Type);
  286.       New_Scope (Id);
  287.  
  288.       if Present (Decls) then
  289.          Analyze_Declarations (Decls);
  290.          Check_Completion;
  291.       end if;
  292.  
  293.       Analyze (Handled_Statement_Sequence (N));
  294.  
  295.       if Present (Exception_Handlers (Handled_Statement_Sequence (N))) then
  296.          declare
  297.             S : Entity_Id := Scope (Id);
  298.  
  299.          begin
  300.             --  Indicate that enclosing scopes contain a block with handlers.
  301.             --  Only non-generic scopes need to be marked.
  302.  
  303.             loop
  304.                Set_Has_Nested_Block_With_Handler (S);
  305.                exit when Is_Overloadable (S)
  306.                  or else Ekind (S) = E_Package
  307.                  or else Ekind (S) = E_Generic_Function
  308.                  or else Ekind (S) = E_Generic_Package
  309.                  or else Ekind (S) = E_Generic_Procedure;
  310.                S := Scope (S);
  311.             end loop;
  312.          end;
  313.       end if;
  314.  
  315.       End_Scope;
  316.    end Analyze_Block_Statement;
  317.  
  318.    ----------------------------
  319.    -- Analyze_Case_Statement --
  320.    ----------------------------
  321.  
  322.    procedure Analyze_Case_Statement (N : Node_Id) is
  323.       Alt            : Node_Id;
  324.       Case_Table     : Case_Table_Type (1 .. Number_Of_Case_Choices (N));
  325.       Choice         : Node_Id;
  326.       Choice_Count   : Nat := 0;
  327.       E              : Entity_Id;
  328.       Exp            : Node_Id;
  329.       Exp_Btype      : Entity_Id;
  330.       Exp_Type       : Entity_Id;
  331.       Exp_Lo, Exp_Hi : Uint;
  332.       Hi             : Node_Id;
  333.       Invalid_Case   : Boolean := False;
  334.       Kind           : Node_Kind;
  335.       Lo             : Node_Id;
  336.       Others_Present : Boolean := False;
  337.  
  338.       procedure Check_Choice (Lo, Hi : Node_Id; Choice : Node_Id);
  339.       --  Check_Choice checks whether the given bounds of a choice are
  340.       --  static and valid for the range of the discrete subtype. If not,
  341.       --  a message is issued, otherwise the bounds are entered into
  342.       --  the case table.
  343.  
  344.       procedure Check_Choice (Lo, Hi : Node_Id; Choice : Node_Id) is
  345.       begin
  346.          if not Is_Static_Expression (Lo)
  347.            or else not Is_Static_Expression (Hi)
  348.          then
  349.             Error_Msg_N
  350.               ("choice given in case statement is not static", Choice);
  351.             Invalid_Case := True;
  352.             return;
  353.          end if;
  354.  
  355.          if Choice_In_Range (Lo, Hi, Exp_Lo, Exp_Hi, Exp_Btype) then
  356.             Choice_Count := Choice_Count + 1;
  357.             Case_Table (Choice_Count).Choice_Lo := Lo;
  358.             Case_Table (Choice_Count).Choice_Hi := Hi;
  359.             Case_Table (Choice_Count).Choice_Node := Choice;
  360.          end if;
  361.       end Check_Choice;
  362.  
  363.    --  Start of processing for Analyze_Case_Statement
  364.  
  365.    begin
  366.       --  Check that the case expression is of a discrete type and that
  367.       --  its range is static, and find the length of the range.
  368.  
  369.       Exp := Expression (N);
  370.       Analyze (Exp);
  371.       Resolve (Exp, Any_Discrete);
  372.       Exp_Type := Etype (Exp);
  373.  
  374.       --  If universal, force Standard.Integer, else use given type
  375.  
  376.       if Exp_Type = Universal_Integer then
  377.          Exp_Btype := Standard_Integer;
  378.       else
  379.          Exp_Btype := Base_Type (Exp_Type);
  380.       end if;
  381.  
  382.       --  The expression must be of a discrete type which must be determinable
  383.       --  independently of the context in which the expression occurs, but
  384.       --  using the fact that the expression must be of a discrete type.
  385.       --  Moreover, the type this expression must not be a generic formal type.
  386.  
  387.       if not Is_Discrete_Type (Exp_Btype) then
  388.          Error_Msg_N ("case expression not of discrete type", Exp);
  389.          return;
  390.  
  391.       elsif Is_Generic_Type (Exp_Btype) then
  392.          Error_Msg_N ("case expression cannot be of a generic type", Exp);
  393.          return;
  394.       end if;
  395.  
  396.       if Is_OK_Static_Subtype (Exp_Type) then
  397.          Exp_Lo := Expr_Value (Type_Low_Bound (Exp_Type));
  398.          Exp_Hi := Expr_Value (Type_High_Bound (Exp_Type));
  399.  
  400.       else
  401.          Exp_Lo := Expr_Value (Type_Low_Bound (Exp_Btype));
  402.          Exp_Hi := Expr_Value (Type_High_Bound (Exp_Btype));
  403.       end if;
  404.  
  405.       --  The simple expressions and discrete ranges given as choices
  406.       --  in a case statement must be static (RM 5.4) and in range.
  407.  
  408.       Alt := First (Alternatives (N));
  409.       while Present (Alt) loop
  410.          Choice := First (Discrete_Choices (Alt));
  411.  
  412.          while Present (Choice) loop
  413.  
  414.             --  Type check the choice and ensure that it is static,
  415.             --  that it is in the range for the expression subtype, and
  416.             --  that it appears no more than once as a value possibility.
  417.  
  418.             Analyze (Choice);
  419.             Kind := Nkind (Choice);
  420.  
  421.             if Kind = N_Range then
  422.                Resolve (Choice, Exp_Btype);
  423.                Check_Choice (Low_Bound (Choice), High_Bound (Choice), Choice);
  424.  
  425.             elsif Is_Entity_Name (Choice)
  426.               and then Is_Type (Entity (Choice))
  427.             then
  428.                if not Covers (Exp_Btype, Etype (Choice)) then
  429.                   Wrong_Type (Choice, Exp_Btype);
  430.                end if;
  431.  
  432.                E := Entity (Choice);
  433.                Lo := Type_Low_Bound (E);
  434.                Hi := Type_High_Bound (E);
  435.                Check_Choice (Lo, Hi, Choice);
  436.  
  437.             elsif Kind = N_Subtype_Indication then
  438.                Resolve_Discrete_Subtype_Indication (Choice, Exp_Btype);
  439.  
  440.                if Etype (Choice) /= Any_Type then
  441.                   declare
  442.                      Constr : constant Node_Id   := Constraint (Choice);
  443.                      Rang   : constant Node_Id   := Range_Expression (Constr);
  444.                      Subt   : constant Entity_Id :=
  445.                                 Entity (Subtype_Mark (Choice));
  446.  
  447.                   begin
  448.                      Lo := Low_Bound (Rang);
  449.                      Hi := High_Bound (Rang);
  450.  
  451.                      if Is_OK_Static_Expression (Lo)
  452.                        and then Is_OK_Static_Expression (Hi)
  453.                      then
  454.                         if Expr_Value (Lo) <= Expr_Value (Hi) then
  455.                            if Is_Out_Of_Range (Lo, Subt) then
  456.                               Compile_Time_Constraint_Error
  457.                                 (Lo, "static value out of range");
  458.                            end if;
  459.  
  460.                            if Is_Out_Of_Range (Hi, Subt) then
  461.                               Compile_Time_Constraint_Error
  462.                                 (Hi, "static value out of range");
  463.                            end if;
  464.                         end if;
  465.                      end if;
  466.  
  467.                      Check_Choice (Lo, Hi, Choice);
  468.                   end;
  469.                end if;
  470.  
  471.             --  The choice others is only allowed for the last alternative and
  472.             --  as its only choice; it stands for all values (possibly none)
  473.             --  not given in the choices of previous statement alternatives.
  474.  
  475.             elsif Kind = N_Others_Choice then
  476.                if not (Choice = First (Discrete_Choices (Alt))
  477.                         and then Choice = Last (Discrete_Choices (Alt))
  478.                         and then Alt = Last (Alternatives (N)))
  479.                then
  480.                   Error_Msg_N
  481.                     ("the choice OTHERS must appear alone and last", Choice);
  482.                   return;
  483.                end if;
  484.  
  485.                Others_Present := True;
  486.  
  487.             --  Only other possibility is an expression
  488.  
  489.             else
  490.                Resolve (Choice, Exp_Btype);
  491.  
  492.                if Etype (Choice) /= Any_Type then
  493.                   Check_Choice (Choice, Choice, Choice);
  494.                end if;
  495.             end if;
  496.  
  497.             Choice := Next (Choice);
  498.          end loop;
  499.  
  500.          Analyze_Statements (Statements (Alt));
  501.          Alt := Next (Alt);
  502.       end loop;
  503.  
  504.       if not Invalid_Case and then Choice_Count > 0 then
  505.          Check_Case_Choices
  506.            (Case_Table (1 .. Choice_Count), N, Exp_Type, Others_Present);
  507.       end if;
  508.  
  509.    end Analyze_Case_Statement;
  510.  
  511.    -------------------------
  512.    -- Analyze_Elsif_Parts --
  513.    -------------------------
  514.  
  515.    procedure Analyze_Elsif_Parts (L : List_Id) is
  516.       N    : constant Node_Id := Parent (L);
  517.       Cond : constant Node_Id := Condition (N);
  518.       E    : Node_Id;
  519.  
  520.    begin
  521.       E := First (L);
  522.       while Present (E) loop
  523.          declare
  524.             Cond : constant Node_Id := Condition (E);
  525.  
  526.          begin
  527.             Analyze (Cond);
  528.             Resolve (Cond, Any_Boolean);
  529.          end;
  530.  
  531.          Analyze_Statements (Then_Statements (E));
  532.          E := Next (E);
  533.       end loop;
  534.    end Analyze_Elsif_Parts;
  535.  
  536.    ----------------------------
  537.    -- Analyze_Exit_Statement --
  538.    ----------------------------
  539.  
  540.    --  If the exit includes a name, it must be the name of a currently open
  541.    --  loop. Otherwise there must be an innermost open loop on the stack,
  542.    --  to which the statement implicitly refers.
  543.  
  544.    procedure Analyze_Exit_Statement (N : Node_Id) is
  545.       Target   : constant Node_Id := Name (N);
  546.       Cond     : constant Node_Id := Condition (N);
  547.       Scope_Id : Entity_Id;
  548.       U_Name   : Entity_Id;
  549.       Kind     : Entity_Kind;
  550.  
  551.    begin
  552.       if Present (Target) then
  553.          Analyze (Target);
  554.          U_Name := Entity (Target);
  555.  
  556.          if not In_Open_Scopes (U_Name) or else Ekind (U_Name) /= E_Loop then
  557.             Error_Msg_N ("invalid loop name in exit statement", N);
  558.             return;
  559.          else
  560.             Set_Has_Exit (U_Name);
  561.          end if;
  562.       end if;
  563.  
  564.       for J in reverse 0 .. Scope_Stack.Last loop
  565.          Scope_Id := Scope_Stack.Table (J).Entity;
  566.          Kind := Ekind (Scope_Id);
  567.  
  568.          if Kind = E_Loop  and (No (Target) or Scope_Id = U_Name) then
  569.             exit;
  570.  
  571.          elsif Kind = E_Block or else Kind = E_Loop then
  572.             null;
  573.  
  574.          else
  575.             Error_Msg_N
  576.               ("cannot exit from program unit or accept statement", N);
  577.             exit;
  578.          end if;
  579.       end loop;
  580.  
  581.       --  Verify that if present the condition is a Boolean expression.
  582.  
  583.       if Present (Cond) then
  584.          Analyze (Cond);
  585.          Resolve (Cond, Any_Boolean);
  586.       end if;
  587.    end Analyze_Exit_Statement;
  588.  
  589.    ----------------------------
  590.    -- Analyze_Goto_Statement --
  591.    ----------------------------
  592.  
  593.    procedure Analyze_Goto_Statement (N : Node_Id) is
  594.       Label       : constant Node_Id := Name (N);
  595.       Scope_Id    : Entity_Id;
  596.       Label_Scope : Entity_Id;
  597.  
  598.    begin
  599.       Analyze (Label);
  600.  
  601.       if Entity (Label) = Any_Id then
  602.          return;
  603.  
  604.       elsif Ekind (Entity (Label)) /= E_Label then
  605.          Error_Msg_N ("target of goto statement must be a label", Label);
  606.          return;
  607.  
  608.       elsif not Reachable (Entity (Label)) then
  609.          Error_Msg_N ("target of goto statement is not reachable", Label);
  610.          return;
  611.       end if;
  612.  
  613.       Label_Scope := Scope (Entity (Label));
  614.  
  615.       for J in reverse 0 .. Scope_Stack.Last loop
  616.          Scope_Id := Scope_Stack.Table (J).Entity;
  617.          exit when (Label_Scope = Scope_Id)
  618.            or else (Ekind (Scope_Id) /= E_Block
  619.                      and then Ekind (Scope_Id) /= E_Loop);
  620.       end loop;
  621.  
  622.       if Scope_Id /= Label_Scope then
  623.          Error_Msg_N
  624.            ("cannot exit from program unit or accept statement", N);
  625.       end if;
  626.    end Analyze_Goto_Statement;
  627.  
  628.    --------------------------
  629.    -- Analyze_If_Statement --
  630.    --------------------------
  631.  
  632.    procedure Analyze_If_Statement (N : Node_Id) is
  633.       Cond : constant Node_Id := Condition (N);
  634.  
  635.    begin
  636.       Analyze (Cond);
  637.       Resolve (Cond, Any_Boolean);
  638.       Analyze_Statements (Then_Statements (N));
  639.  
  640.       if Present (Elsif_Parts (N)) then
  641.          Analyze_Elsif_Parts (Elsif_Parts (N));
  642.       end if;
  643.  
  644.       if Present (Else_Statements (N)) then
  645.          Analyze_Statements (Else_Statements (N));
  646.       end if;
  647.    end Analyze_If_Statement;
  648.  
  649.    ----------------------------------------
  650.    -- Analyze_Implicit_Label_Declaration --
  651.    ----------------------------------------
  652.  
  653.    --  An implicit label declaration is generated in the innermost
  654.    --  enclosing declarative part. This is done for labels as well as
  655.    --  block and loop names.
  656.  
  657.    procedure Analyze_Implicit_Label_Declaration (N : Node_Id) is
  658.       Id : Node_Id := Defining_Identifier (N);
  659.  
  660.    begin
  661.       Enter_Name (Id);
  662.       Set_Ekind (Id, E_Label);
  663.       Set_Etype (Id, Standard_Void_Type);
  664.    end Analyze_Implicit_Label_Declaration;
  665.  
  666.    ------------------------------
  667.    -- Analyze_Iteration_Scheme --
  668.    ------------------------------
  669.  
  670.    procedure Analyze_Iteration_Scheme (N : Node_Id) is
  671.    begin
  672.       --  For an infinite loop, there is no iteration scheme
  673.  
  674.       if No (N) then
  675.          return;
  676.  
  677.       else
  678.          declare
  679.             Cond : constant Node_Id := Condition (N);
  680.  
  681.          begin
  682.             --  For WHILE loop, verify that the condition is a Boolean
  683.             --  expression and resolve and check it.
  684.  
  685.             if Present (Cond) then
  686.                Analyze (Cond);
  687.                Resolve (Cond, Any_Boolean);
  688.  
  689.             --  Else we have a FOR loop
  690.  
  691.             else
  692.                declare
  693.                   L  : constant Node_Id := Loop_Parameter_Specification (N);
  694.                   Id : constant Node_Id := Defining_Identifier (L);
  695.                   D  : constant Node_Id := Discrete_Subtype_Definition (L);
  696.  
  697.                begin
  698.                   Analyze (D);
  699.  
  700.                   if not Is_Discrete_Type (Etype (D)) then
  701.                      Wrong_Type (D, Any_Discrete);
  702.                      Set_Etype (D, Any_Type);
  703.                   end if;
  704.  
  705.                   Make_Index (D, L);
  706.                   Enter_Name (Id);
  707.                   Set_Ekind (Id, E_Loop_Parameter);
  708.                   Set_Etype (Id, Etype (D));
  709.                end;
  710.             end if;
  711.          end;
  712.       end if;
  713.    end Analyze_Iteration_Scheme;
  714.  
  715.    ----------------------------
  716.    -- Analyze_Loop_Statement --
  717.    ----------------------------
  718.  
  719.    procedure Analyze_Loop_Statement (N : Node_Id) is
  720.       Id : Node_Id := Identifier (N);
  721.  
  722.    begin
  723.       if Present (Id) then
  724.  
  725.          --  Make name visible, e.g. for use in exit statements
  726.  
  727.          Analyze (Id);
  728.          Id := Entity (Id);
  729.  
  730.          --  If we found a label, mark it's type. If not, ignore it, since it
  731.          --  means we have a conflicting declaration, which would already have
  732.          --  been diagnosed at declaration time.
  733.  
  734.          if Ekind (Id) = E_Label then
  735.             Set_Ekind (Id, E_Loop);
  736.          end if;
  737.  
  738.       else
  739.          Id := New_Internal_Entity (E_Loop, Current_Scope, Sloc (N), 'L');
  740.          Set_Etype (Id,  Standard_Void_Type);
  741.       end if;
  742.  
  743.       New_Scope (Id);
  744.       Analyze_Iteration_Scheme (Iteration_Scheme (N));
  745.  
  746.       Analyze_Statements (Statements (N));
  747.       End_Scope;
  748.    end Analyze_Loop_Statement;
  749.  
  750.    ----------------------------
  751.    -- Analyze_Null_Statement --
  752.    ----------------------------
  753.  
  754.    --  Note: the semantics of the null statement is implemented by a single
  755.    --  null statement, too bad everything isn't as simple as this!
  756.  
  757.    procedure Analyze_Null_Statement (N : Node_Id) is
  758.    begin
  759.       null;
  760.    end Analyze_Null_Statement;
  761.  
  762.    ------------------------------
  763.    -- Analyze_Return_Statement --
  764.    ------------------------------
  765.  
  766.    procedure Analyze_Return_Statement (N : Node_Id) is
  767.       Expr     : Node_Id;
  768.       Scope_Id : Entity_Id;
  769.       Kind     : Entity_Kind;
  770.  
  771.    begin
  772.       --  Find subprogram or accept statement enclosing the return statement
  773.  
  774.       for J in reverse 0 .. Scope_Stack.Last loop
  775.          Scope_Id := Scope_Stack.Table (J).Entity;
  776.          exit when Ekind (Scope_Id) /= E_Block and then
  777.                    Ekind (Scope_Id) /= E_Loop;
  778.       end loop;
  779.  
  780.       Kind := Ekind (Scope_Id);
  781.       Expr := Expression (N);
  782.  
  783.       if Kind = E_Package then
  784.          Error_Msg_N ("return not allowed in package body", N);
  785.  
  786.       elsif Present (Expr) then
  787.          if Kind = E_Function or else Kind = E_Generic_Function then
  788.             Set_Return_Present (Scope_Id);
  789.             Set_Return_Type (N, Etype (Scope_Id));
  790.             Analyze (Expr);
  791.             Resolve (Expr, Etype (Scope_Id));
  792.             Apply_Range_Check (Expr, Etype (Expr), Etype (Scope_Id));
  793.  
  794.             --  ??? a real static accessibility check is needed when
  795.             --  returning by reference. For now just check the most obvious
  796.             --  cases
  797.  
  798.             if Is_Return_By_Reference_Type (Etype (Scope_Id))
  799.               and then Is_Entity_Name (Expr)
  800.             then
  801.                if Scope (Entity (Expr)) = Scope_Id
  802.                  or else Scope (Scope (Entity (Expr))) = Scope_Id
  803.                  or else Scope (Scope (Scope (Entity (Expr)))) = Scope_Id
  804.                then
  805.                   Error_Msg_N ("cannot return a local value by reference", N);
  806.                end if;
  807.             end if;
  808.  
  809.  
  810.          elsif Kind = E_Procedure or else Kind = E_Generic_Procedure then
  811.             Error_Msg_N ("procedure cannot return value (use function)", N);
  812.  
  813.          else
  814.             Error_Msg_N ("accept statement cannot return value", N);
  815.          end if;
  816.  
  817.       elsif Kind = E_Function or Kind = E_Generic_Function then
  818.          Error_Msg_N ("missing expression in return from function", N);
  819.       end if;
  820.    end Analyze_Return_Statement;
  821.  
  822.    ---------------------
  823.    -- Choice_In_Range --
  824.    ---------------------
  825.  
  826.    function Choice_In_Range
  827.      (Lo, Hi   : Node_Id;
  828.       Discr_Lo : Uint;
  829.       Discr_Hi : Uint;
  830.       Btype    : Entity_Id)
  831.       return     Boolean
  832.    is
  833.       Lo_Val, Hi_Val : Uint;
  834.  
  835.    begin
  836.       --  Ignore range which raises constraint error (error already posted)
  837.  
  838.       if Raises_Constraint_Error (Lo)
  839.         or else Raises_Constraint_Error (Hi)
  840.       then
  841.          return False;
  842.  
  843.       --  Otherwise we have an OK static choice
  844.       else
  845.          Lo_Val := Expr_Value (Lo);
  846.          Hi_Val := Expr_Value (Hi);
  847.       end if;
  848.  
  849.       --  Ignore null range
  850.  
  851.       if Lo_Val > Hi_Val then
  852.          return False;
  853.       end if;
  854.  
  855.       --  Check for bound out of range. Note that we still store the
  856.       --  bounds in the table, even if they are out of range, since
  857.       --  this may prevent unnecessary cascaded errors for values
  858.       --  that are covered by such an excessive range.
  859.  
  860.       if Lo_Val < Discr_Lo then
  861.          if Is_Integer_Type (Btype) then
  862.             Error_Msg_Uint_1 := Discr_Lo;
  863.             Error_Msg_N ("minimum allowed choice value is^", Hi);
  864.  
  865.          else
  866.             Error_Msg_Name_1 := Choice_Image (Discr_Lo, Btype);
  867.             Error_Msg_N ("minimum allowed choice value is%", Lo);
  868.          end if;
  869.  
  870.       elsif Hi_Val > Discr_Hi then
  871.          if Is_Integer_Type (Btype) then
  872.             Error_Msg_Uint_1 := Discr_Hi;
  873.             Error_Msg_N ("maximum allowed choice value is^", Hi);
  874.          else
  875.             Error_Msg_Name_1 := Choice_Image (Discr_Hi, Btype);
  876.             Error_Msg_N ("maximum allowed choice value is%", Hi);
  877.          end if;
  878.       end if;
  879.  
  880.       --  Will store range in table
  881.  
  882.       return True;
  883.    end Choice_In_Range;
  884.  
  885.    ------------------------
  886.    -- Check_Case_Choices --
  887.    ------------------------
  888.  
  889.    procedure Check_Case_Choices
  890.      (Case_Table     : in out Case_Table_Type;
  891.       N              : Node_Id;
  892.       Choice_Type    : Entity_Id;
  893.       Others_Present : Boolean)
  894.    is
  895.       Choice      : Node_Id;
  896.       First_Msg   : Boolean := True;
  897.       Exp_Lo      : Node_Id;
  898.       Exp_Hi      : Node_Id;
  899.       Hi          : Uint;
  900.       Lo          : Uint;
  901.       Msg_Sloc    : Source_Ptr;
  902.       Previous_Hi : Uint;
  903.  
  904.       procedure Issue_Msg (Value1, Value2 : Uint);
  905.       --  Issue an error message indicating that there are missing choices,
  906.       --  followed by the image of the missing choices themselves which lie
  907.       --  between Value1 and Value2 exclusive. If there is more than one
  908.       --  choice missing print the first and last of the range. Since this
  909.       --  can be called several times for the same case statement or variant
  910.       --  part, make sure to print the error message itself only once per
  911.       --  case statement or variant part.
  912.  
  913.       procedure Issue_Msg (Value1, Value2 : Uint) is
  914.       begin
  915.          if First_Msg then
  916.             Msg_Sloc := Sloc (N);
  917.             First_Msg := False;
  918.          end if;
  919.  
  920.          --  Get range of missing values
  921.  
  922.          Error_Msg_Uint_1 := Value1 + 1;
  923.          Error_Msg_Uint_2 := Value2 - 1;
  924.  
  925.          --  Case of only one value that is missing
  926.  
  927.          if Error_Msg_Uint_1 = Error_Msg_Uint_2 then
  928.             if Is_Integer_Type (Choice_Type) then
  929.                Error_Msg ("missing case value: ^!", Msg_Sloc);
  930.  
  931.             else
  932.                Error_Msg_Name_1 :=
  933.                  Choice_Image (Error_Msg_Uint_1, Choice_Type);
  934.                Error_Msg ("missing case value: %!", Msg_Sloc);
  935.             end if;
  936.  
  937.          --  More than one choice value, so print range of values
  938.  
  939.          else
  940.             if Is_Integer_Type (Choice_Type) then
  941.                Error_Msg ("missing case values: ^ .. ^!", Msg_Sloc);
  942.  
  943.             else
  944.                Error_Msg_Name_1 :=
  945.                  Choice_Image (Error_Msg_Uint_1, Choice_Type);
  946.                Error_Msg_Name_2 :=
  947.                  Choice_Image (Error_Msg_Uint_2, Choice_Type);
  948.                Error_Msg ("missing case values: % .. %!", Msg_Sloc);
  949.             end if;
  950.          end if;
  951.       end Issue_Msg;
  952.  
  953.    --  Start processing for Check_Case_Choices
  954.  
  955.    begin
  956.       Sort_Case_Table (Case_Table);
  957.  
  958.       --  If the subtype of the discriminant is static, then each value of this
  959.       --  subtype must be represented once and only once in the set of choices
  960.       --  of the variant part, and no other value is allowed. Otherwise, each
  961.       --  value of the (base) type of the discriminant must be represented once
  962.       --  and only once in the set of choices. [LRM 3.7.3]
  963.  
  964.       --  If the expression is the name of an object whose subtype is static,
  965.       --  then each value of this subtype must be represented once and only
  966.       --  once in the set of choices of the case statement, and no other value
  967.       --  is allowed. Otherwise, for other forms of expression, each value
  968.       --  of the (base) type of the expression must be represented once and
  969.       --  only once in the set of choices, and no other value is allowed.
  970.  
  971.       if Is_OK_Static_Subtype (Choice_Type) then
  972.          Exp_Lo := Type_Low_Bound (Choice_Type);
  973.          Exp_Hi := Type_High_Bound (Choice_Type);
  974.       else
  975.          Exp_Lo := Type_Low_Bound (Base_Type (Choice_Type));
  976.          Exp_Hi := Type_High_Bound (Base_Type (Choice_Type));
  977.       end if;
  978.  
  979.       Lo := Expr_Value (Case_Table (Case_Table'First).Choice_Lo);
  980.       Hi := Expr_Value (Case_Table (Case_Table'First).Choice_Hi);
  981.       Previous_Hi := Expr_Value (Case_Table (Case_Table'First).Choice_Hi);
  982.  
  983.       if not Others_Present and then Expr_Value (Exp_Lo) < Lo then
  984.          Issue_Msg (Expr_Value (Exp_Lo) - 1, Lo);
  985.       end if;
  986.  
  987.       for J in Case_Table'First + 1 .. Case_Table'Last loop
  988.          Lo := Expr_Value (Case_Table (J).Choice_Lo);
  989.          Hi := Expr_Value (Case_Table (J).Choice_Hi);
  990.          Choice := Case_Table (J).Choice_Node;
  991.  
  992.          if Lo <= Previous_Hi then
  993.             Error_Msg_Sloc := Sloc (Case_Table (J - 1).Choice_Node);
  994.             Error_Msg_N ("duplication of choice value#", Choice);
  995.  
  996.          elsif not Others_Present
  997.            and then Lo /= Previous_Hi + 1
  998.          then
  999.             Issue_Msg (Previous_Hi, Lo);
  1000.          end if;
  1001.  
  1002.          Previous_Hi := Hi;
  1003.       end loop;
  1004.  
  1005.       if not Others_Present and then Expr_Value (Exp_Hi) > Hi then
  1006.          Issue_Msg (Hi, Expr_Value (Exp_Hi) + 1);
  1007.       end if;
  1008.    end Check_Case_Choices;
  1009.  
  1010.    ------------------
  1011.    -- Choice_Image --
  1012.    ------------------
  1013.  
  1014.    function Choice_Image (Value : Uint; Ctype : Entity_Id) return Name_Id is
  1015.       Rtp : constant Entity_Id := Root_Type (Ctype);
  1016.       Lit : Entity_Id;
  1017.       C   : Int;
  1018.  
  1019.    begin
  1020.       --  For character, or wide character. If we are in 7-bit ASCII graphic
  1021.       --  range, then build and return appropriate character literal name
  1022.  
  1023.       if Rtp = Standard_Character
  1024.         or else Rtp = Standard_Wide_Character
  1025.       then
  1026.          C := UI_To_Int (Value);
  1027.  
  1028.          if C in 16#20# .. 16#7E# then
  1029.             Name_Buffer (1) := ''';
  1030.             Name_Buffer (2) := Character'Val (C);
  1031.             Name_Buffer (3) := ''';
  1032.             Name_Len := 3;
  1033.             return Name_Find;
  1034.          end if;
  1035.  
  1036.       --  For user defined enumeration type, find enum/char literal
  1037.  
  1038.       else
  1039.          Lit := First_Literal (Rtp);
  1040.  
  1041.          for J in 1 .. UI_To_Int (Value) loop
  1042.             Lit := Next_Literal (Lit);
  1043.          end loop;
  1044.  
  1045.          --  If enumeration literal, just return its value
  1046.  
  1047.          if Nkind (Lit) = N_Defining_Identifier then
  1048.             return Chars (Lit);
  1049.  
  1050.          --  For character literal, get the name and use it if it is
  1051.          --  for a 7-bit ASCII graphic character in 16#20#..16#7E#.
  1052.  
  1053.          else
  1054.             Get_Decoded_Name_String (Chars (Lit));
  1055.  
  1056.             if Name_Len = 3
  1057.               and then Name_Buffer (2) in
  1058.                 Character'Val (16#20#) .. Character'Val (16#7E#)
  1059.             then
  1060.                return Chars (Lit);
  1061.             end if;
  1062.          end if;
  1063.       end if;
  1064.  
  1065.       --  If we fall through, we have a character literal which is not in
  1066.       --  the 7-bit ASCII graphic set. For such cases, we construct the
  1067.       --  name "type'val(nnn)" where type is the choice type, and nnn is
  1068.       --  the pos value passed as an argument to Choice_Image.
  1069.  
  1070.       Get_Name_String (Chars (Ctype));
  1071.       Name_Len := Name_Len + 1;
  1072.       Name_Buffer (Name_Len) := ''';
  1073.       Name_Len := Name_Len + 1;
  1074.       Name_Buffer (Name_Len) := 'v';
  1075.       Name_Len := Name_Len + 1;
  1076.       Name_Buffer (Name_Len) := 'a';
  1077.       Name_Len := Name_Len + 1;
  1078.       Name_Buffer (Name_Len) := 'l';
  1079.       Name_Len := Name_Len + 1;
  1080.       Name_Buffer (Name_Len) := '(';
  1081.  
  1082.       UI_Image (Value);
  1083.  
  1084.       for J in 1 .. UI_Image_Length loop
  1085.          Name_Len := Name_Len + 1;
  1086.          Name_Buffer (Name_Len) := UI_Image_Buffer (J);
  1087.       end loop;
  1088.  
  1089.       Name_Len := Name_Len + 1;
  1090.       Name_Buffer (Name_Len) := ')';
  1091.       return Name_Find;
  1092.    end Choice_Image;
  1093.  
  1094.    ----------------------------
  1095.    -- Number_Of_Case_Choices --
  1096.    ----------------------------
  1097.  
  1098.    function Number_Of_Case_Choices (N : Node_Id) return Nat is
  1099.       Alt_or_Var : Node_Id;
  1100.       Choice     : Node_Id;
  1101.       Count      : Nat := 0;
  1102.  
  1103.    begin
  1104.       --  The iteration uses different access functions depending on whether
  1105.       --  it is processing a case statement or a variant part here.
  1106.  
  1107.       if Nkind (N) = N_Case_Statement then
  1108.          Alt_or_Var := First (Alternatives (N));
  1109.  
  1110.       else -- N_Variant_Part
  1111.          Alt_or_Var := First (Variants (N));
  1112.       end if;
  1113.  
  1114.       while Present (Alt_or_Var) loop
  1115.          Choice := First (Discrete_Choices (Alt_or_Var));
  1116.  
  1117.          while Present (Choice) loop
  1118.             if Nkind (Choice) /= N_Others_Choice then
  1119.                Count := Count + 1;
  1120.             end if;
  1121.  
  1122.             Choice := Next (Choice);
  1123.          end loop;
  1124.  
  1125.          Alt_or_Var := Next (Alt_or_Var);
  1126.       end loop;
  1127.  
  1128.       return Count;
  1129.    end Number_Of_Case_Choices;
  1130.  
  1131.    ---------------------
  1132.    -- Sort_Case_Table --
  1133.    ---------------------
  1134.  
  1135.    procedure Sort_Case_Table (Case_Table : in out Case_Table_Type) is
  1136.       L : Int := Case_Table'First;
  1137.       U : Int := Case_Table'Last;
  1138.       K : Int;
  1139.       J : Int;
  1140.       T : Case_Bounds;
  1141.  
  1142.    begin
  1143.       K := L;
  1144.  
  1145.       while K /= U loop
  1146.          T := Case_Table (K + 1);
  1147.          J := K + 1;
  1148.  
  1149.          while J /= L
  1150.            and then Expr_Value (Case_Table (J - 1).Choice_Lo) >
  1151.                     Expr_Value (T.Choice_Lo)
  1152.          loop
  1153.             Case_Table (J) := Case_Table (J - 1);
  1154.             J := J - 1;
  1155.          end loop;
  1156.  
  1157.          Case_Table (J) := T;
  1158.          K := K + 1;
  1159.       end loop;
  1160.    end Sort_Case_Table;
  1161.  
  1162. end Sem_Ch5;
  1163.