sem_case.adb (Check_Choice_Set): Choose initial choice range below low bound of type...
authorEd Schonberg <schonberg@adacore.com>
Mon, 26 Oct 2015 11:21:21 +0000 (11:21 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 26 Oct 2015 11:21:21 +0000 (12:21 +0100)
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.

From-SVN: r229332

gcc/ada/ChangeLog
gcc/ada/sem_case.adb
gcc/ada/sem_util.ads

index fff8b879093c9a8fcbc9188b26e463434573dfa8..2e3f50e79cfe0158eabf5607c1ed826f774aea47 100644 (file)
@@ -1,3 +1,11 @@
+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
index 201855b5e364518ee93f0a2fc7db5f5f1f7deb5b..a23358afe2e8113047f85efba81ae9a37ccc7b53 100644 (file)
@@ -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
index 2349252f523e05a6839bd7014e5d6b84b7f053f0..2d5cb5ef90a25f8ec66b2c7384f0d20e353b9f82 100644 (file)
@@ -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