Bug 20917 – stacking alias this, drops data during assignment
Status
RESOLVED
Resolution
WONTFIX
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2020-06-09T21:35:15Z
Last change time
2020-06-09T23:47:35Z
Assigned to
No Owner
Creator
crazymonkyyy
Comments
Comment #0 by crazymonkyyy — 2020-06-09T21:35:15Z
struct ihatecompilers(T,size_t n){
struct hate{
T payload; alias payload this;
float depthofhatred=float.max;
}
hate data;
void opAssign(T a){
data=a;
import std.stdio;
data.writeln;
assert(data==a);
}
}
unittest{
struct inner{int a;}
struct outer{
inner payload;alias payload this;
string metadata;
}
ihatecompilers!(outer,100) foo;
inner bar= inner(10);
foo=outer(bar,"very very very important data");
}
foo is assigned as outer(inner(10),""), droping the very very important data
Comment #1 by stanislav.blinov — 2020-06-09T22:53:03Z
void opAssign(T a) {
data = a;
// hate = outer; Needs implicit conversion.
// outer converts to inner.
// hate = inner; Needs implicit conversion.
// No implicit conversion found. Lookup through hate's alias this.
// getAliasThis(hate) -> outer.
// outer = inner; Needs implicit conversion.
// No implicit conversion found. Lookup through outer's alias this.
// getAliasThis(outer) -> inner.
// inner = inner;
assert(data == a); // makes incorrect assumption
}
You need to define opAssign(T) for hate.