aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/sem_case.adb12
-rw-r--r--gcc/ada/sem_util.ads2
3 files changed, 18 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index fff8b87..2e3f50e 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,13 @@
2015-10-26 Ed Schonberg <schonberg@adacore.com>
+ * sem_case.adb (Check_Choice_Set): Choose initial choice range
+ below low bound of type, to prevent spurious errors on case
+ statements whose expressions have an integer subtype with a
+ static predicate.
+ * sem_util.ads: Fix typo.
+
+2015-10-26 Ed Schonberg <schonberg@adacore.com>
+
* exp_ch4.adb (Expand_N_Case_Expression): In the scope of a
predicate function, delay the expansion of the expression only
if the target type has a specified Static_ Predicate aspect,
diff --git a/gcc/ada/sem_case.adb b/gcc/ada/sem_case.adb
index 201855b..a23358a 100644
--- a/gcc/ada/sem_case.adb
+++ b/gcc/ada/sem_case.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1996-2014, Free Software Foundation, Inc. --
+-- Copyright (C) 1996-2015, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -766,8 +766,14 @@ package body Sem_Case is
if Has_Predicate then
Pred := First (Static_Discrete_Predicate (Bounds_Type));
- Prev_Lo := Uint_Minus_1;
- Prev_Hi := Uint_Minus_1;
+
+ -- Make initial value smaller than 'First of type, so that first
+ -- range comparison succeeds. This applies both to integer types
+ -- and to enumeration types.
+
+ Prev_Lo := Expr_Value (Type_Low_Bound (Bounds_Type)) - 1;
+ Prev_Hi := Prev_Lo;
+
Error := False;
for Index in 1 .. Num_Choices loop
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 2349252..2d5cb5e 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -601,7 +601,7 @@ package Sem_Util is
(N : Node_Id;
Formal : out Entity_Id;
Call : out Node_Id);
- -- Determines if the node N is an actual parameter of a function of a
+ -- Determines if the node N is an actual parameter of a function or a
-- procedure call. If so, then Formal points to the entity for the formal
-- (Ekind is E_In_Parameter, E_Out_Parameter, or E_In_Out_Parameter) and
-- Call is set to the node for the corresponding call. If the node N is not