Compiler bug with overloaded function
This is, I suspect, to be expected.
The issue is that the compiler-intrinsic
Round function returns a 64-bit integer. Both CodeInsight and the official documentation tells me that. And if the compiler has to chose between a routine taking a 32-bit integer or a double, when given a 64-bit integer, it chooses the routine accepting a double.
To verify this, try
procedure Test(x: Double); overload; begin ShowMessage('double'); end; procedure Test(x: Integer); overload; begin ShowMessage('integer'); end; procedure TForm5.FormCreate(Sender: TObject); begin Test(Int64.MaxValue) end;
System.Round function results an
I think that the compiler retains that the
Double overload of your
Func function is more appropriated than the
In fact, the
Integer overload could cause information loss if the param's value exceeds the
Integer's type min-max (from -2147483648 to 2147483647, see System.Integer).
Integer param to an
Int64 param will solve the problem and avoid information losses.
function Func(x : Double) : Double; overload; function Func(x : Int64) : Double; overload; ... function Func(x : Double) : Double; begin Result := Func(Round(x)); end; function Func(x : Int64) : Double; begin Result := 1.0; end;