[Issue 7483] Can't recursively call function with auto return
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Feb 12 02:48:56 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7483
--- Comment #2 from Andrej Mitrovic <andrej.mitrovich at gmail.com> 2012-02-12 02:48:48 PST ---
(In reply to comment #1)
> Your example function is an infinite recursion. Both for determining the return
> type as well as hypothetically at runtime.
I've rushed too quickly and posted a silly example.
My use-case was code like this:
auto foo(bool check)
{
if (check)
{
check = false;
return foo(check);
}
else
{
return 1;
}
}
I don't know whether this would be too difficult for the compiler to figure out
on its own. But the basic idea is: if there's at least one known type for a
return expression then the function's return type becomes that type and there's
no longer a forward reference error. If there are any other return expressions
they all must have the same type (just like usual functions).
E.g. this would be legal:
auto foo(int state)
{
if (state == 1)
{
state++;
return foo(state);
}
else
if (state == 2)
{
return tuple(0, 0);
}
else
{
return tuple(0, 0);
}
}
The return type is std.typecons.Tuple!(int,int).Tuple for the last two return
expressions, the first return is not taken into account since it's a recursive
call, and all other return expression types match.
This one would be illegal since all the return types don't match:
auto foo(int state)
{
if (state == 1)
{
state++;
return foo(state);
}
else
if (state == 2)
{
return tuple(0, 0);
}
else
{
return tuple(0, 0, 0);
}
}
The OP sample would still be invalid since you can't figure out the return type
at all in that case.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list