www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16427] New: alias to typecons.Rebindable depends on lexical


          Issue ID: 16427
           Summary: alias to typecons.Rebindable depends on lexical order
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: eiderdaus gmail.com

DMD64 D Compiler v2.071.2-b2 on Debian 6.

This code doesn't compile:

    import std.typecons;

    alias RIA = Rebindable!(immutable(IA));
    interface IA {
        Rebindable!(immutable(IA)) f();

./testinterface.d(7): Error: Rebindable!(immutable(IA)) is used as a type
/usr/include/dmd/phobos/std/typecons.d(1616): Error: template instance
std.traits.isDynamicArray!(immutable(IA)) error instantiating
./testinterface.d(5):        instantiated from here: Rebindable!(immutable(IA))
/usr/include/dmd/phobos/std/typecons.d(1625): Error: mixin
std.typecons.RebindableCommon!(immutable(IA), IA, Rebindable) does not match
template declaration RebindableCommon(T, U, alias This) if (is(T == class) ||
is(T == interface) || isAssociativeArray!T)
Failed: ["dmd", "-v", "-o-", "./testinterface.d", "-I."]


Here are 3 variants of the above code. All compile and run perfectly.

    import std.typecons;

    alias REmpty = Rebindable!(immutable(Empty));
    interface Empty { }

    interface IA {
        Rebindable!(immutable(IA)) f();
    alias RIA = Rebindable!(immutable(IA));

    class B {
        Rebindable!(immutable(B)) f() { return rebindable(new immutable B()); }
    alias RB = Rebindable!(immutable(B));

Aug 25 2016