August 03, 2010
The following example should compile according to TDPL. The compiler is supossed to automatically infer the type of the parameter in the function literal:

void main() { }

T[] find(alias pred, T)(T[] input)
    if (is(typeof(pred(input[0])) == bool))
{
    for (; input.length > 0; input = input[1 .. $])
    {
        if (pred(input[0]))
            break;
    }
    return input;
}

unittest {
    int[] a = [1, 2, 3, 4, -5, 3, -4];

    // find first negative number
    auto b = find!(function bool(int x) { return x < 0; })(a);
    auto c = find!(function (x) { return x < 0; })(a);
    auto d = find!((x) { return x < 0; })(a);
}

The auto c and auto d lines are not compiling:
higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__funcliteral2)(int[])
higher_functions.d(55): Error: template instance errors instantiating template
higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__dgliteral4)(int[])
higher_functions.d(56): Error: template instance errors instantiating template

Gotta love those error messages, a C++ programmer will feel right at home! ;)

 If I add a type specifier like so:

    auto c = find!(function (int x) { return x < 0; })(a);
    auto d = find!((int x) { return x < 0; })(a);

Then it will compile. Should I report this to bugzilla?
August 03, 2010
One other thing which is semi-relevant, from TDPL:

auto f = (int i) {};
assert(is(f == function));

f seems to be a delegate by default, not a function.

Andrej Mitrovic Wrote:

> The following example should compile according to TDPL. The compiler is supossed to automatically infer the type of the parameter in the function literal:
> 
> void main() { }
> 
> T[] find(alias pred, T)(T[] input)
>     if (is(typeof(pred(input[0])) == bool))
> {
>     for (; input.length > 0; input = input[1 .. $])
>     {
>         if (pred(input[0]))
>             break;
>     }
>     return input;
> }
> 
> unittest {
>     int[] a = [1, 2, 3, 4, -5, 3, -4];
> 
>     // find first negative number
>     auto b = find!(function bool(int x) { return x < 0; })(a);
>     auto c = find!(function (x) { return x < 0; })(a);
>     auto d = find!((x) { return x < 0; })(a);
> }
> 
> The auto c and auto d lines are not compiling:
> higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
> higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__funcliteral2)(int[])
> higher_functions.d(55): Error: template instance errors instantiating template
> higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
> higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__dgliteral4)(int[])
> higher_functions.d(56): Error: template instance errors instantiating template
> 
> Gotta love those error messages, a C++ programmer will feel right at home! ;)
> 
>  If I add a type specifier like so:
> 
>     auto c = find!(function (int x) { return x < 0; })(a);
>     auto d = find!((int x) { return x < 0; })(a);
> 
> Then it will compile. Should I report this to bugzilla?

August 21, 2010
Update: This seems to have been fixed in 2.048. But I don't see it mentioned in the changelog, so I'm not sure if it was fixed for good or fixed by accident. :)

Andrej Mitrovic Wrote:

> The following example should compile according to TDPL. The compiler is supossed to automatically infer the type of the parameter in the function literal:
> 
> void main() { }
> 
> T[] find(alias pred, T)(T[] input)
>     if (is(typeof(pred(input[0])) == bool))
> {
>     for (; input.length > 0; input = input[1 .. $])
>     {
>         if (pred(input[0]))
>             break;
>     }
>     return input;
> }
> 
> unittest {
>     int[] a = [1, 2, 3, 4, -5, 3, -4];
> 
>     // find first negative number
>     auto b = find!(function bool(int x) { return x < 0; })(a);
>     auto c = find!(function (x) { return x < 0; })(a);
>     auto d = find!((x) { return x < 0; })(a);
> }
> 
> The auto c and auto d lines are not compiling:
> higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
> higher_functions.d(55): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__funcliteral2)(int[])
> higher_functions.d(55): Error: template instance errors instantiating template
> higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) does not match any function template declaration
> higher_functions.d(56): Error: template higher_functions.find(alias pred,T) if (is(typeof(pred(input[0])) == bool)) cannot deduce template function from argument types !(__dgliteral4)(int[])
> higher_functions.d(56): Error: template instance errors instantiating template
> 
> Gotta love those error messages, a C++ programmer will feel right at home! ;)
> 
>  If I add a type specifier like so:
> 
>     auto c = find!(function (int x) { return x < 0; })(a);
>     auto d = find!((int x) { return x < 0; })(a);
> 
> Then it will compile. Should I report this to bugzilla?

Top | Discussion index | About this forum | D home