This patch suppresses a spurious warning on the use of a 64-bit modular type
in a quantified expression, where the range of iteration will include a bound
that appears larger than the run-time representation of Universal_Integer'last.

Tested on x86_64-pc-linux-gnu, committed on trunk

2018-07-31  Ed Schonberg  <schonb...@adacore.com>

gcc/ada/

        * sem_eval.adb (Check_Non_Static_Context): Do not warn on an
        integer literal greater than the upper bound of
        Universal_Integer'Last when expansion is disabled, to avoid a
        spurious warning over ranges involving 64-bit modular types.

gcc/testsuite/

        * gnat.dg/iter3.adb: New testcase.
--- gcc/ada/sem_eval.adb
+++ gcc/ada/sem_eval.adb
@@ -547,9 +547,15 @@ package body Sem_Eval is
       --  called in contexts like the expression of a number declaration where
       --  we certainly want to allow out of range values.
 
+      --  We inhibit the warning when expansion is disabled, because the
+      --  preanalysis of a range of a 64-bit modular type may appear to
+      --  violate the constraint on non-static Universal_Integer. If there
+      --  is a true overflow it will be diagnosed during full analysis.
+
       if Etype (N) = Universal_Integer
         and then Nkind (N) = N_Integer_Literal
         and then Nkind (Parent (N)) in N_Subexpr
+        and then Expander_Active
         and then
           (Intval (N) < Expr_Value (Type_Low_Bound (Universal_Integer))
              or else

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/iter3.adb
@@ -0,0 +1,15 @@
+--  { dg-do compile }
+--  { dg-options "-gnata" }
+
+procedure Iter3 is
+   type Mod64 is mod 2 ** 64;
+
+   function F (X : Mod64) return Boolean is (X /= Mod64'Last);
+begin
+   pragma Assert (for all X in Mod64 => F(X));
+   pragma Assert (for all X in Mod64'Range => F(X));
+
+  for X in Mod64'Range loop
+      null;
+  end loop;
+end;

Reply via email to