[Issue 21762] object.destroy may silently fail depending on whether a member function is a template
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Thu Jul  1 01:37:34 UTC 2021
    
    
  
https://issues.dlang.org/show_bug.cgi?id=21762
--- Comment #7 from thomas.bockman at gmail.com ---
I ran into this again in a different context. One workaround for the compiler
bug is to change the definition of object.destroy to do the work of __xdtor
itself when the type has a destructor, but no __xdtor is found:
//////////////////////////////////////////////////////////////////
import core.internal.lifetime : emplaceInitializer;
import core.internal.traits : hasElaborateDestructor;
void destroy(bool initialize = true, T)(ref T obj)
    if(is(T == struct))
{
    static if(initialize) {
        destroy!false(obj);
        emplaceInitializer(obj);
    } else
    static if(hasElaborateDestructor!T) {
        static if(__traits(hasMember, T, `__xdtor`)
        && __traits(isSame, T, __traits(parent, obj.__xdtor)))
            obj.__xdtor();
        else {
            static if(__traits(hasMember, T, `__dtor`)
            && __traits(isSame, T, __traits(parent, obj.__dtor)))
                obj.__dtor();
            foreach_reverse(ref objField; obj.tupleof)
                destroy!false(objField);
        }
    }
}
//////////////////////////////////////////////////////////////////
Should I submit a druntime pull request for this?
--
    
    
More information about the Digitalmars-d-bugs
mailing list