Hello,

Ran into it while compiling Lazarus. It appears that, while many sophisticated checks are done in tcallnode.maybe_create_funcret_node, the obvious case when function result destination is one of the function's arguments, is not checked. To be honest, I noticed that earlier for the case of s := Copy(s, ...), but was thiniking that there is some compiler magic around Copy(). Delphi also appears to be smart enough to omit temps in case of s := copy(s,...). Anyway, since copy() assigns its result once before exiting, it works fine. Things go wrong when the function is tries to access its argument after modifying the result, like in the attached example.

Sergei

-------------------------------------
program test;
{$ifdef fpc}{$mode objfpc}{$H+}{$endif}

const buf: array[0..5] of char = 'abcdef';

function foo(const a: string): string;
begin
  SetLength(result, 6);
  Move(buf, result[1], sizeof(buf));
  if a <> '1234567890' then
    writeln('Failed')
  else
    writeln('ok');
end;

procedure test_proc;
var
  s: string;
begin
  s := '1234567890';
  s := foo(s);             // This one failes
  writeln(s);
end;

var
  s: string;

begin
  test_proc;
  s := '1234567890';
s := foo(s); // But this one is correct (called from main program level?)
  writeln(s);
end.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to