+2019-07-03 Bob Duff <duff@adacore.com>
+
+ * sem_warn.adb (Check_Infinite_Loop_Warning): Avoid the warning
+ if an Iterator_Specification is present.
+
2019-07-03 Bob Duff <duff@adacore.com>
* doc/gnat_ugn/gnat_utility_programs.rst: Document default
Expression := Condition (Iter);
- -- For iteration, do not process, since loop will always terminate
-
- elsif Present (Loop_Parameter_Specification (Iter)) then
+ -- For Loop_Parameter_Specification, do not process, since loop
+ -- will always terminate. For Iterator_Specification, also do not
+ -- process. Either it will always terminate (e.g. "for X of
+ -- Some_Array ..."), or we can't tell if it's going to terminate
+ -- without looking at the iterator, so any warning here would be
+ -- noise.
+
+ elsif Present (Loop_Parameter_Specification (Iter))
+ or else Present (Iterator_Specification (Iter))
+ then
return;
end if;
end if;
+2019-07-03 Bob Duff <duff@adacore.com>
+
+ * gnat.dg/warn20.adb, gnat.dg/warn20_pkg.adb,
+ gnat.dg/warn20_pkg.ads: New testcase.
+
2019-07-03 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/predicate6.adb, gnat.dg/predicate6.ads: New testcase.
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-gnatwa" }
+
+with Warn20_Pkg;
+
+procedure Warn20 is
+ package P is new Warn20_Pkg (Integer, 0);
+ pragma Unreferenced (P);
+begin
+ null;
+end Warn20;
--- /dev/null
+package body Warn20_Pkg is
+ L : array (1 .. 10) of T := (1 .. 10 => None);
+ procedure Foo is
+ begin
+ for A of L loop
+ exit when A = None;
+ Dispatch (A);
+ end loop;
+ end;
+end;
--- /dev/null
+generic
+ type T is private;
+ None : T;
+package Warn20_Pkg is
+ generic
+ with procedure Dispatch (X : T) is null;
+ procedure Foo;
+end;