* lambda.c (lambda_expr_this_capture): Improve logic.
authorJason Merrill <jason@redhat.com>
Thu, 10 May 2018 18:40:43 +0000 (14:40 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 10 May 2018 18:40:43 +0000 (14:40 -0400)
From-SVN: r260122

gcc/cp/ChangeLog
gcc/cp/lambda.c

index e70d3948eb156a160af33036a06cdcc16b72071d..544806d28a43f1e0b93a9da1dd96c7a0b7405ae6 100644 (file)
@@ -1,5 +1,7 @@
 2018-05-09  Jason Merrill  <jason@redhat.com>
 
+       * lambda.c (lambda_expr_this_capture): Improve logic.
+
        * decl.c (make_typename_type): s/parameters/arguments/.
        * parser.c (cp_parser_nested_name_specifier_opt): Likewise.
        * pt.c (make_pack_expansion): Correct error message.
index e9b962a8f3316cab44bf676f349e3371e49c775e..e3f22fcc5b9dec0b6fcb325016fb8ade2cca1094 100644 (file)
@@ -743,9 +743,7 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
     add_capture_p = false;
 
   /* Try to default capture 'this' if we can.  */
-  if (!this_capture
-      && (!add_capture_p
-          || LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) != CPLD_NONE))
+  if (!this_capture)
     {
       tree lambda_stack = NULL_TREE;
       tree init = NULL_TREE;
@@ -756,9 +754,15 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
            3. a non-default capturing lambda function.  */
       for (tree tlambda = lambda; ;)
        {
-          lambda_stack = tree_cons (NULL_TREE,
-                                    tlambda,
-                                    lambda_stack);
+         if (add_capture_p
+             && LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (tlambda) == CPLD_NONE)
+           /* tlambda won't let us capture 'this'.  */
+           break;
+
+         if (add_capture_p)
+           lambda_stack = tree_cons (NULL_TREE,
+                                     tlambda,
+                                     lambda_stack);
 
          tree closure = LAMBDA_EXPR_CLOSURE (tlambda);
          tree containing_function
@@ -807,10 +811,6 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
              init = LAMBDA_EXPR_THIS_CAPTURE (tlambda);
              break;
            }
-
-         if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (tlambda) == CPLD_NONE)
-           /* An outer lambda won't let us capture 'this'.  */
-           break;
        }
 
       if (init)