[clang] [OpenMP] Fix atomic compare handling with overloaded operators (PR #141142)
Shilei Tian via cfe-commits
cfe-commits at lists.llvm.org
Thu May 22 15:00:47 PDT 2025
================
@@ -11762,52 +11762,98 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
X = BO->getLHS();
- auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
- if (!Cond) {
- ErrorInfo.Error = ErrorTy::NotABinaryOp;
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
- return false;
- }
-
- switch (Cond->getOpcode()) {
- case BO_EQ: {
- C = Cond;
- D = BO->getRHS();
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) {
- E = Cond->getRHS();
- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) {
- E = Cond->getLHS();
- } else {
- ErrorInfo.Error = ErrorTy::InvalidComparison;
+ if (auto *Cond = dyn_cast<BinaryOperator>(S->getCond())) {
+ switch (Cond->getOpcode()) {
+ case BO_EQ: {
+ C = Cond;
+ D = BO->getRHS();
+ 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;
+ }
+ break;
+ }
+ case BO_LT:
+ case BO_GT: {
+ E = BO->getRHS();
+ if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) &&
+ checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) {
+ C = Cond;
+ } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS()) &&
+ checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) {
+ C = Cond;
+ IsXBinopExpr = false;
+ } else {
+ ErrorInfo.Error = ErrorTy::InvalidComparison;
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
+ return false;
+ }
+ break;
+ }
+ default:
+ ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
return false;
}
- break;
- }
- case BO_LT:
- case BO_GT: {
- E = BO->getRHS();
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) &&
- checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) {
- C = Cond;
- } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS()) &&
- checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) {
- C = Cond;
- IsXBinopExpr = false;
- } else {
- ErrorInfo.Error = ErrorTy::InvalidComparison;
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
+ } else if (auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond())) {
----------------
shiltian wrote:
but you can just check whether they are dependent type and call it a day?
https://github.com/llvm/llvm-project/pull/141142
More information about the cfe-commits
mailing list