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;