1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_pointer {
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_pointer<T*> {
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_pointer<const T*> {
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array0[is_pointer<int>::value? -1 : 1];
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array1[is_pointer<int*>::value? 1 : -1];
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array2[is_pointer<const int*>::value? 1 : -1];
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_lvalue_reference {
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_lvalue_reference<T&> {
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint lvalue_ref0[is_lvalue_reference<int>::value? -1 : 1];
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint lvalue_ref1[is_lvalue_reference<const int&>::value? 1 : -1];
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_const {
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_const<const T> {
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const0[is_const<int>::value? -1 : 1];
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const1[is_const<const int>::value? 1 : -1];
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const2[is_const<const volatile int>::value? 1 : -1];
47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const3[is_const<const int [3]>::value? 1 : -1];
48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const4[is_const<const volatile int[3]>::value? 1 : -1];
49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_const5[is_const<volatile int[3]>::value? -1 : 1];
50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_volatile {
53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_volatile<volatile T> {
58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_volatile0[is_volatile<int>::value? -1 : 1];
62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_volatile1[is_volatile<volatile int>::value? 1 : -1];
63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_volatile2[is_volatile<const volatile int>::value? 1 : -1];
64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_volatile3[is_volatile<volatile char[3]>::value? 1 : -1];
65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_same {
68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_same<T, T> {
73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotypedef int INT;
77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotypedef INT* int_ptr;
78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_same0[is_same<int, int>::value? 1 : -1];
80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_same1[is_same<int, INT>::value? 1 : -1];
81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_same2[is_same<const int, int>::value? -1 : 1];
82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_same3[is_same<int_ptr, int>::value? -1 : 1];
83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_reference {
86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_reference<T&> {
91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_ref0[is_same<remove_reference<int>::type, int>::value? 1 : -1];
95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_ref1[is_same<remove_reference<int&>::type, int>::value? 1 : -1];
96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_const {
99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_const<const T> {
104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_const0[is_same<remove_const<const int>::type, int>::value? 1 : -1];
108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_const1[is_same<remove_const<const int[3]>::type, int[3]>::value? 1 : -1];
109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_incomplete_array {
112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_incomplete_array<T[]> {
117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint incomplete_array0[is_incomplete_array<int>::value ? -1 : 1];
121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint incomplete_array1[is_incomplete_array<int[1]>::value ? -1 : 1];
122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint incomplete_array2[is_incomplete_array<bool[]>::value ? 1 : -1];
123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint incomplete_array3[is_incomplete_array<int[]>::value ? 1 : -1];
124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_array_with_4_elements {
127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_array_with_4_elements<T[4]> {
132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array_with_4_elements0[is_array_with_4_elements<int[]>::value ? -1 : 1];
136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array_with_4_elements1[is_array_with_4_elements<int[1]>::value ? -1 : 1];
137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array_with_4_elements2[is_array_with_4_elements<int[4]>::value ? 1 : -1];
138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array_with_4_elements3[is_array_with_4_elements<int[4][2]>::value ? 1 : -1];
139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct get_array_size;
142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, unsigned N>
144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct get_array_size<T[N]> {
145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const unsigned value = N;
146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint array_size0[get_array_size<int[12]>::value == 12? 1 : -1];
149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_extent {
152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_extent<T[]> {
157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, unsigned N>
161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct remove_extent<T[N]> {
162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T type;
163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_extent0[is_same<remove_extent<int[][5]>::type, int[5]>::value? 1 : -1];
166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint remove_extent1[is_same<remove_extent<const int[][5]>::type, const int[5]>::value? 1 : -1];
167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_unary_function {
170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_unary_function<T (*)(U)> {
175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function0[is_unary_function<int>::value ? -1 : 1];
179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function1[is_unary_function<int (*)()>::value ? -1 : 1];
180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function2[is_unary_function<int (*)(int, bool)>::value ? -1 : 1];
181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function3[is_unary_function<int (*)(bool)>::value ? 1 : -1];
182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function4[is_unary_function<int (*)(int)>::value ? 1 : -1];
183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_unary_function_with_same_return_type_as_argument_type {
186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_unary_function_with_same_return_type_as_argument_type<T (*)(T)> {
191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function5[is_unary_function_with_same_return_type_as_argument_type<int>::value ? -1 : 1];
195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function6[is_unary_function_with_same_return_type_as_argument_type<int (*)()>::value ? -1 : 1];
196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function7[is_unary_function_with_same_return_type_as_argument_type<int (*)(int, bool)>::value ? -1 : 1];
197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function8[is_unary_function_with_same_return_type_as_argument_type<int (*)(bool)>::value ? -1 : 1];
198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function9[is_unary_function_with_same_return_type_as_argument_type<int (*)(int)>::value ? 1 : -1];
199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function10[is_unary_function_with_same_return_type_as_argument_type<int (*)(int, ...)>::value ? -1 : 1];
200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_unary_function11[is_unary_function_with_same_return_type_as_argument_type<int (* const)(int)>::value ? -1 : 1];
201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_binary_function {
204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename R, typename T1, typename T2>
208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_binary_function<R(T1, T2)> {
209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_binary_function0[is_binary_function<int(float, double)>::value? 1 : -1];
213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_pointer {
216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class>
220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_pointer<T Class::*> {
221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X { };
225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer0[is_member_pointer<int X::*>::value? 1 : -1];
227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer1[is_member_pointer<const int X::*>::value? 1 : -1];
228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer2[is_member_pointer<int (X::*)()>::value? 1 : -1];
229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer3[is_member_pointer<int (X::*)(int) const>::value? 1 : -1];
230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer4[is_member_pointer<int (X::**)(int) const>::value? -1 : 1];
231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_pointer5[is_member_pointer<int>::value? -1 : 1];
232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer {
235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class>
239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)()> {
240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class>
244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)() const> {
245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class>
249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)() volatile> {
250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class>
254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)() const volatile> {
255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class, typename A1>
259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)(A1)> {
260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class, typename A1>
264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)(A1) const> {
265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class, typename A1>
269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)(A1) volatile> {
270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Class, typename A1>
274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_member_function_pointer<T (Class::*)(A1) const volatile> {
275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_function_pointer0[
279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                          is_member_function_pointer<int X::*>::value? -1 : 1];
280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_function_pointer1[
281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                      is_member_function_pointer<int (X::*)()>::value? 1 : -1];
282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_function_pointer2[
283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                      is_member_function_pointer<X (X::*)(X&)>::value? 1 : -1];
284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_function_pointer3[
285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           is_member_function_pointer<int (X::*)() const>::value? 1 : -1];
286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_member_function_pointer4[
287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           is_member_function_pointer<int (X::*)(float) const>::value? 1 : -1];
288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Test substitution of non-dependent arguments back into the template
290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// argument list of the class template partial specialization.
291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename ValueType = T>
292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_nested_value_type_identity {
293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = false;
294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct is_nested_value_type_identity<T, typename T::value_type> {
298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static const bool value = true;
299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct HasValueType {
303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef T value_type;
304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
305ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
306ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct HasIdentityValueType {
307ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef HasIdentityValueType value_type;
308ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
309ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
310ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct NoValueType { };
311ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
312ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_nested_value_type_identity0[
313ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            is_nested_value_type_identity<HasValueType<int> >::value? -1 : 1];
314ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_nested_value_type_identity1[
315ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao          is_nested_value_type_identity<HasIdentityValueType>::value? 1 : -1];
316ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint is_nested_value_type_identity2[
317ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                   is_nested_value_type_identity<NoValueType>::value? -1 : 1];
318ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
319ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
320ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// C++ [temp.class.spec]p4:
321ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1, class T2, int I> class A { }; //#1
322ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T, int I> class A<T, T*, I> { }; //#2
323ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1, class T2, int I> class A<T1*, T2, I> { }; //#3
324ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T> class A<int, T*, 5> { }; //#4
325ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1, class T2, int I> class A<T1, T2*, I> { }; //#5
326ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
327ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Redefinition of class template partial specializations
328ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, T N, typename U> class A0;
329ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
330ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, T N> class A0<T, N, int> { }; // expected-note{{here}}
331ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, T N> class A0<T, N, int>;
332ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, T N> class A0<T, N, int> { }; // expected-error{{redef}}
333ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
334ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace PR6025 {
335ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template< int N > struct A;
336ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
337ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  namespace N
338ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  {
339ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    template< typename F >
340ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    struct B;
341ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
342ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
343ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template< typename Protect, typename Second >
344ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  struct C;
345ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
346ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template <class T>
347ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  struct C< T, A< N::B<T>::value > >
348ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  {
349ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  };
350ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
351ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
352ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace PR6181 {
353ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template <class T>
354ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class a;
355ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
356ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class s;
357ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
358ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template <class U>
359ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class a<s> // expected-error{{partial specialization of 'a' does not use any of its template parameters}}
360ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  {
361ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  };
362ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
363ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
364