diff options
author | Robert Widmann <devteam.codafi@gmail.com> | 2019-02-13 22:22:23 +0000 |
---|---|---|
committer | Robert Widmann <devteam.codafi@gmail.com> | 2019-02-13 22:22:23 +0000 |
commit | 04306d62a0329278102ac993d0147e09247f0780 (patch) | |
tree | f7155c7a5041917f6ffe8088c10aaba11caae80a /clang | |
parent | de7a0a152648d1a74cf4319920b1848aa00d1ca3 (diff) | |
download | bcm5719-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.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-infinite-recursion.cpp | 13 |
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(); |