aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/expr.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-03-09 16:40:55 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-03-09 16:40:55 -0500
commit1577f10a637352b4fe7fb4a4c0fd672a96c84f58 (patch)
treeafa0946e5089101e7d7a41bfed0009c943fdcfe8 /gcc/cp/expr.c
parent5f2440b05799cb854b8d4a7622d50d7abcfecb0f (diff)
downloadgcc-1577f10a637352b4fe7fb4a4c0fd672a96c84f58.zip
gcc-1577f10a637352b4fe7fb4a4c0fd672a96c84f58.tar.gz
gcc-1577f10a637352b4fe7fb4a4c0fd672a96c84f58.tar.bz2
PR c++/84726 - unnecessary capture of constant vars.
* cp-tree.h (LAMBDA_CAPTURE_EXPLICIT_P) (LAMBDA_EXPR_CAPTURE_OPTIMIZED): New. * expr.c (mark_use): Set LAMBDA_EXPR_CAPTURE_OPTIMIZED. * lambda.c (is_constant_capture_proxy) (current_lambda_expr, var_to_maybe_prune, mark_const_cap_r) (prune_lambda_captures): New. (finish_lambda_function): Call prune_lambda_captures. From-SVN: r258398
Diffstat (limited to 'gcc/cp/expr.c')
-rw-r--r--gcc/cp/expr.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 2e67986..15894fc 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -117,7 +117,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
tree cap = DECL_CAPTURED_VARIABLE (expr);
if (TREE_CODE (TREE_TYPE (cap)) == TREE_CODE (TREE_TYPE (expr))
&& decl_constant_var_p (cap))
- return RECUR (cap);
+ {
+ tree val = RECUR (cap);
+ if (!is_capture_proxy (val))
+ {
+ tree l = current_lambda_expr ();
+ LAMBDA_EXPR_CAPTURE_OPTIMIZED (l) = true;
+ }
+ return val;
+ }
}
if (outer_automatic_var_p (expr)
&& decl_constant_var_p (expr))
@@ -160,7 +168,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
tree cap = DECL_CAPTURED_VARIABLE (ref);
if (TREE_CODE (TREE_TYPE (cap)) != REFERENCE_TYPE
&& decl_constant_var_p (cap))
- return RECUR (cap);
+ {
+ tree val = RECUR (cap);
+ if (!is_capture_proxy (val))
+ {
+ tree l = current_lambda_expr ();
+ LAMBDA_EXPR_CAPTURE_OPTIMIZED (l) = true;
+ }
+ return val;
+ }
}
tree r = mark_rvalue_use (ref, loc, reject_builtin);
if (r != ref)