OSDN Git Service

2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_case.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ C A S E                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1996-2004 Free Software Foundation, Inc.          --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
19 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, USA.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Atree;    use Atree;
28 with Einfo;    use Einfo;
29 with Errout;   use Errout;
30 with Namet;    use Namet;
31 with Nlists;   use Nlists;
32 with Nmake;    use Nmake;
33 with Opt;      use Opt;
34 with Sem;      use Sem;
35 with Sem_Eval; use Sem_Eval;
36 with Sem_Res;  use Sem_Res;
37 with Sem_Util; use Sem_Util;
38 with Sem_Type; use Sem_Type;
39 with Snames;   use Snames;
40 with Stand;    use Stand;
41 with Sinfo;    use Sinfo;
42 with Tbuild;   use Tbuild;
43 with Uintp;    use Uintp;
44
45 with GNAT.Heap_Sort_A; use GNAT.Heap_Sort_A;
46
47 package body Sem_Case is
48
49    -----------------------
50    -- Local Subprograms --
51    -----------------------
52
53    type Sort_Choice_Table_Type is array (Nat range <>) of Choice_Bounds;
54    --  This new array type is used as the actual table type for sorting
55    --  discrete choices. The reason for not using Choice_Table_Type, is that
56    --  in Sort_Choice_Table_Type we reserve entry 0 for the sorting algortim
57    --  (this is not absolutely necessary but it makes the code more
58    --  efficient).
59
60    procedure Check_Choices
61      (Choice_Table   : in out Sort_Choice_Table_Type;
62       Bounds_Type    : Entity_Id;
63       Others_Present : Boolean;
64       Msg_Sloc       : Source_Ptr);
65    --  This is the procedure which verifies that a set of case alternatives
66    --  or record variant choices has no duplicates, and covers the range
67    --  specified by Bounds_Type. Choice_Table contains the discrete choices
68    --  to check. These must start at position 1.
69    --  Furthermore Choice_Table (0) must exist. This element is used by
70    --  the sorting algorithm as a temporary. Others_Present is a flag
71    --  indicating whether or not an Others choice is present. Finally
72    --  Msg_Sloc gives the source location of the construct containing the
73    --  choices in the Choice_Table.
74
75    function Choice_Image (Value : Uint; Ctype : Entity_Id) return Name_Id;
76    --  Given a Pos value of enumeration type Ctype, returns the name
77    --  ID of an appropriate string to be used in error message output.
78
79    procedure Expand_Others_Choice
80      (Case_Table     : Choice_Table_Type;
81       Others_Choice  : Node_Id;
82       Choice_Type    : Entity_Id);
83    --  The case table is the table generated by a call to Analyze_Choices
84    --  (with just 1 .. Last_Choice entries present). Others_Choice is a
85    --  pointer to the N_Others_Choice node (this routine is only called if
86    --  an others choice is present), and Choice_Type is the discrete type
87    --  of the bounds. The effect of this call is to analyze the cases and
88    --  determine the set of values covered by others. This choice list is
89    --  set in the Others_Discrete_Choices field of the N_Others_Choice node.
90
91    -------------------
92    -- Check_Choices --
93    -------------------
94
95    procedure Check_Choices
96      (Choice_Table   : in out Sort_Choice_Table_Type;
97       Bounds_Type    : Entity_Id;
98       Others_Present : Boolean;
99       Msg_Sloc       : Source_Ptr)
100    is
101       function Lt_Choice (C1, C2 : Natural) return Boolean;
102       --  Comparison routine for comparing Choice_Table entries.
103       --  Use the lower bound of each Choice as the key.
104
105       procedure Move_Choice (From : Natural; To : Natural);
106       --  Move routine for sorting the Choice_Table.
107
108       procedure Issue_Msg (Value1 : Node_Id; Value2 : Node_Id);
109       procedure Issue_Msg (Value1 : Node_Id; Value2 : Uint);
110       procedure Issue_Msg (Value1 : Uint;    Value2 : Node_Id);
111       procedure Issue_Msg (Value1 : Uint;    Value2 : Uint);
112       --  Issue an error message indicating that there are missing choices,
113       --  followed by the image of the missing choices themselves which lie
114       --  between Value1 and Value2 inclusive.
115
116       ---------------
117       -- Issue_Msg --
118       ---------------
119
120       procedure Issue_Msg (Value1 : Node_Id; Value2 : Node_Id) is
121       begin
122          Issue_Msg (Expr_Value (Value1), Expr_Value (Value2));
123       end Issue_Msg;
124
125       procedure Issue_Msg (Value1 : Node_Id; Value2 : Uint) is
126       begin
127          Issue_Msg (Expr_Value (Value1), Value2);
128       end Issue_Msg;
129
130       procedure Issue_Msg (Value1 : Uint; Value2 : Node_Id) is
131       begin
132          Issue_Msg (Value1, Expr_Value (Value2));
133       end Issue_Msg;
134
135       procedure Issue_Msg (Value1 : Uint; Value2 : Uint) is
136       begin
137          --  In some situations, we call this with a null range, and
138          --  obviously we don't want to complain in this case!
139
140          if Value1 > Value2 then
141             return;
142          end if;
143
144          --  Case of only one value that is missing
145
146          if Value1 = Value2 then
147             if Is_Integer_Type (Bounds_Type) then
148                Error_Msg_Uint_1 := Value1;
149                Error_Msg ("missing case value: ^!", Msg_Sloc);
150             else
151                Error_Msg_Name_1 := Choice_Image (Value1, Bounds_Type);
152                Error_Msg ("missing case value: %!", Msg_Sloc);
153             end if;
154
155          --  More than one choice value, so print range of values
156
157          else
158             if Is_Integer_Type (Bounds_Type) then
159                Error_Msg_Uint_1 := Value1;
160                Error_Msg_Uint_2 := Value2;
161                Error_Msg ("missing case values: ^ .. ^!", Msg_Sloc);
162             else
163                Error_Msg_Name_1 := Choice_Image (Value1, Bounds_Type);
164                Error_Msg_Name_2 := Choice_Image (Value2, Bounds_Type);
165                Error_Msg ("missing case values: % .. %!", Msg_Sloc);
166             end if;
167          end if;
168       end Issue_Msg;
169
170       ---------------
171       -- Lt_Choice --
172       ---------------
173
174       function Lt_Choice (C1, C2 : Natural) return Boolean is
175       begin
176          return
177            Expr_Value (Choice_Table (Nat (C1)).Lo)
178              <
179            Expr_Value (Choice_Table (Nat (C2)).Lo);
180       end Lt_Choice;
181
182       -----------------
183       -- Move_Choice --
184       -----------------
185
186       procedure Move_Choice (From : Natural; To : Natural) is
187       begin
188          Choice_Table (Nat (To)) := Choice_Table (Nat (From));
189       end Move_Choice;
190
191       --  Variables local to Check_Choices
192
193       Choice      : Node_Id;
194       Bounds_Lo   : constant Node_Id := Type_Low_Bound (Bounds_Type);
195       Bounds_Hi   : constant Node_Id := Type_High_Bound (Bounds_Type);
196
197       Prev_Choice : Node_Id;
198
199       Hi       : Uint;
200       Lo       : Uint;
201       Prev_Hi  : Uint;
202
203    --  Start processing for Check_Choices
204
205    begin
206       --  Choice_Table must start at 0 which is an unused location used
207       --  by the sorting algorithm. However the first valid position for
208       --  a discrete choice is 1.
209
210       pragma Assert (Choice_Table'First = 0);
211
212       if Choice_Table'Last = 0 then
213          if not Others_Present then
214             Issue_Msg (Bounds_Lo, Bounds_Hi);
215          end if;
216          return;
217       end if;
218
219       Sort
220         (Positive (Choice_Table'Last),
221          Move_Choice'Unrestricted_Access,
222          Lt_Choice'Unrestricted_Access);
223
224       Lo      := Expr_Value (Choice_Table (1).Lo);
225       Hi      := Expr_Value (Choice_Table (1).Hi);
226       Prev_Hi := Hi;
227
228       if not Others_Present and then Expr_Value (Bounds_Lo) < Lo then
229          Issue_Msg (Bounds_Lo, Lo - 1);
230       end if;
231
232       for J in 2 .. Choice_Table'Last loop
233          Lo := Expr_Value (Choice_Table (J).Lo);
234          Hi := Expr_Value (Choice_Table (J).Hi);
235
236          if Lo <= Prev_Hi then
237             Prev_Choice := Choice_Table (J - 1).Node;
238             Choice      := Choice_Table (J).Node;
239
240             if Sloc (Prev_Choice) <= Sloc (Choice) then
241                Error_Msg_Sloc := Sloc (Prev_Choice);
242                Error_Msg_N ("duplication of choice value#", Choice);
243             else
244                Error_Msg_Sloc := Sloc (Choice);
245                Error_Msg_N ("duplication of choice value#", Prev_Choice);
246             end if;
247
248          elsif not Others_Present and then Lo /= Prev_Hi + 1 then
249             Issue_Msg (Prev_Hi + 1, Lo - 1);
250          end if;
251
252          Prev_Hi := Hi;
253       end loop;
254
255       if not Others_Present and then Expr_Value (Bounds_Hi) > Hi then
256          Issue_Msg (Hi + 1, Bounds_Hi);
257       end if;
258    end Check_Choices;
259
260    ------------------
261    -- Choice_Image --
262    ------------------
263
264    function Choice_Image (Value : Uint; Ctype : Entity_Id) return Name_Id is
265       Rtp : constant Entity_Id := Root_Type (Ctype);
266       Lit : Entity_Id;
267       C   : Int;
268
269    begin
270       --  For character, or wide character. If we are in 7-bit ASCII graphic
271       --  range, then build and return appropriate character literal name
272
273       if Rtp = Standard_Character
274         or else Rtp = Standard_Wide_Character
275       then
276          C := UI_To_Int (Value);
277
278          if C in 16#20# .. 16#7E# then
279             Set_Character_Literal_Name (Char_Code (UI_To_Int (Value)));
280             return Name_Find;
281          end if;
282
283       --  For user defined enumeration type, find enum/char literal
284
285       else
286          Lit := First_Literal (Rtp);
287
288          for J in 1 .. UI_To_Int (Value) loop
289             Next_Literal (Lit);
290          end loop;
291
292          --  If enumeration literal, just return its value
293
294          if Nkind (Lit) = N_Defining_Identifier then
295             return Chars (Lit);
296
297          --  For character literal, get the name and use it if it is
298          --  for a 7-bit ASCII graphic character in 16#20#..16#7E#.
299
300          else
301             Get_Decoded_Name_String (Chars (Lit));
302
303             if Name_Len = 3
304               and then Name_Buffer (2) in
305                 Character'Val (16#20#) .. Character'Val (16#7E#)
306             then
307                return Chars (Lit);
308             end if;
309          end if;
310       end if;
311
312       --  If we fall through, we have a character literal which is not in
313       --  the 7-bit ASCII graphic set. For such cases, we construct the
314       --  name "type'val(nnn)" where type is the choice type, and nnn is
315       --  the pos value passed as an argument to Choice_Image.
316
317       Get_Name_String (Chars (First_Subtype (Ctype)));
318       Name_Len := Name_Len + 1;
319       Name_Buffer (Name_Len) := ''';
320       Name_Len := Name_Len + 1;
321       Name_Buffer (Name_Len) := 'v';
322       Name_Len := Name_Len + 1;
323       Name_Buffer (Name_Len) := 'a';
324       Name_Len := Name_Len + 1;
325       Name_Buffer (Name_Len) := 'l';
326       Name_Len := Name_Len + 1;
327       Name_Buffer (Name_Len) := '(';
328
329       UI_Image (Value);
330
331       for J in 1 .. UI_Image_Length loop
332          Name_Len := Name_Len + 1;
333          Name_Buffer (Name_Len) := UI_Image_Buffer (J);
334       end loop;
335
336       Name_Len := Name_Len + 1;
337       Name_Buffer (Name_Len) := ')';
338       return Name_Find;
339    end Choice_Image;
340
341    --------------------------
342    -- Expand_Others_Choice --
343    --------------------------
344
345    procedure Expand_Others_Choice
346      (Case_Table    : Choice_Table_Type;
347       Others_Choice : Node_Id;
348       Choice_Type   : Entity_Id)
349    is
350       Loc         : constant Source_Ptr := Sloc (Others_Choice);
351       Choice_List : constant List_Id    := New_List;
352       Choice      : Node_Id;
353       Exp_Lo      : Node_Id;
354       Exp_Hi      : Node_Id;
355       Hi          : Uint;
356       Lo          : Uint;
357       Previous_Hi : Uint;
358
359       function Build_Choice (Value1, Value2 : Uint) return Node_Id;
360       --  Builds a node representing the missing choices given by the
361       --  Value1 and Value2. A N_Range node is built if there is more than
362       --  one literal value missing. Otherwise a single N_Integer_Literal,
363       --  N_Identifier or N_Character_Literal is built depending on what
364       --  Choice_Type is.
365
366       function Lit_Of (Value : Uint) return Node_Id;
367       --  Returns the Node_Id for the enumeration literal corresponding to the
368       --  position given by Value within the enumeration type Choice_Type.
369
370       ------------------
371       -- Build_Choice --
372       ------------------
373
374       function Build_Choice (Value1, Value2 : Uint) return Node_Id is
375          Lit_Node : Node_Id;
376          Lo, Hi   : Node_Id;
377
378       begin
379          --  If there is only one choice value missing between Value1 and
380          --  Value2, build an integer or enumeration literal to represent it.
381
382          if (Value2 - Value1) = 0 then
383             if Is_Integer_Type (Choice_Type) then
384                Lit_Node := Make_Integer_Literal (Loc, Value1);
385                Set_Etype (Lit_Node, Choice_Type);
386             else
387                Lit_Node := Lit_Of (Value1);
388             end if;
389
390          --  Otherwise is more that one choice value that is missing between
391          --  Value1 and Value2, therefore build a N_Range node of either
392          --  integer or enumeration literals.
393
394          else
395             if Is_Integer_Type (Choice_Type) then
396                Lo := Make_Integer_Literal (Loc, Value1);
397                Set_Etype (Lo, Choice_Type);
398                Hi := Make_Integer_Literal (Loc, Value2);
399                Set_Etype (Hi, Choice_Type);
400                Lit_Node :=
401                  Make_Range (Loc,
402                    Low_Bound  => Lo,
403                    High_Bound => Hi);
404
405             else
406                Lit_Node :=
407                  Make_Range (Loc,
408                    Low_Bound  => Lit_Of (Value1),
409                    High_Bound => Lit_Of (Value2));
410             end if;
411          end if;
412
413          return Lit_Node;
414       end Build_Choice;
415
416       ------------
417       -- Lit_Of --
418       ------------
419
420       function Lit_Of (Value : Uint) return Node_Id is
421          Lit : Entity_Id;
422
423       begin
424          --  In the case where the literal is of type Character, there needs
425          --  to be some special handling since there is no explicit chain
426          --  of literals to search. Instead, a N_Character_Literal node
427          --  is created with the appropriate Char_Code and Chars fields.
428
429          if Root_Type (Choice_Type) = Standard_Character
430               or else
431             Root_Type (Choice_Type) = Standard_Wide_Character
432          then
433             Set_Character_Literal_Name (Char_Code (UI_To_Int (Value)));
434             Lit := New_Node (N_Character_Literal, Loc);
435             Set_Chars (Lit, Name_Find);
436             Set_Char_Literal_Value (Lit, Char_Code (UI_To_Int (Value)));
437             Set_Etype (Lit, Choice_Type);
438             Set_Is_Static_Expression (Lit, True);
439             return Lit;
440
441          --  Otherwise, iterate through the literals list of Choice_Type
442          --  "Value" number of times until the desired literal is reached
443          --  and then return an occurrence of it.
444
445          else
446             Lit := First_Literal (Choice_Type);
447             for J in 1 .. UI_To_Int (Value) loop
448                Next_Literal (Lit);
449             end loop;
450
451             return New_Occurrence_Of (Lit, Loc);
452          end if;
453       end Lit_Of;
454
455    --  Start of processing for Expand_Others_Choice
456
457    begin
458       if Case_Table'Length = 0 then
459
460          --  Special case: only an others case is present.
461          --  The others case covers the full range of the type.
462
463          if Is_Static_Subtype (Choice_Type) then
464             Choice := New_Occurrence_Of (Choice_Type, Loc);
465          else
466             Choice := New_Occurrence_Of (Base_Type (Choice_Type), Loc);
467          end if;
468
469          Set_Others_Discrete_Choices (Others_Choice, New_List (Choice));
470          return;
471       end if;
472
473       --  Establish the bound values for the choice depending upon whether
474       --  the type of the case statement is static or not.
475
476       if Is_OK_Static_Subtype (Choice_Type) then
477          Exp_Lo := Type_Low_Bound (Choice_Type);
478          Exp_Hi := Type_High_Bound (Choice_Type);
479       else
480          Exp_Lo := Type_Low_Bound (Base_Type (Choice_Type));
481          Exp_Hi := Type_High_Bound (Base_Type (Choice_Type));
482       end if;
483
484       Lo := Expr_Value (Case_Table (Case_Table'First).Lo);
485       Hi := Expr_Value (Case_Table (Case_Table'First).Hi);
486       Previous_Hi := Expr_Value (Case_Table (Case_Table'First).Hi);
487
488       --  Build the node for any missing choices that are smaller than any
489       --  explicit choices given in the case.
490
491       if Expr_Value (Exp_Lo) < Lo then
492          Append (Build_Choice (Expr_Value (Exp_Lo), Lo - 1), Choice_List);
493       end if;
494
495       --  Build the nodes representing any missing choices that lie between
496       --  the explicit ones given in the case.
497
498       for J in Case_Table'First + 1 .. Case_Table'Last loop
499          Lo := Expr_Value (Case_Table (J).Lo);
500          Hi := Expr_Value (Case_Table (J).Hi);
501
502          if Lo /= (Previous_Hi + 1) then
503             Append_To (Choice_List, Build_Choice (Previous_Hi + 1, Lo - 1));
504          end if;
505
506          Previous_Hi := Hi;
507       end loop;
508
509       --  Build the node for any missing choices that are greater than any
510       --  explicit choices given in the case.
511
512       if Expr_Value (Exp_Hi) > Hi then
513          Append (Build_Choice (Hi + 1, Expr_Value (Exp_Hi)), Choice_List);
514       end if;
515
516       Set_Others_Discrete_Choices (Others_Choice, Choice_List);
517
518       --  Warn on null others list if warning option set
519
520       if Warn_On_Redundant_Constructs
521         and then Comes_From_Source (Others_Choice)
522         and then Is_Empty_List (Choice_List)
523       then
524          Error_Msg_N ("?others choice is empty", Others_Choice);
525       end if;
526    end Expand_Others_Choice;
527
528    -----------
529    -- No_OP --
530    -----------
531
532    procedure No_OP (C : Node_Id) is
533       pragma Warnings (Off, C);
534
535    begin
536       null;
537    end No_OP;
538
539    --------------------------------
540    -- Generic_Choices_Processing --
541    --------------------------------
542
543    package body Generic_Choices_Processing is
544
545       ---------------------
546       -- Analyze_Choices --
547       ---------------------
548
549       procedure Analyze_Choices
550         (N              : Node_Id;
551          Subtyp         : Entity_Id;
552          Choice_Table   : out Choice_Table_Type;
553          Last_Choice    : out Nat;
554          Raises_CE      : out Boolean;
555          Others_Present : out Boolean)
556       is
557          E : Entity_Id;
558
559          Enode : Node_Id;
560          --  This is where we post error messages for bounds out of range
561
562          Nb_Choices        : constant Nat := Choice_Table'Length;
563          Sort_Choice_Table : Sort_Choice_Table_Type (0 .. Nb_Choices);
564
565          Choice_Type : constant Entity_Id := Base_Type (Subtyp);
566          --  The actual type against which the discrete choices are
567          --  resolved.  Note that this type is always the base type not the
568          --  subtype of the ruling expression, index or discriminant.
569
570          Bounds_Type : Entity_Id;
571          --  The type from which are derived the bounds of the values
572          --  covered by the discrete choices (see 3.8.1 (4)). If a discrete
573          --  choice specifies a value outside of these bounds we have an error.
574
575          Bounds_Lo : Uint;
576          Bounds_Hi : Uint;
577          --  The actual bounds of the above type.
578
579          Expected_Type : Entity_Id;
580          --  The expected type of each choice. Equal to Choice_Type, except
581          --  if the expression is universal,  in which case the choices can
582          --  be of any integer type.
583
584          Alt : Node_Id;
585          --  A case statement alternative or a variant in a record type
586          --  declaration
587
588          Choice : Node_Id;
589          Kind   : Node_Kind;
590          --  The node kind of the current Choice
591
592          Others_Choice : Node_Id := Empty;
593          --  Remember others choice if it is present (empty otherwise)
594
595          procedure Check (Choice : Node_Id; Lo, Hi : Node_Id);
596          --  Checks the validity of the bounds of a choice.  When the bounds
597          --  are static and no error occurred the bounds are entered into
598          --  the choices table so that they can be sorted later on.
599
600          -----------
601          -- Check --
602          -----------
603
604          procedure Check (Choice : Node_Id; Lo, Hi : Node_Id) is
605             Lo_Val : Uint;
606             Hi_Val : Uint;
607
608          begin
609             --  First check if an error was already detected on either bounds
610
611             if Etype (Lo) = Any_Type or else Etype (Hi) = Any_Type then
612                return;
613
614             --  Do not insert non static choices in the table to be sorted
615
616             elsif not Is_Static_Expression (Lo)
617               or else not Is_Static_Expression (Hi)
618             then
619                Process_Non_Static_Choice (Choice);
620                return;
621
622             --  Ignore range which raise constraint error
623
624             elsif Raises_Constraint_Error (Lo)
625               or else Raises_Constraint_Error (Hi)
626             then
627                Raises_CE := True;
628                return;
629
630             --  Otherwise we have an OK static choice
631
632             else
633                Lo_Val := Expr_Value (Lo);
634                Hi_Val := Expr_Value (Hi);
635
636                --  Do not insert null ranges in the choices table
637
638                if Lo_Val > Hi_Val then
639                   Process_Empty_Choice (Choice);
640                   return;
641                end if;
642             end if;
643
644             --  Check for low bound out of range
645
646             if Lo_Val < Bounds_Lo then
647
648                --  If the choice is an entity name, then it is a type, and
649                --  we want to post the message on the reference to this
650                --  entity. Otherwise we want to post it on the lower bound
651                --  of the range.
652
653                if Is_Entity_Name (Choice) then
654                   Enode := Choice;
655                else
656                   Enode := Lo;
657                end if;
658
659                --  Specialize message for integer/enum type
660
661                if Is_Integer_Type (Bounds_Type) then
662                   Error_Msg_Uint_1 := Bounds_Lo;
663                   Error_Msg_N ("minimum allowed choice value is^", Enode);
664                else
665                   Error_Msg_Name_1 := Choice_Image (Bounds_Lo, Bounds_Type);
666                   Error_Msg_N ("minimum allowed choice value is%", Enode);
667                end if;
668             end if;
669
670             --  Check for high bound out of range
671
672             if Hi_Val > Bounds_Hi then
673
674                --  If the choice is an entity name, then it is a type, and
675                --  we want to post the message on the reference to this
676                --  entity. Otherwise we want to post it on the upper bound
677                --  of the range.
678
679                if Is_Entity_Name (Choice) then
680                   Enode := Choice;
681                else
682                   Enode := Hi;
683                end if;
684
685                --  Specialize message for integer/enum type
686
687                if Is_Integer_Type (Bounds_Type) then
688                   Error_Msg_Uint_1 := Bounds_Hi;
689                   Error_Msg_N ("maximum allowed choice value is^", Enode);
690                else
691                   Error_Msg_Name_1 := Choice_Image (Bounds_Hi, Bounds_Type);
692                   Error_Msg_N ("maximum allowed choice value is%", Enode);
693                end if;
694             end if;
695
696             --  Store bounds in the table
697
698             --  Note: we still store the bounds, even if they are out of
699             --  range, since this may prevent unnecessary cascaded errors
700             --  for values that are covered by such an excessive range.
701
702             Last_Choice := Last_Choice + 1;
703             Sort_Choice_Table (Last_Choice).Lo   := Lo;
704             Sort_Choice_Table (Last_Choice).Hi   := Hi;
705             Sort_Choice_Table (Last_Choice).Node := Choice;
706          end Check;
707
708       --  Start of processing for Analyze_Choices
709
710       begin
711          Last_Choice    := 0;
712          Raises_CE      := False;
713          Others_Present := False;
714
715          --  If Subtyp is not a static subtype Ada 95 requires then we use
716          --  the bounds of its base type to determine the values covered by
717          --  the discrete choices.
718
719          if Is_OK_Static_Subtype (Subtyp) then
720             Bounds_Type := Subtyp;
721          else
722             Bounds_Type := Choice_Type;
723          end if;
724
725          --  Obtain static bounds of type, unless this is a generic formal
726          --  discrete type for which all choices will be non-static.
727
728          if not Is_Generic_Type (Root_Type (Bounds_Type))
729            or else Ekind (Bounds_Type) /= E_Enumeration_Type
730          then
731             Bounds_Lo := Expr_Value (Type_Low_Bound (Bounds_Type));
732             Bounds_Hi := Expr_Value (Type_High_Bound (Bounds_Type));
733          end if;
734
735          if Choice_Type = Universal_Integer then
736             Expected_Type := Any_Integer;
737          else
738             Expected_Type := Choice_Type;
739          end if;
740
741          --  Now loop through the case alternatives or record variants
742
743          Alt := First (Get_Alternatives (N));
744          while Present (Alt) loop
745
746             --  If pragma, just analyze it
747
748             if Nkind (Alt) = N_Pragma then
749                Analyze (Alt);
750
751             --  Otherwise check each choice against its base type
752
753             else
754                Choice := First (Get_Choices (Alt));
755
756                while Present (Choice) loop
757                   Analyze (Choice);
758                   Kind := Nkind (Choice);
759
760                   --  Choice is a Range
761
762                   if Kind = N_Range
763                     or else (Kind = N_Attribute_Reference
764                               and then Attribute_Name (Choice) = Name_Range)
765                   then
766                      Resolve (Choice, Expected_Type);
767                      Check (Choice, Low_Bound (Choice), High_Bound (Choice));
768
769                   --  Choice is a subtype name
770
771                   elsif Is_Entity_Name (Choice)
772                     and then Is_Type (Entity (Choice))
773                   then
774                      if not Covers (Expected_Type, Etype (Choice)) then
775                         Wrong_Type (Choice, Choice_Type);
776
777                      else
778                         E := Entity (Choice);
779
780                         if not Is_Static_Subtype (E) then
781                            Process_Non_Static_Choice (Choice);
782                         else
783                            Check
784                              (Choice, Type_Low_Bound (E), Type_High_Bound (E));
785                         end if;
786                      end if;
787
788                   --  Choice is a subtype indication
789
790                   elsif Kind = N_Subtype_Indication then
791                      Resolve_Discrete_Subtype_Indication
792                        (Choice, Expected_Type);
793
794                      if Etype (Choice) /= Any_Type then
795                         declare
796                            C : constant Node_Id := Constraint (Choice);
797                            R : constant Node_Id := Range_Expression (C);
798                            L : constant Node_Id := Low_Bound (R);
799                            H : constant Node_Id := High_Bound (R);
800
801                         begin
802                            E := Entity (Subtype_Mark (Choice));
803
804                            if not Is_Static_Subtype (E) then
805                               Process_Non_Static_Choice (Choice);
806
807                            else
808                               if Is_OK_Static_Expression (L)
809                                 and then Is_OK_Static_Expression (H)
810                               then
811                                  if Expr_Value (L) > Expr_Value (H) then
812                                     Process_Empty_Choice (Choice);
813                                  else
814                                     if Is_Out_Of_Range (L, E) then
815                                        Apply_Compile_Time_Constraint_Error
816                                          (L, "static value out of range",
817                                           CE_Range_Check_Failed);
818                                     end if;
819
820                                     if Is_Out_Of_Range (H, E) then
821                                        Apply_Compile_Time_Constraint_Error
822                                          (H, "static value out of range",
823                                           CE_Range_Check_Failed);
824                                     end if;
825                                  end if;
826                               end if;
827
828                               Check (Choice, L, H);
829                            end if;
830                         end;
831                      end if;
832
833                   --  The others choice is only allowed for the last
834                   --  alternative and as its only choice.
835
836                   elsif Kind = N_Others_Choice then
837                      if not (Choice = First (Get_Choices (Alt))
838                              and then Choice = Last (Get_Choices (Alt))
839                              and then Alt = Last (Get_Alternatives (N)))
840                      then
841                         Error_Msg_N
842                           ("the choice OTHERS must appear alone and last",
843                            Choice);
844                         return;
845                      end if;
846
847                      Others_Present := True;
848                      Others_Choice  := Choice;
849
850                   --  Only other possibility is an expression
851
852                   else
853                      Resolve (Choice, Expected_Type);
854                      Check (Choice, Choice, Choice);
855                   end if;
856
857                   Next (Choice);
858                end loop;
859
860                Process_Associated_Node (Alt);
861             end if;
862
863             Next (Alt);
864          end loop;
865
866          Check_Choices
867            (Sort_Choice_Table (0 .. Last_Choice),
868             Bounds_Type,
869             Others_Present or else (Choice_Type = Universal_Integer),
870             Sloc (N));
871
872          --  Now copy the sorted discrete choices
873
874          for J in 1 .. Last_Choice loop
875             Choice_Table (Choice_Table'First - 1 + J) := Sort_Choice_Table (J);
876          end loop;
877
878          --  If no others choice we are all done, otherwise we have one more
879          --  step, which is to set the Others_Discrete_Choices field of the
880          --  others choice (to contain all otherwise unspecified choices).
881          --  Skip this if CE is known to be raised.
882
883          if Others_Present and not Raises_CE then
884             Expand_Others_Choice
885               (Case_Table    => Choice_Table (1 .. Last_Choice),
886                Others_Choice => Others_Choice,
887                Choice_Type   => Bounds_Type);
888          end if;
889       end Analyze_Choices;
890
891       -----------------------
892       -- Number_Of_Choices --
893       -----------------------
894
895       function Number_Of_Choices (N : Node_Id) return Nat is
896          Alt : Node_Id;
897          --  A case statement alternative or a record variant
898
899          Choice : Node_Id;
900          Count  : Nat := 0;
901
902       begin
903          if not Present (Get_Alternatives (N)) then
904             return 0;
905          end if;
906
907          Alt := First_Non_Pragma (Get_Alternatives (N));
908          while Present (Alt) loop
909
910             Choice := First (Get_Choices (Alt));
911             while Present (Choice) loop
912                if Nkind (Choice) /= N_Others_Choice then
913                   Count := Count + 1;
914                end if;
915
916                Next (Choice);
917             end loop;
918
919             Next_Non_Pragma (Alt);
920          end loop;
921
922          return Count;
923       end Number_Of_Choices;
924
925    end Generic_Choices_Processing;
926
927 end Sem_Case;