Bug 6257 – Struct postblit not called in one case

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2011-07-06T03:27:00Z
Last change time
2012-05-10T19:53:28Z
Keywords
wrong-code
Assigned to
nobody
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2011-07-06T03:27:03Z
With DMD 2.053 the second assert of this program fires, is this a DMD bug? struct Foo { int[] data; this(int n) { data.length = n; } this(this) { data = data.dup; } } void main() { Foo f1, f2; f1 = Foo(1); f2 = f1; assert(f1.data.ptr != f2.data.ptr); // OK f1 = f2 = Foo(1); assert(f1.data.ptr != f2.data.ptr); // asserts }
Comment #1 by k.hara.pg — 2012-05-10T19:52:21Z
The bug mechanism is: struct Foo { int[] data; this(int n) { data.length = n; } this(this) { data = data.dup; } // Implicitly generated by compiler ref Foo opAssign(Foo rhs) { ... } } void main() { ... f1 = f2 = Foo(1); // is translated to: f1.opAssign(f2.opAssign(Foo(1))); // f2.opAssign returns ref Foo } "Postblit not called on ref returned object" is same as bug 6119. Then, this was a dup of it. *** This issue has been marked as a duplicate of issue 6119 ***
Comment #2 by k.hara.pg — 2012-05-10T19:53:28Z
Sorry, I missed. This is a dup of bug 6199. *** This issue has been marked as a duplicate of issue 6199 ***