Skip to content

Commit

Permalink
Restore Check for Unreachable Exit Block in -Winfinite-recursion
Browse files Browse the repository at this point in the history
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@353984 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
CodaFi authored and cachemeifyoucan committed Feb 18, 2019
1 parent b299f6b commit f27d6c0
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lib/Sema/AnalysisBasedWarnings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,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);
Expand Down
13 changes: 11 additions & 2 deletions test/SemaCXX/warn-infinite-recursion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit f27d6c0

Please sign in to comment.