www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - UFCS call and regular call behaves differently with alias parameter

reply Jacob Carlborg <doob me.com> writes:
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
Jun 17 2012
parent reply Timon Gehr <timon.gehr gmx.ch> writes:
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.
Jun 17 2012
parent Jacob Carlborg <doob me.com> writes:
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
Jun 17 2012