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 1909a4db032ecd991626d236a502e770126db32bd31Richard Smith namespace PR13811 { 1919a4db032ecd991626d236a502e770126db32bd31Richard Smith constexpr int g(int n, int m) { return n * 10 + m; } 1929a4db032ecd991626d236a502e770126db32bd31Richard Smith 1939a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...A> 1949a4db032ecd991626d236a502e770126db32bd31Richard Smith struct X6 { 1959a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...B> 196840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr auto f1(A ...a) const -> decltype(g(A(a + B())...)) { return g(A(a + B())...); } 1979a4db032ecd991626d236a502e770126db32bd31Richard Smith 1989a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...B> 199840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr auto f2(A ...a, B ...b) const -> decltype(g((&a)[b] ...)) { return g((&a)[b] ...); } // expected-note {{past-the-end}} 2009a4db032ecd991626d236a502e770126db32bd31Richard Smith 2019a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...B> struct Inner { 2029a4db032ecd991626d236a502e770126db32bd31Richard Smith template<typename...C> 203840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr auto f(A ...a, B ...b, C ...c) const -> decltype(g(a+b+c...)) { return g(a+b+c...); } 2049a4db032ecd991626d236a502e770126db32bd31Richard Smith }; 2059a4db032ecd991626d236a502e770126db32bd31Richard Smith }; 206840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith struct A { constexpr operator int() const { return 2; } }; 207840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith struct B { constexpr operator int() const { return 1; } }; 2089a4db032ecd991626d236a502e770126db32bd31Richard Smith 2099a4db032ecd991626d236a502e770126db32bd31Richard Smith static_assert(X6<unsigned char, int>().f1<A, B>(255, 1) == 12, ""); 2109a4db032ecd991626d236a502e770126db32bd31Richard Smith static_assert(X6<int, int>().f2(3, 4, 0, 0) == 34, ""); 2119a4db032ecd991626d236a502e770126db32bd31Richard Smith static_assert(X6<int, int>().f2(3, 4, 0, 1) == 34, ""); // expected-error {{constant expression}} expected-note {{in call}} 2129a4db032ecd991626d236a502e770126db32bd31Richard Smith static_assert(X6<int, int>::Inner<int, int>().f(1, 2, 3, 4, 5, 6) == 102, ""); 2139a4db032ecd991626d236a502e770126db32bd31Richard Smith } 214c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 2156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregornamespace ExpandingNonTypeTemplateParameters { 2176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor template<typename ...Types> 2186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor struct tuple_of_values { 2196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor template<Types ...Values> // expected-error{{a non-type template parameter cannot have type 'float'}} \ 2206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // expected-note{{template parameter is declared here}} 2216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor struct apply { // expected-note 2{{template is declared here}} 2226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor typedef tuple<value_c<Types, Values>...> type; 2236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor }; 2246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor }; 2256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor int i; 2276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor float f; 2286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor int check_tuple_of_values_1[ 2296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor is_same<tuple_of_values<int&, float&, char, int>::apply<i, f, 'a', 17> 2306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ::type, 2316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor tuple<value_c<int&, i>, value_c<float&, f>, value_c<char, 'a'>, 2326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor value_c<int, 17>> 2336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor >::value? 1 : -1]; 2346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor tuple_of_values<int, float> tv1; // expected-note{{in instantiation of template class 'ExpandingNonTypeTemplateParameters::tuple_of_values<int, float>' requested here}} 2366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas 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'}} 2386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor tuple_of_values<int&, float&>::apply<i>::type tv3; // expected-error{{too few template arguments for class template 'apply'}} 2406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor tuple_of_values<int&, float&>::apply<i, f, i>::type tv4; // expected-error{{too many template arguments for class template 'apply'}} 2426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 243406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 244406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregornamespace ExpandingFunctionParameters { 245406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor template<typename ...T> 246406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor struct X0 { 247406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor typedef int type; 248406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor }; 249406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 250406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor template<typename ...T> 251406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor struct X1 { 252406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor template<typename ... U> 253406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor typename X0<T(T, U...)...>::type f(U...); 254406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor }; 255406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 256406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor void test() { 257406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor X1<float> x1; 258406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor x1.f(17, 3.14159); 259406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } 260406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor} 261089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor 262089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregornamespace PR10230 { 263089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor template<typename> 264089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor struct s 265089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor { 266089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor template<typename... Args> 267089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor auto f() -> int(&)[sizeof...(Args)]; 268089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor }; 269089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor 270089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor void main() 271089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor { 272089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor int (&ir1)[1] = s<int>().f<int>(); 273089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor int (&ir3)[3] = s<int>().f<int, float, double>(); 274089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor } 275089e8939b7b3e72c32477e39df82f18e6a8f436eDouglas Gregor} 276500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 277500d729e85028944355a119f9823ac99fa5ddcabRichard Smithnamespace PR13386 { 278500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...> struct tuple {}; 279500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...T> 280500d729e85028944355a119f9823ac99fa5ddcabRichard Smith struct S { 281500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...U> 282500d729e85028944355a119f9823ac99fa5ddcabRichard Smith void f(T &&...t, U &&...u) {} // expected-note {{candidate}} 283500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...U> 284500d729e85028944355a119f9823ac99fa5ddcabRichard Smith void g(U &&...u, T &&...t) {} // expected-note {{candidate}} 285500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...U> 286500d729e85028944355a119f9823ac99fa5ddcabRichard Smith void h(tuple<T, U> &&...) {} // expected-note 2{{candidate}} 287500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 288500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...U> 289500d729e85028944355a119f9823ac99fa5ddcabRichard Smith struct X { 290500d729e85028944355a119f9823ac99fa5ddcabRichard Smith template<typename...V> 291500d729e85028944355a119f9823ac99fa5ddcabRichard Smith void x(tuple<T, U, V> &&...); // expected-error {{different lengths}} 292500d729e85028944355a119f9823ac99fa5ddcabRichard Smith }; 293500d729e85028944355a119f9823ac99fa5ddcabRichard Smith }; 294500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 295500d729e85028944355a119f9823ac99fa5ddcabRichard Smith void test() { 296500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().f(); 297500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().f(0); 298500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().f(0); 299500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().f(0, 1); 300500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int, int>().f(0); // expected-error {{no matching member function for call}} 301500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 302500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().g(); 303500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().g(0); 304500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().g(0); 305500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().g(0, 1); // expected-error {{no matching member function for call}} 306500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().g<int>(0, 1); 307500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int, int>().g(0, 1); 308500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 309500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().h(); 310500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<>().h(0); // expected-error {{no matching member function for call}} 311500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().h({}); // expected-error {{no matching member function for call}} 312500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().h<int>({}); 313500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int>().h(tuple<int,int>{}); 314500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int, int>().h(tuple<int,int>{}, tuple<int,int>{}); 315500d729e85028944355a119f9823ac99fa5ddcabRichard Smith 316500d729e85028944355a119f9823ac99fa5ddcabRichard Smith S<int, int>::X<char>(); // expected-note {{here}} 317500d729e85028944355a119f9823ac99fa5ddcabRichard Smith } 318500d729e85028944355a119f9823ac99fa5ddcabRichard Smith} 319