https://issues.dlang.org/show_bug.cgi?id=20752
Iain Buclaw <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #1 from Iain Buclaw <[email protected]> --- (In reply to Mathias LANG from comment #0) > Since half of the logic for NRVO is in the backend, this traits simply > cannot be relied on and is mostly useless. For finding out if a struct is to be returned using (N)RVO, the right test to use would be __traits(isPOD). If a struct is non-POD, then it should _always_ be passed around by invisible reference, no ifs, no buts, no excuses. However, that's ignoring static arrays, which is a little more hairy to find out, as they need to be big enough to be considered returning in memory. But just what is "big enough" is a very target-specific question. > For example, the following compiles and triggers the assert with DMD: > [--snip--] > > I would expect a compilation error, or the assert to pass. Worse, some back-ends can't provide any useful information as there's no access to "target". This is from the gdc-ddmd branch with included explanation. --- bool Target::isReturnOnStack (TypeFunction *, bool) { /* Need the back-end type to determine this, but this is called from the frontend before semantic processing is finished. An accurate value is not currently needed anyway. */ return true; } --- A type could be synthesized, however. But it would be a best guess approach. --
