Skip to content

Commit 2aaa928

Browse files
committed
Optimize
1 parent e2b7c86 commit 2aaa928

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

clang-tools-extra/clang-tidy/misc/BoolBitwiseOperationCheck.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,24 @@ static llvm::StringRef translate(llvm::StringRef Value) {
7474
return {};
7575
}
7676

77+
static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
78+
std::optional<bool> &RootAssignsToBoolean);
79+
80+
static bool recheckIsBooleanDeeply(const BinaryOperator *BinOp, ASTContext *AC,
81+
bool &IsBooleanLHS, bool &IsBooleanRHS) {
82+
std::optional<bool> DummyFlag = false;
83+
IsBooleanLHS = IsBooleanLHS ||
84+
isBooleanBitwise(dyn_cast<BinaryOperator>(
85+
BinOp->getLHS()->IgnoreParenImpCasts()),
86+
AC, DummyFlag);
87+
IsBooleanRHS = IsBooleanRHS ||
88+
isBooleanBitwise(dyn_cast<BinaryOperator>(
89+
BinOp->getRHS()->IgnoreParenImpCasts()),
90+
AC, DummyFlag);
91+
return true; // just a formal bool for possibility to be invoked from
92+
// expression
93+
}
94+
7795
static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
7896
std::optional<bool> &RootAssignsToBoolean) {
7997
if (!BinOp)
@@ -91,7 +109,9 @@ static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
91109
->getType()
92110
.getDesugaredType(*AC)
93111
->isBooleanType();
94-
for (int i = 0; i < 2; ++i) {
112+
for (int i = 0; i < 2;
113+
!i++ &&
114+
recheckIsBooleanDeeply(BinOp, AC, IsBooleanLHS, IsBooleanRHS)) {
95115
if (IsBooleanLHS && IsBooleanRHS) {
96116
RootAssignsToBoolean = RootAssignsToBoolean.value_or(false);
97117
return true;
@@ -105,24 +125,13 @@ static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
105125
RootAssignsToBoolean = RootAssignsToBoolean.value_or(true);
106126
return true;
107127
}
108-
std::optional<bool> DummyFlag = false;
109-
IsBooleanLHS =
110-
IsBooleanLHS ||
111-
isBooleanBitwise(dyn_cast<BinaryOperator>(
112-
BinOp->getLHS()->IgnoreParenImpCasts()),
113-
AC, DummyFlag);
114-
IsBooleanRHS =
115-
IsBooleanRHS ||
116-
isBooleanBitwise(dyn_cast<BinaryOperator>(
117-
BinOp->getRHS()->IgnoreParenImpCasts()),
118-
AC, DummyFlag);
119128
}
120129
}
121130
}
122131
return false;
123132
}
124133

125-
static const Expr *getValidCompoundsLHS(const BinaryOperator *BinOp) {
134+
static const Expr *getAcceptableCompoundsLHS(const BinaryOperator *BinOp) {
126135
assert(BinOp->isCompoundAssignmentOp());
127136

128137
if (const auto *DeclRefLHS =
@@ -202,7 +211,7 @@ void BoolBitwiseOperationCheck::emitWarningAndChangeOperatorsIfPossible(
202211

203212
FixItHint InsertEqual;
204213
if (BinOp->isCompoundAssignmentOp()) {
205-
const auto *LHS = getValidCompoundsLHS(BinOp);
214+
const auto *LHS = getAcceptableCompoundsLHS(BinOp);
206215
if (!LHS)
207216
return static_cast<void>(DiagEmitter());
208217
const SourceLocation LocLHS = LHS->getEndLoc();

0 commit comments

Comments
 (0)