forked from OSchip/llvm-project
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:
parent
6b6291aa9b
commit
fa1bf447d9
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue