[OpenACC] fix 'loop' restriction of auto/seq/independent
We previously allowed duplicates of auto/seq/independent on a 'loop'
construct. This is disallowed by the restriction (which says exactly one
of...), so this patch ensures they are disallowed.
diff --git a/clang/lib/Sema/SemaOpenACCClause.cpp b/clang/lib/Sema/SemaOpenACCClause.cpp
index 0805779..532bc3e 100644
--- a/clang/lib/Sema/SemaOpenACCClause.cpp
+++ b/clang/lib/Sema/SemaOpenACCClause.cpp
@@ -1264,7 +1264,8 @@
// Only one of the seq, independent, and auto clauses may appear.
const auto *Itr =
llvm::find_if(ExistingClauses,
- llvm::IsaPred<OpenACCIndependentClause, OpenACCSeqClause>);
+ llvm::IsaPred<OpenACCAutoClause, OpenACCIndependentClause,
+ OpenACCSeqClause>);
if (Itr != ExistingClauses.end()) {
SemaRef.Diag(Clause.getBeginLoc(), diag::err_acc_loop_spec_conflict)
<< Clause.getClauseKind() << Clause.getDirectiveKind();
@@ -1281,7 +1282,8 @@
// OpenACC 3.3 2.9:
// Only one of the seq, independent, and auto clauses may appear.
const auto *Itr = llvm::find_if(
- ExistingClauses, llvm::IsaPred<OpenACCAutoClause, OpenACCSeqClause>);
+ ExistingClauses, llvm::IsaPred<OpenACCIndependentClause,
+ OpenACCAutoClause, OpenACCSeqClause>);
if (Itr != ExistingClauses.end()) {
SemaRef.Diag(Clause.getBeginLoc(), diag::err_acc_loop_spec_conflict)
<< Clause.getClauseKind() << Clause.getDirectiveKind();
@@ -1798,7 +1800,8 @@
// Only one of the seq, independent, and auto clauses may appear.
const auto *Itr =
llvm::find_if(ExistingClauses,
- llvm::IsaPred<OpenACCAutoClause, OpenACCIndependentClause>);
+ llvm::IsaPred<OpenACCAutoClause, OpenACCIndependentClause,
+ OpenACCSeqClause>);
if (Itr != ExistingClauses.end()) {
SemaRef.Diag(Clause.getBeginLoc(), diag::err_acc_loop_spec_conflict)
<< Clause.getClauseKind() << Clause.getDirectiveKind();
diff --git a/clang/test/SemaOpenACC/loop-construct-auto_seq_independent-clauses.c b/clang/test/SemaOpenACC/loop-construct-auto_seq_independent-clauses.c
index b4a705b..1c1db8c 100644
--- a/clang/test/SemaOpenACC/loop-construct-auto_seq_independent-clauses.c
+++ b/clang/test/SemaOpenACC/loop-construct-auto_seq_independent-clauses.c
@@ -33,6 +33,19 @@
#pragma acc loop independent seq
for(unsigned i = 0; i < 5; ++i);
+ // expected-error@+2{{OpenACC clause 'seq' on 'loop' construct conflicts with previous data dependence clause}}
+ // expected-note@+1{{previous clause is here}}
+#pragma acc loop seq seq
+ for(unsigned i = 0; i < 5; ++i);
+ // expected-error@+2{{OpenACC clause 'independent' on 'loop' construct conflicts with previous data dependence clause}}
+ // expected-note@+1{{previous clause is here}}
+#pragma acc loop independent independent
+ for(unsigned i = 0; i < 5; ++i);
+ // expected-error@+2{{OpenACC clause 'auto' on 'loop' construct conflicts with previous data dependence clause}}
+ // expected-note@+1{{previous clause is here}}
+#pragma acc loop auto auto
+ for(unsigned i = 0; i < 5; ++i);
+
int Var;
int *VarPtr;