[fpc-devel] Unexpected "Range check error while evaluating constants" when compiling for Win64
Yuriy Sydorov
jura at cp-lab.com
Sun Feb 12 22:37:27 CET 2023
On 12.02.2023 23:04, J. Gareth Moreton via fpc-devel wrote:
> Yeah, of course, since LongInt($80000001), before typecasting to HKEY, is specifically a signed constant. So obvious!!
Declarations like this have been made on purpose:
HKEY_CURRENT_USER = HKEY(longint($80000001));
On Win64 HKEY_CURRENT_USER must be $FFFFFFFF80000001, but on Win32 it must remain $80000001.
See commit 2012220aec67494ac34329dabe8b6a05dacbb9c1 for details.
Don't break it if you decide to fix something.
Error "Range check error while evaluating constants (18446744071562067969 must be between -2147483648 and 4294967295)"
is wrong here:
property RootKey: HKey read FRootKey write FRootKey default HKEY_CURRENT_USER;
Since HKEY = THandle = QWord on Win64, the reported range for it is incorrect.
Yuriy.
> On 12/02/2023 20:43, Bart via fpc-devel wrote:
>> On Sun, Feb 12, 2023 at 6:26 PM J. Gareth Moreton via fpc-devel
>> <fpc-devel at lists.freepascal.org> wrote:
>>> If HKey is unsigned, then yes, the definition should be
>>> HKEY(DWORD($80000001)). I do wonder why Win64 produces that particular
>>> error though because the final destination is an unsigned 64-bit integer.
>> Because QWord(some not so big negative number) = some large positive number.
>>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
More information about the fpc-devel
mailing list