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))));
    }

Reply via email to