| /** |
| 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); |
| } |