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 ***