aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2006-09-01 13:59:41 -0400
committerJason Merrill <jason@gcc.gnu.org>2006-09-01 13:59:41 -0400
commit4832214af7070b43375bf34756334536024acdfb (patch)
tree3c685cb9c8c3dcc588beeaeb56a9d06d2c15b249 /gcc
parenta56913dd3781809746ff00a6f296acee9bfc5b9a (diff)
downloadgcc-4832214af7070b43375bf34756334536024acdfb.zip
gcc-4832214af7070b43375bf34756334536024acdfb.tar.gz
gcc-4832214af7070b43375bf34756334536024acdfb.tar.bz2
re PR c++/28899 (gimplification failed)
PR c++/28899 * gimplify.c (gimplify_modify_expr_rhs) [BIND_EXPR]: Handle want_value. * gimplify.c (voidify_wrapper_expr): Handle null type. From-SVN: r116637
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimplify.c21
-rw-r--r--gcc/testsuite/g++.dg/ext/stmtexpr9.C8
3 files changed, 33 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 922caa5..242104b 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 cf48770..a408c01 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 0000000..4963e10
--- /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; });
+}