On 24/12/2021 18:07, Bart via fpc-devel wrote:
On Fri, Dec 24, 2021 at 12:00 PM Adriaan van Os via fpc-devel
<fpc-devel@lists.freepascal.org> wrote:

Neither would the compiler allow (I hope) the const parameter to be passed as a 
var parameter.
It does not:

{$mode objfpc}
{$h+}

procedure foo(var x: integer);
begin
end;

procedure bar(const y: integer);
begin
   foo(y); //line 10
end;


The first quote was probably a ref to the (current) case from the forum, that triggered this.

procedure Foo(const A: String; var B: string);
begin ... end;

var s: string;
Foo(s,s);

It is most likely (but not certain) that B will be modified. And with that A would be modified.

The tricky bits are:
- If A would no longer be accessed after B was modified, then that code will *currently* work.  Yet new optimizations could be added, that affect this (though really unlikely)
- could be a virtual method, and each version only accesses either A or B.
- it can not always be caught "Foo(s1,s2)" could have s1 and s2 have the same var (and with a ref count of 1, if both were "var param" to the caller).
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to