[fpc-pascal] Feature announcement: implicit generic function specializations
Mattias Gaertner
nc-gaertnma at netcologne.de
Fri Apr 22 21:30:21 CEST 2022
On Fri, 22 Apr 2022 20:51:56 +0200
Martin Frb via fpc-pascal <fpc-pascal at lists.freepascal.org> wrote:
>[...]
> I did explore what happens if I throw different types at it, and see
> how the current implementation deals with this (what I call) lack of
> type safety.
> And also asked the question, how should it act? (Because the current
> behaviour is new, expected to need fixes, and can obviously be fixed).
See Sven's first mail.
>[...]
> So what happens if:
>
> var
> b: Byte;
> c: Cardinal;
> begin
> Add(b, c);
>
> Well, I tested: It uses the type of the first Param. So it calls a
> function for both param of type Byte. The cardinal argument is
> converted. (potentially truncated).
Yes, as explained by Sven.
> If you use numeric constants:
> writeln(' 0', Add(0, 0) ); // ShortInt
> writeln('1000', Add(1000, 1000) ); // SmallInt
> writeln('100K', Add(100000, 100000) ); // Integer
>
> So then, if you try to fix " Add(b, c)" by checking that b and c
> have the same type => "Add(c, 0)" will fail => because 0 is ShortInt
> and not cardinal.
Why is that a fail?
> ----------------------------
> I created a little test program (see bottom of mail).
>
> And it gives a strange warning:
>
> Compile Project, Target:
> C:\Users\martin\AppData\Local\Temp\project1.exe: Success, Warnings:
> 1, Hints: 3
> project1.lpr(67,52) Warning: Range check error while evaluating
> constants (100000 must be between -128 and 127)
Add(0, 100000)
Correct range error.
> project1.lpr(41,18) Hint: Local proc "Add$1" is not used
> 72 lines compiled, 0.2 sec, 105136 bytes code, 5476 bytes data
> Line 41 is the declaration of the generic
> generic function Add<T>(aArg1, aArg2: T): T;
Maybe related to
https://gitlab.com/freepascal.org/fpc/source/-/issues/39675
>[...]
Mattias
More information about the fpc-pascal
mailing list