[Issue 17284] ref returning function template allows bypassing @safe on unions
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Wed Mar 29 12:53:49 PDT 2017
    
    
  
https://issues.dlang.org/show_bug.cgi?id=17284
ZombineDev <petar.p.kirov at gmail.com> changed:
           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|opDispatch allows bypassing |ref returning function
                   |@safe on unions             |template allows bypassing
                   |                            |@safe on unions
--- Comment #2 from ZombineDev <petar.p.kirov at gmail.com> ---
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
--
    
    
More information about the Digitalmars-d-bugs
mailing list