19beaf20b882eb83082da27a74760277bb9fc0bddRichard Smith// RUN: %clang_cc1 -std=c++11 %s -verify -Wno-c++1y-extensions
293962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
393962e5360a43200faa70939571afc4fb9326cf7Douglas Gregorclass X0 {
493962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  void explicit_capture() {
593962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor    int foo;
693962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
7b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[foo, foo] () {}; // expected-error {{'foo' can appear only once}}
8b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[this, this] () {}; // expected-error {{'this' can appear only once}}
9b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[=, foo] () {}; // expected-error {{'&' must precede a capture when}}
10b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[=, &foo] () {};
113ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor    (void)[=, this] () {}; // expected-error {{'this' cannot be explicitly captured}}
12b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&, foo] () {};
13b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&, &foo] () {}; // expected-error {{'&' cannot precede a capture when}}
14b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&, this] () {};
1593962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  }
1693962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor};
1793e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor
183ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregorstruct S2 {
193ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor  void f(int i);
203ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor  void g(int i);
213ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor};
2293e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor
2393e2fa488740a68604a4069ac61eba398de7275dDouglas Gregorvoid S2::f(int i) {
2493e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor  (void)[&, i]{ };
2593e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor  (void)[&, &i]{ }; // expected-error{{'&' cannot precede a capture when the capture default is '&'}}
263ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor  (void)[=, this]{ }; // expected-error{{'this' cannot be explicitly captured}}
273ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0Douglas Gregor  (void)[=]{ this->g(i); };
2893e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor  (void)[i, i]{ }; // expected-error{{'i' can appear only once in a capture list}}
290d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  (void)[i(0), i(1)]{ }; // expected-error{{'i' can appear only once in a capture list}}
300d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  (void)[i, i(1)]{ }; // expected-error{{'i' can appear only once in a capture list}}
310d8e9646bc000bab521ce52ed294209a92298cefRichard Smith  (void)[i(0), i]{ }; // expected-error{{'i' can appear only once in a capture list}}
3293e2fa488740a68604a4069ac61eba398de7275dDouglas Gregor}
33