r202892 - [-Wunreachable-code] handle cases where a dead 'return' may have a valid predecessor.
Ted Kremenek
kremenek at apple.com
Tue Mar 4 13:41:39 PST 2014
Author: kremenek
Date: Tue Mar 4 15:41:38 2014
New Revision: 202892
URL: http://llvm.org/viewvc/llvm-project?rev=202892&view=rev
Log:
[-Wunreachable-code] handle cases where a dead 'return' may have a valid predecessor.
Fies PR19040.
Modified:
cfe/trunk/lib/Analysis/ReachableCode.cpp
cfe/trunk/test/SemaCXX/warn-unreachable.cpp
Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=202892&r1=202891&r2=202892&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)
+++ cfe/trunk/lib/Analysis/ReachableCode.cpp Tue Mar 4 15:41:38 2014
@@ -263,6 +263,11 @@ static bool bodyEndsWithNoReturn(const C
}
static bool bodyEndsWithNoReturn(const CFGBlock::AdjacentBlock &AB) {
+ // If the predecessor is a normal CFG edge, then by definition
+ // the predecessor did not end with a 'noreturn'.
+ if (AB.getReachableBlock())
+ return false;
+
const CFGBlock *Pred = AB.getPossiblyUnreachableBlock();
assert(!AB.isReachable() && Pred);
return bodyEndsWithNoReturn(Pred);
Modified: cfe/trunk/test/SemaCXX/warn-unreachable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unreachable.cpp?rev=202892&r1=202891&r2=202892&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-unreachable.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-unreachable.cpp Tue Mar 4 15:41:38 2014
@@ -107,3 +107,26 @@ template <> void funcToSpecialize<int>()
dead(); // expected-warning {{will never be executed}}
}
+// Handle 'try' code dominating a dead return.
+enum PR19040_test_return_t
+{ PR19040_TEST_FAILURE };
+namespace PR19040_libtest
+{
+ class A {
+ public:
+ ~A ();
+ };
+}
+PR19040_test_return_t PR19040_fn1 ()
+{
+ try
+ {
+ throw PR19040_libtest::A ();
+ } catch (...)
+ {
+ return PR19040_TEST_FAILURE;
+ }
+ return PR19040_TEST_FAILURE; // expected-warning {{will never be executed}}
+}
+
+
More information about the cfe-commits
mailing list