diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f042468ebba7..20c6c68e44a0 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -1002,7 +1002,7 @@ private: if (BuildOpts.Observer) BuildOpts.Observer->compareBitwiseEquality(B, B->getOpcode() != BO_EQ); - TryResult(B->getOpcode() != BO_EQ); + return TryResult(B->getOpcode() != BO_EQ); } } else if (BoolExpr->isKnownToHaveBooleanValue()) { if ((*IntLiteral1 == 1) || (*IntLiteral1 == 0)) { @@ -1041,7 +1041,7 @@ private: case UO_Not: return ~Value; case UO_LNot: - return llvm::APInt(Value.getBitWidth(), !Value); + return llvm::APInt(Context->getTypeSize(Context->IntTy), !Value); default: assert(false && "Unexpected unary operator!"); return llvm::None; diff --git a/clang/test/Sema/warn-bitwise-compare.c b/clang/test/Sema/warn-bitwise-compare.c index ccd83613b806..e66c58ee5ae3 100644 --- a/clang/test/Sema/warn-bitwise-compare.c +++ b/clang/test/Sema/warn-bitwise-compare.c @@ -91,6 +91,8 @@ void f(int x) { if ((x | mydefine2) == 4) {} if ((x & 1) == 1L) {} + + if (0 != (x | !0LL)) {} // expected-warning {{bitwise comparison always evaluates to true}} } void g(int x) {