================ @@ -12062,32 +12154,56 @@ bool OpenMPAtomicCompareCaptureChecker::checkForm3(IfStmt *S, X = BO->getLHS(); D = BO->getRHS(); - auto *Cond = dyn_cast<BinaryOperator>(S->getCond()); - if (!Cond) { + if (auto *Cond = dyn_cast<BinaryOperator>(S->getCond())) { + C = Cond; + if (Cond->getOpcode() != BO_EQ) { + ErrorInfo.Error = ErrorTy::NotEQ; + ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); + return false; + } + + if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) { + E = Cond->getRHS(); + } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) { + E = Cond->getLHS(); + } else { + ErrorInfo.Error = ErrorTy::InvalidComparison; + ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); + return false; + } + } else if (auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond())) { + C = Call; + if (Call->getNumArgs() != 2) { + ErrorInfo.Error = ErrorTy::InvalidBinaryOp; + ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Call->getExprLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Call->getSourceRange(); + return false; + } + if (Call->getOperator() != clang::OverloadedOperatorKind::OO_EqualEqual) { + ErrorInfo.Error = ErrorTy::NotEQ; + ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Call->getExprLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Call->getSourceRange(); + return false; + } + + if (checkIfTwoExprsAreSame(ContextRef, X, Call->getArg(0))) { + E = Call->getArg(1); + } else if (checkIfTwoExprsAreSame(ContextRef, X, Call->getArg(1))) { + E = Call->getArg(0); + } else { + ErrorInfo.Error = ErrorTy::InvalidComparison; + ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Call->getExprLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Call->getSourceRange(); + return false; + } ---------------- jdoerfert wrote:
Here and above, I think we can reasonably make helpers. It can take things like ``` bool IsEqual, bool IsLT, ..., auto *LHS, auto *RHS ``` and check the conditions. https://github.com/llvm/llvm-project/pull/141142 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits