On Friday, 27 July 2018 at 12:52:09 UTC, aliak wrote:
On Thursday, 26 July 2018 at 06:37:41 UTC, Simen Kjærås wrote:
As for assigning to Optional!(immutable int), the language basically forbids this (cannot modify struct with immutable members). It would, as you say, cause problems when you can get a pointer to the contents.

So is this undefined behaviour?

import std.stdio;

struct S(T) {
    T value;
    void opUnary(string op)() inout {
        mixin(op ~ "cast(T)value;");
    }
}

void main() {
    immutable a = S!int(2);
    ++a;
}

It's the exact same as the top two lines of this:

void main() {
    immutable int a = 2;
    ++*cast(int*)&a;
    assert(a == 3); // Will trigger on DMD 2.081.1
}

So yes, it's casting away immutable and modifying it, which is UB.

--
  Simen

Reply via email to