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