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 Int64 value.

I think that the compiler retains that the Double overload of your Func function is more appropriated than the Integer overload.

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).

Changing the 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;