[fpc-devel] Re: Oddity: Longint being converted automatically to int64 and then assignment/conversion operator used/applied for/to structure variable...(i386) branch (2.4.2)
Skybuck Flying
skybuck2000 at hotmail.com
Thu Apr 7 08:07:17 CEST 2011
Ok,
It seems wrong unit was being used... now I have corrected it and Delphi XE
seems to work as well... so no extra implicit conversion needed.
So I guess Delphi also automatically finds a conversion path...
Sorry for any confusion ;)
Bye,
Skybuck.
----- Original Message -----
From: "Skybuck Flying" <skybuck2000 at hotmail.com>
To: "Free Pascal Developers Mailing List" <fpc-devel at lists.freepascal.org>
Sent: Thursday, 7 April, 2011 08:01 AM
Subject: Oddity: Longint being converted automatically to int64 and then
assignment/conversion operator used/applied for/to structure
variable...(i386) branch (2.4.2)
> Hello,
>
> I am currently inspecting the following compiler unit of 2.4.2
> branch/release ninl.pas:
>
> line 1371: enum:=tenumsym(tenumdef(def).firstenum);
> line 1372: v:=tenumdef(def).maxval;
>
> Problem is with line 1372.
>
> .maxval is apperently an integer.
>
> v however only knows int64 implicit conversions (operators)
>
> v is defined as
> line 1352: v : tconstexprint;
>
> tconstexprint is defined as in constexp.pas:
>
> type Tconstexprint=record
> overflow:boolean;
> case signed:boolean of
> false:
> (uvalue:qword);
> true:
> (svalue:int64);
> end;
>
> With conversion operators:
>
> operator := (const u:qword):Tconstexprint;inline;
> operator := (const s:int64):Tconstexprint;inline;
> operator := (const c:Tconstexprint):qword;
> operator := (const c:Tconstexprint):int64;
> operator := (const c:Tconstexprint):bestreal;
>
> (Notice the missing conversion operators for integer/longint)
>
> Therefore at least in theory it does not know how to convert an integer to
> an int64.
>
> Further proof that this is indeed what's happening:
>
> tenumdef is defined as follows in symdef.pas:
>
> line 563: tenumdef = class(tstoreddef)
> minval,
> maxval : aint;
>
>
> aint is defined as follows in globtype.pas:
>
> line 51:
>
> { Natural integer register type and size for the target machine }
> {$ifdef cpu64bitalu}
> AWord = qword;
> AInt = Int64;
>
> Const
> AIntBits = 64;
> {$endif cpu64bitalu}
> {$ifdef cpu32bitalu}
> AWord = longword;
> AInt = longint;
>
> Const
> AIntBits = 32;
> {$endif cpu32bitalu}
> {$ifdef cpu16bitalu}
> AWord = Word;
> AInt = Smallint;
>
>
> Assumption is that conditional cpu32bitalu is active (for i386)
>
> Therefore Aint = longint;
>
>
> So to me it seems a bit of an oddity... at least it's an integer which is
> being tried to assign to an int64... so at least no overflow...
>
>
> However v is a structure and .maxvalue is an integer...
>
> So how come a conversion is being done ? (there is no conversion operator
> for this situation ?)
>
>
> So I am guessing free pascal does some conversion from integer to int64
> and then assign int64 to v ?
>
>
> Isn't that a bit weird ? I guess it's kinda beautifull as well.. it
> automatically detects a conversion path... however this is not what Delphi
> XE would do...
> so a slight deviation... causing me headaches... but I'll have to deal
> with it...
>
> Unless ofcourse you guys actually think it's a bug... then it's up to you
> to fix it... but for now I will add some conversion operators to try and
> get it working/compiling...
>
> Bye,
> Skybuck.
More information about the fpc-devel
mailing list