P0409R2 - allow lambda capture [=, this]
authorJakub Jelinek <jakub@redhat.com>
Wed, 20 Sep 2017 19:36:47 +0000 (21:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 20 Sep 2017 19:36:47 +0000 (21:36 +0200)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C
gcc/testsuite/g++.dg/cpp1z/lambda-this1.C

index 01a03f9161ad958f19d49523d7d5183cf2ce0a9e..b4edd80419ee292246ecc06f439675edfcf1b5b7 100644 (file)
@@ -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
index c9cb3cbe55bb1955f356544264cb359eb8440cc9..25b91df278c19f5dc5515221e17c613dd8ee0648 100644 (file)
@@ -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);
index 7caf07a5617b818bd487ef61cd2c0502f9d644e1..801adf0def9c4d1f1ed25f9ef5f891a5b90d1a95 100644 (file)
@@ -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.
 
index 49fbdf32045c583b21f88bc7aa47b34b4d4692d9..baeb8144b31c64581184ebfbba4889fea0e72ed0 100644 (file)
@@ -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
 }
index 5a4c5f96b2dda6fe4fd29c83903998db4acf8dc7..a15438019b9a787cf1eaecdf43af8e8e8bfe0684 100644 (file)
@@ -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 {