diff mbox series

[C++] PR c++/20408 - unnecessary code for empty struct.

Message ID 20190522194752.21900-1-jason@redhat.com
State New
Headers show
Series [C++] PR c++/20408 - unnecessary code for empty struct. | expand

Commit Message

Jason Merrill May 22, 2019, 7:47 p.m. UTC
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.

Tested x86_64-pc-linux-gnu, applying to trunk.

	* call.c (build_call_a): Use simple_empty_class_p.
---
 gcc/cp/cp-tree.h                        |  1 +
 gcc/cp/call.c                           |  2 +-
 gcc/cp/cp-gimplify.c                    |  2 +-
 gcc/testsuite/g++.dg/tree-ssa/empty-3.C | 16 ++++++++++++++++
 gcc/cp/ChangeLog                        |  3 +++
 5 files changed, 22 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/empty-3.C


base-commit: cfb71062a9209810da06cd9b8dd559b62f0d61c7
prerequisite-patch-id: 18c3c5f0daf7a94fa325f89d1c67b15e426d84d1
diff mbox series

Patch

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 45a6a7010f6..7ad3c6b436d 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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);
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 1e167851872..4d9331f98c2 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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);
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 30937b1a1a3..7b9607dde17 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -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)
diff --git a/gcc/testsuite/g++.dg/tree-ssa/empty-3.C b/gcc/testsuite/g++.dg/tree-ssa/empty-3.C
new file mode 100644
index 00000000000..f340bd4070b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/empty-3.C
@@ -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());
+}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6c9869679e0..88baf8647b6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.