1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 class A; 3 4 class S { 5 public: 6 template<typename T> struct A { 7 struct Nested { 8 typedef T type; 9 }; 10 }; 11 }; 12 13 int i; 14 S::A<int>::Nested::type *ip = &i; 15 16 template<typename T> 17 struct Outer { 18 template<typename U> 19 class Inner0; 20 21 template<typename U> 22 class Inner1 { 23 struct ReallyInner; 24 25 T foo(U); 26 template<typename V> T bar(V); 27 template<typename V> T* bar(V); 28 29 static T value1; 30 static U value2; 31 }; 32 }; 33 34 template<typename X> 35 template<typename Y> 36 class Outer<X>::Inner0 { 37 public: 38 void f(X, Y); 39 }; 40 41 template<typename X> 42 template<typename Y> 43 void Outer<X>::Inner0<Y>::f(X, Y) { 44 } 45 46 template<typename X> 47 template<typename Y> 48 struct Outer<X>::Inner1<Y>::ReallyInner { 49 static Y value3; 50 51 void g(X, Y); 52 }; 53 54 template<typename X> 55 template<typename Y> 56 void Outer<X>::Inner1<Y>::ReallyInner::g(X, Y) { 57 } 58 59 template<typename X> 60 template<typename Y> 61 X Outer<X>::Inner1<Y>::foo(Y) { 62 return X(); 63 } 64 65 template<typename X> 66 template<typename Y> 67 template<typename Z> 68 X Outer<X>::Inner1<Y>::bar(Z) { 69 return X(); 70 } 71 72 template<typename X> 73 template<typename Y> 74 template<typename Z> 75 X* Outer<X>::Inner1<Y>::bar(Z) { 76 return 0; 77 } 78 79 template<typename X> 80 template<typename Y> 81 X Outer<X>::Inner1<Y>::value1 = 0; 82 83 template<typename X> 84 template<typename Y> 85 Y Outer<X>::Inner1<Y>::value2 = Y(); 86 87 template<typename X> 88 template<typename Y> 89 Y Outer<X>::Inner1<Y>::ReallyInner::value3 = Y(); 90 91 template<typename X> 92 template<typename Y> 93 Y Outer<X>::Inner1<Y*>::ReallyInner::value4; // expected-error{{Outer<X>::Inner1<Y *>::ReallyInner::}} 94 95 96 template<typename T> 97 struct X0 { }; 98 99 template<typename T> 100 struct X0<T*> { 101 template<typename U> 102 void f(U u = T()) { } 103 }; 104 105 // PR5103 106 template<typename> 107 struct X1 { 108 template<typename, bool = false> struct B { }; 109 }; 110 template struct X1<int>::B<bool>; 111 112 // Template template parameters 113 template<typename T> 114 struct X2 { 115 template<template<class U, T Value> class> // expected-error{{cannot have type 'float'}} 116 struct Inner { }; 117 }; 118 119 template<typename T, int Value> 120 struct X2_arg; 121 122 X2<int>::Inner<X2_arg> x2i1; 123 X2<float> x2a; // expected-note{{instantiation}} 124 X2<long>::Inner<X2_arg> x2i3; 125 126 namespace PR10896 { 127 template<typename TN> 128 class Foo { 129 130 public: 131 void foo() {} 132 private: 133 134 template<typename T> 135 T SomeField; // expected-error {{member 'SomeField' declared as a template}} 136 template<> int SomeField2; // expected-error {{extraneous 'template<>' in declaration of member 'SomeField2'}} 137 }; 138 139 void g() { 140 Foo<int> f; 141 f.foo(); 142 } 143 } 144 145 namespace PR10924 { 146 template< class Topology, class ctype > 147 struct ReferenceElement 148 { 149 }; 150 151 template< class Topology, class ctype > 152 template< int codim > 153 class ReferenceElement< Topology, ctype > :: BaryCenterArray // expected-error{{out-of-line definition of 'BaryCenterArray' does not match any declaration in 'ReferenceElement<Topology, ctype>'}} 154 { 155 }; 156 } 157 158 class Outer1 { 159 template <typename T> struct X; 160 template <typename T> int X<T>::func() {} // expected-error{{out-of-line definition of 'func' from class 'X<T>' without definition}} 161 }; 162 163 namespace RefPack { 164 template<const int &...N> struct A { template<typename ...T> void f(T (&...t)[N]); }; 165 constexpr int k = 10; 166 int arr[10]; 167 void g() { A<k>().f(arr); } 168 } 169