diff --git a/std/concurrency.d b/std/concurrency.d index 9d0f41389f9..1d7d02b594f 100644 --- a/std/concurrency.d +++ b/std/concurrency.d @@ -74,12 +74,16 @@ private { bool hasLocalAliasing(Types...)() { + import std.typecons : Rebindable; + // Works around "statement is not reachable" bool doesIt = false; static foreach (T; Types) { static if (is(T == Tid)) { /* Allowed */ } + else static if (is(T : Rebindable!R, R)) + doesIt |= hasLocalAliasing!R; else static if (is(T == struct)) doesIt |= hasLocalAliasing!(typeof(T.tupleof)); else @@ -94,6 +98,14 @@ private static assert(!hasLocalAliasing!(Tid, Container, int)); } + @safe unittest + { + /* Issue 20097 */ + import std.datetime.systime : SysTime; + static struct Container { SysTime time; } + static assert(!hasLocalAliasing!(SysTime, Container)); + } + enum MsgType { standard,