[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