[fpc-devel] Tests in Delphi XE3 regarding Type Helpers

Sven Barth pascaldragon at googlemail.com
Thu Nov 29 10:48:06 CET 2012


Am 29.11.2012 10:39, schrieb Marco van de Voort:
> In our previous episode, Sven Barth said:
>> For tthlperr2.pas it would have been interesting to see if the same
>> error is reported if a helper is in scope, but the method is invalid...
>> could you please repeat that test with a string helper and a string
>> constant?
> tthlperr2.pas(15) Error: E2003 Undeclared identifier: 'DoTest2'
Somehow what I hoped for. :)
>> Or change the type of the int helper to "uint8" which seems to
>> have helped in the tthlpsize.pas test...
> Only for unsigned constants. I tried, and the results are the same dotest2.
>
> Even with the unsigned value. Only if I change dotest2 to dotest1 I get the
> operator not applicable. So somehow the method name has prio over the
> literal type mismatch
>   
>>> D:\testing\rechelp>dcc32 tthlpminus.pas
>>> Embarcadero Delphi for Win32 compiler version 24.0
>>> Copyright (c) 1983,2012 Embarcadero Technologies, Inc.
>>> tthlpminus.pas(14) Error: E2018 Record, object or class type required
>>> tthlpminus.pas(15) Error: E2018 Record, object or class type required
>>> tthlpminus.pas(17)
>>>
>>> 1. Typecasting the "42" literals to integer works
>>> 2. changing record helper type to "int64" doesn't.
>>> 3. Changing to smaller types (int8,int16) doesn't help.
>>> 4. changing to uint8 works for the "42" one, not for the "-42" one.
>> Ok... so Delphi does use the minimum required size for the constant.
> For unsigned ones yes.
>
>> Good. Does "int8" help for the "-42"? What if you change it to
>> "(-42).DoTest"?
> Then it passes for the signed (int8) type. So it seems there is no helper
> that will accept both positive and negative literals.
Yes, that's true, but at least one can get negative literals passed to a 
helper...
>>> D:\testing\rechelp>dcc32 tthlpself.pas
>>> Embarcadero Delphi for Win32 compiler version 24.0
>>> Copyright (c) 1983,2012 Embarcadero Technologies, Inc.
>>> tthlpself.pas(36)
>>> 37 lines, 0.09 seconds, 18816 bytes code, 13240 bytes data.
>>>
>>> D:\testing\rechelp>tthlpself
>>> -> throws RTE 105
>> It seems that I forgot a "{$apptype console}" :)
> 42
> 21
> Type Helper
> Hello Type Helper World
Great... this does not make that feature easier to implement -.-
>>> D:\testing\rechelp>dcc32 tthlpsize.pas
>>> Embarcadero Delphi for Win32 compiler version 24.0
>>> Copyright (c) 1983,2012 Embarcadero Technologies, Inc.
>>> tthlpsize.pas(24) Error: E2003 Undeclared identifier: 'Short'
>>> tthlpsize.pas(78) Error: E2015 Operator not applicable to this operand type
>>> tthlpsize.pas(80) Error: E2015 Operator not applicable to this operand type
>>> tthlpsize.pas(82) Error: E2015 Operator not applicable to this operand type
>>> tthlpsize.pas(84) Error: E2015 Operator not applicable to this operand type
>>> tthlpsize.pas(87)
>>>
>>> The first is easily fixable by changing short (which probably should have
>>> been shortint) to int16.
>> The introduction of the (U)IntXX types was one of the best things I
>> remember (and luckily we already have them in FPC as well :) ), as I
>> always forget how the smaller types are named... -.-
> Why do you think I added them when I found out? :-)  I never could either.
> (specially smallint and shortint)
>   
>>> The remaining errors are the negative values. I didn't find a solution for
>>> them with tthlpminus
>> So the hexadecimal values work correctly?
> Yes
>
>> What if you here also try the
>> suggestion "(negativevalue).DoTest"? You might also want to add a
>> "{$apptype console}" here.
> Strange results. All compile except (-1)
>
> Input:
>
>   Writeln(0, #9, 0.DoTest);
> //  Writeln(-1, #9, (-1).DoTest);
>    Writeln($ABCD, #9, $ABCD.DoTest);
>    Writeln(-32987, #9, (-32987).DoTest);
>    Writeln(2345678, #9, 2345678.DoTest);
>    Writeln(-2345678, #9, (-2345678).DoTest);
>    Writeln($1234567887654321, #9, $1234567887654321.DoTest);
>    Writeln(-9876543211234, #9, (-9876543211234).DoTest);
>    Writeln(9876543211234, #9, 9876543211234.DoTest);
>
>   Output:
>   
>
> 0       Byte
> 43981   Word
> -32987  LongInt
> 2345678 LongInt
> -2345678        LongInt
> 1311768467139281697     Int64
> -9876543211234  Int64
> 9876543211234   Int64
>
> ... which seems to have a bias for signed types that I didn't see
> in earlier tests.
>
> I played a bit with the minus one value, and got an IE:
>
> Writeln(-129, #9, (-129).DoTest);
>
> caused:
>
> D:\testing\rechelp>dcc32 tthlpsize.pas
> Embarcadero Delphi for Win32 compiler version 24.0
> Copyright (c) 1983,2012 Embarcadero Technologies, Inc.
> tthlpsize.pas(78) Fatal: F2084 Internal Error: SY3502
Fascinating results... Thank you! :D
>> Otherwise: Thank you so far. :)
> As soon as it is finished, you go back to generics? :-)
>
I don't know yet what I'll finish first (this was just some 
preparation), but I do hope that I'll get to decreasing my "feature 
list" in the next weeks :D (and yes, this includes generics)

Regards,
Sven



More information about the fpc-devel mailing list