From the forum discussion: http://forum.dlang.org/thread/kjv4ae$3hp$1@digitalmars.com This code should call void opAssign(S rhs) twice. import std.stdio; import std.string; version = destructor_defined; struct S { int i; string info() const { return format("%s(%s)", &i, i); } void opAssign(S rhs) { writefln("%s from Rvalue %s", this.info(), rhs.info()); } void opAssign(ref S rhs) { writefln("%s from Lvalue %s", this.info(), rhs.info()); } version (destructor_defined) { ~this() { writefln("destroying %s", this.info()); } } } S foo(int i) { return S(i); } void main() { auto s = S(1); // Assignment from two kinds of rvalues s = foo(2); // [1] s = S(3); // [2] } In [1], void opAssign(S rhs) is called correctly. But in [2], void opAssign(ref S rhs) is wrongly called.
https://github.com/D-Programming-Language/dmd/pull/1873
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/065514be2bc214f70575e2877f971da11a3d8637 fix Issue 9907 - Struct literal with destructor should match to non-ref overload https://github.com/D-Programming-Language/dmd/commit/e5ca01905d59fbbccce45ef66803ee8f05a2ef70 Merge pull request #1873 from 9rnsr/fix9907 Issue 9907 - Struct literal with destructor should match to non-ref overload