summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2018-02-13 21:31:47 +0000
committerNico Weber <nicolasweber@gmx.de>2018-02-13 21:31:47 +0000
commit758fbacea5b93307d7456dc4e2c6d3379b8aa781 (patch)
tree42f46414a86f771ea845f0513df0a4b59b8b224d /clang/lib/AST/Expr.cpp
parentfdb3b036cc926843bad7b00bab9fc122be8798fc (diff)
downloadbcm5719-llvm-758fbacea5b93307d7456dc4e2c6d3379b8aa781.tar.gz
bcm5719-llvm-758fbacea5b93307d7456dc4e2c6d3379b8aa781.zip
Teach Wreturn-type, Wunreachable-code, and alpha.deadcode.UnreachableCode to treat __assume(0) like __builtin_unreachable.
Fixes PR29134. https://reviews.llvm.org/D43221 llvm-svn: 325052
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 7ddab9356b5..66f61708c5a 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -2917,6 +2917,18 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef,
return false;
}
+bool CallExpr::isBuiltinAssumeFalse(const ASTContext &Ctx) const {
+ const FunctionDecl* FD = getDirectCallee();
+ if (!FD || (FD->getBuiltinID() != Builtin::BI__assume &&
+ FD->getBuiltinID() != Builtin::BI__builtin_assume))
+ return false;
+
+ const Expr* Arg = getArg(0);
+ bool ArgVal;
+ return !Arg->isValueDependent() &&
+ Arg->EvaluateAsBooleanCondition(ArgVal, Ctx) && !ArgVal;
+}
+
namespace {
/// \brief Look for any side effects within a Stmt.
class SideEffectFinder : public ConstEvaluatedExprVisitor<SideEffectFinder> {
OpenPOWER on IntegriCloud