[fpc-devel] Just to confirm, "with" behaviour expected

Martin Frb lazarus at mfriebe.de
Mon Aug 14 13:38:24 CEST 2023


In the below code, the array is resized (and more important relocated in 
mem) inside the function "bar".

The commented line (without "with") works as expected.

The "with" line has a different behaviour. I guess it is by design. Just 
wanted to confirm.

The version with "with" prints 12345 for  "  writeln(a[i,j].x);"
For all I can tell the return value of "bar" was written to the old 
address of that array-entry.

Does "with" take the "address" of the value, and operate on that 
address, even if the address of that value could change within the 
"with" statement.

- test was performed with
    fpc 3.2.3  -O1
    fpc 3.3.1  -O4


program Project1;
{$mode objfpc}

procedure outer;
   var
     a: array of array of record x:Integer; end;
     i, j: integer;

   function bar(x: integer): integer;
   begin
     Result := random(99) + 2 * x;
     writeln(Result);
     SetLength(a, 3000, 200);
   end;

   procedure foo;
   begin
     i := random(99);
     j := random(99);
     with a[i,j] do x:= bar(x);
     //a[i,j].x := bar(a[i,j].x);
   end;

begin
   SetLength(a, 100, 100);
   for i := 0 to 99 do
     for j := 0 to 99 do
       a[i,j].x := 12345;

   foo;
   writeln(a[i,j].x);
   readln;
end;

begin
   outer;
end.




More information about the fpc-devel mailing list