================
@@ -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

Reply via email to