Skip to content

Commit eca25bb

Browse files
committed
[OpenACC] Implement 'copyout' clause parsing.
This is a fairly simple clause that just requires parsing a potential 'zero:' in front of a Clause var-list. This patch implements/tests that.
1 parent d5000e9 commit eca25bb

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ enum class OpenACCClauseKind {
205205
/// 'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel
206206
/// loop', and 'serial loop' constructs.
207207
Private,
208+
/// 'copyout' clause, allowed on Compute and Combined constructs, plus 'data',
209+
/// 'exit data', and 'declare'.
210+
CopyOut,
208211

209212
/// Represents an invalid clause, for the purposes of parsing.
210213
Invalid,
@@ -288,6 +291,9 @@ inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,
288291
case OpenACCClauseKind::Private:
289292
return Out << "private";
290293

294+
case OpenACCClauseKind::CopyOut:
295+
return Out << "copyout";
296+
291297
case OpenACCClauseKind::Invalid:
292298
return Out << "<invalid>";
293299
}

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
9292
.Case("attach", OpenACCClauseKind::Attach)
9393
.Case("auto", OpenACCClauseKind::Auto)
9494
.Case("copy", OpenACCClauseKind::Copy)
95+
.Case("copyout", OpenACCClauseKind::CopyOut)
9596
.Case("default", OpenACCClauseKind::Default)
9697
.Case("delete", OpenACCClauseKind::Delete)
9798
.Case("detach", OpenACCClauseKind::Detach)
@@ -146,6 +147,7 @@ enum class OpenACCSpecialTokenKind {
146147
ReadOnly,
147148
DevNum,
148149
Queues,
150+
Zero,
149151
};
150152

151153
bool isOpenACCSpecialToken(OpenACCSpecialTokenKind Kind, Token Tok) {
@@ -159,6 +161,8 @@ bool isOpenACCSpecialToken(OpenACCSpecialTokenKind Kind, Token Tok) {
159161
return Tok.getIdentifierInfo()->isStr("devnum");
160162
case OpenACCSpecialTokenKind::Queues:
161163
return Tok.getIdentifierInfo()->isStr("queues");
164+
case OpenACCSpecialTokenKind::Zero:
165+
return Tok.getIdentifierInfo()->isStr("zero");
162166
}
163167
llvm_unreachable("Unknown 'Kind' Passed");
164168
}
@@ -395,6 +399,7 @@ ClauseParensKind getClauseParensKind(OpenACCClauseKind Kind) {
395399
case OpenACCClauseKind::Default:
396400
case OpenACCClauseKind::If:
397401
case OpenACCClauseKind::Copy:
402+
case OpenACCClauseKind::CopyOut:
398403
case OpenACCClauseKind::UseDevice:
399404
case OpenACCClauseKind::NoCreate:
400405
case OpenACCClauseKind::Present:
@@ -554,6 +559,12 @@ bool Parser::ParseOpenACCClauseParams(OpenACCClauseKind Kind) {
554559
return true;
555560
break;
556561
}
562+
case OpenACCClauseKind::CopyOut:
563+
tryParseAndConsumeSpecialTokenKind(*this, OpenACCSpecialTokenKind::Zero,
564+
Kind);
565+
if (ParseOpenACCClauseVarList(Kind))
566+
return true;
567+
break;
557568
case OpenACCClauseKind::Attach:
558569
case OpenACCClauseKind::Copy:
559570
case OpenACCClauseKind::Delete:
@@ -696,7 +707,8 @@ ExprResult Parser::ParseOpenACCIDExpression() {
696707
/// - a common block name between slashes (fortran only)
697708
bool Parser::ParseOpenACCVar() {
698709
OpenACCArraySectionRAII ArraySections(*this);
699-
ExprResult Res = ParseAssignmentExpression();
710+
ExprResult Res =
711+
getActions().CorrectDelayedTyposInExpr(ParseAssignmentExpression());
700712
return Res.isInvalid();
701713
}
702714

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,38 @@ void VarListClauses() {
497497
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
498498
#pragma acc serial device(s.array[s.value : 5], s.value), seq
499499

500+
// expected-error@+2{{expected ','}}
501+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
502+
#pragma acc serial copyout(s.array[s.value] s.array[s.value :5] ), seq
503+
504+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
505+
#pragma acc serial copyout(s.array[s.value : 5], s.value), seq
506+
507+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
508+
#pragma acc serial copyout(zero:s.array[s.value : 5], s.value), seq
509+
510+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
511+
#pragma acc serial copyout(zero : s.array[s.value : 5], s.value), seq
512+
513+
// expected-error@+2{{use of undeclared identifier 'zero'}}
514+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
515+
#pragma acc serial copyout(zero s.array[s.value : 5], s.value), seq
516+
517+
// expected-error@+2{{invalid tag 'readonly' on 'copyout' clause}}
518+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
519+
#pragma acc serial copyout(readonly:s.array[s.value : 5], s.value), seq
520+
521+
// expected-error@+2{{invalid tag 'invalid' on 'copyout' clause}}
522+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
523+
#pragma acc serial copyout(invalid:s.array[s.value : 5], s.value), seq
524+
525+
// expected-error@+2{{invalid tag 'invalid' on 'copyout' clause}}
526+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
527+
#pragma acc serial copyout(invalid:s.array[s.value : 5], s.value), seq
528+
529+
// expected-error@+2{{use of undeclared identifier 'invalid'}}
530+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
531+
#pragma acc serial copyout(invalid s.array[s.value : 5], s.value), seq
500532
}
501533

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

0 commit comments

Comments
 (0)