133 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -pedantic-errors -verify %s2template<class T> struct A { 3 void f(T);4 template<class X1> void g1(T, X1); 5 template<class X2> void g2(T, X2); 6 void h(T) { }7};8 9// specialization 10template<> void A<int>::f(int);11 12// out of class member template definition 13template<class T> template<class X1> void A<T>::g1(T, X1) { }14 15// member template specialization 16template<> template<class X1> void A<int>::g1(int, X1);17 18// member template specialization 19template<> template<>20 void A<int>::g1(int, char); // X1 deduced as char 21 22template<> template<>23 void A<int>::g2<char>(int, char); // X2 specified as char 24 // member specialization even if defined in class definition25 26template<> void A<int>::h(int) { }27 28namespace PR10024 {29 template <typename T> 30 struct Test{ 31 template <typename U> 32 void get(U i) {}33 }; 34 35 template <typename T>36 template <>37 void Test<T>::get<double>(double i) {} // expected-error{{cannot specialize (with 'template<>') a member of an unspecialized template}}38}39 40namespace extraneous {41 template<typename T> struct A;42 43 template<typename T> int x;44 45 template<typename T> void f();46 47 template<> // expected-error{{extraneous template parameter list in template specialization}}48 template<>49 struct A<int>;50 51 template<> // expected-error{{extraneous template parameter list in template specialization}}52 template<>53 int x<int>;54 55 template<> // expected-error{{extraneous template parameter list in template specialization}}56 template<>57 void f<int>();58 59 template<typename T>60 struct B {61 struct C;62 63 template<typename U>64 struct D;65 66 static int y;67 68 template<typename U>69 static int z;70 71 void g();72 73 template<typename U>74 void h();75 76 enum class E;77 78 enum F : int;79 };80 81 template<>82 template<> // expected-error{{extraneous 'template<>' in declaration of struct 'C'}}83 struct B<int>::C;84 85 template<>86 template<> // expected-error{{extraneous template parameter list in template specialization}}87 template<>88 struct B<int>::D<int>;89 90 template<>91 template<> // expected-error{{extraneous template parameter list in template specialization}}92 template<typename U>93 struct B<int>::D;94 95 template<>96 template<> // expected-error{{extraneous 'template<>' in declaration of variable 'y'}}97 int B<int>::y;98 99 template<>100 template<> // expected-error{{extraneous template parameter list in template specialization}}101 template<>102 int B<int>::z<int>;103 104 template<>105 template<> // expected-error{{extraneous template parameter list in template specialization}}106 template<typename U>107 int B<int>::z;108 109 template<>110 template<>111 void B<int>::g(); // expected-error{{no function template matches function template specialization 'g'}}112 113 template<>114 template<> // expected-error{{extraneous template parameter list in template specialization}}115 template<>116 void B<int>::h<int>();117 118 template<>119 template<> // expected-error{{extraneous template parameter list in template specialization}}120 template<typename U>121 void B<int>::h<int>(); // expected-error{{function template partial specialization is not allowed}}122 123 // FIXME: We should diagnose this as having an extraneous 'template<>'124 template<>125 template<>126 enum class B<int>::E; // expected-error{{enumeration cannot be a template}}127 128 // FIXME: We should diagnose this as having an extraneous 'template<>'129 template<>130 template<>131 enum B<int>::F : int; // expected-error{{enumeration cannot be a template}}132}133