P0409R2 - allow lambda capture [=, this]
P0409R2 - allow lambda capture [=, this] * parser.c (cp_parser_lambda_introducer): For cxx2a don't pedwarn on redundant [=, this]. * g++.dg/cpp1z/lambda-this1.C: Don't expect error for c++2a on [=, this] capture. Add further tests. * g++.dg/cpp0x/lambda/lambda-capture-redundancy.C: Don't expect error for c++2a on [=, this] capture. From-SVN: r253030
This commit is contained in:
parent
fb3cd39dcf
commit
2ffb574542
@ -1,3 +1,9 @@
|
||||
2017-09-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
P0409R2 - allow lambda capture [=, this]
|
||||
* parser.c (cp_parser_lambda_introducer): For cxx2a don't pedwarn on
|
||||
redundant [=, this].
|
||||
|
||||
2017-09-18 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/82069 - ICE with lambda in template
|
||||
|
@ -10183,7 +10183,8 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
|
||||
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THIS))
|
||||
{
|
||||
location_t loc = cp_lexer_peek_token (parser->lexer)->location;
|
||||
if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
|
||||
if (cxx_dialect < cxx2a
|
||||
&& LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
|
||||
pedwarn (loc, 0, "explicit by-copy capture of %<this%> redundant "
|
||||
"with by-copy capture default");
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
|
@ -1,5 +1,11 @@
|
||||
2017-09-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
P0409R2 - allow lambda capture [=, this]
|
||||
* g++.dg/cpp1z/lambda-this1.C: Don't expect error for c++2a on [=, this]
|
||||
capture. Add further tests.
|
||||
* g++.dg/cpp0x/lambda/lambda-capture-redundancy.C: Don't expect error
|
||||
for c++2a on [=, this] capture.
|
||||
|
||||
* g++.dg/cpp1z/cplusplus.C: Test that __cplusplus is equal to 201703L.
|
||||
* g++.dg/cpp1z/cplusplus_1z.C: New test.
|
||||
|
||||
|
@ -7,7 +7,7 @@ void S2::f(int i) {
|
||||
[&, i]{ }; // OK
|
||||
[&, &i]{ }; // { dg-error "" } i preceded by & when & is the default
|
||||
[=, i]{ }; // { dg-error "" } i not preceded by & when = is the default
|
||||
[=, this]{ }; // { dg-error "" } this when = is the default
|
||||
[=, this]{ }; // { dg-error "" "" { target c++17_down } } this when = is the default
|
||||
[i, i]{ }; // { dg-error "" } i repeated
|
||||
[this, this]{ }; // { dg-error "" } i repeated
|
||||
}
|
||||
|
@ -17,13 +17,31 @@ struct A {
|
||||
auto h = [*this] () mutable { a++; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
||||
auto i = [=] { return a; };
|
||||
auto j = [&] { return a; };
|
||||
auto k = [=, this] { return a; };// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" }
|
||||
// P0409R2 - C++2A lambda capture [=, this]
|
||||
auto k = [=, this] { return a; };// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } }
|
||||
auto l = [&, this] { return a; };
|
||||
auto m = [=, *this] { return a; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
||||
auto n = [&, *this] { return a; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
||||
auto o = [*this, &v] { return a + v; };// { dg-error "'*this' capture only available with" "" { target c++14_down } }
|
||||
auto p = [*this] { this = 0; }; // { dg-error "lvalue required as left operand of assignment" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
auto q = [=, this, *this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-2 }
|
||||
auto r = [=, this, this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-1 }
|
||||
auto s = [=, *this, this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
// { dg-error "explicit by-copy capture of 'this' redundant with by-copy capture default" "" { target c++17_down } .-2 }
|
||||
auto t = [=, *this, *this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
auto u = [&, this, *this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
auto w = [&, this, this] { return a; };// { dg-error "already captured 'this'" }
|
||||
auto x = [&, *this, this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
auto y = [&, *this, *this] { return a; };// { dg-error "already captured 'this'" }
|
||||
// { dg-error "'*this' capture only available with" "" { target c++14_down } .-1 }
|
||||
}
|
||||
};
|
||||
struct B {
|
||||
|
Loading…
Reference in New Issue
Block a user