[fpc-pascal] Function reference confuses function pointer?

Hairy Pixels genericptr at gmail.com
Sat Mar 4 05:08:43 CET 2023


This caused me a nasty debugging confusion, it’s a bug right? In the program below the two parameters passed to TBinding.Create have the same address despite being function pointers to two different class methods. Calling them both call the same method which is clearly not correct.

Free Pascal Compiler version 3.3.1 [2022/09/28] for aarch64

========================

{$mode objfpc}
{$modeswitch functionreferences}
{$modeswitch advancedrecords}

program test;

type
  generic TBinding<T> = record
    private type
      TGetter = reference to function: T;
      TSetter = reference to procedure(newValue: T);
    private
      getter: TGetter;
      setter: TSetter;
    public
      constructor Create(_getter: TGetter; _setter: TSetter);
  end;

constructor TBinding.Create(_getter: TGetter; _setter: TSetter);
begin
  getter := _getter;
  setter := _setter;

  // Same address for both!
  writeln(HexStr(getter));
  writeln(HexStr(setter));
end;

type
  TMyClass = class
    procedure SetSelection(newValue: Integer); 
    function GetSelection: Integer;
    procedure AfterConstruction; override;
  end;

function TMyClass.GetSelection: Integer;
begin
end;

procedure TMyClass.SetSelection(newValue: Integer); 
begin
end;

procedure TMyClass.AfterConstruction;
begin
  specialize TBinding<Integer>.Create(@GetSelection, @SetSelection);
end;

begin
  TMyClass.Create;
end.

Regards,
	Ryan Joseph



More information about the fpc-pascal mailing list