From 534063156808656e1614c33a649fa68a3ecf0ddf Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 3 Jul 2012 15:09:16 +0200 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/label14.C | 17 +++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/label14.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c524230fe4..0b3adaf7391 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-07-03 Jakub Jelinek + + PR c++/53812 + * semantics.c (finish_goto_stmt): Surround computed goto argument + with CLEANUP_POINT_EXPR if needed. + 2012-07-02 Jason Merrill PR c++/53619 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8e37ebb7e16..0cacf749479 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 3d51a0c574f..42366fa0ecb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-07-03 Jakub Jelinek + + PR c++/53812 + * g++.dg/ext/label14.C: New test. + 2012-07-03 Uros Bizjak 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 00000000000..d1a8b0d5299 --- /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); +} -- 2.30.2