Anonymous function call and access of record method causes a compiler unhanded exception to occur. (When called from a record class method).
## Summary When calling an anonymous function that returns an advanced record, and the result of the call is used to access a method of that record, the compiler raises an internal exception. However, it only does this in a class procedure of the record in question, not in a procedure that is not associated with the record. ## System Information <!-- The more information are provided the easier it is to replicate the bug --> - **Operating system:** Linux, AlmaLinux 9.1 x86_64 - **Processor architecture:** x86_64 - **Compiler version:** 3.3.1-12241-gcf41a549b9 - **Device:** Computer ## Steps to reproduce Given this program: ```pascal program record_member; {$mode objfpc}{$H+} {$modeswitch AnonymousFunctions} {$modeswitch AdvancedRecords} uses sysutils; type TSomeRec = record a: integer; procedure print; function text: string; class procedure main; static; end; function some_fun_0: TSomeRec; begin result.a := 4; end; procedure TSomeRec.print; begin writeln('a = ', a); end; function TSomeRec.text: string; begin result := format('a = %d', [a]); end; procedure main; begin some_fun_0().print; (function: TSomeRec begin result.a := 5 end()).print; writeln((function: TSomeRec begin result.a := 10 end()).text); end; class procedure TSomeRec.main; static; begin some_fun_0().print; (function: TSomeRec begin result.a := 5 end()).print; writeln((function: TSomeRec begin result.a := 10 end()).text); end; begin main; TSomeRec.main; end. ``` When compiled, the following occurs: ```shell $ fpc record_member.pas Free Pascal Compiler version 3.3.1 [2022/12/26] for x86_64 Copyright (c) 1993-2022 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling record_member.pas record_member.pas(42,4) Error: Compilation raised exception internally Fatal: Compilation aborted An unhandled exception occurred at $0000000000527E12: EAccessViolation: Access violation $0000000000527E12 Error: /home/dev/fpc_usr/lib/fpc/3.3.1/ppcx64 returned an error exitcode ``` ## Example Project See steps to reproduce. ## What is the current bug behavior? See steps to reproduce, an internal exception is raised by the compiler. ## What is the expected (correct) behavior? The program should compile and run. Why? Because the following program compiles and runs: ```pascal program record_member2; {$mode objfpc}{$H+} {$modeswitch AnonymousFunctions} {$modeswitch AdvancedRecords} uses sysutils; type TSomeRec = record a: integer; procedure print; function text: string; class procedure main; static; end; function some_fun_0: TSomeRec; begin result.a := 4; end; procedure TSomeRec.print; begin writeln('a = ', a); end; function TSomeRec.text: string; begin result := format('a = %d', [a]); end; procedure main; begin some_fun_0().print; (function: TSomeRec begin result.a := 5 end()).print; writeln((function: TSomeRec begin result.a := 10 end()).text); end; class procedure TSomeRec.main; static; function one: TSomeRec; begin result.a := 5 end; function two: TSomeRec; begin result.a := 10 end; begin some_fun_0().print; one.print; writeln(two.text); end; begin main; TSomeRec.main; end. ``` Compiler output: ```shell $ fpc record_member2.pas Free Pascal Compiler version 3.3.1 [2022/12/26] for x86_64 Copyright (c) 1993-2022 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling record_member2.pas Linking record_member2 51 lines compiled, 0.2 sec, 374976 bytes code, 166456 bytes data ``` Program output: ```shell $ ./record_member2 a = 4 a = 5 a = 10 a = 4 a = 5 a = 10 ``` ## Relevant logs and/or screenshots See steps to reproduce. ## Possible fixes None that I know of.
issue