From 09607d08db43801d0b2fb32f7bf5ec196f9b563a Mon Sep 17 00:00:00 2001
From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 1 Sep 2006 17:59:41 +0000
Subject: [PATCH]         PR c++/28899         * gimplify.c
 (gimplify_modify_expr_rhs) [BIND_EXPR]: Handle         want_value.

        * gimplify.c (voidify_wrapper_expr): Handle null type.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116637 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                        |  8 ++++++++
 gcc/gimplify.c                       | 21 +++++++++++++++++----
 gcc/testsuite/g++.dg/ext/stmtexpr9.C |  8 ++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/stmtexpr9.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 922caa534c7e..242104b35e7d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2006-09-01  Jason Merrill  <jason@redhat.com>
+
+	PR c++/28899
+	* gimplify.c (gimplify_modify_expr_rhs) [BIND_EXPR]: Handle
+	want_value.
+
+	* gimplify.c (voidify_wrapper_expr): Handle null type.
+
 2006-09-01  Josh Conner  <jconner@apple.com>
 
 	PR c++/25505
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index cf48770c84fc..a408c01ae3aa 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -955,9 +955,9 @@ gimple_build_eh_filter (tree body, tree allowed, tree failure)
 tree
 voidify_wrapper_expr (tree wrapper, tree temp)
 {
-  if (!VOID_TYPE_P (TREE_TYPE (wrapper)))
+  tree type = TREE_TYPE (wrapper);
+  if (type && !VOID_TYPE_P (type))
     {
-      tree type = TREE_TYPE (wrapper);
       tree *p;
 
       /* Set p to point to the body of the wrapper.  Loop until we find
@@ -3415,10 +3415,23 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
       case STATEMENT_LIST:
 	{
 	  tree wrap = *from_p;
-	  tree t = voidify_wrapper_expr (wrap, *expr_p);
+	  tree t;
+
+	  ret = gimplify_expr (to_p, pre_p, post_p,
+			       is_gimple_min_lval, fb_lvalue);
+	  if (ret != GS_ERROR)
+	    ret = GS_OK;
+
+	  t = voidify_wrapper_expr (wrap, *expr_p);
 	  gcc_assert (t == *expr_p);
 
-	  *expr_p = wrap;
+	  if (want_value)
+	    {
+	      gimplify_and_add (wrap, pre_p);
+	      *expr_p = unshare_expr (*to_p);
+	    }
+	  else
+	    *expr_p = wrap;
 	  return GS_OK;
 	}
 	
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr9.C b/gcc/testsuite/g++.dg/ext/stmtexpr9.C
new file mode 100644
index 000000000000..4963e10e4cd7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/stmtexpr9.C
@@ -0,0 +1,8 @@
+// PR c++/28899
+// { dg-options "" }
+
+void f()
+{
+  unsigned l, l1;
+  l1 = l = ({ unsigned __v; __v; });
+}
-- 
GitLab