Skip to content

A SIGSEGV occurs when using an anonymous nested function from a class method

When executing the following program, SIGSEGV occurs:

program project4;

{$mode delphi}
{$modeswitch nestedprocvars}
{$modeswitch anonymousfunctions}

type
  TFuncNested = function (const P1: String): String is nested;

  TMyClass = class
    class function CallFn(const A: String; const Fn: TFuncNested): String;
    class function Test(const A, B: String): String;
  end;

class function TMyClass.CallFn(const A: String; const Fn: TFuncNested): String;
begin
  Result := Fn(A);
end;

class function TMyClass.Test(const A, B: String): String;
begin
  Result := CallFn(A, function (const P1: String): String begin
      Result := P1 + B; // <-- SIGSEGV !!!
    end);
end;

var
  Sum: String;
begin
  Sum := TMyClass.Test('1', '2');
  if Sum <> '12' then
    Halt(1);
  WriteLn('OK');
end.
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information