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