[Issue 8991] New: adding a __ctfe branch with return to a function breaks NRVO
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Nov 10 03:14:40 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8991
Summary: adding a __ctfe branch with return to a function
breaks NRVO
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: dmitry.olsh at gmail.com
--- Comment #0 from Dmitry Olshansky <dmitry.olsh at gmail.com> 2012-11-10 03:14:36 PST ---
Sample obtained while trying to make move work (at least making a copy) during
CTFE.
In the following snippet if __ctfe section is commented out, then return value
doesn't get copied. If it's present however there is a postblit call.
The expected result is that __ctfe should never affect code generation of
run-time code.
Tested on DMD 2.061 from git master.
import core.stdc.string;
T move(T)(ref T source)
{
if (__ctfe)
{
*cast(int*)0 = 0; //to demonstrate that no CTFE is attempted
T result = source;
return result; //must have broke NRVO
}
T result = void;
static if (is(T == struct))
{
static T empty;
memcpy(&result, &source, T.sizeof);
memcpy(&source, &empty, T.sizeof);
}
else
{
result = source;
}
return result;
}
unittest
{
// Issue 5661 test(2)
static struct S4
{
static struct X
{
int n = 0;
this(this){n = 0;}
}
X x;
}
S4 s41;
s41.x.n = 1;
S4 s42 = move(s41);
assert(s41.x.n == 0); //ok, memcpy-ed T.init over source
assert(s42.x.n == 1); //fails, postblit got called somewhere
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list