Consider this program:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
procedure Foo;
begin
end;
type
TProcedure = procedure;
const
FooConst: TProcedure = Foo;
var
FooVar: TProcedure = Foo;
P: Pointer;
{$TYPEDADDRESS ON}
begin
P := @Foo;
Writeln(Format('%p', [P]));
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
Writeln(Format('%p', [@Foo]));
Readln;
end.
This program compiles and runs on XE3 and produces the following output:
00419FB8 00419FB8 00419FB8 00419FB8
On XE4 and later the program fails to compile, with error messages on both of these lines:
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
[dcc32 Error] E2250 There is no overloaded version of 'Format' that can be called with these arguments
On XE4, XE5 and XE6, the program compiles when $TYPEDADDRESS
is switched off. On XE7, the program fails to compile irrespective of the setting of $TYPEDADDRESS
.
Is this a compiler bug? Or am I using incorrect syntax to obtain the address of a procedure?
Addr(FooConst)
andAddr(FooVar)
works in XE6. System.Addr is unaffected by the $T directive. Don't have XE7 at hand right now. – LU RDAddr(...)
compiles and run correctly in XE7 too. Which is odd and points finger at compiler bug. Thanks. – David HeffernanPointer(@FooConst)
works as well in XE6 and XE7. – LU RD