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