On Thursday, 17 May 2012 at 13:10:20 UTC, Tobias Pankrath wrote:
For the human reader it is easy to see that the return type of
foo should be int. Could the following rule be added to make dmd
see this, too?

If the function is called recursively the type of the result of this call is inferred in the same way. If the recursive call is part of a return statement > then this statement is not considered for type inference. If all return statements are discarded in this way, it is an error.

It's not that simple:

--------------------------------
int bar(int x);
real bar(real x);

auto foo(int x)
{
    if (x < 0)
        return bar(foo(x-1));
    return 0;
}
--------------------------------

In order to determine the first return type, it needs to find out what overloaded 'bar' to call, which requires determining the first return type.

If you ignore the first return statement and only consider the int then there could be problems. e.g. if above we had:

real bar(int x);

And we ignored the first return statement then the determined return type would be wrong (would infer int, but bar(foo(x-1)) would return real).

Reply via email to