diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -11007,8 +11007,6 @@ Expr *C = nullptr; /// True if the cond expr is in the form of 'x ordop expr'. bool IsXBinopExpr = true; - /// The atomic compare operator. - OMPAtomicCompareOp Op; /// Check if it is a valid conditional update statement (cond-update-stmt). bool checkCondUpdateStmt(IfStmt *S, ErrorInfoTy &ErrorInfo); @@ -11065,23 +11063,7 @@ } switch (Cond->getOpcode()) { - case BO_EQ: - Op = OMPAtomicCompareOp::EQ; - break; - case BO_LT: - Op = OMPAtomicCompareOp::MIN; - break; - case BO_GT: - Op = OMPAtomicCompareOp::MAX; - break; - default: - ErrorInfo.Error = ErrorTy::InvalidBinaryOp; - ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); - ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); - return false; - } - - if (Cond->getOpcode() == BO_EQ) { + case BO_EQ: { C = Cond; D = BO->getRHS(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) { @@ -11094,7 +11076,10 @@ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); return false; } - } else { + break; + } + case BO_LT: + case BO_GT: { E = BO->getRHS(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) && checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) { @@ -11109,6 +11094,13 @@ 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; } return true; @@ -11159,23 +11151,7 @@ } switch (Cond->getOpcode()) { - case BO_EQ: - Op = OMPAtomicCompareOp::EQ; - break; - case BO_LT: - Op = OMPAtomicCompareOp::MIN; - break; - case BO_GT: - Op = OMPAtomicCompareOp::MAX; - break; - default: - ErrorInfo.Error = ErrorTy::InvalidBinaryOp; - ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); - ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); - return false; - } - - if (Cond->getOpcode() == BO_EQ) { + case BO_EQ: { C = Cond; D = CO->getTrueExpr(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) { @@ -11188,7 +11164,10 @@ ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); return false; } - } else { + break; + } + case BO_LT: + case BO_GT: { E = CO->getTrueExpr(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) && checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) { @@ -11203,6 +11182,13 @@ 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; } return true; @@ -11212,8 +11198,7 @@ // 'x' and 'e' cannot be nullptr assert(X && E && "X and E cannot be nullptr"); - auto CheckValue = [&ErrorInfo](const Expr *E, OMPAtomicCompareOp Op, - bool ShouldBeLValue) { + auto CheckValue = [&ErrorInfo](const Expr *E, bool ShouldBeLValue) { if (ShouldBeLValue && !E->isLValue()) { ErrorInfo.Error = ErrorTy::XNotLValue; ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = E->getExprLoc(); @@ -11230,7 +11215,7 @@ return false; } - if (Op != OMPAtomicCompareOp::EQ && !QTy->isIntegerType()) { + if (!QTy->isIntegerType()) { ErrorInfo.Error = ErrorTy::NotInteger; ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = E->getExprLoc(); ErrorInfo.ErrorRange = ErrorInfo.NoteRange = E->getSourceRange(); @@ -11241,13 +11226,13 @@ return true; }; - if (!CheckValue(X, Op, true)) + if (!CheckValue(X, true)) return false; - if (!CheckValue(E, Op, false)) + if (!CheckValue(E, false)) return false; - if (D && !CheckValue(D, Op, false)) + if (D && !CheckValue(D, false)) return false; return true;