www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - struct is not copyable because it is annotated with disable bugs ?

reply Newbie2019 <newbie2019 gmail.com> writes:
I think this is a bug.

If I return a struct more than one times,  will throw this error.
If I return once,  every thing is ok.

https://run.dlang.io/is/T4kWKM


	ref auto getList() return scope {
		if( i ) return NodeList(null); // remove this line will fix 
this error
		A* a;
		B* b;
		auto list = NodeList(a, b);
		return list;
	}
Jul 27 2019
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 27 July 2019 at 16:59:44 UTC, Newbie2019 wrote:
 		auto list = NodeList(a, b);
If you change that to just plain `return NodeList(a, b);`, while keeping the first line, it will compile too. The reason here is when you return and construct together, it constructs it in-place. But if you put it in a local variable first, it needs to copy it to the return value. Removing the first line just lets the compiler optimize out the local variable, reducing it to the in-place one again. But explicitly returning and constructing together works in either case.
Jul 27 2019
parent Newbie2019 <newbie2019 gmail.com> writes:
On Saturday, 27 July 2019 at 17:13:45 UTC, Adam D. Ruppe wrote:
 If you change that to just plain `return NodeList(a, b);`, 
 while keeping the first line, it will compile too.

 The reason here is when you return and construct together, it 
 constructs it in-place. But if you put it in a local variable 
 first, it needs to copy it to the return value.

 Removing the first line just lets the compiler optimize out the 
 local variable, reducing it to the in-place one again.

 But explicitly returning and constructing together works in 
 either case.
Thanks your for the very quick and good explain. I thinks the DMD should report a more helpful error about this.
Jul 27 2019