[Ada] Fix spurious loop warning for function with Out parameter
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 22 Jul 2019 13:56:50 +0000 (13:56 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:56:50 +0000 (13:56 +0000)
The compiler gives a spurious warning about a possible infinite while
loop whose condition contains a call to a function that takes an Out or
In/Out parameter and whose actual is a variable that is not modified in
the loop, because it still thinks that functions can only have In
parameters.

2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* sem_warn.adb (Find_Var): Bail out for a function call with an
Out or In/Out parameter.

gcc/testsuite/

* gnat.dg/warn23.adb: New testcase.

From-SVN: r273673

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

index ec1b81aeb59c141bcd05becaa72fed47fcf2ab4c..6fc9d1c59cc69fc7d5aab75060edadc4afdf2aef 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * sem_warn.adb (Find_Var): Bail out for a function call with an
+       Out or In/Out parameter.
+
 2019-07-22  Nicolas Roche  <roche@adacore.com>
 
        * terminals.c (__gnat_tty_waitpid): Support both blocking and
index 16a772af88ba12af1c9db25a3cd873e2c1b28b19..0e1e292bd796de0a1e3fb9d1986fd323636d5193 100644 (file)
@@ -333,6 +333,11 @@ package body Sem_Warn is
 
             elsif Has_Warnings_Off (Entity (Name (N))) then
                return;
+
+            --  Forget it if the parameter is not In
+
+            elsif Has_Out_Or_In_Out_Parameter (Entity (Name (N))) then
+               return;
             end if;
 
             --  OK, see if we have one argument
index 2fa30eb58dd5ba275f2e66ed18f6accfdcce43f6..c542c626f1d6725e34fd0172bed4cd6291b557ea 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/warn23.adb: New testcase.
+
 2019-07-22  Javier Miranda  <miranda@adacore.com>
 
        * gnat.dg/cpp_constructor2.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/warn23.adb b/gcc/testsuite/gnat.dg/warn23.adb
new file mode 100644 (file)
index 0000000..63d0557
--- /dev/null
@@ -0,0 +1,17 @@
+--  { dg-do compile }
+
+procedure Warn23 is
+
+   type Enum_Type is (A, B, C);
+
+   function Poll (E : out Enum_Type) return Boolean
+     with Convention => Ada,
+          Import => True;
+
+   E : Enum_Type;
+
+begin
+   while Poll (E) loop
+      null;
+   end loop;
+end;