blob: 5c5932d99c6b44aa854ad282001be43c888db76c [file] [log] [blame]
/**
This module contains implementations for destroying instances of types
Copyright: Copyright Digital Mars 2000 - 2019.
License: Distributed under the
$(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
(See accompanying file LICENSE)
Source: $(DRUNTIMESRC core/_internal/_destruction.d)
*/
module core.internal.destruction;
// compiler frontend lowers dynamic array deconstruction to this
void __ArrayDtor(T)(scope T[] a)
{
foreach_reverse (ref T e; a)
e.__xdtor();
}
public void destructRecurse(E, size_t n)(ref E[n] arr)
{
import core.internal.traits : hasElaborateDestructor;
static if (hasElaborateDestructor!E)
{
foreach_reverse (ref elem; arr)
destructRecurse(elem);
}
}
public void destructRecurse(S)(ref S s)
if (is(S == struct))
{
static if (__traits(hasMember, S, "__xdtor") &&
// Bugzilla 14746: Check that it's the exact member of S.
__traits(isSame, S, __traits(parent, s.__xdtor)))
s.__xdtor();
}
// Test static struct
nothrow @safe @nogc unittest
{
static int i = 0;
static struct S { ~this() nothrow @safe @nogc { i = 42; } }
S s;
destructRecurse(s);
assert(i == 42);
}