OSDN Git Service

* semantics.c (finish_compound_stmt): Avoid creating an
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Oct 2010 15:48:09 +0000 (15:48 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Oct 2010 15:48:09 +0000 (15:48 +0000)
unnecessary BIND_EXPR.

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

gcc/cp/ChangeLog
gcc/cp/semantics.c

index 7646dca..178bed6 100644 (file)
@@ -1,5 +1,8 @@
 2010-10-27  Jason Merrill  <jason@redhat.com>
 
+       * semantics.c (finish_compound_stmt): Avoid creating an
+       unnecessary BIND_EXPR.
+
        * call.c (convert_like_real): Don't check narrowing if the element
        is also an initializer-list.
 
index ae3bf90..0012bdd 100644 (file)
@@ -1208,7 +1208,19 @@ void
 finish_compound_stmt (tree stmt)
 {
   if (TREE_CODE (stmt) == BIND_EXPR)
-    BIND_EXPR_BODY (stmt) = do_poplevel (BIND_EXPR_BODY (stmt));
+    {
+      tree body = do_poplevel (BIND_EXPR_BODY (stmt));
+      /* If the STATEMENT_LIST is empty and this BIND_EXPR isn't special,
+        discard the BIND_EXPR so it can be merged with the containing
+        STATEMENT_LIST.  */
+      if (TREE_CODE (body) == STATEMENT_LIST
+         && STATEMENT_LIST_HEAD (body) == NULL
+         && !BIND_EXPR_BODY_BLOCK (stmt)
+         && !BIND_EXPR_TRY_BLOCK (stmt))
+       stmt = body;
+      else
+       BIND_EXPR_BODY (stmt) = body;
+    }
   else if (STATEMENT_LIST_NO_SCOPE (stmt))
     stmt = pop_stmt_list (stmt);
   else