July 02, 2015
https://issues.dlang.org/show_bug.cgi?id=14756

Kenji Hara <k.hara.pg@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |INVALID

--- Comment #1 from Kenji Hara <k.hara.pg@gmail.com> ---
(In reply to Tim from comment #0)

This behavior change is an intentional bug fix. See issue 14290.

> enum bool isInstanceOf(alias S, T) = is(T == S!Args, Args...);
> 
> struct Test(size_t id)
> {
>     static void from(Other)(Other other)
>     if (isInstanceOf!(Test, Other))

In here, 'Test' represents an instantiated struct, not a template. By fixing issue 14290, is-expression won't match to the instantiation form S!Args when S is a struct.

> If the template constraint uses the is-expression directly, the error goes away.

When you rewrite the condition as follows:

    static void from(Other)(Other other)
    if (is(Other == Test!Args, Args...))

'Test' is still a struct, but in here, the is-expression can recognize it may also represent the outer template Test(size_t id) because it's accessible through the lexical scope.

To fix the issue, you need to pass explicitly the template 'Test' to the isInstanceOf.

struct Test(size_t id)
{
    static void from(Other)(Other other)
    if (isInstanceOf!(.Test, Other))
    // <-- Use Module Scope Operator (http://dlang.org/module)
    {}
}

--
September 14, 2015
https://issues.dlang.org/show_bug.cgi?id=14756

Kenji Hara <k.hara.pg@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Marco.Leise@gmx.de

--- Comment #2 from Kenji Hara <k.hara.pg@gmail.com> ---
*** Issue 15042 has been marked as a duplicate of this issue. ***

--