parser.c (cp_parser_lambda_expression): Clear LAMBDA_EXPR_THIS_CAPTURE after parsing.
authorJason Merrill <jason@redhat.com>
Fri, 17 Jun 2011 20:07:45 +0000 (16:07 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 17 Jun 2011 20:07:45 +0000 (16:07 -0400)
* parser.c (cp_parser_lambda_expression): Clear
LAMBDA_EXPR_THIS_CAPTURE after parsing.
* pt.c (tsubst_copy_and_build): Make sure it isn't set.

From-SVN: r175156

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/pt.c

index e90d12da42c180cc9e1e5e1b676f4fda1ebebba6..baa4899743cfec86737fe696fdd667157d7faf03 100644 (file)
@@ -1,5 +1,9 @@
 2011-06-17  Jason Merrill  <jason@redhat.com>
 
+       * parser.c (cp_parser_lambda_expression): Clear
+       LAMBDA_EXPR_THIS_CAPTURE after parsing.
+       * pt.c (tsubst_copy_and_build): Make sure it isn't set.
+
        * cp-tree.h (struct tree_lambda_expr): Change common to typed.
        Move non-pointers to end of struct.
 
index ee303fec88321160337cf78240c948acd9d49918..cf1c5927cb0b3aee29b5d1379ac7d5cf9d9e5767 100644 (file)
@@ -625,7 +625,8 @@ enum cp_lambda_default_capture_mode_type {
 #define LAMBDA_EXPR_CAPTURE_LIST(NODE) \
   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list)
 
-/* The node in the capture-list that holds the 'this' capture.  */
+/* During parsing of the lambda, the node in the capture-list that holds
+   the 'this' capture.  */
 #define LAMBDA_EXPR_THIS_CAPTURE(NODE) \
   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture)
 
index 5ea04b56cb5fdfc9a8c2e2864832d472fdab3d47..a9cedcf38ab152afff791c31e179ded5e63c158e 100644 (file)
@@ -7430,6 +7430,9 @@ cp_parser_lambda_expression (cp_parser* parser)
 
   pop_deferring_access_checks ();
 
+  /* This field is only used during parsing of the lambda.  */
+  LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
+
   if (ok)
     return build_lambda_object (lambda_expr);
   else
index 308aff7bc4809bcac07bf7af6bccef94d5001cd3..ca4f955cc12c3a8542328180ab1235f3460f9a81 100644 (file)
@@ -13498,10 +13498,9 @@ tsubst_copy_and_build (tree t,
          = (LAMBDA_EXPR_DISCRIMINATOR (t));
        LAMBDA_EXPR_CAPTURE_LIST (r)
          = RECUR (LAMBDA_EXPR_CAPTURE_LIST (t));
-       LAMBDA_EXPR_THIS_CAPTURE (r)
-         = RECUR (LAMBDA_EXPR_THIS_CAPTURE (t));
        LAMBDA_EXPR_EXTRA_SCOPE (r)
          = RECUR (LAMBDA_EXPR_EXTRA_SCOPE (t));
+       gcc_assert (LAMBDA_EXPR_THIS_CAPTURE (t) == NULL_TREE);
 
        /* Do this again now that LAMBDA_EXPR_EXTRA_SCOPE is set.  */
        determine_visibility (TYPE_NAME (type));