On 2025-02-25 20:04, Bart via fpc-devel wrote:

Hi Bart,

I possibly did not search hard enough, but did not find what the
"rules" are regarding overload selection (is that the correct term?).

Consider this simple example:
===
program test;
{$ifdef fpc}
{$mode fpc}
{$endif fpc}

{$apptype console}
{$ifndef fpc}
type
  TProcedure = procedure;
{$endif not pc}

procedure dummyproc;
begin
end;

procedure Foo(buf: pointer); {$ifndef fpc}overload;{$endif not fpc}
begin
  writeln('Foo(buf: pointer)');
end;

procedure foo(proc: TProcedure); {$ifndef fpc}overload;{$endif not fpc}
begin
  writeln('Foo(proc: TProcedure)');
end;

var
  x: integer;
begin
  write('foo(@x) -> ');
  foo(@x);
  write('foo(@dummyproc) -> ');
  foo(@dummyproc);
  write('foo(nil) -> ');
  foo(nil);
end.
====

fpc outputs:
foo(@x) -> Foo(buf: pointer)
foo(@dummyproc) -> Foo(proc: TProcedure)
foo(nil) -> Foo(buf: pointer)

Delphi 7 (yes, very old, probably not a good reference):
foo(@x) -> Foo(buf: pointer)
foo(@dummyproc) -> Foo(buf: pointer)
foo(nil) -> Foo(buf: pointer)

So, fpc is more clever than D7.
 .
 .

No, it's because you used a different compilation mode _and_ FPC treats @ differently depending on the compilation mode. If you change "{$mode fpc}" to "{$mode delphi}" and make the "overload" directive non-conditional (otherwise FPC rejects to compile the source in that mode), you get the same result with FPC as with your Delphi 7. If you change "foo(@dummyproc)" to "foo(dummyproc)" and recompile it (still with {$mode delphi}), you get the same result as with the original version in {$mode fpc} - I guess that Delphi 7 might give you the same result, but I might be wrong.

Tomas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to