@@ -11763,51 +11763,61 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
1176311763 X = BO->getLHS();
1176411764
1176511765 auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
11766- if (!Cond) {
11766+ auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond());
11767+ Expr *LHS = nullptr;
11768+ Expr *RHS = nullptr;
11769+ if (Cond) {
11770+ LHS = Cond->getLHS();
11771+ RHS = Cond->getRHS();
11772+ } else if (Call) {
11773+ LHS = Call->getArg(0);
11774+ RHS = Call->getArg(1);
11775+ } else {
1176711776 ErrorInfo.Error = ErrorTy::NotABinaryOp;
1176811777 ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
1176911778 ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
1177011779 return false;
1177111780 }
1177211781
11773- switch ( Cond->getOpcode()) {
11774- case BO_EQ: {
11775- C = Cond ;
11782+ if (( Cond && Cond ->getOpcode() == BO_EQ) ||
11783+ (Call && Call->getOperator() == OverloadedOperatorKind::OO_EqualEqual)) {
11784+ C = S->getCond() ;
1177611785 D = BO->getRHS();
11777- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
11778- E = Cond->getRHS() ;
11779- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
11780- E = Cond->getLHS() ;
11786+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
11787+ E = RHS ;
11788+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11789+ E = LHS ;
1178111790 } else {
1178211791 ErrorInfo.Error = ErrorTy::InvalidComparison;
11783- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
11784- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
11792+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
11793+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11794+ S->getCond()->getSourceRange();
1178511795 return false;
1178611796 }
11787- break;
11788- }
11789- case BO_LT:
11790- case BO_GT: {
11797+ } else if ((Cond &&
11798+ (Cond->getOpcode() == BO_LT || Cond->getOpcode() == BO_GT)) ||
11799+ (Call &&
11800+ (Call->getOperator() == OverloadedOperatorKind::OO_Less ||
11801+ Call->getOperator() == OverloadedOperatorKind::OO_Greater))) {
1179111802 E = BO->getRHS();
11792- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() ) &&
11793- checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS() )) {
11794- C = Cond ;
11795- } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS() ) &&
11796- checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
11797- C = Cond ;
11803+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS ) &&
11804+ checkIfTwoExprsAreSame(ContextRef, E, RHS )) {
11805+ C = S->getCond() ;
11806+ } else if (checkIfTwoExprsAreSame(ContextRef, E, LHS ) &&
11807+ checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11808+ C = S->getCond() ;
1179811809 IsXBinopExpr = false;
1179911810 } else {
1180011811 ErrorInfo.Error = ErrorTy::InvalidComparison;
11801- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
11802- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
11812+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
11813+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11814+ S->getCond()->getSourceRange();
1180311815 return false;
1180411816 }
11805- break;
11806- }
11807- default:
11817+ } else {
1180811818 ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
11809- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
11810- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
11819+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
11820+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
1181111821 return false;
1181211822 }
1181311823
@@ -11857,52 +11867,64 @@ bool OpenMPAtomicCompareChecker::checkCondExprStmt(Stmt *S,
1185711867 }
1185811868
1185911869 auto *Cond = dyn_cast<BinaryOperator>(CO->getCond());
11860- if (!Cond) {
11870+ auto *Call = dyn_cast<CXXOperatorCallExpr>(CO->getCond());
11871+ Expr *LHS = nullptr;
11872+ Expr *RHS = nullptr;
11873+ if (Cond) {
11874+ LHS = Cond->getLHS();
11875+ RHS = Cond->getRHS();
11876+ } else if (Call) {
11877+ LHS = Call->getArg(0);
11878+ RHS = Call->getArg(1);
11879+ } else {
1186111880 ErrorInfo.Error = ErrorTy::NotABinaryOp;
1186211881 ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
1186311882 ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
1186411883 CO->getCond()->getSourceRange();
1186511884 return false;
1186611885 }
1186711886
11868- switch ( Cond->getOpcode()) {
11869- case BO_EQ: {
11870- C = Cond ;
11887+ if (( Cond && Cond ->getOpcode() == BO_EQ) ||
11888+ (Call && Call->getOperator() == OverloadedOperatorKind::OO_EqualEqual)) {
11889+ C = CO->getCond() ;
1187111890 D = CO->getTrueExpr();
11872- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
11873- E = Cond->getRHS() ;
11874- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
11875- E = Cond->getLHS() ;
11891+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
11892+ E = RHS ;
11893+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11894+ E = LHS ;
1187611895 } else {
1187711896 ErrorInfo.Error = ErrorTy::InvalidComparison;
11878- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
11879- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
11897+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
11898+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11899+ CO->getCond()->getSourceRange();
1188011900 return false;
1188111901 }
11882- break;
11883- }
11884- case BO_LT:
11885- case BO_GT: {
11902+ } else if ((Cond &&
11903+ (Cond->getOpcode() == BO_LT || Cond->getOpcode() == BO_GT)) ||
11904+ (Call &&
11905+ (Call->getOperator() == OverloadedOperatorKind::OO_Less ||
11906+ Call->getOperator() == OverloadedOperatorKind::OO_Greater))) {
11907+
1188611908 E = CO->getTrueExpr();
11887- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() ) &&
11888- checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS() )) {
11889- C = Cond ;
11890- } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS() ) &&
11891- checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
11892- C = Cond ;
11909+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS ) &&
11910+ checkIfTwoExprsAreSame(ContextRef, E, RHS )) {
11911+ C = CO->getCond() ;
11912+ } else if (checkIfTwoExprsAreSame(ContextRef, E, LHS ) &&
11913+ checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11914+ C = CO->getCond() ;
1189311915 IsXBinopExpr = false;
1189411916 } else {
1189511917 ErrorInfo.Error = ErrorTy::InvalidComparison;
11896- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
11897- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
11918+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
11919+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11920+ CO->getCond()->getSourceRange();
1189811921 return false;
1189911922 }
11900- break;
11901- }
11902- default:
11923+ } else {
1190311924 ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
11904- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
11905- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
11925+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
11926+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11927+ CO->getCond()->getSourceRange();
1190611928 return false;
1190711929 }
1190811930
@@ -12063,31 +12085,41 @@ bool OpenMPAtomicCompareCaptureChecker::checkForm3(IfStmt *S,
1206312085 D = BO->getRHS();
1206412086
1206512087 auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
12066- if (!Cond) {
12088+ auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond());
12089+ Expr *LHS = nullptr;
12090+ Expr *RHS = nullptr;
12091+ if (Cond) {
12092+ LHS = Cond->getLHS();
12093+ RHS = Cond->getRHS();
12094+ } else if (Call) {
12095+ LHS = Call->getArg(0);
12096+ RHS = Call->getArg(1);
12097+ } else {
1206712098 ErrorInfo.Error = ErrorTy::NotABinaryOp;
1206812099 ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
1206912100 ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
1207012101 return false;
1207112102 }
12072- if (Cond->getOpcode() != BO_EQ) {
12103+ if ((Cond && Cond->getOpcode() != BO_EQ) ||
12104+ (Call && Call->getOperator() != OverloadedOperatorKind::OO_EqualEqual)) {
1207312105 ErrorInfo.Error = ErrorTy::NotEQ;
12074- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12075- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12106+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12107+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
1207612108 return false;
1207712109 }
1207812110
12079- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
12080- E = Cond->getRHS() ;
12081- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12082- E = Cond->getLHS() ;
12111+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
12112+ E = RHS ;
12113+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12114+ E = LHS ;
1208312115 } else {
1208412116 ErrorInfo.Error = ErrorTy::InvalidComparison;
12085- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12086- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12117+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12118+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
1208712119 return false;
1208812120 }
1208912121
12090- C = Cond ;
12122+ C = S->getCond() ;
1209112123
1209212124 if (!S->getElse()) {
1209312125 ErrorInfo.Error = ErrorTy::NoElse;
0 commit comments