www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - scope instantiation bug with alias template parameters

reply Don Clugston <dac nospam.com.au> writes:
In this example, outside() seems to be instantiated only once, with the 
first use of  test:local().

test.val is always 123, no matter what its template parameter is.
(if you reverse the last two lines, then b passes and a fails --
test.val is always 456).

I suspect this one is not trivial.

---------------
template outside(alias s)
{
   const int outval = s.localval;
}

template test(alias f)
{
    template local() {  const int localval = f.x; }
    const int val = outside!(local!()).outval;
}

template a()
{   const int x = 123; }

template b()
{   const int x = 456; }

static assert( test!( a!() ).val == 123);
static assert( test!( b!() ).val == 456);

int main() { return 0; }
-----------
Nov 14 2005
parent Thomas Kuehne <thomas-dloop kuehne.cn> writes:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Don Clugston schrieb am 2005-11-14:
 In this example, outside() seems to be instantiated only once, with the 
 first use of  test:local().

 test.val is always 123, no matter what its template parameter is.
 (if you reverse the last two lines, then b passes and a fails --
 test.val is always 456).

 I suspect this one is not trivial.

 ---------------
 template outside(alias s)
 {
    const int outval = s.localval;
 }

 template test(alias f)
 {
     template local() {  const int localval = f.x; }
     const int val = outside!(local!()).outval;
 }

 template a()
 {   const int x = 123; }

 template b()
 {   const int x = 456; }

 static assert( test!( a!() ).val == 123);
 static assert( test!( b!() ).val == 456);

 int main() { return 0; }
 -----------

Added to DStress as http://dstress.kuehne.cn/run/t/template_18_A.d http://dstress.kuehne.cn/run/t/template_18_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFDf74O3w+/yD4P9tIRAvFKAKDJ/f+xUUrw39wgaUclKRnSq/GgHwCgyHTx NgrcT+TLiKnhJQ8Yzv8axjo= =twwc -----END PGP SIGNATURE-----
Nov 19 2005