1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 template<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 10 template<> void A<int>::f(int); 11 12 // out of class member template definition 13 template<class T> template<class X1> void A<T>::g1(T, X1) { } 14 15 // member template specialization 16 template<> template<class X1> void A<int>::g1(int, X1); 17 18 // member template specialization 19 template<> template<> 20 void A<int>::g1(int, char); // X1 deduced as char 21 22 template<> template<> 23 void A<int>::g2<char>(int, char); // X2 specified as char 24 // member specialization even if defined in class definition 25 26 template<> void A<int>::h(int) { } 27 28 namespace 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