aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorBob Duff <duff@adacore.com>2019-07-03 08:15:28 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-03 08:15:28 +0000
commite08a896b96792d73293db82d0dc3541c17e545ad (patch)
tree873033257e40845a247e50b2c395a10f182c897b /gcc/ada
parent07fb741a3672a677a48a2672345d2dd67f944fad (diff)
downloadgcc-e08a896b96792d73293db82d0dc3541c17e545ad.zip
gcc-e08a896b96792d73293db82d0dc3541c17e545ad.tar.gz
gcc-e08a896b96792d73293db82d0dc3541c17e545ad.tar.bz2
[Ada] Improve warnings about infinite loops
The compiler now has fewer false alarms when warning about infinite loops. For example, a loop of the form "for X of A ...", where A is an array, cannot be infinite. The compiler no longer warns in this case. 2019-07-03 Bob Duff <duff@adacore.com> gcc/ada/ * sem_warn.adb (Check_Infinite_Loop_Warning): Avoid the warning if an Iterator_Specification is present. gcc/testsuite/ * gnat.dg/warn20.adb, gnat.dg/warn20_pkg.adb, gnat.dg/warn20_pkg.ads: New testcase. From-SVN: r272978
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/sem_warn.adb13
2 files changed, 15 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index dd14590..02f35d5 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,10 @@
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
new-line behavior.
diff --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb
index dda94d2..7e13aa5 100644
--- a/gcc/ada/sem_warn.adb
+++ b/gcc/ada/sem_warn.adb
@@ -632,9 +632,16 @@ package body Sem_Warn is
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;