// For standalone condition variables and for "or" binary operations we simply
// remove the inner `if`.
- const auto *BinOpCond = dyn_cast<BinaryOperator>(InnerIf->getCond());
+ const auto *BinOpCond =
+ dyn_cast<BinaryOperator>(InnerIf->getCond()->IgnoreParenImpCasts());
+
if (isa<DeclRefExpr>(InnerIf->getCond()->IgnoreParenImpCasts()) ||
(BinOpCond && BinOpCond->getOpcode() == BO_LOr)) {
SourceLocation IfBegin = InnerIf->getBeginLoc();
// For "and" binary operations we remove the "and" operation with the
// condition variable from the inner if.
} else {
- const auto *CondOp = cast<BinaryOperator>(InnerIf->getCond());
+ const auto *CondOp =
+ cast<BinaryOperator>(InnerIf->getCond()->IgnoreParenImpCasts());
const auto *LeftDRE =
dyn_cast<DeclRefExpr>(CondOp->getLHS()->IgnoreParenImpCasts());
if (LeftDRE && LeftDRE->getDecl() == CondVar) {
}
}
+// ExprWithCleanups doesn't crash
+int positive_expr_with_cleanups() {
+ class RetT {
+ public:
+ RetT(const int _code) : code_(_code) {}
+ bool Ok() const { return code_ == 0; }
+ static RetT Test(bool &_isSet) { return 0; }
+
+ private:
+ int code_;
+ };
+
+ bool isSet = false;
+ if (RetT::Test(isSet).Ok() && isSet) {
+ if (RetT::Test(isSet).Ok() && isSet) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]
+ // CHECK-FIXES: if (RetT::Test(isSet).Ok() ) {
+ }
+ }
+ if (isSet) {
+ if ((RetT::Test(isSet).Ok() && isSet)) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]
+ // CHECK-FIXES: if ((RetT::Test(isSet).Ok() )) {
+ }
+ }
+ return 0;
+}
+
//===--- Special Negatives ------------------------------------------------===//
// Aliasing