D 1.076 and 2.061 release
deadalnix
deadalnix at gmail.com
Thu Jan 3 15:32:56 PST 2013
On Thursday, 3 January 2013 at 18:36:32 UTC, Jonathan M Davis
wrote:
> On Thursday, January 03, 2013 17:59:22 deadalnix wrote:
>> On Thursday, 3 January 2013 at 16:43:06 UTC, bearophile wrote:
>> > deadalnix:
>> >> I still have code broken all over the place.
>> >
>> > D2 is getting its corner case problems sorted out and fixed,
>> > but this still causes some breakage in user code. As more
>> > people use D2, issues are found, discussed and fixed, the
>> > breakages will get more and more uncommon.
>>
>> Is this breakage intended ? To me it doesn't make sense, the
>> generated code is :
>>
>> (Bar bar = Bar.init; , bar).this()
>
> It is most definitely intended. ref requires an lvalue. A
> struct literal is a
> temporary and therefore should be an rvalue, not an lvalue.
>
struct Bar {
uint i;
this(uint foo) {
import std.stdio;
writeln(&this);
}
}
void main() {
Bar(0);
}
> Before, you had the stupid situation of
>
> foo(Bar()); //compiles
> foo(funcWhichReturnsBar()); //fails to compile
>
> Both are dealing with temporaries, so both should be rvalues,
> and neither
> should compile. You need an actual variable or other
> non-temporary memory
> location (e.g. dereferenced pointer) if you want to pass an
> argument to a ref
> function. The previous behavior was broken and should have been
> fixed ages ago.
>
> - Jonathan M Davis
The compiler actually create this storage to pass it to the
constructor. Why can't it pass it to something else ?
More information about the Digitalmars-d-announce
mailing list