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 ***