On Thursday, 16 May 2019 at 01:05:53 UTC, H. S. Teoh wrote:
Gah, so apparently .hashOf is a gigantic overload set of *21* different overloads, so this is not really "truly" reduced. =-O

Anybody up for figuring out which overload(s) is/are getting called?

https://github.com/dlang/druntime/blob/master/src/core/internal/hash.d#L393

static if (hasCallableToHash!(typeof(val))){ ... } // false
else
{
static if (__traits(hasMember, T, "toHash") && is(typeof(T.toHash) == function)) { ... } // false
    else static if (T.tupleof.length == 0) { ... } // false
else static if ((is(T == struct) && !canBitwiseHash!T) || T.tupleof.length == 1)//true
    {
        static foreach (i, F; typeof(val.tupleof))
        {
static if (__traits(isStaticArray, F)) { ... } // false else static if (is(F == struct) || is(F == union)) { ... } // false
            else
            {
                    // Nothing special happening.
                    static if (i == 0 && !isChained)
                        size_t h = hashOf(val.tupleof[i]);
                    else
                        h = hashOf(val.tupleof[i], h);
            }
    }
}

Betcha the problem is that -preview=dip1000 causes one of the overloads to fail to compile, thus shuffling to a different overload that isn't @safe. I hate SFINAE.

My money's on access to a private member through .tupleof.

Reply via email to