1// RUN: %clang_cc1 -fsyntax-only -verify %s
2template<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 definition
25
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