aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <andrew_pinski@playstation.sony.com>2007-02-16 01:23:35 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2007-02-15 17:23:35 -0800
commit76b9a2a1cd4c0777039da22ae087268ab282c123 (patch)
treedfbf6ba184ffd7395764059f3975e99ffefb979a /gcc
parentd3d6f724f2c524bd2e82f14ff97ee3cfd0a182eb (diff)
downloadgcc-76b9a2a1cd4c0777039da22ae087268ab282c123.zip
gcc-76b9a2a1cd4c0777039da22ae087268ab282c123.tar.gz
gcc-76b9a2a1cd4c0777039da22ae087268ab282c123.tar.bz2
re PR c++/30158 (ICE with invalid statement-expressions)
2007-02-15 Andrew Pinski <andrew_pinski@playstation.sony.com> 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 <andrew_pinski@playstation.sony.com> PR C++/30158 * g++.dg/ext/stmtexpr10.C: New testcase. From-SVN: r122028
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/stmtexpr10.C16
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 16df0f7..6e7f84f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-02-15 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ 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 <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 3df045e..c4cdd95 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 20c5591..c0fc66a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2007-02-15 Andrew Pinski <andrew_pinski@playstation.sony.com>
+ PR C++/30158
+ * g++.dg/ext/stmtexpr10.C: New testcase.
+
+2007-02-15 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
PR middle-end/30729
* gcc.dg/Wunused-value-2.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr10.C b/gcc/testsuite/g++.dg/ext/stmtexpr10.C
new file mode 100644
index 0000000..f7c5f8f
--- /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 "" } */
+ }
+};