tianshilei1992 created this revision.
tianshilei1992 added reviewers: jdoerfert, ABataev.
Herald added subscribers: guansong, yaxunl.
tianshilei1992 requested review of this revision.
Herald added subscribers: cfe-commits, sstefan1.
Herald added a project: clang.
This is a follow-up patch of D119378 <https://reviews.llvm.org/D119378>.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D119392
Files:
clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/atomic_messages.c
Index: clang/test/OpenMP/atomic_messages.c
===================================================================
--- clang/test/OpenMP/atomic_messages.c
+++ clang/test/OpenMP/atomic_messages.c
@@ -473,15 +473,5 @@
x = e;
d = e;
}
- float fx = 0.0f;
- float fd = 0.0f;
- float fe = 0.0f;
-// omp51-error@+5 {{the statement for 'atomic compare' must be a compound statement of form '{x = expr ordop x ? expr : x;}', '{x = x ordop expr? expr : x;}', '{x = x == e ? d : x;}', '{x = e == x ? d : x;}', or 'if(expr ordop x) {x = expr;}', 'if(x ordop expr) {x = expr;}', 'if(x == e) {x = d;}', 'if(e == x) {x = d;}' where 'x' is an lvalue expression with scalar type, 'expr', 'e', and 'd' are expressions with scalar type, and 'ordop' is one of '<' or '>'.}}
-// omp51-note@+4 {{expect integer value}}
-#pragma omp atomic compare
- {
- if (fx > fe)
- fx = fe;
- }
}
#endif
Index: clang/lib/Sema/SemaOpenMP.cpp
===================================================================
--- clang/lib/Sema/SemaOpenMP.cpp
+++ 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;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits