diff options
author | John McCall <rjmccall@apple.com> | 2010-04-30 07:10:06 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-04-30 07:10:06 +0000 |
commit | 259d48e1486044093131c8c078f70a28b1503e70 (patch) | |
tree | faee5ff36889d04ee00c87f27e85af15723a1bac | |
parent | 54022952450beff428a30ef5adfb82874063603d (diff) |
An edge from a call expression to the exit block is only an abnormal edge
if *none* of the successors of the call expression is the exit block.
This matters when a call of bool type is the condition of (say) a while
loop in a function with no statements after the loop. This *can* happen
in C, but it's much more common in C++ because of overloaded operators.
Suppresses some substantial number of spurious -Wmissing-noreturn warnings.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102696 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/warn-missing-noreturn.cpp | 9 |
2 files changed, 11 insertions, 1 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 7c1d8cbae9..dffdf6b445 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -147,7 +147,8 @@ static ControlFlowKind CheckFallThrough(AnalysisContext &AC) { bool NoReturnEdge = false; if (CallExpr *C = dyn_cast<CallExpr>(S)) { - if (B.succ_begin()[0] != &cfg->getExit()) { + if (std::find(B.succ_begin(), B.succ_end(), &cfg->getExit()) + == B.succ_end()) { HasAbnormalEdge = true; continue; } diff --git a/test/SemaCXX/warn-missing-noreturn.cpp b/test/SemaCXX/warn-missing-noreturn.cpp index 5ca2eca61a..8016c3da5c 100644 --- a/test/SemaCXX/warn-missing-noreturn.cpp +++ b/test/SemaCXX/warn-missing-noreturn.cpp @@ -27,3 +27,12 @@ template void B::g<int>(int); // expected-note {{in instantiation of function te struct X { virtual void g() { f(); } }; + +namespace test1 { + bool condition(); + + // We don't want a warning here. + void foo() { + while (condition()) {} + } +} |