xref: /llvm-project/clang/test/CXX/temp/temp.spec/temp.expl.spec/p16.cpp (revision 8302cef83f0614f1fb2078f2335b94aa77bde271)
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