[fpc-devel] Assigning class procedures

Florian Klaempfl florian at freepascal.org
Wed Mar 15 09:48:09 CET 2006

Peter Vreman wrote:
>> Hi
>> I'm just migrating a lot of code from delphi to objfpc mode, and I
>> noticed that in objfpc mode I can't do
>>    MyFunc := @TMyClass.Func;
>> where TMyClass.Func is a class procedure that matches the type of
>> MyFunc. I'm attaching the complete source code. With
>>    fpc -S2 test_1.pas
>> the attached code doesn't compile, fails with message
>>    Error: Incompatible types: got "<class method type of
>> procedure(LongInt) of object;Register>" expected "<procedure variable
>> type of procedure(LongInt) of object;Register>"
>> Tested with various FPC versions (2.0.0, 2.0.2, 2.0.3 and 2.1.1
>> (revision 2911)).
>> With
>>    fpc -Sd test_1.pas
>> and
>>    dcc test_1.pas
>> it compiles OK.
>> I initially intended to submit this as a bug, but I decided to ask here
>> first. This *is* a bug, right ? I mean, delphi mode behavior seems
>> sensible here, passing class procedures as procedures of objects should
>> be allowed.
> Class methods require a different parameter for the implicit pushed
> instance that is not compatible with normal methods. That Delphi allows it
> is the uglyness of procvar typechecking in Delphi. It results in invalid
> code and is therefor forbidden in objfpc.

By casting the left side to a pointer it should be eaten by the compiler:
pointer(MyFunc) := @TMyClass.Func;

More information about the fpc-devel mailing list