diff --git a/src/dmd/globals.d b/src/dmd/globals.d index 2149b98b0fcc..3b5f15e37da6 100644 --- a/src/dmd/globals.d +++ b/src/dmd/globals.d @@ -504,6 +504,7 @@ enum MATCH : int { nomatch, // no match convert, // match with conversions + shared_, // match with conversion to shared constant, // match with conversion to const exact, // exact match } diff --git a/src/dmd/mtype.d b/src/dmd/mtype.d index a589aa421b43..04f1e0ea7d26 100644 --- a/src/dmd/mtype.d +++ b/src/dmd/mtype.d @@ -79,7 +79,8 @@ bool MODimplicitConv(MOD modfrom, MOD modto) pure nothrow @nogc @safe case X(MODFlags.wild, MODFlags.const_): case X(MODFlags.wild, MODFlags.wildconst): case X(MODFlags.wildconst, MODFlags.const_): - return (modfrom & MODFlags.shared_) == (modto & MODFlags.shared_); + // Casting to shared is fine, but otherwise casting from shared is not. + return (modto & MODFlags.shared_) || !(modfrom & MODFlags.shared_); case X(MODFlags.immutable_, MODFlags.const_): case X(MODFlags.immutable_, MODFlags.wildconst): @@ -116,6 +117,9 @@ MATCH MODmethodConv(MOD modfrom, MOD modto) pure nothrow @nogc @safe case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild): return MATCH.constant; + case X(0,MODFlags.shared_): + return MATCH.shared_; + default: return MATCH.nomatch; }