diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 16df0f7da4f..6e7f84fe72b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-02-15 Andrew Pinski + + PR C++/30158 + * semantics.c (finish_stmt_expr_expr): Set TREE_TYPE of the + statement expression if we had an error mark node. + 2007-02-15 Sandra Loosemore Brooks Moses Lee Millward diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3df045e733d..c4cdd954982 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1631,7 +1631,12 @@ tree finish_stmt_expr_expr (tree expr, tree stmt_expr) { if (error_operand_p (expr)) - return error_mark_node; + { + /* The type of the statement-expression is the type of the last + expression. */ + TREE_TYPE (stmt_expr) = error_mark_node; + return error_mark_node; + } /* If the last statement does not have "void" type, then the value of the last statement is the value of the entire expression. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 20c55913da0..c0fc66a9f32 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-02-15 Andrew Pinski + + PR C++/30158 + * g++.dg/ext/stmtexpr10.C: New testcase. + 2007-02-15 Andrew Pinski PR middle-end/30729 diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr10.C b/gcc/testsuite/g++.dg/ext/stmtexpr10.C new file mode 100644 index 00000000000..f7c5f8f591f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr10.C @@ -0,0 +1,16 @@ +/* { dg-do compile } " */ +/* { dg-options "" } */ + +void foo(int i) +{ + (i ? 1 : 2) = ({ X; }); /* { dg-error "" } */ +} + +struct A +{ + ~A (); + void foo() + { + delete this = ({ X; }); /* { dg-error "" } */ + } +};