Fix moveEmplace not being pure
This commit is contained in:
parent
09b6655b9a
commit
392cdcf192
@ -54,17 +54,24 @@ body
|
|||||||
|
|
||||||
static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
|
static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
|
||||||
{
|
{
|
||||||
static const T init = T.init;
|
|
||||||
|
|
||||||
static if (isNested!T)
|
static if (isNested!T)
|
||||||
{
|
{
|
||||||
// Don't override the context pointer.
|
// Don't override the context pointer.
|
||||||
enum size_t size = T.sizeof - (void*).sizeof;
|
enum size_t size = T.sizeof - (void*).sizeof;
|
||||||
copy((cast(void*) &init)[0 .. size], (&source)[0 .. 1]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
copy((&init)[0 .. 1], (&source)[0 .. 1]);
|
enum size_t size = T.sizeof;
|
||||||
|
}
|
||||||
|
|
||||||
|
const(void)[] init = typeid(T).initializer();
|
||||||
|
if (init.ptr is null)
|
||||||
|
{
|
||||||
|
fill!0((cast(void*) &source)[0 .. size]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
copy(init[0 .. size], (&source)[0 .. 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,6 +102,33 @@ body
|
|||||||
assert(x2 == 5);
|
assert(x2 == 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Is pure.
|
||||||
|
@nogc nothrow pure @system unittest
|
||||||
|
{
|
||||||
|
struct S
|
||||||
|
{
|
||||||
|
this(this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
S source, target = void;
|
||||||
|
static assert(is(typeof({ moveEmplace(source, target); })));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves nested.
|
||||||
|
@nogc nothrow pure @system unittest
|
||||||
|
{
|
||||||
|
struct Nested
|
||||||
|
{
|
||||||
|
void method() @nogc nothrow pure @safe
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Nested source, target = void;
|
||||||
|
moveEmplace(source, target);
|
||||||
|
assert(source == target);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves $(D_PARAM source) into $(D_PARAM target) assuming that
|
* Moves $(D_PARAM source) into $(D_PARAM target) assuming that
|
||||||
* $(D_PARAM target) isn't initialized.
|
* $(D_PARAM target) isn't initialized.
|
||||||
@ -162,3 +196,11 @@ T move(T)(ref T source)
|
|||||||
assert(x2 == 5);
|
assert(x2 == 5);
|
||||||
assert(move(x2) == 5);
|
assert(move(x2) == 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Moves if source is target.
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
int x = 5;
|
||||||
|
move(x, x);
|
||||||
|
assert(x == 5);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user