// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify -Wno-c++1y-extensions -Wno-c++2a-extensions
// RUN: %clang_cc1 -fsyntax-only -std=c++1y %s -verify -Wno-c++2a-extensions
// RUN: %clang_cc1 -fsyntax-only -std=c++2a %s -verify

void print();

template<typename T, typename... Ts>
void print(T first, Ts... rest) {
  (void)first;
  print(rest...);
}

template<typename... Ts>
void unexpanded_capture(Ts ...values) {
  auto unexp = [values] {}; // expected-error{{initializer contains unexpanded parameter pack 'values'}}
}

template<typename... Ts>
void implicit_capture(Ts ...values) {
  auto implicit = [&] { print(values...); };
  implicit();
}

template<typename... Ts>
void do_print(Ts... values) {
  auto bycopy = [values...]() { print(values...); };
  bycopy();
  auto byref = [&values...]() { print(values...); };
  byref();

  auto bycopy2 = [=]() { print(values...); };
  bycopy2();
  auto byref2 = [&]() { print(values...); };
  byref2();
}

template void do_print(int, float, double);

template<typename T, int... Values>
void bogus_expansions(T x) {
  auto l1 = [x...] {}; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
  auto l2 = [Values...] {}; // expected-error{{'Values' in capture list does not name a variable}}
}

void g(int*, float*, double*);

template<class... Args>
void std_example(Args... args) {
  auto lm = [&, args...] { return g(args...); };
};

template void std_example(int*, float*, double*);

template<typename ...Args>
void variadic_lambda(Args... args) {
  auto lambda = [](Args... inner_args) { return g(inner_args...); };
  lambda(args...);
}

template void variadic_lambda(int*, float*, double*);

template<typename ...Args>
void init_capture_pack_err(Args ...args) {
  [...as(args)]{} ();
  [as(args)...] {} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}
  [as...(args)]{} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}
  [...as{args}]{} ();
  [as{args}...] {} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}
  [as...{args}]{} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}
  [...as = args]{} ();
  [as = args...] {} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}
  [as... = args]{} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}

  [&...as(args)]{} ();
  [...&as(args)]{} (); // expected-error {{ellipsis in pack init-capture must appear before the name of the capture}}

  [args...] {} ();
  [...args] {} (); // expected-error {{ellipsis in pack capture must appear after the name of the capture}}

  [&args...] {} ();
  [...&args] {} (); // expected-error {{ellipsis in pack capture must appear after the name of the capture}}
  [&...args] {} (); // expected-error {{ellipsis in pack capture must appear after the name of the capture}}
}

template<typename ...Args>
void init_capture_pack_multi(Args ...args) {
  [as(args...)] {} (); // expected-error {{initializer missing for lambda capture 'as'}} expected-error {{multiple}}
}
template void init_capture_pack_multi(); // expected-note {{instantiation}}
template void init_capture_pack_multi(int);
template void init_capture_pack_multi(int, int); // expected-note {{instantiation}}

template<typename ...Args>
void init_capture_pack_outer(Args ...args) {
  print([as(args)] { return sizeof(as); } () ...);
}
template void init_capture_pack_outer();
template void init_capture_pack_outer(int);
template void init_capture_pack_outer(int, int);
