Bug 21692 – Non-mutable extern(D) scope class instances cannot be created.
Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2021-03-08T22:29:48Z
Last change time
2022-05-30T13:38:43Z
Assigned to
No Owner
Creator
thomas.bockman
Comments
Comment #0 by thomas.bockman — 2021-03-08T22:29:48Z
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)();
}
Comment #1 by kinke — 2021-03-08T23:15:21Z
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).
Comment #2 by thomas.bockman — 2021-03-08T23:43:29Z
(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.
Comment #3 by nick — 2022-05-30T13:38:43Z
*** This issue has been marked as a duplicate of issue 19272 ***