@@ -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