stackConstD and stackImutD should be allowed in the program below, just like the other combinations. Alternatively, if there is some good reason for this restriction, a better error message is needed, because construction is not modification. extern(C++) class C { } extern(D) class D { } void main() { scope stackConstC = new const(C)(); scope stackConstD = new const(D)(); // Error: cannot modify const expression stackConstD auto gcConstD = new const(D)(); scope stackImutC = new immutable(C)(); scope stackImutD = new immutable(D)(); // Error: cannot modify immutable expression stackImutD auto gcImutD = new immutable(D)(); }
This seems caused by `scope` allocations for (D) classes getting an implicit `delete stackConstD`, while C++ classes don't. Which is probably a bug in its own right. The `delete` expression is deprecated; it resets the pointer to null, that's why it cannot be const. An updated lowering could use `destroy()` instead (it's only about calling the dtor/finalizer AFAICT), for C++ classes too, which should make it work with const as well (without dtor or with a const dtor).
(In reply to kinke from comment #1) > This seems caused by `scope` allocations for (D) classes getting an implicit > `delete stackConstD`, while C++ classes don't. Which is probably a bug in > its own right. Good catch! I filed a separate bug for that: https://issues.dlang.org/show_bug.cgi?id=21693 > The `delete` expression is deprecated; it resets the pointer to null, that's > why it cannot be const. An updated lowering could use `destroy()` instead > (it's only about calling the dtor/finalizer AFAICT), for C++ classes too, > which should make it work with const as well (without dtor or with a const > dtor). Yes, that is how it should work.
*** This issue has been marked as a duplicate of issue 19272 ***