Bug 3944 – Require immutable annotation for new fields of class inherited from immutable class

Status
NEW
Severity
enhancement
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2010-03-12T14:57:54Z
Last change time
2024-12-13T17:51:36Z
Assigned to
No Owner
Creator
bearophile_hugs
Moved to GitHub: dmd#18176 →

Comments

Comment #0 by bearophile_hugs — 2010-03-12T14:57:54Z
This is a wrong D2 program: immutable class Foo {} class Bar : Foo { int x; } void main() { auto b = new Bar; b.x = 10; // line 5 } From the error message it's clear that x is not a mutable variable: test.d(5): Error: can only initialize const member x inside constructor But from the code of the Foo class there is no clear indication that x is immutable. So in this situation I think it's better if the compiler requires a immutable annotation on x too, for code readability, something like: immutable class Foo {} class Bar : Foo { int x; } // Error: attribute x requires 'immutable' annotation void main() { auto b = new Bar; } immutable class Foo {} class Bar : Foo { immutable int x; } // OK, no error void main() { auto b = new Bar; }
Comment #1 by tjverweij — 2010-07-07T14:36:34Z
Here's another situation that produces the same error message: class Foo { int x; immutable void bar() { x = 1; } } Error: can only initialize const member x inside constructor It should probably report something along the lines of "immutable member function cannot modify member variables".
Comment #2 by robert.schadek — 2024-12-13T17:51:36Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18176 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB