1*24ad1215SRichard Smith // RUN: %clang_cc1 -std=c++11 %s -verify -Wno-c++14-extensions
253a9bdf1SDouglas Gregor
353a9bdf1SDouglas Gregor class X0 {
explicit_capture()453a9bdf1SDouglas Gregor void explicit_capture() {
553a9bdf1SDouglas Gregor int foo;
653a9bdf1SDouglas Gregor
7656bc62aSDouglas Gregor (void)[foo, foo] () {}; // expected-error {{'foo' can appear only once}}
8656bc62aSDouglas Gregor (void)[this, this] () {}; // expected-error {{'this' can appear only once}}
9656bc62aSDouglas Gregor (void)[=, foo] () {}; // expected-error {{'&' must precede a capture when}}
10656bc62aSDouglas Gregor (void)[=, &foo] () {};
11*24ad1215SRichard Smith (void)[=, this] () {}; // expected-warning {{C++20 extension}}
12656bc62aSDouglas Gregor (void)[&, foo] () {};
13656bc62aSDouglas Gregor (void)[&, &foo] () {}; // expected-error {{'&' cannot precede a capture when}}
14656bc62aSDouglas Gregor (void)[&, this] () {};
1553a9bdf1SDouglas Gregor }
1653a9bdf1SDouglas Gregor };
17136b2f24SDouglas Gregor
18a1bffa26SDouglas Gregor struct S2 {
19a1bffa26SDouglas Gregor void f(int i);
20a1bffa26SDouglas Gregor void g(int i);
21a1bffa26SDouglas Gregor };
22136b2f24SDouglas Gregor
f(int i)23136b2f24SDouglas Gregor void S2::f(int i) {
24136b2f24SDouglas Gregor (void)[&, i]{ };
25136b2f24SDouglas Gregor (void)[&, &i]{ }; // expected-error{{'&' cannot precede a capture when the capture default is '&'}}
26*24ad1215SRichard Smith (void)[=, this]{ }; // expected-warning{{C++20 extension}}
27a1bffa26SDouglas Gregor (void)[=]{ this->g(i); };
28136b2f24SDouglas Gregor (void)[i, i]{ }; // expected-error{{'i' can appear only once in a capture list}}
29ba71c085SRichard Smith (void)[i(0), i(1)]{ }; // expected-error{{'i' can appear only once in a capture list}}
30ba71c085SRichard Smith (void)[i, i(1)]{ }; // expected-error{{'i' can appear only once in a capture list}}
31ba71c085SRichard Smith (void)[i(0), i]{ }; // expected-error{{'i' can appear only once in a capture list}}
32136b2f24SDouglas Gregor }
33