Thanks Jordy! On Jul 26, 2010, at 8:39 PM, Jordy Rose wrote:
> Author: jrose > Date: Mon Jul 26 22:39:53 2010 > New Revision: 109487 > > URL: http://llvm.org/viewvc/llvm-project?rev=109487&view=rev > Log: > Don't warn about unreachable code if the block starts with > __builtin_unreachable(). > > The next step is to warn if a block labeled unreachable is, in fact, > reachable. Somewhat related to PR810. > > Modified: > cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp > cfe/trunk/test/Analysis/unreachable-code-path.c > > Modified: cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp?rev=109487&r1=109486&r2=109487&view=diff > ============================================================================== > --- cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp (original) > +++ cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp Mon Jul 26 22:39:53 2010 > @@ -10,7 +10,7 @@ > // path-sensitive analysis. We mark any path visited, and then walk the CFG > as a > // post-analysis to determine what was never visited. > // > -// A similar flow-sensitive only check exists in Analysis/UnreachableCode.cpp > +// A similar flow-sensitive only check exists in Analysis/ReachableCode.cpp > //===----------------------------------------------------------------------===// > > #include "clang/Checker/PathSensitive/CheckerVisitor.h" > @@ -19,6 +19,7 @@ > #include "clang/Checker/BugReporter/BugReporter.h" > #include "GRExprEngineExperimentalChecks.h" > #include "clang/AST/StmtCXX.h" > +#include "clang/Basic/Builtins.h" > #include "llvm/ADT/SmallPtrSet.h" > > // The number of CFGBlock pointers we want to reserve memory for. This is used > @@ -79,6 +80,8 @@ > if (!C) > return; > > + ASTContext &Ctx = B.getContext(); > + > // Find CFGBlocks that were not covered by any node > for (CFG::const_iterator I = C->begin(); I != C->end(); ++I) { > const CFGBlock *CB = *I; > @@ -96,6 +99,18 @@ > if (S.getBegin().isMacroID() || S.getEnd().isMacroID() || S.isInvalid() > || SL.isInvalid()) > continue; > + > + // Special case for __builtin_unreachable. > + // FIXME: This should be extended to include other unreachable markers, > + // such as llvm_unreachable. > + if (!CB->empty()) { > + const Stmt *First = CB->front(); > + if (const CallExpr *CE = dyn_cast<CallExpr>(First)) { > + if (CE->isBuiltinCall(Ctx) == Builtin::BI__builtin_unreachable) > + continue; > + } > + } > + > B.EmitBasicReport("Unreachable code", "This statement is never > executed", > SL, S); > } > > Modified: cfe/trunk/test/Analysis/unreachable-code-path.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/unreachable-code-path.c?rev=109487&r1=109486&r2=109487&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/unreachable-code-path.c (original) > +++ cfe/trunk/test/Analysis/unreachable-code-path.c Mon Jul 26 22:39:53 2010 > @@ -53,3 +53,9 @@ > } > } > > +void test6(const char *c) { > + if (c) return; > + if (!c) return; > + __builtin_unreachable(); // no-warning > +} > + > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
