@@ -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-
9577static 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 }
0 commit comments