Consider the following code:
program Promote;
{$APPTYPE CONSOLE}
uses
  SysUtils;
{$HINTS OFF}
type
  MyWord = record
    FValue: LongWord;
    class operator Implicit(AValue: LongWord): MyWord;
  end;
class operator MyWord.Implicit(AValue: LongWord): MyWord;
begin
  Result.FValue:= AValue;
end;
procedure Test(AValue: MyWord); overload;
begin
  Writeln('MyWord');
end;
procedure Test(AValue: UInt64); overload;
begin
  Writeln('UInt64');
end;
var
  LW: LongWord;
begin
  Test(LW);
  Readln;
end.
When I run it (Delphi XE) I see that the compiler promotes LongWord parameter to UInt64 (built-in type), not to MyWord (user-defined type).
Can I assume that Delphi compiler always promotes a built-in type to a built-in type if such promotion is implemented in the compiler itself?
More generally what rules control type promotion in such situations (say we have 2 built-in types, or 2 user-defined types, etc)?
To my understanding an ordinal type like uint64 will always be closer to another ordinal type like longword, than a record. Period.
The "closer type" distance is not about "built-in" or "custom" types. You are comparing apples and oranges.
In the compiler, records and ordinals are two diverse families. The fact you can define implicit conversion would never promote a record to become an ordinal type.
As a result, a "built-in" string will always have less affinity with an integer than a new ordinal type like:
type TMyInteger64 = type Int46;
Here, this TMyInteger64 type will be "nearer" than a built-in string type.
As soon as you define a record, it will have affinities with other record, not ordinal types.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With