1*b2997f57SRichard Smith // RUN: %clang_cc1 -std=c++2a -verify %s 2*b2997f57SRichard Smith 3*b2997f57SRichard Smith namespace std_example { 4*b2997f57SRichard Smith namespace std { template<typename T> T &&move(T &); } 5*b2997f57SRichard Smith 6*b2997f57SRichard Smith void g(...); 7*b2997f57SRichard Smith f(Args...args)8*b2997f57SRichard Smith template <class... Args> void f(Args... args) { 9*b2997f57SRichard Smith auto lm = [&, args...] { return g(args...); }; 10*b2997f57SRichard Smith lm(); 11*b2997f57SRichard Smith 12*b2997f57SRichard Smith auto lm2 = [... xs = std::move(args)] { return g(xs...); }; 13*b2997f57SRichard Smith lm2(); 14*b2997f57SRichard Smith } 15*b2997f57SRichard Smith } 16*b2997f57SRichard Smith f(int k,T...t)17*b2997f57SRichard Smithtemplate<typename ...T> constexpr int f(int k, T ...t) { 18*b2997f57SRichard Smith auto a = [...v = t] (bool b) mutable { 19*b2997f57SRichard Smith if (!b) { 20*b2997f57SRichard Smith ((v += 1), ...); 21*b2997f57SRichard Smith return (__SIZE_TYPE__)0; 22*b2997f57SRichard Smith } 23*b2997f57SRichard Smith return (v * ... * 1) + sizeof...(v); 24*b2997f57SRichard Smith }; 25*b2997f57SRichard Smith for (int i = 0; i != k; ++i) 26*b2997f57SRichard Smith a(false); 27*b2997f57SRichard Smith return a(true); 28*b2997f57SRichard Smith } 29*b2997f57SRichard Smith 30*b2997f57SRichard Smith static_assert(f(1, 2, 3, 4) == 3 * 4 * 5 + 3); 31*b2997f57SRichard Smith static_assert(f(5) == 1); 32*b2997f57SRichard Smith __anon12e3667a0402null33*b2997f57SRichard Smithauto q = [...x = 0] {}; // expected-error {{does not contain any unexpanded parameter packs}} 34*b2997f57SRichard Smith nested(T...t)35*b2997f57SRichard Smithtemplate<typename ...T> constexpr int nested(T ...t) { 36*b2997f57SRichard Smith return [...a = t] { 37*b2997f57SRichard Smith return [a...] { 38*b2997f57SRichard Smith return (a + ...); 39*b2997f57SRichard Smith }(); 40*b2997f57SRichard Smith }(); 41*b2997f57SRichard Smith } 42*b2997f57SRichard Smith static_assert(nested(1, 2, 3) == 6); 43