xref: /llvm-project/clang/test/CXX/expr/expr.prim/expr.prim.lambda/expr.prim.lambda.capture/p17.cpp (revision b2997f579a8b6552a49eab97e33c437b9251eb0a)
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 Smith template<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 Smith auto q = [...x = 0] {}; // expected-error {{does not contain any unexpanded parameter packs}}
34*b2997f57SRichard Smith 
nested(T...t)35*b2997f57SRichard Smith template<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