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.