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