================
@@ -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;
+    }
----------------
jhuber6 wrote:

I tried that but the switch statements required some kind of helper to abstract 
over the differing enum values. I could potentially just replace those with 
`if` and `else` that just did short circuiting or something I guess.

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