From 7d277e1796e2a54dd3bb0aea1793a2e0e5b45962 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 22 May 2019 15:48:05 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/cp-gimplify.c | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 970f7e89b38..6c9869679e0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-05-22 Jason Merrill + + 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 * parser.c (cp_parser_template_declaration_after_parameters): Use diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index e8c22c071c2..30937b1a1a3 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 -- 2.30.2