aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2005-01-28 17:32:57 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2005-01-28 17:32:57 +0000
commit09f8cf2de9eafc6247038b4e9517ccd09ba53ea6 (patch)
tree6d6a388ad6a6b5ea928aaa1b993c788e29f3c7e6
parent91e390fe3dd2e1ec29b6742c69a83d687f135657 (diff)
downloadgcc-09f8cf2de9eafc6247038b4e9517ccd09ba53ea6.zip
gcc-09f8cf2de9eafc6247038b4e9517ccd09ba53ea6.tar.gz
gcc-09f8cf2de9eafc6247038b4e9517ccd09ba53ea6.tar.bz2
re PR middle-end/16558 (bogus missing-return warning)
PR middle-end/16558 PR middle-end/19583 * gimple-low.c (block_may_fallthru): TRY_FINALLY_EXPR only falls through if both operands fall through. From-SVN: r94381
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/gimple-low.c10
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index af2c494..97410c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-01-28 Ian Lance Taylor <ian@airs.com>
+
+ PR middle-end/16558
+ PR middle-end/19583
+ * gimple-low.c (block_may_fallthru): TRY_FINALLY_EXPR only falls
+ through if both operands fall through.
+
2005-01-28 Kazu Hirata <kazu@cs.umass.edu>
* cse.c (fold_rtx) <PC>: Don't optimize.
@@ -95,7 +102,7 @@
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Only iterate at -O2
and better.
-2005-01-27 Ian Lance Taylor <ian@c2micro.com>
+2005-01-27 Ian Lance Taylor <ian@airs.com>
PR middle-end/19583
* gimple-low.c (try_catch_may_fallthru): New static function.
diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c
index 5165a9a..6e60aeb 100644
--- a/gcc/gimple-low.c
+++ b/gcc/gimple-low.c
@@ -348,7 +348,15 @@ block_may_fallthru (tree block)
return try_catch_may_fallthru (stmt);
case TRY_FINALLY_EXPR:
- return block_may_fallthru (TREE_OPERAND (stmt, 1));
+ /* The finally clause is always executed after the try clause,
+ so if it does not fall through, then the try-finally will not
+ fall through. Otherwise, if the try clause does not fall
+ through, then when the finally clause falls through it will
+ resume execution wherever the try clause was going. So the
+ whole try-finally will only fall through if both the try
+ clause and the finally clause fall through. */
+ return (block_may_fallthru (TREE_OPERAND (stmt, 0))
+ && block_may_fallthru (TREE_OPERAND (stmt, 1)));
case MODIFY_EXPR:
if (TREE_CODE (TREE_OPERAND (stmt, 1)) == CALL_EXPR)