diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-07-03 15:09:16 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-07-03 15:09:16 +0200 |
commit | 534063156808656e1614c33a649fa68a3ecf0ddf (patch) | |
tree | ffeda640fb398c179df2c1c99d7fef559802810a /gcc | |
parent | 95a3d9ee86cca4621511406e8293daaf65b77001 (diff) | |
download | gcc-534063156808656e1614c33a649fa68a3ecf0ddf.zip gcc-534063156808656e1614c33a649fa68a3ecf0ddf.tar.gz gcc-534063156808656e1614c33a649fa68a3ecf0ddf.tar.bz2 |
re PR c++/53812 (lower_stmt (4.6), verify_gimple_stmt (4.7.0, 4.7.1))
PR c++/53812
* semantics.c (finish_goto_stmt): Surround computed goto argument
with CLEANUP_POINT_EXPR if needed.
* g++.dg/ext/label14.C: New test.
From-SVN: r189225
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/label14.C | 17 |
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c52423..0b3adaf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-07-03 Jakub Jelinek <jakub@redhat.com> + + PR c++/53812 + * semantics.c (finish_goto_stmt): Surround computed goto argument + with CLEANUP_POINT_EXPR if needed. + 2012-07-02 Jason Merrill <jason@redhat.com> PR c++/53619 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8e37ebb..0cacf74 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -571,6 +571,9 @@ finish_goto_stmt (tree destination) tf_warning_or_error); if (error_operand_p (destination)) return NULL_TREE; + destination + = fold_build_cleanup_point_expr (TREE_TYPE (destination), + destination); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3d51a0c..42366fa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-07-03 Jakub Jelinek <jakub@redhat.com> + + PR c++/53812 + * g++.dg/ext/label14.C: New test. + 2012-07-03 Uros Bizjak <ubizjak@gmail.com> PR target/53811 diff --git a/gcc/testsuite/g++.dg/ext/label14.C b/gcc/testsuite/g++.dg/ext/label14.C new file mode 100644 index 0000000..d1a8b0d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label14.C @@ -0,0 +1,17 @@ +// PR c++/53812 +// { dg-do compile } +// { dg-options "" } + +struct T { T () : t(0) {}; int t; ~T (); }; +struct S { void *operator [] (T); }; +void bar (S &, void *, void *); + +void +foo (S &x, T &y) +{ + bar (x, &&l1, &&l2); +l1: + goto *x[y]; +l2: + bar (x, &&l1, &&l2); +} |