aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.dg/eh/pr112619.C15
-rw-r--r--gcc/tree.cc18
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/eh/pr112619.C b/gcc/testsuite/g++.dg/eh/pr112619.C
new file mode 100644
index 0000000..f04e1c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/pr112619.C
@@ -0,0 +1,15 @@
+// PR c++/112619
+// { dg-do compile }
+
+struct S { S (); ~S (); };
+
+S
+foo (int a, int b)
+{
+ if (a || b)
+ {
+ S s;
+ return s;
+ }
+ return S ();
+}
diff --git a/gcc/tree.cc b/gcc/tree.cc
index a3d907a..e9f703e 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -12573,6 +12573,24 @@ try_catch_may_fallthru (const_tree stmt)
if (block_may_fallthru (TREE_OPERAND (stmt, 0)))
return true;
+ switch (TREE_CODE (TREE_OPERAND (stmt, 1)))
+ {
+ case CATCH_EXPR:
+ /* See below. */
+ return block_may_fallthru (CATCH_BODY (TREE_OPERAND (stmt, 1)));
+
+ case EH_FILTER_EXPR:
+ /* See below. */
+ return block_may_fallthru (EH_FILTER_FAILURE (TREE_OPERAND (stmt, 1)));
+
+ case STATEMENT_LIST:
+ break;
+
+ default:
+ /* See below. */
+ return false;
+ }
+
i = tsi_start (TREE_OPERAND (stmt, 1));
switch (TREE_CODE (tsi_stmt (i)))
{