xref: /aosp_15_r20/external/clang/test/SemaTemplate/explicit-specialization-member.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li template<typename T>
3*67e74705SXin Li struct X0 {
4*67e74705SXin Li   typedef T* type;
5*67e74705SXin Li 
6*67e74705SXin Li   void f0(T);
7*67e74705SXin Li   void f1(type);
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li template<> void X0<char>::f0(char);
11*67e74705SXin Li template<> void X0<char>::f1(type);
12*67e74705SXin Li 
13*67e74705SXin Li namespace PR6161 {
14*67e74705SXin Li   template<typename _CharT>
15*67e74705SXin Li   class numpunct : public locale::facet // expected-error{{use of undeclared identifier 'locale'}} \
16*67e74705SXin Li               // expected-error{{expected class name}}
17*67e74705SXin Li   {
18*67e74705SXin Li     static locale::id id; // expected-error{{use of undeclared identifier}}
19*67e74705SXin Li   };
20*67e74705SXin Li   numpunct<char>::~numpunct();
21*67e74705SXin Li }
22*67e74705SXin Li 
23*67e74705SXin Li namespace PR12331 {
24*67e74705SXin Li   template<typename T> struct S {
25*67e74705SXin Li     struct U { static const int n = 5; };
26*67e74705SXin Li     enum E { e = U::n }; // expected-note {{implicit instantiation first required here}}
27*67e74705SXin Li     int arr[e];
28*67e74705SXin Li   };
29*67e74705SXin Li   template<> struct S<int>::U { static const int n = sizeof(int); }; // expected-error {{explicit specialization of 'U' after instantiation}}
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li namespace PR18246 {
33*67e74705SXin Li   template<typename T>
34*67e74705SXin Li   class Baz {
35*67e74705SXin Li   public:
36*67e74705SXin Li     template<int N> void bar();
37*67e74705SXin Li   };
38*67e74705SXin Li 
39*67e74705SXin Li   template<typename T>
40*67e74705SXin Li   template<int N>
bar()41*67e74705SXin Li   void Baz<T>::bar() { // expected-note {{couldn't infer template argument 'N'}}
42*67e74705SXin Li   }
43*67e74705SXin Li 
44*67e74705SXin Li   // FIXME: We shouldn't try to match this against a prior declaration if
45*67e74705SXin Li   // template parameter matching failed.
46*67e74705SXin Li   template<typename T>
bar()47*67e74705SXin Li   void Baz<T>::bar<0>() { // expected-error {{cannot specialize a member of an unspecialized template}} \
48*67e74705SXin Li                           // expected-error {{no function template matches}}
49*67e74705SXin Li   }
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li namespace PR19340 {
53*67e74705SXin Li template<typename T> struct Helper {
funcPR19340::Helper54*67e74705SXin Li   template<int N> static void func(const T *m) {} // expected-note {{failed template argument deduction}}
55*67e74705SXin Li };
56*67e74705SXin Li 
func()57*67e74705SXin Li template<typename T> void Helper<T>::func<2>() {} // expected-error {{cannot specialize a member}} \
58*67e74705SXin Li                                                   // expected-error {{no function template matches}}
59*67e74705SXin Li }
60