Local variable trashing `-gt` trashes anonymous function values in arguments
## Summary When an anonymous function is passed as an argument, that argument is treated as uninitialized by local variable trashing and is overwritten with the signal pattern. If the argument is passed a `nil` value, that does not happen. ## System Information <!-- The more information are provided the easier it is to replicate the bug --> - **Operating system:** Windows - **Processor architecture:** x86, x86-64 - **Compiler version:** fpc-3.3.1-899981 (2022-07-31) ## Steps to reproduce Run the code below with `fpc -gt`. ## Example Project ```pascal { %OPT = -gt } program Project1; {$mode objfpc}{$H+} {$ModeSwitch anonymousfunctions} {$ModeSwitch functionreferences} type TProc = reference to procedure; procedure problem(aParam1: integer; aParam2: integer; aParam3: TProc); begin Writeln(aParam1, aParam2); end; procedure noproblem(aParam1: integer; aParam2: integer; aParam3: IUnknown); begin Writeln(aParam1, aParam2); end; procedure test; begin noproblem(1, 2, TInterfacedObject.Create); // ok problem(3,4, nil); // ok problem(5,6, procedure begin Writeln('x'); end); // aParam3 is trashed end; begin test; end. ``` ## What is the current bug behavior? The first two calls succeed, the third receives a SEGV in the function prologue's `fpc_intf_incr_ref` due to the value of aParam3 being overwritten. Passing "normal" interfaced objects works, so I assume something doesn't recognize anonymous function instances. ## What is the expected (correct) behavior? All three should succeed, printing: ``` 12 34 56 ```
issue