So, I'm a function `f`, I have an `immutable(type)[]` argument and I want to store it for my friend `g` in an TLS variable `v`:
---
string v;
debug string sure;

void f(string s) { v = s; debug sure = s.idup; }
void g() { assert(v == sure); }
---
I also store a copy of `s` into `sure` for my friend to ensure immutable date hasn't been mutated.
Can my friend's assertion ever fail without breaking a type-system?
Sure. Just consider this:
---
void main() {
    auto s = "abba".idup;
    f(s);
    delete s;
    g();
}
---
Is it by-design? Looks like deleting immutable (and const because of implicit conversion) data should be prohibited.
OK. Let `delete` be fixed. Can we still fail?
---
void h() {
    immutable(char)[4] s = "abba";
    f(s);
}
void main() {
    h();
    g();
}
---
Damn! So, what can we do with it? Not sure, but I have a proposal.

Fix it in language:
    * disallow `delete` of const/immutable data
    * disallow immutable data on the stack

This makes data really immutable if I don't miss something. Anyway, I want `immutable` qualified data to be immutable without breaking a type-system (if one do it, its his own responsibility), so some changes should be made (IMHO).

Reply via email to