diff options
author | Nico Weber <nicolasweber@gmx.de> | 2018-02-13 21:31:47 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2018-02-13 21:31:47 +0000 |
commit | 758fbacea5b93307d7456dc4e2c6d3379b8aa781 (patch) | |
tree | 42f46414a86f771ea845f0513df0a4b59b8b224d /clang/lib/AST/Expr.cpp | |
parent | fdb3b036cc926843bad7b00bab9fc122be8798fc (diff) | |
download | bcm5719-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.cpp | 12 |
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> { |