diff options
author | Jason Merrill <jason@redhat.com> | 2018-03-09 16:40:55 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-03-09 16:40:55 -0500 |
commit | 1577f10a637352b4fe7fb4a4c0fd672a96c84f58 (patch) | |
tree | afa0946e5089101e7d7a41bfed0009c943fdcfe8 /gcc/cp/expr.c | |
parent | 5f2440b05799cb854b8d4a7622d50d7abcfecb0f (diff) | |
download | gcc-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.c | 20 |
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) |