aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/except.c3
-rw-r--r--gcc/testsuite/g++.dg/eh/catch5.C13
3 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 63b7b20..e517f89 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-04 Jason Merrill <jason@redhat.com>
+
+ PR c++/31411
+ * except.c (initialize_handler_parm): Put a CLEANUP_POINT_EXPR inside
+ the MUST_NOT_THROW_EXPR.
+
2007-09-04 Richard Sandiford <richard@codesourcery.com>
* decl.c (cp_finish_decl): Call determine_visibility before
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index b6e8eea..3217f27 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -388,6 +388,9 @@ initialize_handler_parm (tree decl, tree exp)
See also expand_default_init. */
init = ocp_convert (TREE_TYPE (decl), init,
CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
+ /* Force cleanups now to avoid nesting problems with the
+ MUST_NOT_THROW_EXPR. */
+ init = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (init), init);
init = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (init), init);
}
diff --git a/gcc/testsuite/g++.dg/eh/catch5.C b/gcc/testsuite/g++.dg/eh/catch5.C
new file mode 100644
index 0000000..6001b56
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/catch5.C
@@ -0,0 +1,13 @@
+// PR c++/31411
+
+struct allocator{
+ ~allocator() throw();
+};
+struct string
+{
+ string(const string& str, const allocator& al = allocator());
+};
+int main() {
+ try {}
+ catch (string smess) {}
+}