summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/tanya/algorithm/mutation.d13
-rw-r--r--source/tanya/conv.d12
2 files changed, 20 insertions, 5 deletions
diff --git a/source/tanya/algorithm/mutation.d b/source/tanya/algorithm/mutation.d
index daff07c..550afdd 100644
--- a/source/tanya/algorithm/mutation.d
+++ b/source/tanya/algorithm/mutation.d
@@ -89,13 +89,20 @@ do
static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
{
- if (typeid(T).initializer().ptr is null)
+ static if (__VERSION__ >= 2083) // __traits(isZeroInit) available.
{
- deinitialize!true(source);
+ deinitialize!(__traits(isZeroInit, T))(source);
}
else
{
- deinitialize!false(source);
+ if (typeid(T).initializer().ptr is null)
+ {
+ deinitialize!true(source);
+ }
+ else
+ {
+ deinitialize!false(source);
+ }
}
}
}
diff --git a/source/tanya/conv.d b/source/tanya/conv.d
index 48cd11a..e19ea7f 100644
--- a/source/tanya/conv.d
+++ b/source/tanya/conv.d
@@ -185,8 +185,16 @@ out(result; memory.ptr is result)
}
else
{
- static const T init = T.init;
- trustedCopy(init);
+ static if (__VERSION__ >= 2083 // __traits(isZeroInit) available.
+ && __traits(isZeroInit, T))
+ {
+ (() @trusted => memory.ptr[0 .. T.sizeof])().fill!0;
+ }
+ else
+ {
+ static immutable T init = T.init;
+ trustedCopy(init);
+ }
}
result.__ctor(args);
}