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