https://issues.dlang.org/show_bug.cgi?id=17284
ZombineDev <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|opDispatch allows bypassing |ref returning function |@safe on unions |template allows bypassing | |@safe on unions --- Comment #2 from ZombineDev <[email protected]> --- I reduced it a bit further: Case 1: ``` class C { } union U { C c; int i; } ref C getC1(ref U u) { return u.c; } ref C getC2(T)(ref T u) { return u.c; } void main() @safe { U u; u.getC2() = new C; // compiles (!!!) } ``` Case 2: ``` class C { } union U { C c; int i; } ref C getC1(ref U u) { return u.c; } ref C getC2(T)(ref T u) { return u.c; } void main() @safe { U u; u.getC1() = new C; // (Line 12) Doesn't compile } ``` main.d(12): Error: @safe function 'D main' cannot call @system function 'main.getC1' Case 3: ``` class C { } union U { C c; int i; } @safe: ref C getC1(ref U u) { return u.c; } // (Line 9) ref C getC2(T)(ref T u) { return u.c; } void main() @safe { U u; u.getC1() = new C; } ``` main.d(9): Error: field U.c cannot access pointers in @safe code that overlap other fields Case 4: ``` class C { } union U { C c; int i; } @safe: ref C getC1(ref U u) { return u.c; } // (Line 9) ref C getC2(T)(ref T u) { return u.c; } // (Line 10) void main() @safe { U u; u.getC2() = new C; // (Line 14) } ``` main.d(9): Error: field U.c cannot access pointers in @safe code that overlap other fields main.d(10): Error: field U.c cannot access pointers in @safe code that overlap other fields main.d(14): Error: template instance main.getC2!(U) error instantiating --
