In Ada 2012, if a subtype has a static predicate the set of its possible values
is known statically and those are the alternatives that must be covered in in
case statement. If the subtype has dynamic predicates, the alternatives must
cover all values of the base type.
Compiling nonstaticcase.adb in Ada 2012 mode must yield:
nonstaticcase.adb:7:04: missing case values: -16#8000_0000# .. 0
nonstaticcase.adb:7:04: missing case values: 11 .. 16#7FFF_FFFF#
nonstaticcase.adb:7:09: bounds of "rr" are not static,
alternatives must cover base type
---
procedure nonstaticcase (rmin : integer) is
subtype r is integer range 1 .. 10
with Dynamic_Predicate => r >= rmin;
rr : r;
begin
rr := rmin + 1;
case rr is
when 1 .. 10 => null;
end case;
end;
Tested on x86_64-pc-linux-gnu, committed on trunk
2012-05-15 Ed Schonberg <[email protected]>
* sem_case.adb (Analyze_Choices): If the subtype of the
expression has a non-static predicate, the case alternatives
must cover the base type.
Index: sem_case.adb
===================================================================
--- sem_case.adb (revision 187501)
+++ sem_case.adb (working copy)
@@ -803,8 +803,18 @@
-- bounds of its base type to determine the values covered by the
-- discrete choices.
+ -- In Ada 2012, if the subtype has a non-static predicate the full
+ -- range of the base type must be covered as well.
+
if Is_OK_Static_Subtype (Subtyp) then
- Bounds_Type := Subtyp;
+ if not Has_Predicates (Subtyp)
+ or else Present (Static_Predicate (Subtyp))
+ then
+ Bounds_Type := Subtyp;
+ else
+ Bounds_Type := Choice_Type;
+ end if;
+
else
Bounds_Type := Choice_Type;
end if;