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" <skybuck2...@hotmail.com>
To: "Free Pascal Developers Mailing List" <fpc-devel@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.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel