@@ -12159,51 +12159,61 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
12159
12159
X = BO->getLHS();
12160
12160
12161
12161
auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
12162
- if (!Cond) {
12162
+ auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond());
12163
+ Expr *LHS = nullptr;
12164
+ Expr *RHS = nullptr;
12165
+ if (Cond) {
12166
+ LHS = Cond->getLHS();
12167
+ RHS = Cond->getRHS();
12168
+ } else if (Call) {
12169
+ LHS = Call->getArg(0);
12170
+ RHS = Call->getArg(1);
12171
+ } else {
12163
12172
ErrorInfo.Error = ErrorTy::NotABinaryOp;
12164
12173
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
12165
12174
ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
12166
12175
return false;
12167
12176
}
12168
12177
12169
- switch ( Cond->getOpcode()) {
12170
- case BO_EQ: {
12171
- C = Cond ;
12178
+ if (( Cond && Cond ->getOpcode() == BO_EQ) ||
12179
+ (Call && Call->getOperator() == OverloadedOperatorKind::OO_EqualEqual)) {
12180
+ C = S->getCond() ;
12172
12181
D = BO->getRHS();
12173
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
12174
- E = Cond->getRHS() ;
12175
- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12176
- E = Cond->getLHS() ;
12182
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
12183
+ E = RHS ;
12184
+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12185
+ E = LHS ;
12177
12186
} else {
12178
12187
ErrorInfo.Error = ErrorTy::InvalidComparison;
12179
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
12180
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
12188
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
12189
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12190
+ S->getCond()->getSourceRange();
12181
12191
return false;
12182
12192
}
12183
- break;
12184
- }
12185
- case BO_LT:
12186
- case BO_GT: {
12193
+ } else if ((Cond &&
12194
+ (Cond->getOpcode() == BO_LT || Cond->getOpcode() == BO_GT)) ||
12195
+ (Call &&
12196
+ (Call->getOperator() == OverloadedOperatorKind::OO_Less ||
12197
+ Call->getOperator() == OverloadedOperatorKind::OO_Greater))) {
12187
12198
E = BO->getRHS();
12188
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() ) &&
12189
- checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS() )) {
12190
- C = Cond ;
12191
- } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS() ) &&
12192
- checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12193
- C = Cond ;
12199
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS ) &&
12200
+ checkIfTwoExprsAreSame(ContextRef, E, RHS )) {
12201
+ C = S->getCond() ;
12202
+ } else if (checkIfTwoExprsAreSame(ContextRef, E, LHS ) &&
12203
+ checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12204
+ C = S->getCond() ;
12194
12205
IsXBinopExpr = false;
12195
12206
} else {
12196
12207
ErrorInfo.Error = ErrorTy::InvalidComparison;
12197
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
12198
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
12208
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
12209
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12210
+ S->getCond()->getSourceRange();
12199
12211
return false;
12200
12212
}
12201
- break;
12202
- }
12203
- default:
12213
+ } else {
12204
12214
ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
12205
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12206
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12215
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12216
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
12207
12217
return false;
12208
12218
}
12209
12219
@@ -12253,52 +12263,64 @@ bool OpenMPAtomicCompareChecker::checkCondExprStmt(Stmt *S,
12253
12263
}
12254
12264
12255
12265
auto *Cond = dyn_cast<BinaryOperator>(CO->getCond());
12256
- if (!Cond) {
12266
+ auto *Call = dyn_cast<CXXOperatorCallExpr>(CO->getCond());
12267
+ Expr *LHS = nullptr;
12268
+ Expr *RHS = nullptr;
12269
+ if (Cond) {
12270
+ LHS = Cond->getLHS();
12271
+ RHS = Cond->getRHS();
12272
+ } else if (Call) {
12273
+ LHS = Call->getArg(0);
12274
+ RHS = Call->getArg(1);
12275
+ } else {
12257
12276
ErrorInfo.Error = ErrorTy::NotABinaryOp;
12258
12277
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
12259
12278
ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12260
12279
CO->getCond()->getSourceRange();
12261
12280
return false;
12262
12281
}
12263
12282
12264
- switch ( Cond->getOpcode()) {
12265
- case BO_EQ: {
12266
- C = Cond ;
12283
+ if (( Cond && Cond ->getOpcode() == BO_EQ) ||
12284
+ (Call && Call->getOperator() == OverloadedOperatorKind::OO_EqualEqual)) {
12285
+ C = CO->getCond() ;
12267
12286
D = CO->getTrueExpr();
12268
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
12269
- E = Cond->getRHS() ;
12270
- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12271
- E = Cond->getLHS() ;
12287
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
12288
+ E = RHS ;
12289
+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12290
+ E = LHS ;
12272
12291
} else {
12273
12292
ErrorInfo.Error = ErrorTy::InvalidComparison;
12274
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
12275
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
12293
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
12294
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12295
+ CO->getCond()->getSourceRange();
12276
12296
return false;
12277
12297
}
12278
- break;
12279
- }
12280
- case BO_LT:
12281
- case BO_GT: {
12298
+ } else if ((Cond &&
12299
+ (Cond->getOpcode() == BO_LT || Cond->getOpcode() == BO_GT)) ||
12300
+ (Call &&
12301
+ (Call->getOperator() == OverloadedOperatorKind::OO_Less ||
12302
+ Call->getOperator() == OverloadedOperatorKind::OO_Greater))) {
12303
+
12282
12304
E = CO->getTrueExpr();
12283
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() ) &&
12284
- checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS() )) {
12285
- C = Cond ;
12286
- } else if (checkIfTwoExprsAreSame(ContextRef, E, Cond->getLHS() ) &&
12287
- checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12288
- C = Cond ;
12305
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS ) &&
12306
+ checkIfTwoExprsAreSame(ContextRef, E, RHS )) {
12307
+ C = CO->getCond() ;
12308
+ } else if (checkIfTwoExprsAreSame(ContextRef, E, LHS ) &&
12309
+ checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12310
+ C = CO->getCond() ;
12289
12311
IsXBinopExpr = false;
12290
12312
} else {
12291
12313
ErrorInfo.Error = ErrorTy::InvalidComparison;
12292
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
12293
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
12314
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
12315
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12316
+ CO->getCond()->getSourceRange();
12294
12317
return false;
12295
12318
}
12296
- break;
12297
- }
12298
- default:
12319
+ } else {
12299
12320
ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
12300
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
12301
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange();
12321
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
12322
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
12323
+ CO->getCond()->getSourceRange();
12302
12324
return false;
12303
12325
}
12304
12326
@@ -12459,31 +12481,41 @@ bool OpenMPAtomicCompareCaptureChecker::checkForm3(IfStmt *S,
12459
12481
D = BO->getRHS();
12460
12482
12461
12483
auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
12462
- if (!Cond) {
12484
+ auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond());
12485
+ Expr *LHS = nullptr;
12486
+ Expr *RHS = nullptr;
12487
+ if (Cond) {
12488
+ LHS = Cond->getLHS();
12489
+ RHS = Cond->getRHS();
12490
+ } else if (Call) {
12491
+ LHS = Call->getArg(0);
12492
+ RHS = Call->getArg(1);
12493
+ } else {
12463
12494
ErrorInfo.Error = ErrorTy::NotABinaryOp;
12464
12495
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
12465
12496
ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
12466
12497
return false;
12467
12498
}
12468
- if (Cond->getOpcode() != BO_EQ) {
12499
+ if ((Cond && Cond->getOpcode() != BO_EQ) ||
12500
+ (Call && Call->getOperator() != OverloadedOperatorKind::OO_EqualEqual)) {
12469
12501
ErrorInfo.Error = ErrorTy::NotEQ;
12470
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12471
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12502
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12503
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
12472
12504
return false;
12473
12505
}
12474
12506
12475
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
12476
- E = Cond->getRHS() ;
12477
- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12478
- E = Cond->getLHS() ;
12507
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
12508
+ E = RHS ;
12509
+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12510
+ E = LHS ;
12479
12511
} else {
12480
12512
ErrorInfo.Error = ErrorTy::InvalidComparison;
12481
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12482
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12513
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12514
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
12483
12515
return false;
12484
12516
}
12485
12517
12486
- C = Cond ;
12518
+ C = S->getCond() ;
12487
12519
12488
12520
if (!S->getElse()) {
12489
12521
ErrorInfo.Error = ErrorTy::NoElse;
0 commit comments