xref: /aosp_15_r20/external/clang/test/SemaTemplate/partial-spec-instantiate.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li // PR4607
6*67e74705SXin Li template <class T> struct X {};
7*67e74705SXin Li 
8*67e74705SXin Li template <> struct X<char>
9*67e74705SXin Li {
10*67e74705SXin Li   static char* g();
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li template <class T> struct X2 {};
14*67e74705SXin Li 
15*67e74705SXin Li template <class U>
16*67e74705SXin Li struct X2<U*> {
fX217*67e74705SXin Li   static void f() {
18*67e74705SXin Li     X<U>::g();
19*67e74705SXin Li   }
20*67e74705SXin Li };
21*67e74705SXin Li 
a(char * a,char * b)22*67e74705SXin Li void a(char *a, char *b) {X2<char*>::f();}
23*67e74705SXin Li 
24*67e74705SXin Li namespace WonkyAccess {
25*67e74705SXin Li   template<typename T>
26*67e74705SXin Li   struct X {
27*67e74705SXin Li     int m;
28*67e74705SXin Li   };
29*67e74705SXin Li 
30*67e74705SXin Li   template<typename U>
31*67e74705SXin Li   class Y;
32*67e74705SXin Li 
33*67e74705SXin Li   template<typename U>
34*67e74705SXin Li   struct Y<U*> : X<U> { };
35*67e74705SXin Li 
36*67e74705SXin Li   template<>
37*67e74705SXin Li   struct Y<float*> : X<float> { };
38*67e74705SXin Li 
f(Y<int * > y,Y<float * > y2)39*67e74705SXin Li   int f(Y<int*> y, Y<float*> y2) {
40*67e74705SXin Li     return y.m + y2.m;
41*67e74705SXin Li   }
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li // <rdar://problem/9169404>
45*67e74705SXin Li namespace rdar9169404 {
46*67e74705SXin Li   template<typename T, T N> struct X { };
47*67e74705SXin Li   template<bool C> struct X<bool, C> {
48*67e74705SXin Li     typedef int type;
49*67e74705SXin Li   };
50*67e74705SXin Li 
51*67e74705SXin Li   X<bool, -1>::type value;
52*67e74705SXin Li #if __cplusplus >= 201103L
53*67e74705SXin Li   // expected-error@-2 {{non-type template argument evaluates to -1, which cannot be narrowed to type 'bool'}}
54*67e74705SXin Li #else
55*67e74705SXin Li   // expected-no-diagnostics
56*67e74705SXin Li #endif
57*67e74705SXin Li }
58