[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