digitalmars.D.bugs - [Issue 18568] New: partially overlapping assignments have undefined
- d-bugmail puremagic.com (48/52) Mar 07 2018 https://issues.dlang.org/show_bug.cgi?id=18568
https://issues.dlang.org/show_bug.cgi?id=18568 Issue ID: 18568 Summary: partially overlapping assignments have undefined behavior but are accepted in safe code Product: D Version: D2 Hardware: All OS: All Status: NEW Keywords: safe Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: ag0aep6g gmail.com Prompted by this forum post: https://forum.dlang.org/post/kslpmklgrgwaynlbkrph forum.dlang.org On assignments, the spec says [1]:Undefined Behavior: 1. if the lvalue and rvalue have partially overlapping storage 2. if the lvalue and rvalue's storage overlaps exactly but the types are differentBut DMD accepts this: ---- struct S { union { int i; byte b; float f; struct { byte b2; align(1) int i2; } } } void main() safe { S s; s.i = s.b; /* Partially overlapping, different types. */ s.f = s.i; /* Exactly overlapping, different types. */ s.i = s.i2; /* Partially overlapping, same type. */ } ---- According to the spec, all those assignments have undefined behavior. So they shouldn't be allowed in safe code. (As always, this can be fixed by letting DMD reject the code, or by changing the spec to give the code defined behavior.) [1] https://dlang.org/spec/expression.html#assign_expressions --
Mar 07 2018