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.

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

2019-07-22  Eric Botcazou  <ebotca...@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.
--- gcc/ada/sem_warn.adb
+++ gcc/ada/sem_warn.adb
@@ -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

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/warn23.adb
@@ -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;

Reply via email to