Skip to content

Commit 75a5399

Browse files
committed
Fix flags case
1 parent 2aaa928 commit 75a5399

File tree

2 files changed

+38
-34
lines changed

2 files changed

+38
-34
lines changed

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

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,6 @@ 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-
9577
static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
9678
std::optional<bool> &RootAssignsToBoolean) {
9779
if (!BinOp)
@@ -109,22 +91,35 @@ static bool isBooleanBitwise(const BinaryOperator *BinOp, ASTContext *AC,
10991
->getType()
11092
.getDesugaredType(*AC)
11193
->isBooleanType();
112-
for (int i = 0; i < 2;
113-
!i++ &&
114-
recheckIsBooleanDeeply(BinOp, AC, IsBooleanLHS, IsBooleanRHS)) {
115-
if (IsBooleanLHS && IsBooleanRHS) {
116-
RootAssignsToBoolean = RootAssignsToBoolean.value_or(false);
117-
return true;
118-
}
119-
if (assignsToBoolean(BinOp, AC) ||
120-
RootAssignsToBoolean.value_or(false)) {
121-
RootAssignsToBoolean = RootAssignsToBoolean.value_or(true);
122-
return true;
123-
}
124-
if (BinOp->isCompoundAssignmentOp() && IsBooleanLHS) {
125-
RootAssignsToBoolean = RootAssignsToBoolean.value_or(true);
126-
return true;
127-
}
94+
if (IsBooleanLHS && IsBooleanRHS) {
95+
RootAssignsToBoolean = RootAssignsToBoolean.value_or(false);
96+
return true;
97+
}
98+
if (((IsBooleanLHS || IsBooleanRHS) && assignsToBoolean(BinOp, AC)) ||
99+
RootAssignsToBoolean.value_or(false)) {
100+
RootAssignsToBoolean = RootAssignsToBoolean.value_or(true);
101+
return true;
102+
}
103+
if (BinOp->isCompoundAssignmentOp() && IsBooleanLHS) {
104+
RootAssignsToBoolean = RootAssignsToBoolean.value_or(true);
105+
return true;
106+
}
107+
108+
std::optional<bool> DummyFlag = false;
109+
IsBooleanLHS =
110+
IsBooleanLHS ||
111+
isBooleanBitwise(
112+
dyn_cast<BinaryOperator>(BinOp->getLHS()->IgnoreParenImpCasts()),
113+
AC, DummyFlag);
114+
IsBooleanRHS =
115+
IsBooleanRHS ||
116+
isBooleanBitwise(
117+
dyn_cast<BinaryOperator>(BinOp->getRHS()->IgnoreParenImpCasts()),
118+
AC, DummyFlag);
119+
120+
if (IsBooleanLHS && IsBooleanRHS) {
121+
RootAssignsToBoolean = RootAssignsToBoolean.value_or(false);
122+
return true;
128123
}
129124
}
130125
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %check_clang_tidy %s misc-bool-bitwise-operation %t
2+
3+
bool normal() {
4+
unsigned flags = 100;
5+
if (flags & 0xFFFFFFF8) {
6+
7+
}
8+
return flags & 0x20;
9+
}

0 commit comments

Comments
 (0)