Skip to content

Commit 0dd0cbd

Browse files
committed
[OpenACC] Implement 'wait' clause parsing.
The 'wait' clause is parsed the same way as the 'wait' construct, so this jsut differs to that function.
1 parent 58e8c07 commit 0dd0cbd

File tree

3 files changed

+173
-12
lines changed

3 files changed

+173
-12
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ enum class OpenACCClauseKind {
245245
Tile,
246246
/// 'gang' clause, allowed on 'loop' and Combined constructs.
247247
Gang,
248+
/// 'wait' clause, allowed on Compute, Data, 'update', and Combined
249+
/// constructs.
250+
Wait,
248251

249252
/// Represents an invalid clause, for the purposes of parsing.
250253
Invalid,
@@ -376,6 +379,9 @@ inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,
376379
case OpenACCClauseKind::Gang:
377380
return Out << "gang";
378381

382+
case OpenACCClauseKind::Wait:
383+
return Out << "wait";
384+
379385
case OpenACCClauseKind::Invalid:
380386
return Out << "<invalid>";
381387
}

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
129129
.Case("use_device", OpenACCClauseKind::UseDevice)
130130
.Case("vector", OpenACCClauseKind::Vector)
131131
.Case("vector_length", OpenACCClauseKind::VectorLength)
132+
.Case("wait", OpenACCClauseKind::Wait)
132133
.Case("worker", OpenACCClauseKind::Worker)
133134
.Default(OpenACCClauseKind::Invalid);
134135
}
@@ -475,6 +476,7 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
475476
case OpenACCClauseKind::Worker:
476477
case OpenACCClauseKind::Vector:
477478
case OpenACCClauseKind::Gang:
479+
case OpenACCClauseKind::Wait:
478480
return ClauseParensKind::Optional;
479481

480482
case OpenACCClauseKind::Default:
@@ -907,6 +909,12 @@ bool Parser::ParseOpenACCClauseParams(OpenACCDirectiveKind DirKind,
907909
if (ParseOpenACCGangArgList())
908910
return true;
909911
break;
912+
case OpenACCClauseKind::Wait:
913+
if (ParseOpenACCWaitArgument()) {
914+
Parens.skipToEnd();
915+
return false;
916+
}
917+
break;
910918
default:
911919
llvm_unreachable("Not an optional parens type?");
912920
}
@@ -940,8 +948,7 @@ bool Parser::ParseOpenACCWaitArgument() {
940948
// Consume colon.
941949
ConsumeToken();
942950

943-
ExprResult IntExpr =
944-
getActions().CorrectDelayedTyposInExpr(ParseAssignmentExpression());
951+
ExprResult IntExpr = ParseOpenACCIntExpr();
945952
if (IntExpr.isInvalid())
946953
return true;
947954

@@ -962,14 +969,6 @@ bool Parser::ParseOpenACCWaitArgument() {
962969
// the term 'async-argument' means a nonnegative scalar integer expression, or
963970
// one of the special values 'acc_async_noval' or 'acc_async_sync', as defined
964971
// in the C header file and the Fortran opacc module.
965-
//
966-
// We are parsing this simply as list of assignment expressions (to avoid
967-
// comma being troublesome), and will ensure it is an integral type. The
968-
// 'special' types are defined as macros, so we can't really check those
969-
// (other than perhaps as values at one point?), but the standard does say it
970-
// is implementation-defined to use any other negative value.
971-
//
972-
//
973972
bool FirstArg = true;
974973
while (!getCurToken().isOneOf(tok::r_paren, tok::annot_pragma_openacc_end)) {
975974
if (!FirstArg) {
@@ -978,8 +977,7 @@ bool Parser::ParseOpenACCWaitArgument() {
978977
}
979978
FirstArg = false;
980979

981-
ExprResult CurArg =
982-
getActions().CorrectDelayedTyposInExpr(ParseAssignmentExpression());
980+
ExprResult CurArg = ParseOpenACCAsyncArgument();
983981

984982
if (CurArg.isInvalid())
985983
return true;
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// RUN: %clang_cc1 %s -verify -fopenacc
2+
3+
void func() {
4+
int i, j;
5+
6+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
7+
#pragma acc parallel wait
8+
9+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
10+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
11+
#pragma acc parallel wait clause-list
12+
13+
// expected-error@+3{{expected ')'}}
14+
// expected-note@+2{{to match this '('}}
15+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
16+
#pragma acc parallel wait (
17+
18+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
19+
#pragma acc parallel wait ()
20+
21+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
22+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
23+
#pragma acc parallel wait () clause-list
24+
25+
// expected-error@+4{{expected expression}}
26+
// expected-error@+3{{expected ')'}}
27+
// expected-note@+2{{to match this '('}}
28+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
29+
#pragma acc parallel wait (devnum:
30+
31+
// expected-error@+2{{expected expression}}
32+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
33+
#pragma acc parallel wait (devnum:)
34+
35+
// expected-error@+3{{expected expression}}
36+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
37+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
38+
#pragma acc parallel wait (devnum:) clause-list
39+
40+
// expected-error@+4{{expected ':'}}
41+
// expected-error@+3{{expected ')'}}
42+
// expected-note@+2{{to match this '('}}
43+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
44+
#pragma acc parallel wait (devnum: i + j
45+
46+
// expected-error@+2{{expected ':'}}
47+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
48+
#pragma acc parallel wait (devnum: i + j)
49+
50+
// expected-error@+3{{expected ':'}}
51+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
52+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
53+
#pragma acc parallel wait (devnum: i + j) clause-list
54+
55+
// expected-error@+3{{expected ')'}}
56+
// expected-note@+2{{to match this '('}}
57+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
58+
#pragma acc parallel wait (queues:
59+
60+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
61+
#pragma acc parallel wait (queues:)
62+
63+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
64+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
65+
#pragma acc parallel wait (queues:) clause-list
66+
67+
// expected-error@+3{{expected ')'}}
68+
// expected-note@+2{{to match this '('}}
69+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
70+
#pragma acc parallel wait (devnum: i + j:queues:
71+
72+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
73+
#pragma acc parallel wait (devnum: i + j:queues:)
74+
75+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
76+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
77+
#pragma acc parallel wait (devnum: i + j:queues:) clause-list
78+
79+
// expected-error@+4{{use of undeclared identifier 'devnum'}}
80+
// expected-error@+3{{expected ')'}}
81+
// expected-note@+2{{to match this '('}}
82+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
83+
#pragma acc parallel wait (queues:devnum: i + j
84+
85+
// expected-error@+2{{use of undeclared identifier 'devnum'}}
86+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
87+
#pragma acc parallel wait (queues:devnum: i + j)
88+
89+
// expected-error@+3{{use of undeclared identifier 'devnum'}}
90+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
91+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
92+
#pragma acc parallel wait (queues:devnum: i + j) clause-list
93+
94+
// expected-error@+3{{expected ')'}}
95+
// expected-note@+2{{to match this '('}}
96+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
97+
#pragma acc parallel wait(i, j, 1+1, 3.3
98+
99+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
100+
#pragma acc parallel wait(i, j, 1+1, 3.3)
101+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
102+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
103+
#pragma acc parallel wait(i, j, 1+1, 3.3) clause-list
104+
105+
// expected-error@+4{{expected expression}}
106+
// expected-error@+3{{expected ')'}}
107+
// expected-note@+2{{to match this '('}}
108+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
109+
#pragma acc parallel wait(,
110+
111+
// expected-error@+2{{expected expression}}
112+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
113+
#pragma acc parallel wait(,)
114+
115+
// expected-error@+3{{expected expression}}
116+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
117+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
118+
#pragma acc parallel wait(,) clause-list
119+
120+
// expected-error@+3{{expected ')'}}
121+
// expected-note@+2{{to match this '('}}
122+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
123+
#pragma acc parallel wait(queues:i, j, 1+1, 3.3
124+
125+
// expected-error@+4{{expected expression}}
126+
// expected-error@+3{{expected ')'}}
127+
// expected-note@+2{{to match this '('}}
128+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
129+
#pragma acc parallel wait(queues:i, j, 1+1, 3.3,
130+
131+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
132+
#pragma acc parallel wait(queues:i, j, 1+1, 3.3)
133+
134+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
135+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
136+
#pragma acc parallel wait(queues:i, j, 1+1, 3.3) clause-list
137+
138+
// expected-error@+3{{expected ')'}}
139+
// expected-note@+2{{to match this '('}}
140+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
141+
#pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3
142+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
143+
#pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3)
144+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
145+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
146+
#pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3) clause-list
147+
148+
// expected-error@+3{{expected ')'}}
149+
// expected-note@+2{{to match this '('}}
150+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
151+
#pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3
152+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
153+
#pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3)
154+
// expected-error@+2{{invalid OpenACC clause 'clause'}}
155+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
156+
#pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3) clause-list
157+
}

0 commit comments

Comments
 (0)