Thread overview
UFCS call and regular call behaves differently with alias parameter
Jun 17, 2012
Jacob Carlborg
Jun 17, 2012
Timon Gehr
Jun 17, 2012
Jacob Carlborg
June 17, 2012
The following code shows that depending on how a function is called, UFCS or regular syntax, the type of T is inferred differently. If I remove the alias parameter the code behaves as expected.

string foo (alias p, T) (T t)
{
    return typeof(t).stringof;
}

void main ()
{
    string[string] aa;

    auto x = foo!(3 > 4)(aa);
    auto y = aa.foo!(3 > 4);

    assert(x == y);

    writeln("x=", x);
    writeln("y=", y);
}

In the above code the assert is triggered. If I remove the assert the code prints:

x=string[string]
y=AssociativeArray!(string,string)

-- 
/Jacob Carlborg
June 17, 2012
On 06/17/2012 06:14 PM, Jacob Carlborg wrote:
> The following code shows that depending on how a function is called,
> UFCS or regular syntax, the type of T is inferred differently. If I
> remove the alias parameter the code behaves as expected.
>
> string foo (alias p, T) (T t)
> {
>      return typeof(t).stringof;
> }
>
> void main ()
> {
>      string[string] aa;
>
>      auto x = foo!(3 > 4)(aa);
>      auto y = aa.foo!(3 > 4);
>
>      assert(x == y);
>
>      writeln("x=", x);
>      writeln("y=", y);
> }
>
> In the above code the assert is triggered. If I remove the assert the
> code prints:
>
> x=string[string]
> y=AssociativeArray!(string,string)
>
> --
> /Jacob Carlborg

This should go straight to the bug tracker. User code is not supposed to see the AssociativeArray rewrite.
June 17, 2012
On 2012-06-17 18:46, Timon Gehr wrote:

> This should go straight to the bug tracker. User code is not supposed to
> see the AssociativeArray rewrite.

Done: http://d.puremagic.com/issues/show_bug.cgi?id=8259

-- 
/Jacob Carlborg