Skip to content

Commit bfc2dbe

Browse files
committed
[OpenACC] Implement data construct 'at least 1 of ... clauses' rule
All 4 of the 'data' constructs have a requirement that at least 1 of a small list of clauses must appear on the construct. This patch implements that restriction, and updates all of the tests it takes to do so.
1 parent 89d5272 commit bfc2dbe

25 files changed

+218
-65
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12804,6 +12804,8 @@ def err_acc_loop_terminating_condition
1280412804
def err_acc_loop_not_monotonic
1280512805
: Error<"OpenACC '%0' variable must monotonically increase or decrease "
1280612806
"('++', '--', or compound assignment)">;
12807+
def err_acc_construct_one_clause_of
12808+
: Error<"OpenACC '%0' construct must have at least one %1 clause">;
1280712809

1280812810
// AMDGCN builtins diagnostics
1280912811
def err_amdgcn_global_load_lds_size_invalid_value : Error<"invalid size value">;

clang/include/clang/Sema/SemaOpenACC.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,8 @@ class SemaOpenACC : public SemaBase {
662662
/// parsing has consumed the 'annot_pragma_openacc_end' token. This DOES
663663
/// happen before any associated declarations or statements have been parsed.
664664
/// This function is only called when we are parsing a 'statement' context.
665-
bool ActOnStartStmtDirective(OpenACCDirectiveKind K, SourceLocation StartLoc);
665+
bool ActOnStartStmtDirective(OpenACCDirectiveKind K, SourceLocation StartLoc,
666+
ArrayRef<const OpenACCClause *> Clauses);
666667

667668
/// Called after the directive, including its clauses, have been parsed and
668669
/// parsing has consumed the 'annot_pragma_openacc_end' token. This DOES

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,8 +1512,8 @@ StmtResult Parser::ParseOpenACCDirectiveStmt() {
15121512
ParsingOpenACCDirectiveRAII DirScope(*this);
15131513

15141514
OpenACCDirectiveParseInfo DirInfo = ParseOpenACCDirective();
1515-
if (getActions().OpenACC().ActOnStartStmtDirective(DirInfo.DirKind,
1516-
DirInfo.StartLoc))
1515+
if (getActions().OpenACC().ActOnStartStmtDirective(
1516+
DirInfo.DirKind, DirInfo.StartLoc, DirInfo.Clauses))
15171517
return StmtError();
15181518

15191519
StmtResult AssocStmt;

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3526,8 +3526,35 @@ void SemaOpenACC::ActOnForStmtEnd(SourceLocation ForLoc, StmtResult Body) {
35263526
}
35273527
}
35283528

3529-
bool SemaOpenACC::ActOnStartStmtDirective(OpenACCDirectiveKind K,
3530-
SourceLocation StartLoc) {
3529+
namespace {
3530+
// Get a list of clause Kinds for diagnosing a list, joined by a commas and an
3531+
// 'or'.
3532+
std::string GetListOfClauses(llvm::ArrayRef<OpenACCClauseKind> Clauses) {
3533+
assert(!Clauses.empty() && "empty clause list not supported");
3534+
3535+
std::string Output;
3536+
llvm::raw_string_ostream OS{Output};
3537+
3538+
if (Clauses.size() == 1) {
3539+
OS << '\'' << Clauses[0] << '\'';
3540+
return Output;
3541+
}
3542+
3543+
llvm::ArrayRef<OpenACCClauseKind> AllButLast{Clauses.begin(),
3544+
Clauses.end() - 1};
3545+
3546+
llvm::interleave(
3547+
AllButLast, [&](OpenACCClauseKind K) { OS << '\'' << K << '\''; },
3548+
[&] { OS << ", "; });
3549+
3550+
OS << " or \'" << Clauses.back() << '\'';
3551+
return Output;
3552+
}
3553+
} // namespace
3554+
3555+
bool SemaOpenACC::ActOnStartStmtDirective(
3556+
OpenACCDirectiveKind K, SourceLocation StartLoc,
3557+
ArrayRef<const OpenACCClause *> Clauses) {
35313558
SemaRef.DiscardCleanupsInEvaluationContext();
35323559
SemaRef.PopExpressionEvaluationContext();
35333560

@@ -3554,6 +3581,59 @@ bool SemaOpenACC::ActOnStartStmtDirective(OpenACCDirectiveKind K,
35543581
<< OpenACCClauseKind::Tile;
35553582
}
35563583

3584+
// OpenACC3.3 2.6.5: At least one copy, copyin, copyout, create, no_create,
3585+
// present, deviceptr, attach, or default clause must appear on a 'data'
3586+
// construct.
3587+
if (K == OpenACCDirectiveKind::Data &&
3588+
llvm::find_if(Clauses,
3589+
llvm::IsaPred<OpenACCCopyClause, OpenACCCopyInClause,
3590+
OpenACCCopyOutClause, OpenACCCreateClause,
3591+
OpenACCNoCreateClause, OpenACCPresentClause,
3592+
OpenACCDevicePtrClause, OpenACCAttachClause,
3593+
OpenACCDefaultClause>) == Clauses.end())
3594+
return Diag(StartLoc, diag::err_acc_construct_one_clause_of)
3595+
<< K
3596+
<< GetListOfClauses(
3597+
{OpenACCClauseKind::Copy, OpenACCClauseKind::CopyIn,
3598+
OpenACCClauseKind::CopyOut, OpenACCClauseKind::Create,
3599+
OpenACCClauseKind::NoCreate, OpenACCClauseKind::Present,
3600+
OpenACCClauseKind::DevicePtr, OpenACCClauseKind::Attach,
3601+
OpenACCClauseKind::Default});
3602+
3603+
// OpenACC3.3 2.6.6: At least one copyin, create, or attach clause must appear
3604+
// on an enter data directive.
3605+
if (K == OpenACCDirectiveKind::EnterData &&
3606+
llvm::find_if(Clauses,
3607+
llvm::IsaPred<OpenACCCopyInClause, OpenACCCreateClause,
3608+
OpenACCAttachClause>) == Clauses.end())
3609+
return Diag(StartLoc, diag::err_acc_construct_one_clause_of)
3610+
<< K
3611+
<< GetListOfClauses({
3612+
OpenACCClauseKind::CopyIn,
3613+
OpenACCClauseKind::Create,
3614+
OpenACCClauseKind::Attach,
3615+
});
3616+
// OpenACC3.3 2.6.6: At least one copyout, delete, or detach clause must
3617+
// appear on an exit data directive.
3618+
if (K == OpenACCDirectiveKind::ExitData &&
3619+
llvm::find_if(Clauses,
3620+
llvm::IsaPred<OpenACCCopyOutClause, OpenACCDeleteClause,
3621+
OpenACCDetachClause>) == Clauses.end())
3622+
return Diag(StartLoc, diag::err_acc_construct_one_clause_of)
3623+
<< K
3624+
<< GetListOfClauses({
3625+
OpenACCClauseKind::CopyOut,
3626+
OpenACCClauseKind::Delete,
3627+
OpenACCClauseKind::Detach,
3628+
});
3629+
3630+
// OpenACC3.3 2.8: At least 'one use_device' clause must appear.
3631+
if (K == OpenACCDirectiveKind::HostData &&
3632+
llvm::find_if(Clauses, llvm::IsaPred<OpenACCUseDeviceClause>) ==
3633+
Clauses.end())
3634+
return Diag(StartLoc, diag::err_acc_construct_one_clause_of)
3635+
<< K << GetListOfClauses({OpenACCClauseKind::UseDevice});
3636+
35573637
return diagnoseConstructAppertainment(*this, K, StartLoc, /*IsStmt=*/true);
35583638
}
35593639

clang/lib/Sema/TreeTransform.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12178,8 +12178,8 @@ StmtResult TreeTransform<Derived>::TransformOpenACCComputeConstruct(
1217812178
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1217912179
C->clauses());
1218012180

12181-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12182-
C->getBeginLoc()))
12181+
if (getSema().OpenACC().ActOnStartStmtDirective(
12182+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1218312183
return StmtError();
1218412184

1218512185
// Transform Structured Block.
@@ -12205,8 +12205,8 @@ TreeTransform<Derived>::TransformOpenACCLoopConstruct(OpenACCLoopConstruct *C) {
1220512205
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1220612206
C->clauses());
1220712207

12208-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12209-
C->getBeginLoc()))
12208+
if (getSema().OpenACC().ActOnStartStmtDirective(
12209+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1221012210
return StmtError();
1221112211

1221212212
// Transform Loop.
@@ -12231,8 +12231,8 @@ StmtResult TreeTransform<Derived>::TransformOpenACCCombinedConstruct(
1223112231
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1223212232
C->clauses());
1223312233

12234-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12235-
C->getBeginLoc()))
12234+
if (getSema().OpenACC().ActOnStartStmtDirective(
12235+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1223612236
return StmtError();
1223712237

1223812238
// Transform Loop.
@@ -12256,8 +12256,8 @@ TreeTransform<Derived>::TransformOpenACCDataConstruct(OpenACCDataConstruct *C) {
1225612256
llvm::SmallVector<OpenACCClause *> TransformedClauses =
1225712257
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1225812258
C->clauses());
12259-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12260-
C->getBeginLoc()))
12259+
if (getSema().OpenACC().ActOnStartStmtDirective(
12260+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1226112261
return StmtError();
1226212262

1226312263
SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
@@ -12280,8 +12280,8 @@ StmtResult TreeTransform<Derived>::TransformOpenACCEnterDataConstruct(
1228012280
llvm::SmallVector<OpenACCClause *> TransformedClauses =
1228112281
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1228212282
C->clauses());
12283-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12284-
C->getBeginLoc()))
12283+
if (getSema().OpenACC().ActOnStartStmtDirective(
12284+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1228512285
return StmtError();
1228612286

1228712287
return getDerived().RebuildOpenACCEnterDataConstruct(
@@ -12297,8 +12297,8 @@ StmtResult TreeTransform<Derived>::TransformOpenACCExitDataConstruct(
1229712297
llvm::SmallVector<OpenACCClause *> TransformedClauses =
1229812298
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1229912299
C->clauses());
12300-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12301-
C->getBeginLoc()))
12300+
if (getSema().OpenACC().ActOnStartStmtDirective(
12301+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1230212302
return StmtError();
1230312303

1230412304
return getDerived().RebuildOpenACCExitDataConstruct(
@@ -12314,8 +12314,8 @@ StmtResult TreeTransform<Derived>::TransformOpenACCHostDataConstruct(
1231412314
llvm::SmallVector<OpenACCClause *> TransformedClauses =
1231512315
getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
1231612316
C->clauses());
12317-
if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(),
12318-
C->getBeginLoc()))
12317+
if (getSema().OpenACC().ActOnStartStmtDirective(
12318+
C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
1231912319
return StmtError();
1232012320

1232112321
SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(

clang/test/AST/ast-print-openacc-data-construct.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ void foo() {
1010
#pragma acc data default(none)
1111
;
1212

13-
// CHECK: #pragma acc data device_type(int)
14-
#pragma acc data device_type(int)
13+
// CHECK: #pragma acc data default(none) device_type(int)
14+
#pragma acc data default(none) device_type(int)
1515
;
1616

1717
// CHECK: #pragma acc enter data copyin(Var)

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,27 @@
44

55
void func() {
66

7+
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
78
#pragma acc exit data finalize
89

10+
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
911
#pragma acc exit data finalize finalize
1012

13+
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
1114
// expected-error@+1{{invalid OpenACC clause 'invalid'}}
1215
#pragma acc exit data finalize invalid
1316

17+
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
1418
// expected-error@+1{{invalid OpenACC clause 'invalid'}}
1519
#pragma acc exit data finalize invalid invalid finalize
1620

21+
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
1722
#pragma acc exit data wait finalize
1823

24+
// expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
1925
#pragma acc host_data if_present
2026

27+
// expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
2128
#pragma acc host_data if_present, if_present
2229

2330
// expected-error@+4{{OpenACC clause 'independent' on 'loop' construct conflicts with previous data dependence clause}}

clang/test/ParserOpenACC/parse-constructs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,15 @@ void func() {
5454
// expected-error@+1{{invalid OpenACC clause 'clause'}}
5555
#pragma acc kernels clause list
5656
for(;;){}
57+
// expected-error@+2{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
5758
// expected-error@+1{{invalid OpenACC clause 'clause'}}
5859
#pragma acc data clause list
5960
for(;;){}
61+
// expected-error@+2{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
6062
// expected-error@+1{{invalid OpenACC clause 'clause'}}
6163
#pragma acc enter data clause list
6264
for(;;){}
65+
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
6366
// expected-error@+1{{invalid OpenACC clause 'clause'}}
6467
#pragma acc exit data clause list
6568
for(;;){}
@@ -75,6 +78,7 @@ void func() {
7578
// expected-error@+1{{expected identifier}}
7679
#pragma acc exit }
7780
for(;;){}
81+
// expected-error@+2{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
7882
// expected-error@+1{{invalid OpenACC clause 'clause'}}
7983
#pragma acc host_data clause list
8084
for(;;){}

clang/test/SemaOpenACC/combined-construct-collapse-clause.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,15 @@ void no_other_directives() {
214214
#pragma acc serial loop collapse(2)
215215
for(unsigned i = 0; i < 5; ++i) {
216216
for(unsigned j = 0; j < 5; ++j) {
217+
// expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
217218
#pragma acc data
218219
;
219220
}
220221
}
221222
// expected-note@+1{{active 'collapse' clause defined here}}
222223
#pragma acc kernels loop collapse(2)
223224
for(unsigned i = 0; i < 5; ++i) {
225+
// expected-error@+2{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
224226
// expected-error@+1{{OpenACC 'data' construct cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
225227
#pragma acc data
226228
for(unsigned j = 0; j < 5; ++j) {

clang/test/SemaOpenACC/combined-construct-if-clause.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void BoolExpr(int *I, float *F) {
4343
#pragma acc kernels loop if (*I < *F)
4444
for (unsigned i = 0; i < 5; ++i);
4545

46+
// expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
4647
#pragma acc data if (*I < *F)
4748
for (unsigned i = 0; i < 5; ++i);
4849
#pragma acc parallel loop if (*I < *F)

clang/test/SemaOpenACC/compute-construct-device_type-clause.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ void uses() {
3434
#pragma acc kernels dtype(MACRO)
3535
while(1);
3636

37+
// expected-error@+2{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
3738
// expected-error@+1{{OpenACC 'device_type' clause is not valid on 'enter data' directive}}
3839
#pragma acc enter data device_type(I)
40+
// expected-error@+2{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
3941
// expected-error@+1{{OpenACC 'dtype' clause is not valid on 'enter data' directive}}
4042
#pragma acc enter data dtype(I)
4143

clang/test/SemaOpenACC/compute-construct-if-clause.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void BoolExpr(int *I, float *F) {
4343
#pragma acc kernels if (*I < *F)
4444
while(0);
4545

46+
// expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
4647
#pragma acc data if (*I < *F)
4748
while(0);
4849
#pragma acc parallel loop if (*I < *F)

clang/test/SemaOpenACC/data-construct-async-ast.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,30 @@ void TemplUses() {
1515
// CHECK-NEXT: FunctionDecl{{.*}}TemplUses
1616
// CHECK-NEXT: CompoundStmt
1717

18-
#pragma acc data async(some_int())
18+
// CHECK-NEXT: DeclStmt
19+
// CHECK-NEXT: VarDecl
20+
T t;
21+
22+
#pragma acc data default(none) async(some_int())
1923
;
2024
// CHECK-NEXT: OpenACCDataConstruct{{.*}}data
25+
// CHECK-NEXT: default(none)
2126
// CHECK-NEXT: async clause
2227
// CHECK-NEXT: CallExpr{{.*}}'int'
2328
// CHECK-NEXT: ImplicitCastExpr
2429
// CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
2530
// CHECK-NEXT: NullStmt
26-
#pragma acc enter data async(T{})
31+
#pragma acc enter data copyin(t) async(T{})
2732
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
33+
// CHECK-NEXT: copyin clause
34+
// CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'
2835
// CHECK-NEXT: async clause
2936
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list
3037
// CHECK-NEXT: InitListExpr{{.*}}'void'
31-
#pragma acc exit data async
38+
#pragma acc exit data copyout(t) async
3239
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
40+
// CHECK-NEXT: copyout clause
41+
// CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'
3342
// CHECK-NEXT: async clause
3443

3544
// Instantiations
@@ -38,19 +47,27 @@ void TemplUses() {
3847
// CHECK-NEXT: BuiltinType{{.*}} 'int'
3948
// CHECK-NEXT: CompoundStmt
4049

50+
// CHECK-NEXT: DeclStmt
51+
// CHECK-NEXT: VarDecl
52+
4153
// CHECK-NEXT: OpenACCDataConstruct{{.*}}data
54+
// CHECK-NEXT: default(none)
4255
// CHECK-NEXT: async clause
4356
// CHECK-NEXT: CallExpr{{.*}}'int'
4457
// CHECK-NEXT: ImplicitCastExpr
4558
// CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
4659
// CHECK-NEXT: NullStmt
4760

4861
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
62+
// CHECK-NEXT: copyin clause
63+
// CHECK-NEXT: DeclRefExpr{{.*}}'t' 'int'
4964
// CHECK-NEXT: async clause
5065
// CHECK-NEXT: CXXFunctionalCastExpr
5166
// CHECK-NEXT: InitListExpr{{.*}}'int'
5267

5368
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
69+
// CHECK-NEXT: copyout clause
70+
// CHECK-NEXT: DeclRefExpr{{.*}}'t' 'int'
5471
// CHECK-NEXT: async clause
5572
}
5673
void Inst() {

clang/test/SemaOpenACC/data-construct-copy-clause.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,13 @@ void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete Compo
5656
#pragma acc data copy((float)ArrayParam[2])
5757
;
5858

59+
// expected-error@+2{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
5960
// expected-error@+1{{OpenACC 'copy' clause is not valid on 'enter data' directive}}
6061
#pragma acc enter data copy(LocalInt)
62+
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
6163
// expected-error@+1{{OpenACC 'pcopy' clause is not valid on 'exit data' directive}}
6264
#pragma acc exit data pcopy(LocalInt)
65+
// expected-error@+2{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
6366
// expected-error@+1{{OpenACC 'present_or_copy' clause is not valid on 'host_data' directive}}
6467
#pragma acc host_data present_or_copy(LocalInt)
6568
;

clang/test/SemaOpenACC/data-construct-copyin-clause.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,10 @@ void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete Compo
6363
#pragma acc data copyin(invalid:(float)ArrayParam[2])
6464
;
6565

66+
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
6667
// expected-error@+1{{OpenACC 'copyin' clause is not valid on 'exit data' directive}}
6768
#pragma acc exit data copyin(LocalInt)
69+
// expected-error@+2{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
6870
// expected-error@+1{{OpenACC 'pcopyin' clause is not valid on 'host_data' directive}}
6971
#pragma acc host_data pcopyin(LocalInt)
7072
;

0 commit comments

Comments
 (0)