summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRobert Widmann <devteam.codafi@gmail.com>2019-02-13 22:22:23 +0000
committerRobert Widmann <devteam.codafi@gmail.com>2019-02-13 22:22:23 +0000
commit04306d62a0329278102ac993d0147e09247f0780 (patch)
treef7155c7a5041917f6ffe8088c10aaba11caae80a /clang
parentde7a0a152648d1a74cf4319920b1848aa00d1ca3 (diff)
downloadbcm5719-llvm-04306d62a0329278102ac993d0147e09247f0780.tar.gz
bcm5719-llvm-04306d62a0329278102ac993d0147e09247f0780.zip
Restore Check for Unreachable Exit Block in -Winfinite-recursion
Summary: When this was rewritten in D43737, the logic changed to better explore infinite loops. The check for a reachable exit block was deleted which accidentally introduced false positives in case the exit node was unreachable. We were testing for cases like this, but @steven_wu provided an additional test case that I've included in the regression tests for this patch. Reviewers: steven_wu, rtrieu Reviewed By: steven_wu, rtrieu Subscribers: cfe-commits, steven_wu Tags: #clang Differential Revision: https://reviews.llvm.org/D58122 llvm-svn: 353984
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/AnalysisBasedWarnings.cpp4
-rw-r--r--clang/test/SemaCXX/warn-infinite-recursion.cpp13
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 7ce69fd8c19..6120d2b9df3 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -249,6 +249,10 @@ static void checkRecursiveFunction(Sema &S, const FunctionDecl *FD,
CFG *cfg = AC.getCFG();
if (!cfg) return;
+ // If the exit block is unreachable, skip processing the function.
+ if (cfg->getExit().pred_empty())
+ return;
+
// Emit diagnostic if a recursive function call is detected for all paths.
if (checkForRecursiveFunctionCall(FD, cfg))
S.Diag(Body->getBeginLoc(), diag::warn_infinite_recursive_function);
diff --git a/clang/test/SemaCXX/warn-infinite-recursion.cpp b/clang/test/SemaCXX/warn-infinite-recursion.cpp
index bbeff92a657..e5a5a18b657 100644
--- a/clang/test/SemaCXX/warn-infinite-recursion.cpp
+++ b/clang/test/SemaCXX/warn-infinite-recursion.cpp
@@ -53,19 +53,28 @@ int j() { // expected-warning{{call itself}}
return 5 + j();
}
-void k() { // expected-warning{{call itself}}
+// Don't warn on infinite loops
+void k() {
while(true) {
k();
}
}
-// Don't warn on infinite loops
void l() {
while (true) {}
l();
}
+void m() {
+ static int count = 5;
+ if (count >0) {
+ count--;
+ l();
+ }
+ while (true) {}
+}
+
class S {
static void a();
void b();
OpenPOWER on IntegriCloud