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