1// https://issues.dlang.org/show_bug.cgi?id=20178
2
3interface I {}
4interface J : I {}
5interface K(T) {}
6class C1 : I {}
7class C2 : C1 {}
8class C3 : J {}
9class C4(T) : C3, K!T {}
10class C5(T) : C4!T {}
11
12void main() @nogc nothrow pure @safe
13{
14    assert(typeid(C1).isBaseOf(typeid(C1)));
15    assert(typeid(C1).isBaseOf(typeid(C2)));
16
17    assert(!typeid(C2).isBaseOf(typeid(C1)));
18    assert(typeid(C2).isBaseOf(typeid(C2)));
19
20    assert(!typeid(C1).isBaseOf(typeid(Object)));
21    assert(!typeid(C2).isBaseOf(typeid(Object)));
22    assert(typeid(Object).isBaseOf(typeid(C1)));
23    assert(typeid(Object).isBaseOf(typeid(C2)));
24
25    assert(typeid(I).isBaseOf(typeid(I)));
26    assert(typeid(I).isBaseOf(typeid(J)));
27    assert(typeid(I).isBaseOf(typeid(C1)));
28    assert(typeid(I).isBaseOf(typeid(C2)));
29    assert(typeid(I).isBaseOf(typeid(C3)));
30    assert(!typeid(I).isBaseOf(typeid(Object)));
31
32    assert(!typeid(J).isBaseOf(typeid(I)));
33    assert(typeid(J).isBaseOf(typeid(J)));
34    assert(!typeid(J).isBaseOf(typeid(C1)));
35    assert(!typeid(J).isBaseOf(typeid(C2)));
36    assert(typeid(J).isBaseOf(typeid(C3)));
37    assert(!typeid(J).isBaseOf(typeid(Object)));
38
39    assert(typeid(C4!int).isBaseOf(typeid(C5!int)));
40    assert(typeid(K!int).isBaseOf(typeid(C5!int)));
41    assert(!typeid(C4!Object).isBaseOf(typeid(C5!int)));
42    assert(!typeid(K!Object).isBaseOf(typeid(C5!int)));
43
44    static assert(!__traits(compiles, TypeInfo.init.isBaseOf(typeid(C1))));
45    static assert(!__traits(compiles, typeid(C1).isBaseOf(TypeInfo.init)));
46}
47