fix Issue 14194 - nothrow emplace for classes needed

- turn the chunk size and alignment checks into asserts
This commit is contained in:
Martin Nowak 2015-02-17 16:45:25 +01:00
parent cf60e6a639
commit 75ca200750

View file

@ -4157,12 +4157,12 @@ version(unittest) private struct __conv_EmplaceTest
version(unittest) private class __conv_EmplaceTestClass version(unittest) private class __conv_EmplaceTestClass
{ {
int i = 3; int i = 3;
this(int i) this(int i) @nogc @safe pure nothrow
{ {
assert(this.i == 3 && i == 5); assert(this.i == 3 && i == 5);
this.i = i; this.i = i;
} }
this(int i, ref int j) this(int i, ref int j) @nogc @safe pure nothrow
{ {
assert(i == 5 && j == 6); assert(i == 5 && j == 6);
this.i = i; this.i = i;
@ -4955,15 +4955,10 @@ unittest
emplaceRef!int(i, 5); emplaceRef!int(i, 5);
} }
private void testEmplaceChunk(void[] chunk, size_t typeSize, size_t typeAlignment, string typeName) private void testEmplaceChunk(void[] chunk, size_t typeSize, size_t typeAlignment, string typeName) @nogc pure nothrow
{ {
import std.exception : enforce; assert(chunk.length >= typeSize, "emplace: Chunk size too small.");
enforce!ConvException(chunk.length >= typeSize, assert((cast(size_t)chunk.ptr) % typeAlignment == 0, "emplace: Chunk is not aligned.");
convFormat("emplace: Chunk size too small: %s < %s size = %s",
chunk.length, typeName, typeSize));
enforce!ConvException((cast(size_t) chunk.ptr) % typeAlignment == 0,
convFormat("emplace: Misaligned memory block (0x%X): it must be %s-byte aligned for type %s",
chunk.ptr, typeAlignment, typeName));
} }
/** /**
@ -5005,10 +5000,11 @@ T emplace(T, Args...)(void[] chunk, auto ref Args args)
return result; return result;
} }
unittest @nogc pure nothrow unittest
{ {
int var = 6; int var = 6;
auto k = emplace!__conv_EmplaceTestClass(new void[__traits(classInstanceSize, __conv_EmplaceTestClass)], 5, var); ubyte[__traits(classInstanceSize, __conv_EmplaceTestClass)] buf;
auto k = emplace!__conv_EmplaceTestClass(buf, 5, var);
assert(k.i == 5); assert(k.i == 5);
assert(var == 7); assert(var == 7);
} }