December 26, 2018
https://issues.dlang.org/show_bug.cgi?id=19517

          Issue ID: 19517
           Summary: Spurious compiler warning with const toHash and alias
                    this classes
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: hsteoh@quickfur.ath.cx

Code:
------
class C { }
struct S
{
    C c;
    alias c this;
}
Nullable!S s;

struct Nullable(T) // reduced from std.typecons.Nullable
{
    union U
    {
        T t;
    }

    U u = U.init;

    size_t toHash() const @safe nothrow
    {
        static if (__traits(compiles, .hashOf(u.t))) {}
        return 0;
    }
}
------

Compiler output:
------
Warning: struct S has method toHash, however it cannot be called with const(S)
this.
------

This warning is spurious, because the whole point of the static if is to check for exactly this case, and to provide workaround code for it.  As things stand, it is impossible to avoid the warning, even if there is workaround code for it.

Related to issue #18682 that introduced .toHash to std.typecons.Nullable. The bug here, however, is related the compiler, and appears to be related to the compiler confusing Nullable.toHash with S.c.toHash because of the `alias this`.

--