Bug 2694 – alias pure nothrow XXX; is not pure nothrow!

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2009-02-27T09:09:00Z
Last change time
2015-06-09T01:21:09Z
Keywords
patch, rejects-valid, wrong-code
Assigned to
nobody
Creator
clugdbug

Comments

Comment #0 by clugdbug — 2009-02-27T09:09:43Z
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'.
Comment #1 by clugdbug — 2009-10-27T12:21:31Z
// 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(); }
Comment #2 by leandro.lucarella — 2009-10-29T14:39:03Z
Comment #3 by bugzilla — 2009-11-06T11:32:57Z
Fixed dmd 2.036