17974c60375b2b9dfc20defc77c9ed8c3d6d241a1Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
2c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
3c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorvoid defargs() {
4c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l1 = [](int i, int j = 17, int k = 18) { return i + j + k; };
5c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  int i1 = l1(1);
6c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  int i2 = l1(1, 2);
7c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  int i3 = l1(1, 2, 3);
8c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor}
9c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
10c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
11c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorvoid defargs_errors() {
12c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l1 = [](int i,
13c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor               int j = 17,
14c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor               int k) { }; // expected-error{{missing default argument on parameter 'k'}}
15c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
16c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l2 = [](int i, int j = i) {}; // expected-error{{default argument references parameter 'i'}}
17c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
18c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  int foo;
19c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l3 = [](int i = foo) {}; // expected-error{{default argument references local variable 'foo' of enclosing function}}
20c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor}
21c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
22c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorstruct NonPOD {
23c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  NonPOD();
24c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  NonPOD(const NonPOD&);
25c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  ~NonPOD();
26c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor};
27c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
28c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorstruct NoDefaultCtor {
29c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  NoDefaultCtor(const NoDefaultCtor&); // expected-note{{candidate constructor}}
30c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  ~NoDefaultCtor();
31c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor};
32c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
33c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate<typename T>
34c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorvoid defargs_in_template_unused(T t) {
35c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l1 = [](const T& value = T()) { };
36c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  l1(t);
37c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor}
38c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
39c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate void defargs_in_template_unused(NonPOD);
40c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate void defargs_in_template_unused(NoDefaultCtor);
41c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
42c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate<typename T>
43c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregorvoid defargs_in_template_used() {
44c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  auto l1 = [](const T& value = T()) { }; // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}}
45c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor  l1(); // expected-note{{in instantiation of default function argument expression for 'operator()<NoDefaultCtor>' required here}}
46c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor}
47c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
48c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate void defargs_in_template_used<NonPOD>();
49c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregortemplate void defargs_in_template_used<NoDefaultCtor>(); // expected-note{{in instantiation of function template specialization}}
50c6889e7ed16604c51994e1f11becf213fdc64eb3Douglas Gregor
51