Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Format reject procedure address arguments starting with XE4

Tags:

delphi

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?

like image 529
David Heffernan Avatar asked Sep 12 '14 20:09

David Heffernan


People also ask

Does Cisco support Netconf?

Cisco is embracing NETCONF/RESTCONF/gRPC interfaces and YANG data models to make automation and management simpler.

How QoS works on Cisco switch?

QoS classifies traffic by assigning priority-indexed 802.1p class of service (CoS) values to frames at ingress ports. If traffic is tagged with a CoS value at the ingress port, the switch forwards the value. If traffic is native, then the switch can rewrite the CoS tag.

What is QoS in Cisco?

Using quality of service (QoS) on Cisco network devices helps. provide both bandwidth and priority to certain types of network traffic. The. network administrator tells the network devices which traffic requires what. bandwidth and priority.


1 Answers

I believe that this is a compiler bug and have submitted a QC report: QC#127814.

As a work around you can use either of the following:

  1. Use addr() rather than the @ operator.
  2. Cast @FooVar or @FooConst to Pointer, e.g. Pointer(@FooVar).
like image 69
David Heffernan Avatar answered Oct 03 '22 16:10

David Heffernan