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