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

Reply via email to