19beaf20b882eb83082da27a74760277bb9fc0bddRichard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify -Wno-c++1y-extensions
20d8e9646bc000bab521ce52ed294209a92298cefRichard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++1y %s -verify
3a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
4a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid print();
5a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
6a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename T, typename... Ts>
7a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid print(T first, Ts... rest) {
8a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  (void)first;
9a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  print(rest...);
10a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
11a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
12a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename... Ts>
13612409ece080e814f79e06772c690d603f45fbd6Richard Smithvoid unexpanded_capture(Ts ...values) {
14612409ece080e814f79e06772c690d603f45fbd6Richard Smith  auto unexp = [values] {}; // expected-error{{initializer contains unexpanded parameter pack 'values'}}
15a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
16a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
17a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename... Ts>
18a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid implicit_capture(Ts ...values) {
19a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto implicit = [&] { print(values...); };
20a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  implicit();
21a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
22a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
23a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename... Ts>
24a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid do_print(Ts... values) {
25a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto bycopy = [values...]() { print(values...); };
26a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  bycopy();
27a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto byref = [&values...]() { print(values...); };
28a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  byref();
29a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
30a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto bycopy2 = [=]() { print(values...); };
31a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  bycopy2();
32a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto byref2 = [&]() { print(values...); };
33a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  byref2();
34a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
35a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
36a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate void do_print(int, float, double);
37a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
38a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename T, int... Values>
39a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid bogus_expansions(T x) {
40a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto l1 = [x...] {}; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
41a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto l2 = [Values...] {}; // expected-error{{'Values' in capture list does not name a variable}}
42a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
43a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
44a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid g(int*, float*, double*);
45a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
46a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<class... Args>
47a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid std_example(Args... args) {
48a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto lm = [&, args...] { return g(args...); };
49a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor};
50a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
51a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate void std_example(int*, float*, double*);
52a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
53a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate<typename ...Args>
54a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregorvoid variadic_lambda(Args... args) {
55a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  auto lambda = [](Args... inner_args) { return g(inner_args...); };
56a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor  lambda(args...);
57a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor}
58a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregor
59a73652465bcc4c0f6cb7d933ad84e002b527a643Douglas Gregortemplate void variadic_lambda(int*, float*, double*);
600d8e9646bc000bab521ce52ed294209a92298cefRichard Smith
610d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename ...Args>
620d8e9646bc000bab521ce52ed294209a92298cefRichard Smithvoid init_capture_pack_err(Args ...args) {
630d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  [as(args)...] {} (); // expected-error {{expected ','}}
640d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  [as...(args)]{} (); // expected-error {{expected ','}}
650d8e9646bc000bab521ce52ed294209a92298cefRichard Smith}
660d8e9646bc000bab521ce52ed294209a92298cefRichard Smith
670d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename ...Args>
680d8e9646bc000bab521ce52ed294209a92298cefRichard Smithvoid init_capture_pack_multi(Args ...args) {
6904fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith  [as(args...)] {} (); // expected-error {{initializer missing for lambda capture 'as'}} expected-error {{multiple}}
700d8e9646bc000bab521ce52ed294209a92298cefRichard Smith}
710d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_multi(); // expected-note {{instantiation}}
720d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_multi(int);
730d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_multi(int, int); // expected-note {{instantiation}}
740d8e9646bc000bab521ce52ed294209a92298cefRichard Smith
750d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename ...Args>
760d8e9646bc000bab521ce52ed294209a92298cefRichard Smithvoid init_capture_pack_outer(Args ...args) {
770d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  print([as(args)] { return sizeof(as); } () ...);
780d8e9646bc000bab521ce52ed294209a92298cefRichard Smith}
790d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_outer();
800d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_outer(int);
810d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_capture_pack_outer(int, int);
82