forked from OSchip/llvm-project
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
This commit is contained in:
parent
de7a0a1526
commit
04306d62a0
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue