[OPENMP50]Support for acquire clause.
Added full support for acquire clause in flush|atomic directives.
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index aa61971..ed2320c 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -4988,6 +4988,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_depend:
case OMPC_threads:
case OMPC_simd:
@@ -8571,6 +8572,24 @@
else
OrderClause = C;
}
+ OpenMPClauseKind MemOrderKind = OMPC_unknown;
+ SourceLocation MemOrderLoc;
+ for (const OMPClause *C : Clauses) {
+ if (C->getClauseKind() == OMPC_seq_cst ||
+ C->getClauseKind() == OMPC_acq_rel ||
+ C->getClauseKind() == OMPC_acquire) {
+ if (MemOrderKind != OMPC_unknown) {
+ Diag(C->getBeginLoc(), diag::err_omp_several_mem_order_clauses)
+ << getOpenMPDirectiveName(OMPD_flush) << 1
+ << SourceRange(C->getBeginLoc(), C->getEndLoc());
+ Diag(MemOrderLoc, diag::note_omp_previous_mem_order_clause)
+ << getOpenMPClauseName(MemOrderKind);
+ } else {
+ MemOrderKind = C->getClauseKind();
+ MemOrderLoc = C->getBeginLoc();
+ }
+ }
+ }
if (FC && OrderClause) {
Diag(FC->getLParenLoc(), diag::err_omp_flush_order_clause_and_list)
<< getOpenMPClauseName(OrderClause->getClauseKind());
@@ -8925,7 +8944,7 @@
if (AtomicKind != OMPC_unknown) {
Diag(C->getBeginLoc(), diag::err_omp_atomic_several_clauses)
<< SourceRange(C->getBeginLoc(), C->getEndLoc());
- Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause)
+ Diag(AtomicKindLoc, diag::note_omp_previous_mem_order_clause)
<< getOpenMPClauseName(AtomicKind);
} else {
AtomicKind = C->getClauseKind();
@@ -8933,11 +8952,13 @@
}
}
if (C->getClauseKind() == OMPC_seq_cst ||
- C->getClauseKind() == OMPC_acq_rel) {
+ C->getClauseKind() == OMPC_acq_rel ||
+ C->getClauseKind() == OMPC_acquire) {
if (MemOrderKind != OMPC_unknown) {
- Diag(C->getBeginLoc(), diag::err_omp_atomic_several_mem_order_clauses)
+ Diag(C->getBeginLoc(), diag::err_omp_several_mem_order_clauses)
+ << getOpenMPDirectiveName(OMPD_atomic) << 0
<< SourceRange(C->getBeginLoc(), C->getEndLoc());
- Diag(MemOrderLoc, diag::note_omp_atomic_previous_clause)
+ Diag(MemOrderLoc, diag::note_omp_previous_mem_order_clause)
<< getOpenMPClauseName(MemOrderKind);
} else {
MemOrderKind = C->getClauseKind();
@@ -10871,6 +10892,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_depend:
case OMPC_threads:
case OMPC_simd:
@@ -11584,6 +11606,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_depend:
case OMPC_threads:
case OMPC_simd:
@@ -12007,6 +12030,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_depend:
case OMPC_device:
case OMPC_threads:
@@ -12208,6 +12232,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_depend:
case OMPC_device:
case OMPC_threads:
@@ -12384,6 +12409,9 @@
case OMPC_acq_rel:
Res = ActOnOpenMPAcqRelClause(StartLoc, EndLoc);
break;
+ case OMPC_acquire:
+ Res = ActOnOpenMPAcquireClause(StartLoc, EndLoc);
+ break;
case OMPC_threads:
Res = ActOnOpenMPThreadsClause(StartLoc, EndLoc);
break;
@@ -12502,6 +12530,11 @@
return new (Context) OMPAcqRelClause(StartLoc, EndLoc);
}
+OMPClause *Sema::ActOnOpenMPAcquireClause(SourceLocation StartLoc,
+ SourceLocation EndLoc) {
+ return new (Context) OMPAcquireClause(StartLoc, EndLoc);
+}
+
OMPClause *Sema::ActOnOpenMPThreadsClause(SourceLocation StartLoc,
SourceLocation EndLoc) {
return new (Context) OMPThreadsClause(StartLoc, EndLoc);
@@ -12659,6 +12692,7 @@
case OMPC_capture:
case OMPC_seq_cst:
case OMPC_acq_rel:
+ case OMPC_acquire:
case OMPC_device:
case OMPC_threads:
case OMPC_simd: