Skip to content

Commit 04952c5

Browse files
committed
[OpenACC] Implement remaining 'simple' int-expr clauses.
'num_gangs', 'num_workers', 'device_num', and 'default_async' are all exactly the same (for the purposes of parsing) as 'vector_length', so implement these the same way.
1 parent a301fb1 commit 04952c5

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,16 @@ enum class OpenACCClauseKind {
224224
/// 'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop',
225225
/// and 'kernels loop' constructs.
226226
VectorLength,
227+
/// 'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and
228+
/// 'kernels loop' constructs.
229+
NumGangs,
230+
/// 'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop',
231+
/// and 'kernels loop' constructs.
232+
NumWorkers,
233+
/// 'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
234+
DeviceNum,
235+
/// 'default_async' clause, allowed on 'set' construct.
236+
DefaultAsync,
227237

228238
/// Represents an invalid clause, for the purposes of parsing.
229239
Invalid,
@@ -328,6 +338,18 @@ inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,
328338
case OpenACCClauseKind::VectorLength:
329339
return Out << "vector_length";
330340

341+
case OpenACCClauseKind::NumGangs:
342+
return Out << "num_gangs";
343+
344+
case OpenACCClauseKind::NumWorkers:
345+
return Out << "num_workers";
346+
347+
case OpenACCClauseKind::DeviceNum:
348+
return Out << "device_num";
349+
350+
case OpenACCClauseKind::DefaultAsync:
351+
return Out << "default_async";
352+
331353
case OpenACCClauseKind::Invalid:
332354
return Out << "<invalid>";
333355
}

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,11 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
9898
.Case("copyin", OpenACCClauseKind::CopyIn)
9999
.Case("copyout", OpenACCClauseKind::CopyOut)
100100
.Case("default", OpenACCClauseKind::Default)
101+
.Case("default_async", OpenACCClauseKind::DefaultAsync)
101102
.Case("delete", OpenACCClauseKind::Delete)
102103
.Case("detach", OpenACCClauseKind::Detach)
103104
.Case("device", OpenACCClauseKind::Device)
105+
.Case("device_num", OpenACCClauseKind::DeviceNum)
104106
.Case("device_resident", OpenACCClauseKind::DeviceResident)
105107
.Case("deviceptr", OpenACCClauseKind::DevicePtr)
106108
.Case("finalize", OpenACCClauseKind::Finalize)
@@ -111,6 +113,8 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
111113
.Case("independent", OpenACCClauseKind::Independent)
112114
.Case("link", OpenACCClauseKind::Link)
113115
.Case("no_create", OpenACCClauseKind::NoCreate)
116+
.Case("num_gangs", OpenACCClauseKind::NumGangs)
117+
.Case("num_workers", OpenACCClauseKind::NumWorkers)
114118
.Case("nohost", OpenACCClauseKind::NoHost)
115119
.Case("present", OpenACCClauseKind::Present)
116120
.Case("private", OpenACCClauseKind::Private)
@@ -471,6 +475,10 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
471475
case OpenACCClauseKind::Collapse:
472476
case OpenACCClauseKind::Bind:
473477
case OpenACCClauseKind::VectorLength:
478+
case OpenACCClauseKind::NumGangs:
479+
case OpenACCClauseKind::NumWorkers:
480+
case OpenACCClauseKind::DeviceNum:
481+
case OpenACCClauseKind::DefaultAsync:
474482
return ClauseParensKind::Required;
475483

476484
case OpenACCClauseKind::Auto:
@@ -684,6 +692,10 @@ bool Parser::ParseOpenACCClauseParams(OpenACCDirectiveKind DirKind,
684692
return true;
685693
break;
686694
}
695+
case OpenACCClauseKind::NumGangs:
696+
case OpenACCClauseKind::NumWorkers:
697+
case OpenACCClauseKind::DeviceNum:
698+
case OpenACCClauseKind::DefaultAsync:
687699
case OpenACCClauseKind::VectorLength: {
688700
ExprResult IntExpr = ParseOpenACCIntExpr();
689701
if (IntExpr.isInvalid())

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,98 @@ void IntExprParsing() {
725725

726726
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
727727
#pragma acc parallel vector_length(returns_int())
728+
729+
// expected-error@+2{{expected '('}}
730+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
731+
#pragma acc parallel num_gangs
732+
733+
// expected-error@+2{{expected expression}}
734+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
735+
#pragma acc parallel num_gangs()
736+
737+
// expected-error@+2{{use of undeclared identifier 'invalid'}}
738+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
739+
#pragma acc parallel num_gangs(invalid)
740+
741+
// expected-error@+3{{expected ')'}}
742+
// expected-note@+2{{to match this '('}}
743+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
744+
#pragma acc parallel num_gangs(5, 4)
745+
746+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
747+
#pragma acc parallel num_gangs(5)
748+
749+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
750+
#pragma acc parallel num_gangs(returns_int())
751+
752+
// expected-error@+2{{expected '('}}
753+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
754+
#pragma acc parallel num_workers
755+
756+
// expected-error@+2{{expected expression}}
757+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
758+
#pragma acc parallel num_workers()
759+
760+
// expected-error@+2{{use of undeclared identifier 'invalid'}}
761+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
762+
#pragma acc parallel num_workers(invalid)
763+
764+
// expected-error@+3{{expected ')'}}
765+
// expected-note@+2{{to match this '('}}
766+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
767+
#pragma acc parallel num_workers(5, 4)
768+
769+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
770+
#pragma acc parallel num_workers(5)
771+
772+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
773+
#pragma acc parallel num_workers(returns_int())
774+
775+
// expected-error@+2{{expected '('}}
776+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
777+
#pragma acc init device_num
778+
779+
// expected-error@+2{{expected expression}}
780+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
781+
#pragma acc init device_num()
782+
783+
// expected-error@+2{{use of undeclared identifier 'invalid'}}
784+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
785+
#pragma acc init device_num(invalid)
786+
787+
// expected-error@+3{{expected ')'}}
788+
// expected-note@+2{{to match this '('}}
789+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
790+
#pragma acc init device_num(5, 4)
791+
792+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
793+
#pragma acc init device_num(5)
794+
795+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
796+
#pragma acc init device_num(returns_int())
797+
798+
// expected-error@+2{{expected '('}}
799+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
800+
#pragma acc set default_async
801+
802+
// expected-error@+2{{expected expression}}
803+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
804+
#pragma acc set default_async()
805+
806+
// expected-error@+2{{use of undeclared identifier 'invalid'}}
807+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
808+
#pragma acc set default_async(invalid)
809+
810+
// expected-error@+3{{expected ')'}}
811+
// expected-note@+2{{to match this '('}}
812+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
813+
#pragma acc set default_async(5, 4)
814+
815+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
816+
#pragma acc set default_async(5)
817+
818+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
819+
#pragma acc set default_async(returns_int())
728820
}
729821

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

0 commit comments

Comments
 (0)