p9-0x.cpp revision 762bb9d0ad20320b9f97a841dce57ba5e8e48b07
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3template<typename ...Types> struct tuple; 4template<unsigned> struct unsigned_c; 5 6template<typename T, typename U> 7struct is_same { 8 static const bool value = false; 9}; 10 11template<typename T> 12struct is_same<T, T> { 13 static const bool value = true; 14}; 15 16namespace PackExpansionNotAtEnd { 17 template<typename T, typename U> 18 struct tuple_same_with_int { 19 static const bool value = false; 20 }; 21 22 template<typename ...Types> 23 struct tuple_same_with_int<tuple<Types...>, tuple<Types..., int>> { 24 static const bool value = true; 25 }; 26 27 int tuple_same_with_int_1[tuple_same_with_int<tuple<int, float, double>, 28 tuple<int, float, double, int> 29 >::value? 1 : -1]; 30 31 template<typename ... Types> struct UselessPartialSpec; 32 33 template<typename ... Types, // expected-note{{non-deducible template parameter 'Types'}} 34 typename Tail> // expected-note{{non-deducible template parameter 'Tail'}} 35 struct UselessPartialSpec<Types..., Tail>; // expected-warning{{class template partial specialization contains template parameters that can not be deduced; this partial specialization will never be used}} 36} 37 38namespace DeduceNonTypeTemplateArgsInArray { 39 template<typename ...ArrayTypes> 40 struct split_arrays; 41 42 template<typename ...ElementTypes, unsigned ...Bounds> 43 struct split_arrays<ElementTypes[Bounds]...> { 44 typedef tuple<ElementTypes...> element_types; 45 46 // FIXME: Would like to have unsigned_tuple<Bounds...> here. 47 typedef tuple<unsigned_c<Bounds>...> bounds_types; 48 }; 49 50 int check1[is_same<split_arrays<int[1], float[2], double[3]>::element_types, 51 tuple<int, float, double>>::value? 1 : -1]; 52 int check2[is_same<split_arrays<int[1], float[2], double[3]>::bounds_types, 53 tuple<unsigned_c<1>, unsigned_c<2>, unsigned_c<3>> 54 >::value? 1 : -1]; 55} 56