diff options
author | Andrew Pinski <andrew_pinski@playstation.sony.com> | 2007-02-16 01:23:35 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2007-02-15 17:23:35 -0800 |
commit | 76b9a2a1cd4c0777039da22ae087268ab282c123 (patch) | |
tree | dfbf6ba184ffd7395764059f3975e99ffefb979a /gcc | |
parent | d3d6f724f2c524bd2e82f14ff97ee3cfd0a182eb (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/stmtexpr10.C | 16 |
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 "" } */ + } +}; |