xref: /llvm-project/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p23.cpp (revision 2589b9808e2a08ee51b2b0e03164303d2b74c6ed)
1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
2 
3 void print();
4 
5 template<typename T, typename... Ts>
6 void print(T first, Ts... rest) {
7   (void)first;
8   print(rest...);
9 }
10 
11 template<typename... Ts>
12 void unexpanded_capture(Ts ...values) {
13   auto unexp = [values] {}; // expected-error{{initializer contains unexpanded parameter pack 'values'}}
14 }
15 
16 template<typename... Ts>
17 void implicit_capture(Ts ...values) {
18   auto implicit = [&] { print(values...); };
19   implicit();
20 }
21 
22 template<typename... Ts>
23 void do_print(Ts... values) {
24   auto bycopy = [values...]() { print(values...); };
25   bycopy();
26   auto byref = [&values...]() { print(values...); };
27   byref();
28 
29   auto bycopy2 = [=]() { print(values...); };
30   bycopy2();
31   auto byref2 = [&]() { print(values...); };
32   byref2();
33 }
34 
35 template void do_print(int, float, double);
36 
37 template<typename T, int... Values>
38 void bogus_expansions(T x) {
39   auto l1 = [x...] {}; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
40   auto l2 = [Values...] {}; // expected-error{{'Values' in capture list does not name a variable}}
41 }
42 
43 void g(int*, float*, double*);
44 
45 template<class... Args>
46 void std_example(Args... args) {
47   auto lm = [&, args...] { return g(args...); };
48 };
49 
50 template void std_example(int*, float*, double*);
51 
52 template<typename ...Args>
53 void variadic_lambda(Args... args) {
54   auto lambda = [](Args... inner_args) { return g(inner_args...); };
55   lambda(args...);
56 }
57 
58 template void variadic_lambda(int*, float*, double*);
59