Skip to content

Commit 8f0e6f8

Browse files
Fix hasElabroateDestructor and hasAnyDestructor template logic
1 parent 968ea4e commit 8f0e6f8

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

source/numem/core/traits.d

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -501,9 +501,8 @@ template hasElaborateDestructor(T) {
501501
enum bool hasElaborateDestructor = false;
502502
else static if (__traits(isStaticArray, T))
503503
enum bool hasElaborateDestructor = T.sizeof && hasElaborateDestructor!(BaseElemOf!T);
504-
else static if (isAggregateType!T)
505-
enum bool hasElaborateDestructor = __traits(hasMember, T, "__dtor") ||
506-
anySatisfy!(.hasElaborateDestructor, Fields!T);
504+
else static if (is(T == struct))
505+
enum bool hasElaborateDestructor = is(typeof(() { T.init.__xdtor(); }));
507506
else
508507
enum bool hasElaborateDestructor = false;
509508
}
@@ -517,14 +516,19 @@ template hasAnyDestructor(T) {
517516
enum bool hasAnyDestructor = false;
518517
else static if (__traits(isStaticArray, T))
519518
enum bool hasAnyDestructor = T.sizeof && hasAnyDestructor!(BaseElemOf!T);
520-
else static if (isAggregateType!T)
521-
enum bool hasAnyDestructor =
522-
is(T == class) || // Classes have implicit destructors
523-
is(T == interface) || // Interfaces have implicit destructors
524-
__traits(hasMember, T, "__xdtor") ||
525-
__traits(hasMember, T, "__dtor") ||
526-
anySatisfy!(.hasAnyDestructor, Fields!T);
527-
else
519+
else static if (is(T == class)) // Classes have implicit destructors
520+
enum bool hasAnyDestructor = true;
521+
else static if (is(T == interface)) // Interfaces have implicit destructors
522+
enum bool hasAnyDestructor = true;
523+
else static if (is(T == struct)) {
524+
525+
// NOTE: Some types should always report as true, especially if said types
526+
// can be self-referential.
527+
static if (is(typeof(() { T.init.__xdtor(); })))
528+
enum bool hasAnyDestructor = true;
529+
else
530+
enum bool hasAnyDestructor = anySatisfy!(.hasAnyDestructor, Fields!T);
531+
} else
528532
enum bool hasAnyDestructor = false;
529533
}
530534

0 commit comments

Comments
 (0)