From 1f145d79e95b1b7d90c95b7615993bc9ff767931 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Mon, 26 Oct 2015 11:21:21 +0000 Subject: [PATCH] sem_case.adb (Check_Choice_Set): Choose initial choice range below low bound of type... 2015-10-26 Ed Schonberg * 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. From-SVN: r229332 --- gcc/ada/ChangeLog | 8 ++++++++ gcc/ada/sem_case.adb | 12 +++++++++--- gcc/ada/sem_util.ads | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fff8b879093..2e3f50e79cf 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2015-10-26 Ed Schonberg + + * 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 * exp_ch4.adb (Expand_N_Case_Expression): In the scope of a diff --git a/gcc/ada/sem_case.adb b/gcc/ada/sem_case.adb index 201855b5e36..a23358afe2e 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 2349252f523..2d5cb5ef90a 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 -- 2.30.2