On Monday, 2 May 2016 at 20:05:15 UTC, Steven Schveighoffer wrote:
On 5/2/16 3:38 PM, Namespace wrote:
The assembler might be safe in some instances, but that
doesn't
reflect the original internal representation in the compiler.
Some
other configuration of calls may allow the compiler to reuse
that
memory, and then you run into problems.
I'm wondering if you used my rewrite if it would actually
output the
same thing?
Not quite. Look for yourself:
https://godbolt.org/g/kO8hdW
https://godbolt.org/g/KCfYPy
Except for offsets, it looks identical. May be the compiler
puts things in different spots for different ways of writing.
But the thing that's not disclosed here is: what happens when
the compiler feels the need to reuse that stack space? Your
example doesn't have anything that may compete for the space,
it just returns after this is over.
For example, define a static array of exactly the same size to
use after the call:
int[3] x;
Now, see if x is pigeonholed into that same place your
temporary return existed (and therefore 'as' points at it).
I'm still fully on the side of this being unsafe.
-Steve
I used it very often, but always assigned the result to an
auto-type variable, never to a slice.