@@ -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+
7795static 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