@@ -497,13 +497,10 @@ template hasElaborateCopyConstructor(T) {
497497 Gets whether type $(D T) has elaborate destructor semantics (is ~this() declared).
498498*/
499499template hasElaborateDestructor (T) {
500- static if (isObjectiveC! T)
501- enum bool hasElaborateDestructor = false ;
502- else static if (__traits(isStaticArray, T))
500+ static if (__traits(isStaticArray, T))
503501 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);
502+ else static if (is (T == struct ))
503+ enum bool hasElaborateDestructor = is (typeof (() { T.init.__xdtor(); }));
507504 else
508505 enum bool hasElaborateDestructor = false ;
509506}
@@ -517,14 +514,19 @@ template hasAnyDestructor(T) {
517514 enum bool hasAnyDestructor = false ;
518515 else static if (__traits(isStaticArray, T))
519516 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
517+ else static if (is (T == class )) // Classes have implicit destructors
518+ enum bool hasAnyDestructor = true ;
519+ else static if (is (T == interface )) // Interfaces have implicit destructors
520+ enum bool hasAnyDestructor = true ;
521+ else static if (is (T == struct )) {
522+
523+ // NOTE: Some types should always report as true, especially if said types
524+ // can be self-referential.
525+ static if (is (typeof (() { T.init.__xdtor(); })))
526+ enum bool hasAnyDestructor = true ;
527+ else
528+ enum bool hasAnyDestructor = anySatisfy! (.hasAnyDestructor, Fields! T);
529+ } else
528530 enum bool hasAnyDestructor = false ;
529531}
530532
0 commit comments