[fpc-devel] Assigning instance methods, accessed via a type, to method pointers

Sven Barth pascaldragon at googlemail.com
Thu May 26 21:54:04 CEST 2022


Am 23.12.2021 um 19:13 schrieb Blaise--- via fpc-devel:
> Subj silently produces invalid codegen:
> -------8<-------
> var Z: procedure of object;
>
> type R = record
>     procedure Foo;
> end;
> procedure R.Foo; begin end;
>
> type O = object
>     procedure Foo;
> end;
> procedure O.Foo; begin end;
>
> type C = class
>     procedure Foo;
>     class procedure ClassCtx;
> end;
> procedure C.Foo; begin end;
> class procedure C.ClassCtx;
> begin
>     Z := Foo; // BadCG: .Code = C.Foo; .Data = C
> end;
>
> type CC = class of C;
> var aCC: CC = nil;
>
> type H = class helper for C
>     procedure Bar;
>     class procedure ClassCtx2;
> end;
> procedure H.Bar; begin end;
> class procedure H.ClassCtx2;
> begin
>     Z := Bar; // BadCG: .Code = H.Bar; .Data = C
> end;
>
> begin
>     Z := R.Foo; // BadCG: GARBAGE
>     Z := O.Foo; // BadCG: GARBAGE
>     Z := C.Foo; // BadCG: .Code = C.Foo; .Data = C
>     Z := CC.Foo; // BadCG: GARBAGE
>     Z := aCC.Foo; // BadCG: .Code = C.Foo; .Data = aCC
>
>     // Currently allowed, and we get the fix for this for free.
>     // Such qualification may become rejected;
>     //    see 
> https://lists.freepascal.org/pipermail/fpc-devel/2021-December/044251.html
>     Z := H.Bar; // BadCG: GARBAGE
> end.
> -------8<-------
>
> The attached methptr_to_instancemeth_via_type.patch catches all these 
> cases and reports the proper error:
>> Error: Only class methods, class properties and class variables can 
>> be referred with class references
>

Accepted.

Regards,
Sven


More information about the fpc-devel mailing list