[Ada] Spurious warning on iteration over range of 64-bit modular type
authorEd Schonberg <schonberg@adacore.com>
Tue, 31 Jul 2018 09:55:48 +0000 (09:55 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 31 Jul 2018 09:55:48 +0000 (09:55 +0000)
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.

2018-07-31  Ed Schonberg  <schonberg@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.

From-SVN: r263095

gcc/ada/ChangeLog
gcc/ada/sem_eval.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/iter3.adb [new file with mode: 0644]

index f91727b7f1316c570aa5ff7b7e16c5c2da88fb25..8b286057c1c4e2e31b085246a2544bdb995ac711 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-31  Ed Schonberg  <schonberg@adacore.com>
+
+       * 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.
+
 2018-07-31  Arnaud Charlet  <charlet@adacore.com>
 
        * einfo.adb (Write_Entity_Flags): Also print
index c14347b0e7d3e919c9c92c9d3a7c5036976565a3..4560a512fb8563f263fa71d381cb1713fd6d2921 100644 (file)
@@ -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
index eb6474211c0e1961e4205d8d6183ad47428d4b39..fd3079cf9079cdc5c326a1f8e81dda9d9fb985a0 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-31  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/iter3.adb: New testcase.
+
 2018-07-31  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        Revert 'AsyncI/O patch committed'
diff --git a/gcc/testsuite/gnat.dg/iter3.adb b/gcc/testsuite/gnat.dg/iter3.adb
new file mode 100644 (file)
index 0000000..28c90a1
--- /dev/null
@@ -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;