1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
10 -- Copyright (C) 1996-2002 Free Software Foundation, Inc. --
12 -- GNAT is free software; you can redistribute it and/or modify it under --
13 -- terms of the GNU General Public License as published by the Free Soft- --
14 -- ware Foundation; either version 2, or (at your option) any later ver- --
15 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
18 -- for more details. You should have received a copy of the GNU General --
19 -- Public License distributed with GNAT; see file COPYING. If not, write --
20 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
21 -- MA 02111-1307, USA. --
23 -- GNAT was originally developed by the GNAT team at New York University. --
24 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
26 ------------------------------------------------------------------------------
28 with Atree
; use Atree
;
29 with Einfo
; use Einfo
;
30 with Errout
; use Errout
;
31 with Namet
; use Namet
;
32 with Nlists
; use Nlists
;
34 with Sem_Eval
; use Sem_Eval
;
35 with Sem_Res
; use Sem_Res
;
36 with Sem_Util
; use Sem_Util
;
37 with Sem_Type
; use Sem_Type
;
38 with Snames
; use Snames
;
39 with Stand
; use Stand
;
40 with Sinfo
; use Sinfo
;
41 with Uintp
; use Uintp
;
43 with GNAT
.Heap_Sort_A
; use GNAT
.Heap_Sort_A
;
45 package body Sem_Case
is
47 -----------------------
48 -- Local Subprograms --
49 -----------------------
51 type Sort_Choice_Table_Type
is array (Nat
range <>) of Choice_Bounds
;
52 -- This new array type is used as the actual table type for sorting
53 -- discrete choices. The reason for not using Choice_Table_Type, is that
54 -- in Sort_Choice_Table_Type we reserve entry 0 for the sorting algortim
55 -- (this is not absolutely necessary but it makes the code more
58 procedure Check_Choices
59 (Choice_Table
: in out Sort_Choice_Table_Type
;
60 Bounds_Type
: Entity_Id
;
61 Others_Present
: Boolean;
62 Msg_Sloc
: Source_Ptr
);
63 -- This is the procedure which verifies that a set of case statement,
64 -- array aggregate or record variant choices has no duplicates, and
65 -- covers the range specified by Bounds_Type. Choice_Table contains the
66 -- discrete choices to check. These must start at position 1.
67 -- Furthermore Choice_Table (0) must exist. This element is used by
68 -- the sorting algorithm as a temporary. Others_Present is a flag
69 -- indicating whether or not an Others choice is present. Finally
70 -- Msg_Sloc gives the source location of the construct containing the
71 -- choices in the Choice_Table.
73 function Choice_Image
(Value
: Uint
; Ctype
: Entity_Id
) return Name_Id
;
74 -- Given a Pos value of enumeration type Ctype, returns the name
75 -- ID of an appropriate string to be used in error message output.
81 procedure Check_Choices
82 (Choice_Table
: in out Sort_Choice_Table_Type
;
83 Bounds_Type
: Entity_Id
;
84 Others_Present
: Boolean;
85 Msg_Sloc
: Source_Ptr
)
88 function Lt_Choice
(C1
, C2
: Natural) return Boolean;
89 -- Comparison routine for comparing Choice_Table entries.
90 -- Use the lower bound of each Choice as the key.
92 procedure Move_Choice
(From
: Natural; To
: Natural);
93 -- Move routine for sorting the Choice_Table.
95 procedure Issue_Msg
(Value1
: Node_Id
; Value2
: Node_Id
);
96 procedure Issue_Msg
(Value1
: Node_Id
; Value2
: Uint
);
97 procedure Issue_Msg
(Value1
: Uint
; Value2
: Node_Id
);
98 procedure Issue_Msg
(Value1
: Uint
; Value2
: Uint
);
99 -- Issue an error message indicating that there are missing choices,
100 -- followed by the image of the missing choices themselves which lie
101 -- between Value1 and Value2 inclusive.
107 procedure Issue_Msg
(Value1
: Node_Id
; Value2
: Node_Id
) is
109 Issue_Msg
(Expr_Value
(Value1
), Expr_Value
(Value2
));
112 procedure Issue_Msg
(Value1
: Node_Id
; Value2
: Uint
) is
114 Issue_Msg
(Expr_Value
(Value1
), Value2
);
117 procedure Issue_Msg
(Value1
: Uint
; Value2
: Node_Id
) is
119 Issue_Msg
(Value1
, Expr_Value
(Value2
));
122 procedure Issue_Msg
(Value1
: Uint
; Value2
: Uint
) is
124 -- In some situations, we call this with a null range, and
125 -- obviously we don't want to complain in this case!
127 if Value1
> Value2
then
131 -- Case of only one value that is missing
133 if Value1
= Value2
then
134 if Is_Integer_Type
(Bounds_Type
) then
135 Error_Msg_Uint_1
:= Value1
;
136 Error_Msg
("missing case value: ^!", Msg_Sloc
);
138 Error_Msg_Name_1
:= Choice_Image
(Value1
, Bounds_Type
);
139 Error_Msg
("missing case value: %!", Msg_Sloc
);
142 -- More than one choice value, so print range of values
145 if Is_Integer_Type
(Bounds_Type
) then
146 Error_Msg_Uint_1
:= Value1
;
147 Error_Msg_Uint_2
:= Value2
;
148 Error_Msg
("missing case values: ^ .. ^!", Msg_Sloc
);
150 Error_Msg_Name_1
:= Choice_Image
(Value1
, Bounds_Type
);
151 Error_Msg_Name_2
:= Choice_Image
(Value2
, Bounds_Type
);
152 Error_Msg
("missing case values: % .. %!", Msg_Sloc
);
161 function Lt_Choice
(C1
, C2
: Natural) return Boolean is
164 Expr_Value
(Choice_Table
(Nat
(C1
)).Lo
)
165 <= Expr_Value
(Choice_Table
(Nat
(C2
)).Lo
);
172 procedure Move_Choice
(From
: Natural; To
: Natural) is
174 Choice_Table
(Nat
(To
)) := Choice_Table
(Nat
(From
));
177 -- Variables local to Check_Choices
180 Bounds_Lo
: constant Node_Id
:= Type_Low_Bound
(Bounds_Type
);
181 Bounds_Hi
: constant Node_Id
:= Type_High_Bound
(Bounds_Type
);
183 Prev_Choice
: Node_Id
;
189 -- Start processing for Check_Choices
193 -- Choice_Table must start at 0 which is an unused location used
194 -- by the sorting algorithm. However the first valid position for
195 -- a discrete choice is 1.
197 pragma Assert
(Choice_Table
'First = 0);
199 if Choice_Table
'Last = 0 then
200 if not Others_Present
then
201 Issue_Msg
(Bounds_Lo
, Bounds_Hi
);
207 (Positive (Choice_Table
'Last),
208 Move_Choice
'Unrestricted_Access,
209 Lt_Choice
'Unrestricted_Access);
211 Lo
:= Expr_Value
(Choice_Table
(1).Lo
);
212 Hi
:= Expr_Value
(Choice_Table
(1).Hi
);
215 if not Others_Present
and then Expr_Value
(Bounds_Lo
) < Lo
then
216 Issue_Msg
(Bounds_Lo
, Lo
- 1);
219 for J
in 2 .. Choice_Table
'Last loop
220 Lo
:= Expr_Value
(Choice_Table
(J
).Lo
);
221 Hi
:= Expr_Value
(Choice_Table
(J
).Hi
);
223 if Lo
<= Prev_Hi
then
224 Prev_Choice
:= Choice_Table
(J
- 1).Node
;
225 Choice
:= Choice_Table
(J
).Node
;
227 if Sloc
(Prev_Choice
) <= Sloc
(Choice
) then
228 Error_Msg_Sloc
:= Sloc
(Prev_Choice
);
229 Error_Msg_N
("duplication of choice value#", Choice
);
231 Error_Msg_Sloc
:= Sloc
(Choice
);
232 Error_Msg_N
("duplication of choice value#", Prev_Choice
);
235 elsif not Others_Present
and then Lo
/= Prev_Hi
+ 1 then
236 Issue_Msg
(Prev_Hi
+ 1, Lo
- 1);
242 if not Others_Present
and then Expr_Value
(Bounds_Hi
) > Hi
then
243 Issue_Msg
(Hi
+ 1, Bounds_Hi
);
251 function Choice_Image
(Value
: Uint
; Ctype
: Entity_Id
) return Name_Id
is
252 Rtp
: constant Entity_Id
:= Root_Type
(Ctype
);
257 -- For character, or wide character. If we are in 7-bit ASCII graphic
258 -- range, then build and return appropriate character literal name
260 if Rtp
= Standard_Character
261 or else Rtp
= Standard_Wide_Character
263 C
:= UI_To_Int
(Value
);
265 if C
in 16#
20#
.. 16#
7E#
then
266 Set_Character_Literal_Name
(Char_Code
(UI_To_Int
(Value
)));
270 -- For user defined enumeration type, find enum/char literal
273 Lit
:= First_Literal
(Rtp
);
275 for J
in 1 .. UI_To_Int
(Value
) loop
279 -- If enumeration literal, just return its value
281 if Nkind
(Lit
) = N_Defining_Identifier
then
284 -- For character literal, get the name and use it if it is
285 -- for a 7-bit ASCII graphic character in 16#20#..16#7E#.
288 Get_Decoded_Name_String
(Chars
(Lit
));
291 and then Name_Buffer
(2) in
292 Character'Val (16#
20#
) .. Character'Val (16#
7E#
)
299 -- If we fall through, we have a character literal which is not in
300 -- the 7-bit ASCII graphic set. For such cases, we construct the
301 -- name "type'val(nnn)" where type is the choice type, and nnn is
302 -- the pos value passed as an argument to Choice_Image.
304 Get_Name_String
(Chars
(First_Subtype
(Ctype
)));
305 Name_Len
:= Name_Len
+ 1;
306 Name_Buffer
(Name_Len
) := ''';
307 Name_Len
:= Name_Len
+ 1;
308 Name_Buffer
(Name_Len
) := 'v';
309 Name_Len
:= Name_Len
+ 1;
310 Name_Buffer
(Name_Len
) := 'a';
311 Name_Len
:= Name_Len
+ 1;
312 Name_Buffer
(Name_Len
) := 'l';
313 Name_Len
:= Name_Len
+ 1;
314 Name_Buffer
(Name_Len
) := '(';
318 for J
in 1 .. UI_Image_Length
loop
319 Name_Len
:= Name_Len
+ 1;
320 Name_Buffer
(Name_Len
) := UI_Image_Buffer
(J
);
323 Name_Len
:= Name_Len
+ 1;
324 Name_Buffer
(Name_Len
) := ')';
332 procedure No_OP
(C
: Node_Id
) is
333 pragma Warnings
(Off
, C
);
339 --------------------------------
340 -- Generic_Choices_Processing --
341 --------------------------------
343 package body Generic_Choices_Processing
is
345 ---------------------
346 -- Analyze_Choices --
347 ---------------------
349 procedure Analyze_Choices
352 Choice_Table
: in out Choice_Table_Type
;
353 Last_Choice
: out Nat
;
354 Raises_CE
: out Boolean;
355 Others_Present
: out Boolean)
358 Nb_Choices
: constant Nat
:= Choice_Table
'Length;
359 Sort_Choice_Table
: Sort_Choice_Table_Type
(0 .. Nb_Choices
);
361 Choice_Type
: constant Entity_Id
:= Base_Type
(Subtyp
);
362 -- The actual type against which the discrete choices are
363 -- resolved. Note that this type is always the base type not the
364 -- subtype of the ruling expression, index or discriminant.
366 Bounds_Type
: Entity_Id
;
367 -- The type from which are derived the bounds of the values
368 -- covered by th discrete choices (see 3.8.1 (4)). If a discrete
369 -- choice specifies a value outside of these bounds we have an error.
373 -- The actual bounds of the above type.
375 Expected_Type
: Entity_Id
;
376 -- The expected type of each choice. Equal to Choice_Type, except
377 -- if the expression is universal, in which case the choices can
378 -- be of any integer type.
380 procedure Check
(Choice
: Node_Id
; Lo
, Hi
: Node_Id
);
381 -- Checks the validity of the bounds of a choice. When the bounds
382 -- are static and no error occurred the bounds are entered into
383 -- the choices table so that they can be sorted later on.
389 procedure Check
(Choice
: Node_Id
; Lo
, Hi
: Node_Id
) is
394 -- First check if an error was already detected on either bounds
396 if Etype
(Lo
) = Any_Type
or else Etype
(Hi
) = Any_Type
then
399 -- Do not insert non static choices in the table to be sorted
401 elsif not Is_Static_Expression
(Lo
)
402 or else not Is_Static_Expression
(Hi
)
404 Process_Non_Static_Choice
(Choice
);
407 -- Ignore range which raise constraint error
409 elsif Raises_Constraint_Error
(Lo
)
410 or else Raises_Constraint_Error
(Hi
)
415 -- Otherwise we have an OK static choice
418 Lo_Val
:= Expr_Value
(Lo
);
419 Hi_Val
:= Expr_Value
(Hi
);
421 -- Do not insert null ranges in the choices table
423 if Lo_Val
> Hi_Val
then
424 Process_Empty_Choice
(Choice
);
429 -- Check for bound out of range.
431 if Lo_Val
< Bounds_Lo
then
432 if Is_Integer_Type
(Bounds_Type
) then
433 Error_Msg_Uint_1
:= Bounds_Lo
;
434 Error_Msg_N
("minimum allowed choice value is^", Lo
);
436 Error_Msg_Name_1
:= Choice_Image
(Bounds_Lo
, Bounds_Type
);
437 Error_Msg_N
("minimum allowed choice value is%", Lo
);
440 elsif Hi_Val
> Bounds_Hi
then
441 if Is_Integer_Type
(Bounds_Type
) then
442 Error_Msg_Uint_1
:= Bounds_Hi
;
443 Error_Msg_N
("maximum allowed choice value is^", Hi
);
445 Error_Msg_Name_1
:= Choice_Image
(Bounds_Hi
, Bounds_Type
);
446 Error_Msg_N
("maximum allowed choice value is%", Hi
);
450 -- We still store the bounds in the table, even if they are out
451 -- of range, since this may prevent unnecessary cascaded errors
452 -- for values that are covered by such an excessive range.
454 Last_Choice
:= Last_Choice
+ 1;
455 Sort_Choice_Table
(Last_Choice
).Lo
:= Lo
;
456 Sort_Choice_Table
(Last_Choice
).Hi
:= Hi
;
457 Sort_Choice_Table
(Last_Choice
).Node
:= Choice
;
460 -- Variables local to Analyze_Choices
463 -- A case statement alternative, an array aggregate component
464 -- association or a variant in a record type declaration
468 -- The node kind of the current Choice.
472 -- Start of processing for Analyze_Choices
477 Others_Present
:= False;
479 -- If Subtyp is not a static subtype Ada 95 requires then we use
480 -- the bounds of its base type to determine the values covered by
481 -- the discrete choices.
483 if Is_OK_Static_Subtype
(Subtyp
) then
484 Bounds_Type
:= Subtyp
;
486 Bounds_Type
:= Choice_Type
;
489 -- Obtain static bounds of type, unless this is a generic formal
490 -- discrete type for which all choices will be non-static.
492 if not Is_Generic_Type
(Root_Type
(Bounds_Type
))
493 or else Ekind
(Bounds_Type
) /= E_Enumeration_Type
495 Bounds_Lo
:= Expr_Value
(Type_Low_Bound
(Bounds_Type
));
496 Bounds_Hi
:= Expr_Value
(Type_High_Bound
(Bounds_Type
));
499 if Choice_Type
= Universal_Integer
then
500 Expected_Type
:= Any_Integer
;
502 Expected_Type
:= Choice_Type
;
505 -- Now loop through the case statement alternatives or array
506 -- aggregate component associations or record variants.
508 Alt
:= First
(Get_Alternatives
(N
));
509 while Present
(Alt
) loop
511 -- If pragma, just analyze it
513 if Nkind
(Alt
) = N_Pragma
then
516 -- Otherwise check each choice against its base type
519 Choice
:= First
(Get_Choices
(Alt
));
521 while Present
(Choice
) loop
523 Kind
:= Nkind
(Choice
);
528 or else (Kind
= N_Attribute_Reference
529 and then Attribute_Name
(Choice
) = Name_Range
)
531 Resolve
(Choice
, Expected_Type
);
532 Check
(Choice
, Low_Bound
(Choice
), High_Bound
(Choice
));
534 -- Choice is a subtype name
536 elsif Is_Entity_Name
(Choice
)
537 and then Is_Type
(Entity
(Choice
))
539 if not Covers
(Expected_Type
, Etype
(Choice
)) then
540 Wrong_Type
(Choice
, Choice_Type
);
543 E
:= Entity
(Choice
);
545 if not Is_Static_Subtype
(E
) then
546 Process_Non_Static_Choice
(Choice
);
549 (Choice
, Type_Low_Bound
(E
), Type_High_Bound
(E
));
553 -- Choice is a subtype indication
555 elsif Kind
= N_Subtype_Indication
then
556 Resolve_Discrete_Subtype_Indication
557 (Choice
, Expected_Type
);
559 if Etype
(Choice
) /= Any_Type
then
561 C
: constant Node_Id
:= Constraint
(Choice
);
562 R
: constant Node_Id
:= Range_Expression
(C
);
563 L
: constant Node_Id
:= Low_Bound
(R
);
564 H
: constant Node_Id
:= High_Bound
(R
);
567 E
:= Entity
(Subtype_Mark
(Choice
));
569 if not Is_Static_Subtype
(E
) then
570 Process_Non_Static_Choice
(Choice
);
573 if Is_OK_Static_Expression
(L
)
574 and then Is_OK_Static_Expression
(H
)
576 if Expr_Value
(L
) > Expr_Value
(H
) then
577 Process_Empty_Choice
(Choice
);
579 if Is_Out_Of_Range
(L
, E
) then
580 Apply_Compile_Time_Constraint_Error
581 (L
, "static value out of range",
582 CE_Range_Check_Failed
);
585 if Is_Out_Of_Range
(H
, E
) then
586 Apply_Compile_Time_Constraint_Error
587 (H
, "static value out of range",
588 CE_Range_Check_Failed
);
593 Check
(Choice
, L
, H
);
598 -- The others choice is only allowed for the last
599 -- alternative and as its only choice.
601 elsif Kind
= N_Others_Choice
then
602 if not (Choice
= First
(Get_Choices
(Alt
))
603 and then Choice
= Last
(Get_Choices
(Alt
))
604 and then Alt
= Last
(Get_Alternatives
(N
)))
607 ("the choice OTHERS must appear alone and last",
612 Others_Present
:= True;
614 -- Only other possibility is an expression
617 Resolve
(Choice
, Expected_Type
);
618 Check
(Choice
, Choice
, Choice
);
624 Process_Associated_Node
(Alt
);
631 (Sort_Choice_Table
(0 .. Last_Choice
),
633 Others_Present
or else (Choice_Type
= Universal_Integer
),
636 -- Now copy the sorted discrete choices
638 for J
in 1 .. Last_Choice
loop
639 Choice_Table
(Choice_Table
'First - 1 + J
) := Sort_Choice_Table
(J
);
644 -----------------------
645 -- Number_Of_Choices --
646 -----------------------
648 function Number_Of_Choices
(N
: Node_Id
) return Nat
is
650 -- A case statement alternative, an array aggregate component
651 -- association or a record variant.
657 if not Present
(Get_Alternatives
(N
)) then
661 Alt
:= First_Non_Pragma
(Get_Alternatives
(N
));
662 while Present
(Alt
) loop
664 Choice
:= First
(Get_Choices
(Alt
));
665 while Present
(Choice
) loop
666 if Nkind
(Choice
) /= N_Others_Choice
then
673 Next_Non_Pragma
(Alt
);
677 end Number_Of_Choices
;
679 end Generic_Choices_Processing
;