PR c++/20408 - unnecessary code for empty struct.
authorJason Merrill <jason@redhat.com>
Wed, 22 May 2019 21:39:08 +0000 (17:39 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 22 May 2019 21:39:08 +0000 (17:39 -0400)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/testsuite/g++.dg/tree-ssa/empty-3.C [new file with mode: 0644]

index 6c9869679e01538857741b08ca168dd61d003b4c..88baf8647b61e8dc3724f0d33f73d41c1a22a7d9 100644 (file)
@@ -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.
 
index 1e167851872906381e44c7b3333077c6db5eb663..4d9331f98c2bc6e340ecb8583b3351e45fd325b7 100644 (file)
@@ -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);
index 30937b1a1a3c31cd6ebb4bc091f3c146e455f9a2..7b9607dde1708e2ad8d5dcce721ed70d6e024390 100644 (file)
@@ -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)
index 45a6a7010f60163c40af468fcf5d348fba145c13..7ad3c6b436d8ed14ec78db562b22990100028959 100644 (file)
@@ -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/testsuite/g++.dg/tree-ssa/empty-3.C b/gcc/testsuite/g++.dg/tree-ssa/empty-3.C
new file mode 100644 (file)
index 0000000..f340bd4
--- /dev/null
@@ -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());
+}