On Friday, January 04, 2013 00:20:58 deadalnix wrote: > I find myself with massive breakage in my codebase. I have a lot > of code doing stuff like foo(Bar(args)) where foo expect a ref > parameter. This used to work just fine, but now it do not. > > This seems to me particularly dubious as the compiler introduce a > temporary to call the constructor on. Bar(args) HAVE an address. > > Looking at the change log, I can't find anything relevant to the > subject. What the fuck did happen and why ?
http://d.puremagic.com/issues/show_bug.cgi?id=9069 It makes _no_ sense for struct literals to be treated as lvalues. They're temporaries, not variables. This has been discussed a number of times before and was finally fixed with 2.061. Previously, you got nonsensical behavior like struct S { int i; } S foo(ref S s) { return s; } S bar(int i) { return S(i); } void main() { S s = S(2); foo(s); //compiles as it should foo(S(5)); //compiles when it shouldn't foo(bar(5)); //fails to compile as it should } There should be no difference between a struct literal and a struct returned by value from a function. Code which depended on struct literals being lvalues was depending on buggy behavior. - Jonathan M Davis
