Index: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp =================================================================== --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp @@ -249,6 +249,10 @@ 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); Index: cfe/trunk/test/SemaCXX/warn-infinite-recursion.cpp =================================================================== --- cfe/trunk/test/SemaCXX/warn-infinite-recursion.cpp +++ cfe/trunk/test/SemaCXX/warn-infinite-recursion.cpp @@ -53,19 +53,28 @@ 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();