[clang] 0dd0cbd - [OpenACC] Implement 'wait' clause parsing.
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 30 12:48:20 PST 2024
Author: erichkeane
Date: 2024-01-30T12:48:16-08:00
New Revision: 0dd0cbd324ad13dd7b91edf69a2ca66a6a208c80
URL: https://github.com/llvm/llvm-project/commit/0dd0cbd324ad13dd7b91edf69a2ca66a6a208c80
DIFF: https://github.com/llvm/llvm-project/commit/0dd0cbd324ad13dd7b91edf69a2ca66a6a208c80.diff
LOG: [OpenACC] Implement 'wait' clause parsing.
The 'wait' clause is parsed the same way as the 'wait' construct, so
this jsut differs to that function.
Added:
clang/test/ParserOpenACC/parse-wait-clause.c
Modified:
clang/include/clang/Basic/OpenACCKinds.h
clang/lib/Parse/ParseOpenACC.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/OpenACCKinds.h b/clang/include/clang/Basic/OpenACCKinds.h
index 04bc2a674af19..afdd0e8983c9e 100644
--- a/clang/include/clang/Basic/OpenACCKinds.h
+++ b/clang/include/clang/Basic/OpenACCKinds.h
@@ -245,6 +245,9 @@ enum class OpenACCClauseKind {
Tile,
/// 'gang' clause, allowed on 'loop' and Combined constructs.
Gang,
+ /// 'wait' clause, allowed on Compute, Data, 'update', and Combined
+ /// constructs.
+ Wait,
/// Represents an invalid clause, for the purposes of parsing.
Invalid,
@@ -376,6 +379,9 @@ inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,
case OpenACCClauseKind::Gang:
return Out << "gang";
+ case OpenACCClauseKind::Wait:
+ return Out << "wait";
+
case OpenACCClauseKind::Invalid:
return Out << "<invalid>";
}
diff --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index b9f2d3c9e1e5e..bfe5061481ad9 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -129,6 +129,7 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
.Case("use_device", OpenACCClauseKind::UseDevice)
.Case("vector", OpenACCClauseKind::Vector)
.Case("vector_length", OpenACCClauseKind::VectorLength)
+ .Case("wait", OpenACCClauseKind::Wait)
.Case("worker", OpenACCClauseKind::Worker)
.Default(OpenACCClauseKind::Invalid);
}
@@ -475,6 +476,7 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
case OpenACCClauseKind::Worker:
case OpenACCClauseKind::Vector:
case OpenACCClauseKind::Gang:
+ case OpenACCClauseKind::Wait:
return ClauseParensKind::Optional;
case OpenACCClauseKind::Default:
@@ -907,6 +909,12 @@ bool Parser::ParseOpenACCClauseParams(OpenACCDirectiveKind DirKind,
if (ParseOpenACCGangArgList())
return true;
break;
+ case OpenACCClauseKind::Wait:
+ if (ParseOpenACCWaitArgument()) {
+ Parens.skipToEnd();
+ return false;
+ }
+ break;
default:
llvm_unreachable("Not an optional parens type?");
}
@@ -940,8 +948,7 @@ bool Parser::ParseOpenACCWaitArgument() {
// Consume colon.
ConsumeToken();
- ExprResult IntExpr =
- getActions().CorrectDelayedTyposInExpr(ParseAssignmentExpression());
+ ExprResult IntExpr = ParseOpenACCIntExpr();
if (IntExpr.isInvalid())
return true;
@@ -962,14 +969,6 @@ bool Parser::ParseOpenACCWaitArgument() {
// the term 'async-argument' means a nonnegative scalar integer expression, or
// one of the special values 'acc_async_noval' or 'acc_async_sync', as defined
// in the C header file and the Fortran opacc module.
- //
- // We are parsing this simply as list of assignment expressions (to avoid
- // comma being troublesome), and will ensure it is an integral type. The
- // 'special' types are defined as macros, so we can't really check those
- // (other than perhaps as values at one point?), but the standard does say it
- // is implementation-defined to use any other negative value.
- //
- //
bool FirstArg = true;
while (!getCurToken().isOneOf(tok::r_paren, tok::annot_pragma_openacc_end)) {
if (!FirstArg) {
@@ -978,8 +977,7 @@ bool Parser::ParseOpenACCWaitArgument() {
}
FirstArg = false;
- ExprResult CurArg =
- getActions().CorrectDelayedTyposInExpr(ParseAssignmentExpression());
+ ExprResult CurArg = ParseOpenACCAsyncArgument();
if (CurArg.isInvalid())
return true;
diff --git a/clang/test/ParserOpenACC/parse-wait-clause.c b/clang/test/ParserOpenACC/parse-wait-clause.c
new file mode 100644
index 0000000000000..7639e6242ea67
--- /dev/null
+++ b/clang/test/ParserOpenACC/parse-wait-clause.c
@@ -0,0 +1,157 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+
+void func() {
+ int i, j;
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait
+
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait ()
+
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait () clause-list
+
+ // expected-error at +4{{expected expression}}
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum:
+
+ // expected-error at +2{{expected expression}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum:)
+
+ // expected-error at +3{{expected expression}}
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum:) clause-list
+
+ // expected-error at +4{{expected ':'}}
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j
+
+ // expected-error at +2{{expected ':'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j)
+
+ // expected-error at +3{{expected ':'}}
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:)
+
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j:queues:
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j:queues:)
+
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (devnum: i + j:queues:) clause-list
+
+ // expected-error at +4{{use of undeclared identifier 'devnum'}}
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:devnum: i + j
+
+ // expected-error at +2{{use of undeclared identifier 'devnum'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:devnum: i + j)
+
+ // expected-error at +3{{use of undeclared identifier 'devnum'}}
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait (queues:devnum: i + j) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(i, j, 1+1, 3.3
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(i, j, 1+1, 3.3)
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(i, j, 1+1, 3.3) clause-list
+
+ // expected-error at +4{{expected expression}}
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(,
+
+ // expected-error at +2{{expected expression}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(,)
+
+ // expected-error at +3{{expected expression}}
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(,) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(queues:i, j, 1+1, 3.3
+
+ // expected-error at +4{{expected expression}}
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(queues:i, j, 1+1, 3.3,
+
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(queues:i, j, 1+1, 3.3)
+
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(queues:i, j, 1+1, 3.3) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3)
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:i, j, 1+1, 3.3) clause-list
+
+ // expected-error at +3{{expected ')'}}
+ // expected-note at +2{{to match this '('}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3)
+ // expected-error at +2{{invalid OpenACC clause 'clause'}}
+ // expected-warning at +1{{OpenACC directives not yet implemented, pragma ignored}}
+ #pragma acc parallel wait(devnum:3:queues:i, j, 1+1, 3.3) clause-list
+}
More information about the cfe-commits
mailing list