diff options
author | Jason Merrill <jason@redhat.com> | 2019-05-22 15:48:05 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-05-22 15:48:05 -0400 |
commit | 7d277e1796e2a54dd3bb0aea1793a2e0e5b45962 (patch) | |
tree | 78bd6f4e7e1c3b93623514457ae06f3560791354 | |
parent | 9ee0fb4c276cc0281ce180917c1bd20600ae7e09 (diff) | |
download | gcc-7d277e1796e2a54dd3bb0aea1793a2e0e5b45962.zip gcc-7d277e1796e2a54dd3bb0aea1793a2e0e5b45962.tar.gz gcc-7d277e1796e2a54dd3bb0aea1793a2e0e5b45962.tar.bz2 |
PR c++/86485 - simple_empty_class_p
Yet another tweak that would have fixed this bug: we should treat INIT_EXPR
and MODIFY_EXPR differently for determining whether this is a simple empty
class copy, since a TARGET_EXPR on the RHS is direct initialization if
INIT_EXPR but copy if MODIFY_EXPR.
* cp-gimplify.c (simple_empty_class_p): Also true for MODIFY_EXPR.
From-SVN: r271521
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 15 |
2 files changed, 13 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 970f7e8..6c98696 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-05-22 Jason Merrill <jason@redhat.com> + + PR c++/86485 - -Wmaybe-unused with empty class ?: + * cp-gimplify.c (simple_empty_class_p): Also true for MODIFY_EXPR. + 2019-05-21 Paolo Carlini <paolo.carlini@oracle.com> * parser.c (cp_parser_template_declaration_after_parameters): Use diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index e8c22c0..30937b1 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -594,19 +594,20 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p) return slot optimization alone because it isn't a copy. */ static bool -simple_empty_class_p (tree type, tree op) +simple_empty_class_p (tree type, tree op, tree_code code) { + if (TREE_CODE (op) == COMPOUND_EXPR) + return simple_empty_class_p (type, TREE_OPERAND (op, 1), code); return - ((TREE_CODE (op) == COMPOUND_EXPR - && simple_empty_class_p (type, TREE_OPERAND (op, 1))) - || TREE_CODE (op) == EMPTY_CLASS_EXPR + (TREE_CODE (op) == EMPTY_CLASS_EXPR + || code == MODIFY_EXPR || is_gimple_lvalue (op) || INDIRECT_REF_P (op) || (TREE_CODE (op) == CONSTRUCTOR - && CONSTRUCTOR_NELTS (op) == 0 - && !TREE_CLOBBER_P (op)) + && CONSTRUCTOR_NELTS (op) == 0) || (TREE_CODE (op) == CALL_EXPR && !CALL_EXPR_RETURN_SLOT_OPT (op))) + && !TREE_CLOBBER_P (op) && is_really_empty_class (type, /*ignore_vptr*/true); } @@ -715,7 +716,7 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) TREE_OPERAND (*expr_p, 1) = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (op0), op1); - else if (simple_empty_class_p (TREE_TYPE (op0), op1)) + else if (simple_empty_class_p (TREE_TYPE (op0), op1, code)) { /* Remove any copies of empty classes. Also drop volatile variables on the RHS to avoid infinite recursion from |