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