diff options
| author | Jordy Rose <jediknil@belkadan.com> | 2010-07-27 03:39:53 +0000 |
|---|---|---|
| committer | Jordy Rose <jediknil@belkadan.com> | 2010-07-27 03:39:53 +0000 |
| commit | 55442abee6a51f132de780eef47728e9fe8da9c1 (patch) | |
| tree | aaeb406b8b74bdd4a4e3252e88cf01d03ef3e9e6 /clang/lib/Checker | |
| parent | 2bd41d1e30fd1bcea568d9f1c68d1e802caf803f (diff) | |
| download | bcm5719-llvm-55442abee6a51f132de780eef47728e9fe8da9c1.tar.gz bcm5719-llvm-55442abee6a51f132de780eef47728e9fe8da9c1.zip | |
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.
llvm-svn: 109487
Diffstat (limited to 'clang/lib/Checker')
| -rw-r--r-- | clang/lib/Checker/UnreachableCodeChecker.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Checker/UnreachableCodeChecker.cpp b/clang/lib/Checker/UnreachableCodeChecker.cpp index 0af49a33fb0..9ee3d02d266 100644 --- a/clang/lib/Checker/UnreachableCodeChecker.cpp +++ b/clang/lib/Checker/UnreachableCodeChecker.cpp @@ -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 @@ void UnreachableCodeChecker::VisitEndAnalysis(ExplodedGraph &G, 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 @@ void UnreachableCodeChecker::VisitEndAnalysis(ExplodedGraph &G, 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); } |

