diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -6183,8 +6183,19 @@ LValue XLVal = CGF.EmitLValue(X); Address XAddr = XLVal.getAddress(CGF); - llvm::Value *EVal = CGF.EmitScalarExpr(E); - llvm::Value *DVal = D ? CGF.EmitScalarExpr(D) : nullptr; + + auto EmitRValueWithCastIfNeeded = [&CGF, Loc](const Expr *X, const Expr *E) { + if (X->getType() == E->getType()) + return CGF.EmitScalarExpr(E); + const Expr *NewE = E->IgnoreImplicitAsWritten(); + llvm::Value *V = CGF.EmitScalarExpr(NewE); + if (NewE->getType() == X->getType()) + return V; + return CGF.EmitScalarConversion(V, NewE->getType(), X->getType(), Loc); + }; + + llvm::Value *EVal = EmitRValueWithCastIfNeeded(X, E); + llvm::Value *DVal = D ? EmitRValueWithCastIfNeeded(X, D) : nullptr; llvm::OpenMPIRBuilder::AtomicOpValue XOpVal{ XAddr.getPointer(), XAddr.getElementType(), 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 @@ -11429,11 +11429,11 @@ switch (Cond->getOpcode()) { case BO_EQ: { C = Cond; - D = BO->getRHS()->IgnoreImpCasts(); + D = BO->getRHS(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) { - E = Cond->getRHS()->IgnoreImpCasts(); + E = Cond->getRHS(); } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) { - E = Cond->getLHS()->IgnoreImpCasts(); + E = Cond->getLHS(); } else { ErrorInfo.Error = ErrorTy::InvalidComparison; ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); @@ -11444,7 +11444,7 @@ } case BO_LT: case BO_GT: { - E = BO->getRHS()->IgnoreImpCasts(); + E = BO->getRHS(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) && checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) { C = Cond; @@ -11524,11 +11524,11 @@ switch (Cond->getOpcode()) { case BO_EQ: { C = Cond; - D = CO->getTrueExpr()->IgnoreImpCasts(); + D = CO->getTrueExpr(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) { - E = Cond->getRHS()->IgnoreImpCasts(); + E = Cond->getRHS(); } else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) { - E = Cond->getLHS()->IgnoreImpCasts(); + E = Cond->getLHS(); } else { ErrorInfo.Error = ErrorTy::InvalidComparison; ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc(); @@ -11539,7 +11539,7 @@ } case BO_LT: case BO_GT: { - E = CO->getTrueExpr()->IgnoreImpCasts(); + E = CO->getTrueExpr(); if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) && checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) { C = Cond;