On Wednesday, 14 January 2015 at 22:37:22 UTC, ketmar via
Digitalmars-d wrote:
On Wed, 14 Jan 2015 22:29:08 +0000
bearophile via Digitalmars-d <digitalmars-d@puremagic.com>
wrote:
According to Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction
C++14 is able to compile code like this:
auto correct(int i) {
if (i == 1)
return i;
else
return correct(i - 1) + i;
}
But not like this:
auto correct(int i) {
if (i != 1)
return correct(i - 1) + i;
else
return i;
}
D isn't able to compile both. Is it a good idea to allow the
first function in D too?
Bye,
bearophile
i'm pretty sure that D *SHOULD* compile the first sample. the
spec says
that return type for `auto` function is taken from the first
`return`
operator parser met. so for the second `return` the return type
is
already known.
i think that this is not just "let it compile", but a bug in
compiler.
something should be fixed: either compiler or specs.
Well, the error the compiler prints is:
Error: forward reference to inferred return type of function call
'correct'
I played with it a bit and it seems to deduce a common type from
all the return statements, which would be more in the style of D
anyways (take type deduction for arrays). For example, the
following code prints "float" rather than "int":
import std.stdio;
auto one(int i)
{
if(i > 0)
return cast(int)i;
else
return cast(float)i;
}
void main()
{
writeln(typeid(typeof(one(10))));
}