@nogc inconsistent for array comparison depending on mutability of elements

Xinok via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Apr 7 20:14:40 PDT 2016


On Friday, 8 April 2016 at 01:36:18 UTC, rcorre wrote:
> @nogc unittest {
>     int[2] a = [1, 2];
>     assert(a == [1, 2]); // OK
>
>     immutable(int)[2] b = [1, 2];
>     assert(b == [1, 2]); // fail: array literal may cause 
> allocation
> }
>
> Is there any logic behind allowing the comparison with `a` but 
> not `b`, or is this a compiler bug?

Semantically, array literals are always allocated on the heap. In 
this case, the optimizer can obviously place the array on the 
stack or even make it static/global. However, it would be in poor 
design to rely on the optimizer to satisfy @nogc. It comes down 
to portability; if the code compiles successfully with one 
compiler, then it should compile successfully in any other 
compiler.

Also, the way that compilers are typically built is that semantic 
analysis is done in the frontend and optimization is done in the 
backend. Trying to build a bridge between these two would be 
incredibly difficult and make implementing the compiler much more 
complex with little gain.


More information about the Digitalmars-d-learn mailing list