1 // RUN: c-index-test -test-load-source all %s -fno-delayed-template-parsing | FileCheck %s
2 template<typename MyBase>
3 struct Derived:  MyBase::InnerIterator
4 {
DerivedDerived5     Derived() : MyBase::InnerIterator() {}
6 // CHECK:  TypeRef=MyBase:2:19 Extent=[5:17 - 5:23]
7 };
8 
9 template<typename MyBase>
10 struct Derived2:  MyBase::Deeper::InnerIterator
11 {
Derived2Derived212     Derived2() : MyBase::Deeper::InnerIterator() {}
13 // CHECK:  TypeRef=MyBase:9:19 Extent=[12:18 - 12:24]
14 };
15 
16 template<typename Q>
17 struct Templ;
18 
19 template<typename MyBase>
20 struct Derived3:  Templ<MyBase>::InnerIterator
21 {
Derived3Derived322     Derived3() : Templ<MyBase>::InnerIterator() {}
23 // CHECK: TemplateRef=Templ:17:8 Extent=[22:18 - 22:23]
24 // CHECK: TypeRef=MyBase:19:19 Extent=[22:24 - 22:30]
25 };
26 
27 
28 struct Outer {
29     template <typename Q>
30     struct Inner {
31         typedef Q Parm;
32     };
33 };
34 
35 template<typename Q>
36 struct Derived4:  Outer::Inner<Q>::Parm
37 {
Derived4Derived438     Derived4() : Outer::Inner<Q>::Parm() {}
39 // CHECK: TypeRef=struct Outer:28:8 Extent=[38:18 - 38:23]
40 // CHECK: TemplateRef=Inner:30:12 Extent=[38:25 - 38:30]
41 // CHECK: TypeRef=Q:35:19 Extent=[38:31 - 38:32]
42 };
43 
44 template<typename Q>
45 struct Derived5:  Outer::Inner<Q>::Parm::InnerIterator
46 {
Derived5Derived547     Derived5() : Outer::Inner<Q>::Parm::InnerIterator() {}
48 // CHECK: TypeRef=struct Outer:28:8 Extent=[47:18 - 47:23]
49 // CHECK: TemplateRef=Inner:30:12 Extent=[47:25 - 47:30]
50 // CHECK: TypeRef=Q:44:19 Extent=[47:31 - 47:32]
51 };
52 
53 template<typename Q>
54 struct Derived6:  Outer::Inner<Q>
55 {
Derived6Derived656     Derived6() : Outer::Inner<Q>() {}
57 // CHECK: TypeRef=struct Outer:28:8 Extent=[56:18 - 56:23]
58 // CHECK: TemplateRef=Inner:30:12 Extent=[56:25 - 56:30]
59 // CHECK: TypeRef=Q:53:19 Extent=[56:31 - 56:32]
60 };
61 
62 struct Base {};
63 
64 struct Derived7:  Outer::Inner<Base>::Parm
65 {
Derived7Derived766     Derived7() : Outer::Inner<Base>::Parm() {}
67 // CHECK: TypeRef=struct Outer:28:8 Extent=[66:18 - 66:23]
68 // CHECK: TemplateRef=Inner:30:12 Extent=[66:25 - 66:30]
69 // CHECK: TypeRef=struct Base:62:8 Extent=[66:31 - 66:35]
70 };
71 
72 struct Derived8:  Outer::Inner<Base>
73 {
Derived8Derived874     Derived8() : Outer::Inner<Base>() {}
75 // CHECK: TypeRef=struct Outer:28:8 Extent=[74:18 - 74:23]
76 // CHECK: TemplateRef=Inner:30:12 Extent=[74:25 - 74:30]
77 // CHECK: TypeRef=struct Base:62:8 Extent=[74:31 - 74:35]
78 };
79 
80 namespace Namespace {
81     template<typename Q> struct Templ;
82 
83     struct Outer {
84         template <typename Q>
85         struct Inner {
86             typedef Q Parm;
87         };
88     };
89 }
90 
91 template<typename MyBase>
92 struct Derived9:  Namespace::Templ<MyBase>::InnerIterator
93 {
Derived9Derived994     Derived9() : Namespace::Templ<MyBase>::InnerIterator() {}
95 // CHECK: NamespaceRef=Namespace:80:11 Extent=[94:18 - 94:27]
96 // CHECK: TemplateRef=Templ:81:33 Extent=[94:29 - 94:34]
97 // CHECK: TypeRef=MyBase:91:19 Extent=[94:35 - 94:41]
98 };
99 
100 template<typename MyBase>
101 struct Derived10:  Namespace::Templ<MyBase>
102 {
Derived10Derived10103     Derived10() : Namespace::Templ<MyBase>() {}
104 // CHECK: NamespaceRef=Namespace:80:11 Extent=[103:19 - 103:28]
105 // CHECK: TemplateRef=Templ:81:33 Extent=[103:30 - 103:35]
106 // CHECK: TypeRef=MyBase:100:19 Extent=[103:36 - 103:42]
107 };
108 
109 template<typename MyBase>
110 struct Derived11:  Namespace::Outer::Inner<MyBase>::Parm
111 {
Derived11Derived11112     Derived11() : Namespace::Outer::Inner<MyBase>::Parm() {}
113 // CHECK: NamespaceRef=Namespace:80:11 Extent=[112:19 - 112:28]
114 // CHECK: TypeRef=struct Namespace::Outer:83:12 Extent=[112:30 - 112:35]
115 // CHECK: TemplateRef=Inner:85:16 Extent=[112:37 - 112:42]
116 // CHECK: TypeRef=MyBase:109:19 Extent=[112:43 - 112:49]
117 };
118