@@ -11763,51 +11763,61 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
11763
11763
X = BO->getLHS();
11764
11764
11765
11765
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 {
11767
11776
ErrorInfo.Error = ErrorTy::NotABinaryOp;
11768
11777
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
11769
11778
ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
11770
11779
return false;
11771
11780
}
11772
11781
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() ;
11776
11785
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 ;
11781
11790
} else {
11782
11791
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();
11785
11795
return false;
11786
11796
}
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))) {
11791
11802
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() ;
11798
11809
IsXBinopExpr = false;
11799
11810
} else {
11800
11811
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();
11803
11815
return false;
11804
11816
}
11805
- break;
11806
- }
11807
- default:
11817
+ } else {
11808
11818
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();
11811
11821
return false;
11812
11822
}
11813
11823
@@ -11857,52 +11867,60 @@ bool OpenMPAtomicCompareChecker::checkCondExprStmt(Stmt *S,
11857
11867
}
11858
11868
11859
11869
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 {
11861
11880
ErrorInfo.Error = ErrorTy::NotABinaryOp;
11862
11881
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond()->getExprLoc();
11863
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange =
11864
- CO->getCond()->getSourceRange();
11882
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = CO->getCond()->getSourceRange();
11865
11883
return false;
11866
11884
}
11867
11885
11868
- switch ( Cond->getOpcode()) {
11869
- case BO_EQ: {
11870
- C = Cond ;
11886
+ if (( Cond && Cond ->getOpcode() == BO_EQ) ||
11887
+ (Call && Call->getOperator() == OverloadedOperatorKind::OO_EqualEqual)) {
11888
+ C = CO->getCond() ;
11871
11889
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() ;
11890
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
11891
+ E = RHS ;
11892
+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11893
+ E = LHS ;
11876
11894
} else {
11877
11895
ErrorInfo.Error = ErrorTy::InvalidComparison;
11878
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
11879
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
11896
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond() ->getExprLoc();
11897
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = CO->getCond() ->getSourceRange();
11880
11898
return false;
11881
11899
}
11882
- break;
11883
- }
11884
- case BO_LT:
11885
- case BO_GT: {
11900
+ } else if ((Cond &&
11901
+ (Cond->getOpcode() == BO_LT || Cond->getOpcode() == BO_GT)) ||
11902
+ (Call &&
11903
+ (Call->getOperator() == OverloadedOperatorKind::OO_Less ||
11904
+ Call->getOperator() == OverloadedOperatorKind::OO_Greater))) {
11905
+
11886
11906
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 ;
11907
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS ) &&
11908
+ checkIfTwoExprsAreSame(ContextRef, E, RHS )) {
11909
+ C = CO->getCond() ;
11910
+ } else if (checkIfTwoExprsAreSame(ContextRef, E, LHS ) &&
11911
+ checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
11912
+ C = CO->getCond() ;
11893
11913
IsXBinopExpr = false;
11894
11914
} else {
11895
11915
ErrorInfo.Error = ErrorTy::InvalidComparison;
11896
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
11897
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
11916
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond() ->getExprLoc();
11917
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = CO->getCond() ->getSourceRange();
11898
11918
return false;
11899
11919
}
11900
- break;
11901
- }
11902
- default:
11920
+ } else {
11903
11921
ErrorInfo.Error = ErrorTy::InvalidBinaryOp;
11904
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
11905
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
11922
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = CO->getCond() ->getExprLoc();
11923
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = CO->getCond() ->getSourceRange();
11906
11924
return false;
11907
11925
}
11908
11926
@@ -12063,31 +12081,41 @@ bool OpenMPAtomicCompareCaptureChecker::checkForm3(IfStmt *S,
12063
12081
D = BO->getRHS();
12064
12082
12065
12083
auto *Cond = dyn_cast<BinaryOperator>(S->getCond());
12066
- if (!Cond) {
12084
+ auto *Call = dyn_cast<CXXOperatorCallExpr>(S->getCond());
12085
+ Expr *LHS = nullptr;
12086
+ Expr *RHS = nullptr;
12087
+ if (Cond) {
12088
+ LHS = Cond->getLHS();
12089
+ RHS = Cond->getRHS();
12090
+ } else if (Call) {
12091
+ LHS = Call->getArg(0);
12092
+ RHS = Call->getArg(1);
12093
+ } else {
12067
12094
ErrorInfo.Error = ErrorTy::NotABinaryOp;
12068
12095
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond()->getExprLoc();
12069
12096
ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond()->getSourceRange();
12070
12097
return false;
12071
12098
}
12072
- if (Cond->getOpcode() != BO_EQ) {
12099
+ if ((Cond && Cond->getOpcode() != BO_EQ) ||
12100
+ (Call && Call->getOperator() != OverloadedOperatorKind::OO_EqualEqual)) {
12073
12101
ErrorInfo.Error = ErrorTy::NotEQ;
12074
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12075
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12102
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12103
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
12076
12104
return false;
12077
12105
}
12078
12106
12079
- if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS() )) {
12080
- E = Cond->getRHS() ;
12081
- } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS() )) {
12082
- E = Cond->getLHS() ;
12107
+ if (checkIfTwoExprsAreSame(ContextRef, X, LHS )) {
12108
+ E = RHS ;
12109
+ } else if (checkIfTwoExprsAreSame(ContextRef, X, RHS )) {
12110
+ E = LHS ;
12083
12111
} else {
12084
12112
ErrorInfo.Error = ErrorTy::InvalidComparison;
12085
- ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond ->getExprLoc();
12086
- ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond ->getSourceRange();
12113
+ ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = S->getCond() ->getExprLoc();
12114
+ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = S->getCond() ->getSourceRange();
12087
12115
return false;
12088
12116
}
12089
12117
12090
- C = Cond ;
12118
+ C = S->getCond() ;
12091
12119
12092
12120
if (!S->getElse()) {
12093
12121
ErrorInfo.Error = ErrorTy::NoElse;
0 commit comments