This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix spurious loop warning for function with Out parameter

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

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

2019-07-22  Eric Botcazou  <>


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


	* 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
+            --  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;
+   while Poll (E) loop
+      null;
+   end loop;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]