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: nob...@puremagic.com ReportedBy: dmitry.o...@gmail.com --- Comment #0 from Dmitry Olshansky <dmitry.o...@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: -------