Clang Project

clang_source_code/test/CXX/temp/temp.spec/temp.expl.spec/p16.cpp
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