I am getting a compiler warning I don’t understand:
procedure Test;
var
Var1: Integer;
begin
while True do
begin
try
if System.Random > 0.5 then
begin
ShowMessage('Skipping');
continue; // If I remove this line, the warning goes away
end;
Var1:=6;
except on
E:Exception do
begin
ShowMessage('Error');
raise;
end;
end;
ShowMessage(IntToStr(Var1)); // Compiler warning on this line
end;
end;
When I compile this in Delphi 2010 I get:
[DCC Warning] OnlineClaimManagerMainU.pas(554): W1036 Variable ‘Var1’
might not have been initialized
If I remove the call to ‘continue’, the warning goes away.
Also, if I remove the try/except clause (and leave the continue), the warning goes away.
How will execution get to the line in question without Var1 being initialised?
Var1will always be initialised before it is used. The compiler gets confused bytry–excepthandling: your code is too complex for the compiler to be able to actually determine thatVar1is always initialised. It sees there may be a handled exception beforeVar1:=6;, which would leaveVar1uninitialised, but it doesn’t see that that exception will always be re-raised.