danielmarjamaki created this revision. danielmarjamaki added reviewers: NoQ, dcoughlin. danielmarjamaki added subscribers: cfe-commits, xazax.hun, zaks.anna, a.sidorin. danielmarjamaki set the repository for this revision to rL LLVM.
This patch fixes false positives for such code: #define RETURN(X) do { return; } while (0) void dostuff(void) { RETURN(1); // no-warning } The condition "0" in the macro is unreachable but that condition is there for a good reason. Repository: rL LLVM https://reviews.llvm.org/D25606 Files: lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp test/Analysis/unreachable-code-path.c Index: test/Analysis/unreachable-code-path.c =================================================================== --- test/Analysis/unreachable-code-path.c +++ test/Analysis/unreachable-code-path.c @@ -206,3 +206,10 @@ 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 +} + Index: lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp +++ lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp @@ -147,6 +147,8 @@ PathDiagnosticLocation DL; SourceLocation SL; if (const Stmt *S = getUnreachableStmt(CB)) { + if (S->getLocStart().isMacroID()) + continue; SR = S->getSourceRange(); DL = PathDiagnosticLocation::createBegin(S, B.getSourceManager(), LC); SL = DL.asLocation();
Index: test/Analysis/unreachable-code-path.c =================================================================== --- test/Analysis/unreachable-code-path.c +++ test/Analysis/unreachable-code-path.c @@ -206,3 +206,10 @@ 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 +} + Index: lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp +++ lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp @@ -147,6 +147,8 @@ PathDiagnosticLocation DL; SourceLocation SL; if (const Stmt *S = getUnreachableStmt(CB)) { + if (S->getLocStart().isMacroID()) + continue; SR = S->getSourceRange(); DL = PathDiagnosticLocation::createBegin(S, B.getSourceManager(), LC); SL = DL.asLocation();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits