Today I was porting some legacy code and noticed a weird warning:
Weird warning, I thought. Obviously the loop variable can be passed as a var parameter as the code compiles. Why a warning and not an error, then?
Stefan later reminded me that warnings are quite extensively covered in the documentation. Indeed, the docs for W1015 clearly state:
Ah! So they actually want to say “… FOR-Loop variable ‘i’ should not be …”
Furthermore, this brings several interesting possibilities to the table. For example, we can finally write for..to..step loops in Delphi!
program ForInStep;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
procedure Step(var loop: integer; step: integer);
begin
loop := loop + step - 1;
end;
var
i: integer;
begin
for i := 1 to 10 do begin
Writeln(i);
Step(i, 2);
end;
Readln;
end.
Indeed, this works!
Danger, Will Robinson!
To be clear, I do not recommend writing such code. If you get warning W1015, you should rewrite the code. Such code is hard to maintain and will eventually cause you big problems.
I certainly did fix the original code although the method that was called from the for loop did not modify its var parameter. (It was declared var and not const because the method was written before const parameters were introduced to Delphi. Oh, the joys of legacy code!)