But alias XXX pure nothrow; works! ---- pure nothrow { alias void function(int) A; // A is pure nothrow } alias void function(int) pure nothrow B; // B is pure nothrow alias pure nothrow void function(int) C; // C is NOT pure nothrow! void main() { A a = null; B b = null; C c = null; a = b; // ok a = c; // fails! } --- bug.d(15): Error: cannot implicitly convert expression (c) of type void function (int) to void function(int) pure nothrow --- If you take away the aliases, and use variables A, B, C instead, it works. So it's a problem with 'alias'.
// PATCH: pure, nothrow need the same treatment which ref already has. Index: declaration.c =================================================================== --- declaration.c (revision 221) +++ declaration.c (working copy) @@ -461,11 +461,11 @@ goto L2; // it's a symbolic alias #if DMDV2 - if (storage_class & STCref) + if (storage_class & (STCref | STCnothrow | STCpure)) { // For 'ref' to be attached to function types, and picked // up by Type::resolve(), it has to go into sc. sc = sc->push(); - sc->stc |= STCref; + sc->stc |= (storage_class & (STCref | STCnothrow |STCpure)); type->resolve(loc, sc, &e, &t, &s); sc = sc->pop(); }
Related SVN revision: http://www.dsource.org/projects/dmd/changeset/225
Fixed dmd 2.036