PR c++/20408 - unnecessary code for empty struct.
Here initializing the argument from a TARGET_EXPR isn't an empty class copy even though the type is !TREE_ADDRESSABLE, so we should check simple_empty_class_p. * call.c (build_call_a): Use simple_empty_class_p. From-SVN: r271523
This commit is contained in:
parent
52ea1caf28
commit
c652ff8312
@ -1,5 +1,8 @@
|
||||
2019-05-22 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/20408 - unnecessary code for empty struct.
|
||||
* call.c (build_call_a): Use simple_empty_class_p.
|
||||
|
||||
PR c++/86485 - -Wmaybe-unused with empty class ?:
|
||||
* cp-gimplify.c (simple_empty_class_p): Also true for MODIFY_EXPR.
|
||||
|
||||
|
@ -393,7 +393,7 @@ build_call_a (tree function, int n, tree *argarray)
|
||||
{
|
||||
tree arg = CALL_EXPR_ARG (function, i);
|
||||
if (is_empty_class (TREE_TYPE (arg))
|
||||
&& ! TREE_ADDRESSABLE (TREE_TYPE (arg)))
|
||||
&& simple_empty_class_p (TREE_TYPE (arg), arg, INIT_EXPR))
|
||||
{
|
||||
tree t = build0 (EMPTY_CLASS_EXPR, TREE_TYPE (arg));
|
||||
arg = build2 (COMPOUND_EXPR, TREE_TYPE (t), arg, t);
|
||||
|
@ -593,7 +593,7 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p)
|
||||
non-empty CONSTRUCTORs get reduced properly, and we leave the
|
||||
return slot optimization alone because it isn't a copy. */
|
||||
|
||||
static bool
|
||||
bool
|
||||
simple_empty_class_p (tree type, tree op, tree_code code)
|
||||
{
|
||||
if (TREE_CODE (op) == COMPOUND_EXPR)
|
||||
|
@ -7581,6 +7581,7 @@ extern tree cp_fully_fold_init (tree);
|
||||
extern void clear_fold_cache (void);
|
||||
extern tree lookup_hotness_attribute (tree);
|
||||
extern tree process_stmt_hotness_attribute (tree, location_t);
|
||||
extern bool simple_empty_class_p (tree, tree, tree_code);
|
||||
|
||||
/* in name-lookup.c */
|
||||
extern tree strip_using_decl (tree);
|
||||
|
16
gcc/testsuite/g++.dg/tree-ssa/empty-3.C
Normal file
16
gcc/testsuite/g++.dg/tree-ssa/empty-3.C
Normal file
@ -0,0 +1,16 @@
|
||||
// PR c++/20408
|
||||
// { dg-additional-options -fdump-tree-gimple }
|
||||
// { dg-final { scan-tree-dump-times "struct Foo" 2 "gimple" } }
|
||||
|
||||
struct Foo {};
|
||||
void foo(const Foo&);
|
||||
void bar(Foo);
|
||||
|
||||
void fooc(void)
|
||||
{
|
||||
foo(Foo());
|
||||
}
|
||||
void barc(void)
|
||||
{
|
||||
bar(Foo());
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user