brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · b7c8d3f Raw
133 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -pedantic-errors -verify %s2template<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 definition25 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 40namespace 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