Skip to content

Commit 0dd72eb

Browse files
committed
[OpenACC] Implement 'vector' and 'worker' cluase argument parsing
Both of the clauses 'vector' and 'worker' have an optional 'special' word followed by an int-expr. The arguments list is optional, as is the special word, but if the parens are included, an int-expr is required. This patch implements parsing for both.
1 parent f10ec8c commit 0dd72eb

File tree

3 files changed

+113
-6
lines changed

3 files changed

+113
-6
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,9 @@ enum class OpenACCClauseKind {
154154
Independent,
155155
/// 'auto' clause, allowed on 'loop' directives.
156156
Auto,
157-
/// 'worker' clause, allowed on 'loop' and 'routine' directives.
157+
/// 'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
158158
Worker,
159-
/// 'vector' clause, allowed on 'loop' and 'routine' directives. Takes no
160-
/// arguments for 'routine', so the 'loop' version is not yet implemented
161-
/// completely.
159+
/// 'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
162160
Vector,
163161
/// 'nohost' clause, allowed on 'routine' directives.
164162
NoHost,

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ enum class OpenACCSpecialTokenKind {
159159
Queues,
160160
Zero,
161161
Force,
162+
Num,
163+
Length,
162164
};
163165

164166
bool isOpenACCSpecialToken(OpenACCSpecialTokenKind Kind, Token Tok) {
@@ -176,6 +178,10 @@ bool isOpenACCSpecialToken(OpenACCSpecialTokenKind Kind, Token Tok) {
176178
return Tok.getIdentifierInfo()->isStr("zero");
177179
case OpenACCSpecialTokenKind::Force:
178180
return Tok.getIdentifierInfo()->isStr("force");
181+
case OpenACCSpecialTokenKind::Num:
182+
return Tok.getIdentifierInfo()->isStr("num");
183+
case OpenACCSpecialTokenKind::Length:
184+
return Tok.getIdentifierInfo()->isStr("length");
179185
}
180186
llvm_unreachable("Unknown 'Kind' Passed");
181187
}
@@ -451,6 +457,9 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
451457
case OpenACCClauseKind::Self:
452458
return DirKind == OpenACCDirectiveKind::Update ? ClauseParensKind::Required
453459
: ClauseParensKind::Optional;
460+
case OpenACCClauseKind::Worker:
461+
case OpenACCClauseKind::Vector:
462+
return ClauseParensKind::Optional;
454463

455464
case OpenACCClauseKind::Default:
456465
case OpenACCClauseKind::If:
@@ -488,8 +497,6 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
488497
case OpenACCClauseKind::Invalid:
489498
case OpenACCClauseKind::NoHost:
490499
case OpenACCClauseKind::Seq:
491-
case OpenACCClauseKind::Worker:
492-
case OpenACCClauseKind::Vector:
493500
return ClauseParensKind::None;
494501
}
495502
llvm_unreachable("Unhandled clause kind");
@@ -719,6 +726,18 @@ bool Parser::ParseOpenACCClauseParams(OpenACCDirectiveKind DirKind,
719726
return true;
720727
break;
721728
}
729+
case OpenACCClauseKind::Vector:
730+
case OpenACCClauseKind::Worker: {
731+
tryParseAndConsumeSpecialTokenKind(*this,
732+
Kind == OpenACCClauseKind::Vector
733+
? OpenACCSpecialTokenKind::Length
734+
: OpenACCSpecialTokenKind::Num,
735+
Kind);
736+
ExprResult IntExpr = ParseOpenACCIntExpr();
737+
if (IntExpr.isInvalid())
738+
return true;
739+
break;
740+
}
722741
default:
723742
llvm_unreachable("Not an optional parens type?");
724743
}

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,96 @@ void IntExprParsing() {
817817

818818
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
819819
#pragma acc set default_async(returns_int())
820+
821+
822+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
823+
#pragma acc loop vector
824+
// expected-error@+2{{expected expression}}
825+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
826+
#pragma acc loop vector()
827+
// expected-error@+3{{invalid tag 'invalid' on 'vector' clause}}
828+
// expected-error@+2{{expected expression}}
829+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
830+
#pragma acc loop vector(invalid:)
831+
// expected-error@+2{{invalid tag 'invalid' on 'vector' clause}}
832+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
833+
#pragma acc loop vector(invalid:5)
834+
// expected-error@+2{{expected expression}}
835+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
836+
#pragma acc loop vector(length:)
837+
// expected-error@+3{{invalid tag 'num' on 'vector' clause}}
838+
// expected-error@+2{{expected expression}}
839+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
840+
#pragma acc loop vector(num:)
841+
// expected-error@+3{{expected ')'}}
842+
// expected-note@+2{{to match this '('}}
843+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
844+
#pragma acc loop vector(5, 4)
845+
// expected-error@+3{{expected ')'}}
846+
// expected-note@+2{{to match this '('}}
847+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
848+
#pragma acc loop vector(length:6,4)
849+
// expected-error@+4{{invalid tag 'num' on 'vector' clause}}
850+
// expected-error@+3{{expected ')'}}
851+
// expected-note@+2{{to match this '('}}
852+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
853+
#pragma acc loop vector(num:6,4)
854+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
855+
#pragma acc loop vector(5)
856+
// expected-error@+2{{invalid tag 'num' on 'vector' clause}}
857+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
858+
#pragma acc loop vector(num:5)
859+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
860+
#pragma acc loop vector(length:5)
861+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
862+
#pragma acc loop vector(returns_int())
863+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
864+
#pragma acc loop vector(length:returns_int())
865+
866+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
867+
#pragma acc loop worker
868+
// expected-error@+2{{expected expression}}
869+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
870+
#pragma acc loop worker()
871+
// expected-error@+3{{invalid tag 'invalid' on 'worker' clause}}
872+
// expected-error@+2{{expected expression}}
873+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
874+
#pragma acc loop worker(invalid:)
875+
// expected-error@+2{{invalid tag 'invalid' on 'worker' clause}}
876+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
877+
#pragma acc loop worker(invalid:5)
878+
// expected-error@+2{{expected expression}}
879+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
880+
#pragma acc loop worker(num:)
881+
// expected-error@+3{{invalid tag 'length' on 'worker' clause}}
882+
// expected-error@+2{{expected expression}}
883+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
884+
#pragma acc loop worker(length:)
885+
// expected-error@+3{{expected ')'}}
886+
// expected-note@+2{{to match this '('}}
887+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
888+
#pragma acc loop worker(5, 4)
889+
// expected-error@+3{{expected ')'}}
890+
// expected-note@+2{{to match this '('}}
891+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
892+
#pragma acc loop worker(num:6,4)
893+
// expected-error@+4{{invalid tag 'length' on 'worker' clause}}
894+
// expected-error@+3{{expected ')'}}
895+
// expected-note@+2{{to match this '('}}
896+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
897+
#pragma acc loop worker(length:6,4)
898+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
899+
#pragma acc loop worker(5)
900+
// expected-error@+2{{invalid tag 'length' on 'worker' clause}}
901+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
902+
#pragma acc loop worker(length:5)
903+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
904+
#pragma acc loop worker(num:5)
905+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
906+
#pragma acc loop worker(returns_int())
907+
// expected-error@+2{{invalid tag 'length' on 'worker' clause}}
908+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
909+
#pragma acc loop worker(length:returns_int())
820910
}
821911

822912
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}

0 commit comments

Comments
 (0)