1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
27a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor
37a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregortemplate<typename T, T ...Values> struct value_tuple {};
46952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregortemplate<typename...> struct tuple { };
56952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregortemplate<typename T, typename U> struct pair { };
66952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
76952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregortemplate<typename T, T Value> struct value_c;
86952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
96952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregortemplate<typename T, typename U>
106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregorstruct is_same {
116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  static const bool value = false;
126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor};
136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregortemplate<typename T>
156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregorstruct is_same<T, T> {
166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  static const bool value = true;
176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor};
187a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor
197a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregortemplate<typename T>
207a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregorstruct X0 {
217a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor  template<T ...Values>
227a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor  void f(value_tuple<T, Values...> * = 0);
237a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor};
247a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor
257a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregorvoid test_X0() {
267a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor  X0<int>().f<1, 2, 3, 4, 5>();
277a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor}
28c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
29c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregornamespace PacksAtDifferentLevels {
30c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
31c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  template<typename ...Types>
32c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  struct X {
33cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    template<typename> struct Inner {
34cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      static const unsigned value = 1;
35cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    };
36c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
37c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    template<typename ...YTypes>
38c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    struct Inner<tuple<pair<Types, YTypes>...> > {
39cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      static const unsigned value = sizeof...(Types) - sizeof...(YTypes);
40c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    };
41c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  };
42c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
43c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  int check0[X<short, int, long>::Inner<tuple<pair<short, unsigned short>,
44c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                             pair<int, unsigned int>,
45c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                             pair<long, unsigned long>>
46cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                       >::value == 0? 1 : -1];
47cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
48cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  int check1[X<short, int>::Inner<tuple<pair<short, unsigned short>,
49cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                        pair<int, unsigned int>,
50cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                        pair<long, unsigned long>>
51cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                       >::value == 1? 1 : -1];
5267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor
5367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  template<unsigned ...Values> struct unsigned_tuple { };
5467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  template<typename ...Types>
5567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  struct X1 {
5667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    template<typename, typename> struct Inner {
5767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      static const unsigned value = 0;
5867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    };
5967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor
6067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    template<typename ...YTypes>
6167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    struct Inner<tuple<pair<Types, YTypes>...>,
6267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                 unsigned_tuple<sizeof(Types) + sizeof(YTypes)...>> {
6367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      static const unsigned value = 1;
6467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    };
6567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  };
6667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor
6767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  int check2[X1<short, int, long>::Inner<tuple<pair<short, unsigned short>,
6867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                               pair<int, unsigned int>,
6967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                               pair<long, unsigned long>>,
7067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                      unsigned_tuple<sizeof(short) + sizeof(unsigned short),
7167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     sizeof(int) + sizeof(unsigned int),
7267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     sizeof(long) + sizeof(unsigned long)>
7367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                       >::value == 1? 1 : -1];
7467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  int check3[X1<short, int>::Inner<tuple<pair<short, unsigned short>,
7567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                         pair<int, unsigned int>,
7667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                         pair<long, unsigned long>>,
7767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                      unsigned_tuple<sizeof(short) + sizeof(unsigned short),
7867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     sizeof(int) + sizeof(unsigned int),
7967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     sizeof(long) + sizeof(unsigned long)>
8067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                       >::value == 0? 1 : -1];
816a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
826a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  template<typename ...Types>
836a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  struct X2 {
846a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    template<typename> struct Inner {
856a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      static const unsigned value = 1;
866a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    };
876a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
886a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    template<typename R, typename ...YTypes>
896a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    struct Inner<R(pair<Types, YTypes>...)> {
906a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      static const unsigned value = sizeof...(Types) - sizeof...(YTypes);
916a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    };
926a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  };
936a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
946a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  int check4[X2<short, int, long>::Inner<int(pair<short, unsigned short>,
956a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                            pair<int, unsigned int>,
966a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                            pair<long, unsigned long>)
976a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                     >::value == 0? 1 : -1];
986a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
996a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  int check5[X2<short, int>::Inner<int(pair<short, unsigned short>,
1006a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                       pair<int, unsigned int>,
1016a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                       pair<long, unsigned long>)
1026a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                     >::value == 1? 1 : -1];
1032be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
1042be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  template<typename T, typename U>
1052be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  struct some_function_object {
1062be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    template<typename>
1072be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    struct result_of;
1082be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  };
1092be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
1102be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  template<template<class> class...> struct metafun_tuple { };
1112be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
1122be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  template<typename ...Types1>
1132be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  struct X3 {
1142be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    template<typename, typename> struct Inner {
1152be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor      static const unsigned value = 0;
1162be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    };
1172be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
1182be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    template<typename ...Types2>
1192be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    struct Inner<tuple<pair<Types1, Types2>...>,
1202be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                 metafun_tuple<some_function_object<Types1, Types2>::template result_of...> > {
1212be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor      static const unsigned value = 1;
1222be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    };
1232be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  };
1242be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
1252be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  int check6[X3<short, int, long>::Inner<tuple<pair<short, unsigned short>,
1262be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                               pair<int, unsigned int>,
1272be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                               pair<long, unsigned long>>,
1282be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                 metafun_tuple<
1292be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<short, unsigned short>::result_of,
1302be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<int, unsigned int>::result_of,
1312be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<long, unsigned long>::result_of>
1322be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                     >::value == 1? 1 : -1];
1332be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  int check7[X3<short, int>::Inner<tuple<pair<short, unsigned short>,
1342be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                               pair<int, unsigned int>,
1352be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                               pair<long, unsigned long>>,
1362be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                 metafun_tuple<
1372be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<short, unsigned short>::result_of,
1382be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<int, unsigned int>::result_of,
1392be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                         some_function_object<long, unsigned long>::result_of>
1402be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                     >::value == 0? 1 : -1];
141c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
142c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  template<unsigned I, unsigned J> struct unsigned_pair { };
143c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
144c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  template<unsigned ...Values1>
145c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  struct X4 {
146c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    template<typename> struct Inner {
147c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      static const unsigned value = 0;
148c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    };
149c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
150c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    template<unsigned ...Values2>
151c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    struct Inner<tuple<unsigned_pair<Values1, Values2>...>> {
152c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      static const unsigned value = 1;
153c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    };
154c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  };
155c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
156c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  int check8[X4<1, 3, 5>::Inner<tuple<unsigned_pair<1, 2>,
157c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                      unsigned_pair<3, 4>,
158c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                      unsigned_pair<5, 6>>
159c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                >::value == 1? 1 : -1];
160c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  int check9[X4<1, 3>::Inner<tuple<unsigned_pair<1, 2>,
161c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                   unsigned_pair<3, 4>,
162c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                   unsigned_pair<5, 6>>
163c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                             >::value == 0? 1 : -1];
1641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  template<class> struct add_reference;
1661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  template<class> struct add_pointer;
1671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  template<class> struct add_const;
1681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  template<template<class> class ...Templates>
1701aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  struct X5 {
1711aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    template<typename> struct Inner {
1721aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      static const unsigned value = 0;
1731aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    };
1741aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1751aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    template<typename ...Types>
1761aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    struct Inner<tuple<Templates<Types>...>> {
1771aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      static const unsigned value = 1;
1781aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    };
1791aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  };
1801aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1811aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  int check10[X5<add_reference, add_pointer, add_const>
1821aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                ::Inner<tuple<add_reference<int>,
1831aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              add_pointer<float>,
1841aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              add_const<double>>>::value == 1? 1 : -1];
1851aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  int check11[X5<add_reference, add_pointer>
1861aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                ::Inner<tuple<add_reference<int>,
1871aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              add_pointer<float>,
1881aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              add_const<double>>>::value == 0? 1 : -1];
1891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
190c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
1916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
1926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregornamespace ExpandingNonTypeTemplateParameters {
1936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  template<typename ...Types>
1946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  struct tuple_of_values {
1956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    template<Types ...Values> // expected-error{{a non-type template parameter cannot have type 'float'}} \
1966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    // expected-note{{template parameter is declared here}}
1976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    struct apply { // expected-note 2{{template is declared here}}
1986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      typedef tuple<value_c<Types, Values>...> type;
1996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    };
2006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  };
2016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
2026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  int i;
2036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  float f;
2046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  int check_tuple_of_values_1[
2056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        is_same<tuple_of_values<int&, float&, char, int>::apply<i, f, 'a', 17>
2066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                  ::type,
2076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                tuple<value_c<int&, i>, value_c<float&, f>, value_c<char, 'a'>,
2086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                      value_c<int, 17>>
2096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                >::value? 1 : -1];
2106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
2116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  tuple_of_values<int, float> tv1; // expected-note{{in instantiation of template class 'ExpandingNonTypeTemplateParameters::tuple_of_values<int, float>' requested here}}
2126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
2136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  tuple_of_values<int&, float&>::apply<i, i>::type tv2; // expected-error{{non-type template parameter of reference type 'float &' cannot bind to template argument of type 'int'}}
2146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
2156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  tuple_of_values<int&, float&>::apply<i>::type tv3; // expected-error{{too few template arguments for class template 'apply'}}
2166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
2176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  tuple_of_values<int&, float&>::apply<i, f, i>::type tv4; // expected-error{{too many template arguments for class template 'apply'}}
2186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
219406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
220406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregornamespace ExpandingFunctionParameters {
221406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  template<typename ...T>
222406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  struct X0 {
223406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    typedef int type;
224406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  };
225406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
226406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  template<typename ...T>
227406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  struct X1 {
228406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    template<typename ... U>
229406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    typename X0<T(T, U...)...>::type f(U...);
230406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  };
231406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
232406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  void test() {
233406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    X1<float> x1;
234406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    x1.f(17, 3.14159);
235406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  }
236406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor}
237089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor
238089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregornamespace PR10230 {
239089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  template<typename>
240089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  struct s
241089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  {
242089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor    template<typename... Args>
243089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor    auto f() -> int(&)[sizeof...(Args)];
244089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  };
245089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor
246089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  void main()
247089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  {
248089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor    int (&ir1)[1] = s<int>().f<int>();
249089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor    int (&ir3)[3] = s<int>().f<int, float, double>();
250089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor  }
251089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor}
252500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
253500d729e85028944355a119f9823ac99fa5ddcabRichard Smithnamespace PR13386 {
254500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  template<typename...> struct tuple {};
255500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  template<typename...T>
256500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  struct S {
257500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    template<typename...U>
258500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    void f(T &&...t, U &&...u) {} // expected-note {{candidate}}
259500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    template<typename...U>
260500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    void g(U &&...u, T &&...t) {} // expected-note {{candidate}}
261500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    template<typename...U>
262500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    void h(tuple<T, U> &&...) {} // expected-note 2{{candidate}}
263500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
264500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    template<typename...U>
265500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    struct X {
266500d729e85028944355a119f9823ac99fa5ddcabRichard Smith      template<typename...V>
267500d729e85028944355a119f9823ac99fa5ddcabRichard Smith      void x(tuple<T, U, V> &&...); // expected-error {{different lengths}}
268500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    };
269500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  };
270500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
271500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  void test() {
272500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().f();
273500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().f(0);
274500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().f(0);
275500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().f(0, 1);
276500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int, int>().f(0); // expected-error {{no matching member function for call}}
277500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
278500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().g();
279500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().g(0);
280500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().g(0);
281500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().g(0, 1); // expected-error {{no matching member function for call}}
282500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().g<int>(0, 1);
283500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int, int>().g(0, 1);
284500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
285500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().h();
286500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<>().h(0); // expected-error {{no matching member function for call}}
287500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().h({}); // expected-error {{no matching member function for call}}
288500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().h<int>({});
289500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int>().h(tuple<int,int>{});
290500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int, int>().h(tuple<int,int>{}, tuple<int,int>{});
291500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
292500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    S<int, int>::X<char>(); // expected-note {{here}}
293500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  }
294500d729e85028944355a119f9823ac99fa5ddcabRichard Smith}
295