fpc/tests/test/tfuncref23.pp

78 lines
1.0 KiB
ObjectPascal

program tfuncref23;
{$mode objfpc}
{$modeswitch functionreferences}
type
TLongIntFunc = reference to function(aArg: LongInt): LongInt;
TTest = class
i: LongInt;
function TestCaptureSelf: TLongIntFunc;
end;
function TestNoCapture: TLongIntFunc;
function Foobar(aArg: LongInt): LongInt;
begin
Result := 42 * aArg;
end;
begin
Result := @Foobar;
end;
function TestCaptureLocal: TLongIntFunc;
var
i: LongInt;
function Foobar(aArg: LongInt): LongInt;
begin
Result := i * aArg;
end;
begin
i := 0;
Result := @Foobar;
i := 21;
end;
function TTest.TestCaptureSelf: TLongIntFunc;
function Foobar(aArg: LongInt): LongInt;
begin
Result := i * aArg;
end;
begin
i := 0;
Result := @Foobar;
i := 84;
end;
var
t: TTest;
f: TLongIntFunc;
begin
f := TestNoCapture();
if f(2) <> 84 then
Halt(1);
f := TestCaptureLocal();
if f(2) <> 42 then
Halt(2);
t := TTest.Create;
try
f := t.TestCaptureSelf;
if f(2) <> 168 then
Halt(3);
finally
t.Free;
end;
Writeln('ok');
end.