OSDN Git Service

PR c++/45307
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Aug 2010 17:00:51 +0000 (17:00 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Aug 2010 17:00:51 +0000 (17:00 +0000)
* gimplify.c (gimplify_init_constructor): Just return GS_UNHANDLED
if ctor is empty.
(gimplify_modify_expr_rhs): Adjust.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163380 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 7588c98..f7461ba 100644 (file)
@@ -1,3 +1,10 @@
+2010-08-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/45307
+       * gimplify.c (gimplify_init_constructor): Just return GS_UNHANDLED
+       if ctor is empty.
+       (gimplify_modify_expr_rhs): Adjust.
+
 2010-08-19  Nathan Froyd  <froydnj@codesourcery.com>
 
        * cfgloop.c (get_loop_body_in_bfs_order): Avoid redundant call to
index d93fd4a..7667bb6 100644 (file)
@@ -1,5 +1,9 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/45307
+       * cp-gimplify.c (cp_gimplify_expr): Also remove assignment
+       of empty class CONSTRUCTOR.
+
        * except.c (pending_noexcept, pending_noexcept_checks): New.
        (perform_deferred_noexcept_checks): New.
        (maybe_noexcept_warning): Split from...
index abd5bf3..e5a7f26 100644 (file)
@@ -575,15 +575,18 @@ 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 ((is_gimple_lvalue (op1) || INDIRECT_REF_P (op1))
-                && !(TREE_CODE (op1) == CALL_EXPR
-                     && CALL_EXPR_RETURN_SLOT_OPT (op1))
+       else if ((is_gimple_lvalue (op1) || INDIRECT_REF_P (op1)
+                 || (TREE_CODE (op1) == CONSTRUCTOR
+                     && CONSTRUCTOR_NELTS (op1) == 0)
+                 || (TREE_CODE (op1) == CALL_EXPR
+                     && !CALL_EXPR_RETURN_SLOT_OPT (op1)))
                 && is_really_empty_class (TREE_TYPE (op0)))
          {
            /* Remove any copies of empty classes.  We check that the RHS
-              has a simple form so that TARGET_EXPRs and CONSTRUCTORs get
-              reduced properly, and we leave the return slot optimization
-              alone because it isn't a copy.
+              has a simple form so that TARGET_EXPRs and non-empty
+              CONSTRUCTORs get reduced properly, and we leave the return
+              slot optimization alone because it isn't a copy (FIXME so it
+              shouldn't be represented as one).
 
               Also drop volatile variables on the RHS to avoid infinite
               recursion from gimplify_expr trying to load the value.  */
index 8b97ee3..7e33666 100644 (file)
@@ -4237,6 +4237,10 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
          break;
 
        case CONSTRUCTOR:
+         /* If we already made some changes, let the front end have a
+            crack at this before we break it down.  */
+         if (ret != GS_UNHANDLED)
+           break;
          /* If we're initializing from a CONSTRUCTOR, break this into
             individual MODIFY_EXPRs.  */
          return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
index 304a8e8..289a124 100644 (file)
@@ -1,5 +1,7 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/tree-ssa/empty-2.C: New.
+
        * g++.dg/cpp0x/noexcept09.C: New.
 
 2010-08-19  Daniel Kraft  <d@domob.eu>
diff --git a/gcc/testsuite/g++.dg/tree-ssa/empty-2.C b/gcc/testsuite/g++.dg/tree-ssa/empty-2.C
new file mode 100644 (file)
index 0000000..728678a
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/45307
+// { dg-options -fdump-tree-gimple }
+
+struct fallible_t { };
+const fallible_t fallible = fallible_t();
+
+// { dg-final { scan-tree-dump-not "fallible" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }