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
This commit is contained in:
Jason Merrill 2019-05-22 15:48:05 -04:00 committed by Jason Merrill
parent 9ee0fb4c27
commit 7d277e1796
2 changed files with 13 additions and 7 deletions

View File

@ -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

View File

@ -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