alpha.core.UnreachableCode - don't warn about unreachable code inside macro

In macros, 'do {...} while (0)' is often used. Don't warn about the condition 0 when it is unreachable.

Differential Revision: https://reviews.llvm.org/D25606

llvm-svn: 284477
This commit is contained in:
Daniel Marjamaki 2016-10-18 13:16:53 +00:00
parent 6b6291aa9b
commit fa1bf447d9
2 changed files with 15 additions and 0 deletions

View File

@ -147,6 +147,14 @@ void UnreachableCodeChecker::checkEndAnalysis(ExplodedGraph &G,
PathDiagnosticLocation DL;
SourceLocation SL;
if (const Stmt *S = getUnreachableStmt(CB)) {
// In macros, 'do {...} while (0)' is often used. Don't warn about the
// condition 0 when it is unreachable.
if (S->getLocStart().isMacroID())
if (const auto *I = dyn_cast<IntegerLiteral>(S))
if (I->getValue() == 0ULL)
if (const Stmt *Parent = PM->getParent(S))
if (isa<DoStmt>(Parent))
continue;
SR = S->getSourceRange();
DL = PathDiagnosticLocation::createBegin(S, B.getSourceManager(), LC);
SL = DL.asLocation();

View File

@ -206,3 +206,10 @@ void test13(int i) {
int x = inlineFunction(i);
x && x < 10; // no-warning
}
// Don't warn in a macro
#define RETURN(X) do { return; } while (0)
void macro(void) {
RETURN(1); // no-warning
}