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);
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.
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 {