1 // RUN: %clang_cc1 -fsyntax-only -pedantic-errors -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);
hA6 void h(T) { }
7 };
8
9 // specialization
10 template<> void A<int>::f(int);
11
12 // out of class member template definition
g1(T,X1)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
h(int)26 template<> void A<int>::h(int) { }
27
28 namespace PR10024 {
29 template <typename T>
30 struct Test{
31 template <typename U>
getPR10024::Test32 void get(U i) {}
33 };
34
35 template <typename T>
36 template <>
get(double i)37 void Test<T>::get<double>(double i) {} // expected-error{{cannot specialize (with 'template<>') a member of an unspecialized template}}
38 }
39
40 namespace 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