blob: 7774b5c77fa8faf8d444cb78d6fbd7e3555d9716 [file] [log] [blame]
Richard Smith762bb9d2011-10-13 22:29:44 +00001// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
Douglas Gregor7b976ec2010-12-23 01:24:45 +00002
3template<typename ...Types> struct tuple;
Douglas Gregor6e4e17d2010-12-24 00:35:52 +00004template<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};
Douglas Gregor7b976ec2010-12-23 01:24:45 +000015
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
Douglas Gregor6e4e17d2010-12-24 00:35:52 +000033 template<typename ... Types, // expected-note{{non-deducible template parameter 'Types'}}
Douglas Gregor7b976ec2010-12-23 01:24:45 +000034 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}
Douglas Gregor6e4e17d2010-12-24 00:35:52 +000037
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}