re PR c++/7050 (g++ segfaults on: (i ? get_string() : throw))

PR c++/7050
        * expr.c (store_expr): Don't attempt to store void-typed trees,
        just evaluate them for side effects.
        * cp/expr.c (cxx_expand_expr): Return const0_rtx for throw
        expressions.

From-SVN: r64270
This commit is contained in:
Andrew Lewycky 2003-03-12 22:59:37 +00:00 committed by Jason Merrill
parent 1efede7e34
commit 731361b379
4 changed files with 23 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2003-03-12 Andrew Lewycky <andrew@mxc.ca>
PR c++/7050
* expr.c (store_expr): Don't attempt to store void-typed trees,
just evaluate them for side effects.
2003-03-12 Bob Wilson <bob.wilson@acm.org>
Backport from mainline:

View File

@ -1,3 +1,9 @@
2003-03-12 Andrew Lewycky <andrew@mxc.ca>
PR c++/7050
* expr.c (cxx_expand_expr): Return const0_rtx for throw
expressions.
2003-03-10 Jason Merrill <jason@redhat.com>
PR c++/9798

View File

@ -111,7 +111,7 @@ cplus_expand_expr (exp, target, tmode, modifier)
case THROW_EXPR:
expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
return NULL;
return const0_rtx;
case MUST_NOT_THROW_EXPR:
expand_eh_region_start ();

View File

@ -3917,6 +3917,16 @@ store_expr (exp, target, want_value)
int dont_return_target = 0;
int dont_store_target = 0;
if (VOID_TYPE_P (TREE_TYPE (exp)))
{
/* C++ can generate ?: expressions with a throw expression in one
branch and an rvalue in the other. Here, we resolve attempts to
store the throw expression's nonexistant result. */
if (want_value)
abort ();
expand_expr (exp, const0_rtx, VOIDmode, 0);
return NULL_RTX;
}
if (TREE_CODE (exp) == COMPOUND_EXPR)
{
/* Perform first part of compound expression, then assign from second