From 76b9a2a1cd4c0777039da22ae087268ab282c123 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Fri, 16 Feb 2007 01:23:35 +0000 Subject: [PATCH] re PR c++/30158 (ICE with invalid statement-expressions) 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 Andrew Pinski PR C++/30158 * g++.dg/ext/stmtexpr10.C: New testcase. From-SVN: r122028 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 7 ++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/stmtexpr10.C | 16 ++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ext/stmtexpr10.C 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 "" } */ + } +};