// RUN: %clang_cc1 -std=c++2a -verify %s namespace p3 { void bar(...); template void foo(Args... args) { (void)[... xs = args] { bar(xs...); }; } void use() { foo(); foo(1); } } template void f(T ...t) { (void)[&...x = t] { x; // expected-error {{unexpanded parameter pack 'x'}} }; // Not OK: can't expand 'x' outside its scope. weird((void)[&...x = t] { return &x; // expected-error {{unexpanded parameter pack 'x'}} }... // expected-error {{does not contain any unexpanded}} ); // OK, capture only one 'slice' of 'x'. weird((void)[&x = t] { return &x; }... ); // 'x' is not expanded by the outer '...', but 'T' is. weird((void)[&... x = t] { return T() + &x; // expected-error {{unexpanded parameter pack 'x'}} }... // expected-error {{does not contain any unexpanded}} ); } template constexpr auto x = [...z = a] (auto F) { return F(z...); }; static_assert(x<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 123); static_assert(x<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 124); // expected-error {{failed}} template constexpr auto y = [z = a...] (auto F) { return F(z...); }; // expected-error {{must appear before the name of the capture}} static_assert(y<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 123); static_assert(y<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 124); // expected-error {{failed}}