Skip to content

Commit b2b1eec

Browse files
committed
[OpenACC] enable 'copyin' clause sema for 'data'/'enter data'
stop reporting 'copyin' as not implemented on a data/enter data construct, and enforce sema rules.
1 parent 0199486 commit b2b1eec

11 files changed

+275
-26
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,11 +962,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyClause(
962962

963963
OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyInClause(
964964
SemaOpenACC::OpenACCParsedClause &Clause) {
965-
// Restrictions only properly implemented on 'compute'/'combined' constructs,
966-
// and 'compute'/'combined' constructs are the only construct that can do
967-
// anything with this yet, so skip/treat as unimplemented in this case.
965+
// Restrictions only properly implemented on 'compute'/'combined'/'data'
966+
// constructs, and 'compute'/'combined'/'data' constructs are the only
967+
// construct that can do anything with this yet, so skip/treat as
968+
// unimplemented in this case.
968969
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
969-
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
970+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()) &&
971+
!isOpenACCDataDirectiveKind(Clause.getDirectiveKind()))
970972
return isNotImplemented();
971973
// ActOnVar ensured that everything is a valid variable reference, so there
972974
// really isn't anything to do here. GCC does some duplicate-finding, though

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ void foo() {
1414
#pragma acc data device_type(int)
1515
;
1616

17-
// CHECK: #pragma acc enter data
18-
// CHECK-NOT: copyin(Var)
17+
// CHECK: #pragma acc enter data copyin(Var)
1918
#pragma acc enter data copyin(Var)
2019
;
2120
// CHECK: #pragma acc exit data
@@ -34,7 +33,7 @@ void foo() {
3433
// CHECK: #pragma acc data default(none) if(i == array[1])
3534
#pragma acc data default(none) if(i == array[1])
3635
;
37-
// CHECK: #pragma acc enter data if(i == array[1])
36+
// CHECK: #pragma acc enter data copyin(Var) if(i == array[1])
3837
#pragma acc enter data copyin(Var) if(i == array[1])
3938
;
4039
// CHECK: #pragma acc exit data if(i == array[1])
@@ -47,7 +46,7 @@ void foo() {
4746
// CHECK: #pragma acc data default(none) async(i)
4847
#pragma acc data default(none) async(i)
4948
;
50-
// CHECK: #pragma acc enter data async(i)
49+
// CHECK: #pragma acc enter data copyin(i) async(i)
5150
#pragma acc enter data copyin(i) async(i)
5251
// CHECK: #pragma acc exit data async
5352
#pragma acc exit data copyout(i) async
@@ -56,7 +55,7 @@ void foo() {
5655
#pragma acc data default(none) wait()
5756
;
5857

59-
// CHECK: #pragma acc enter data wait()
58+
// CHECK: #pragma acc enter data copyin(Var) wait()
6059
#pragma acc enter data copyin(Var) wait()
6160

6261
// CHECK: #pragma acc exit data wait(*iPtr, i)
@@ -66,7 +65,7 @@ void foo() {
6665
#pragma acc data default(none) wait(queues:*iPtr, i)
6766
;
6867

69-
// CHECK: #pragma acc enter data wait(devnum: i : *iPtr, i)
68+
// CHECK: #pragma acc enter data copyin(Var) wait(devnum: i : *iPtr, i)
7069
#pragma acc enter data copyin(Var) wait(devnum:i:*iPtr, i)
7170

7271
// CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i)
@@ -79,4 +78,26 @@ void foo() {
7978
// CHECK: #pragma acc data default(present)
8079
#pragma acc data default(present)
8180
;
81+
82+
// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2])
83+
#pragma acc data default(none) no_create(i, array[1], array, array[1:2])
84+
;
85+
86+
// CHECK: #pragma acc data default(none) no_create(i, array[1], array, array[1:2])
87+
// CHECK-NOT: present(i, array[1], array, array[1:2])
88+
#pragma acc data default(none) no_create(i, array[1], array, array[1:2]) present(i, array[1], array, array[1:2])
89+
;
90+
91+
// CHECK: #pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])
92+
#pragma acc data default(none) copy(i, array[1], array, array[1:2]) pcopy(i, array[1], array, array[1:2]) present_or_copy(i, array[1], array, array[1:2])
93+
;
94+
95+
// CHECK: #pragma acc enter data copyin(i, array[1], array, array[1:2]) pcopyin(readonly: i, array[1], array, array[1:2]) present_or_copyin(i, array[1], array, array[1:2])
96+
#pragma acc enter data copyin(i, array[1], array, array[1:2]) pcopyin(readonly:i, array[1], array, array[1:2]) present_or_copyin(i, array[1], array, array[1:2])
97+
98+
// CHECK-NOT: #pragma acc exit data copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(i, array[1], array, array[1:2])
99+
#pragma acc exit data copyout(i, array[1], array, array[1:2]) pcopyout(zero: i, array[1], array, array[1:2]) present_or_copyout(i, array[1], array, array[1:2])
100+
101+
// CHECK: #pragma acc enter data create(i, array[1], array, array[1:2]) pcreate(zero: i, array[1], array, array[1:2]) present_or_create(i, array[1], array, array[1:2])
102+
#pragma acc enter data create(i, array[1], array, array[1:2]) pcreate(zero: i, array[1], array, array[1:2]) present_or_create(i, array[1], array, array[1:2])
82103
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ void NormalFunc() {
2727
// CHECK: NullStmt
2828
#pragma acc enter data copyin(Var)
2929
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
30+
// CHECK-NEXT: copyin clause
31+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
3032
#pragma acc exit data copyout(Var)
3133
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
3234
#pragma acc host_data use_device(Var)
@@ -55,6 +57,8 @@ void TemplFunc() {
5557
// CHECK: NullStmt
5658
#pragma acc enter data copyin(Var)
5759
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
60+
// CHECK-NEXT: copyin clause
61+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
5862
#pragma acc exit data copyout(Var)
5963
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
6064
#pragma acc host_data use_device(Var)
@@ -78,6 +82,8 @@ void TemplFunc() {
7882
// CHECK: NullStmt
7983

8084
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
85+
// CHECK-NEXT: copyin clause
86+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
8187

8288
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
8389

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ void Test() {
55
struct NotConvertible{} NC;
66
// No special rules for this clause on the data constructs, so not much to
77
// test that isn't covered by combined/compute.
8-
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
98
#pragma acc data copyin(I) async(I)
109
;
11-
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
1210
#pragma acc enter data copyin(I) async(I)
1311
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
1412
#pragma acc exit data copyout(I) async(I)
@@ -17,11 +15,9 @@ void Test() {
1715
#pragma acc host_data use_device(I) async(I)
1816
;
1917

20-
// expected-warning@+2{{OpenACC clause 'copyin' not yet implemented}}
2118
// expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
2219
#pragma acc data copyin(NC) async(NC)
2320
;
24-
// expected-warning@+2{{OpenACC clause 'copyin' not yet implemented}}
2521
// expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
2622
#pragma acc enter data copyin(NC) async(NC)
2723
// expected-warning@+2{{OpenACC clause 'copyout' not yet implemented}}
@@ -32,12 +28,10 @@ void Test() {
3228
#pragma acc host_data use_device(NC) async(NC)
3329
;
3430

35-
// expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
3631
// expected-error@+2{{OpenACC 'async' clause cannot appear more than once on a 'data' directive}}
3732
// expected-note@+1{{previous clause is here}}
3833
#pragma acc data copyin(I) async(I) async(I)
3934
;
40-
// expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
4135
// expected-error@+2{{expected ')'}}
4236
// expected-note@+1{{to match this '('}}
4337
#pragma acc enter data copyin(I) async(I, I)
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s
2+
3+
// Test this with PCH.
4+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -emit-pch -o %t %s
5+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -include-pch %t -ast-dump-all | FileCheck %s
6+
7+
#ifndef PCH_HELPER
8+
#define PCH_HELPER
9+
10+
int Global;
11+
short GlobalArray[5];
12+
void NormalUses(float *PointerParam) {
13+
// CHECK: FunctionDecl{{.*}}NormalUses
14+
// CHECK: ParmVarDecl
15+
// CHECK-NEXT: CompoundStmt
16+
17+
#pragma acc data copyin(GlobalArray) pcopyin(readonly:PointerParam[Global]) present_or_copyin(Global)
18+
;
19+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
20+
// CHECK-NEXT: copyin clause
21+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
22+
// CHECK-NEXT: pcopyin clause : readonly
23+
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
24+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
25+
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
26+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
27+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
28+
// CHECK-NEXT: present_or_copyin clause
29+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
30+
// CHECK-NEXT: NullStmt
31+
32+
#pragma acc enter data copyin(GlobalArray) pcopyin(readonly:PointerParam[Global]) present_or_copyin(Global)
33+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
34+
// CHECK-NEXT: copyin clause
35+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
36+
// CHECK-NEXT: pcopyin clause : readonly
37+
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
38+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
39+
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
40+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
41+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
42+
// CHECK-NEXT: present_or_copyin clause
43+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
44+
}
45+
46+
template<auto &NTTP, typename T, typename U>
47+
void TemplUses(T t, U u) {
48+
// CHECK-NEXT: FunctionTemplateDecl
49+
// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
50+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
51+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U
52+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
53+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
54+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
55+
// CHECK-NEXT: CompoundStmt
56+
57+
#pragma acc data copyin(t) pcopyin(readonly: NTTP, u) present_or_copyin(u[0:t])
58+
;
59+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
60+
// CHECK-NEXT: copyin clause
61+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
62+
// CHECK-NEXT: pcopyin clause : readonly
63+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
64+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
65+
// CHECK-NEXT: present_or_copyin clause
66+
// CHECK-NEXT: ArraySectionExpr
67+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
68+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
69+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
70+
// CHECK-NEXT: NullStmt
71+
72+
#pragma acc enter data copyin(t) pcopyin(readonly: NTTP, u) present_or_copyin(u[0:t])
73+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
74+
// CHECK-NEXT: copyin clause
75+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
76+
// CHECK-NEXT: pcopyin clause : readonly
77+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
78+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
79+
// CHECK-NEXT: present_or_copyin clause
80+
// CHECK-NEXT: ArraySectionExpr
81+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
82+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
83+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
84+
85+
// Check the instantiated versions of the above.
86+
// CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *)' implicit_instantiation
87+
// CHECK-NEXT: TemplateArgument decl
88+
// CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
89+
// CHECK-NEXT: TemplateArgument type 'int'
90+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
91+
// CHECK-NEXT: TemplateArgument type 'int *'
92+
// CHECK-NEXT: PointerType{{.*}} 'int *'
93+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
94+
// CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
95+
// CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'
96+
// CHECK-NEXT: CompoundStmt
97+
98+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
99+
// CHECK-NEXT: copyin clause
100+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
101+
// CHECK-NEXT: pcopyin clause : readonly
102+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
103+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
104+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
105+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
106+
// CHECK-NEXT: present_or_copyin clause
107+
// CHECK-NEXT: ArraySectionExpr
108+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
109+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
110+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
111+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
112+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
113+
// CHECK-NEXT: NullStmt
114+
115+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
116+
// CHECK-NEXT: copyin clause
117+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
118+
// CHECK-NEXT: pcopyin clause : readonly
119+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
120+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
121+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
122+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
123+
// CHECK-NEXT: present_or_copyin clause
124+
// CHECK-NEXT: ArraySectionExpr
125+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
126+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
127+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
128+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
129+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
130+
}
131+
132+
void Inst() {
133+
static constexpr unsigned CEVar = 1;
134+
int i;
135+
TemplUses<CEVar>(i, &i);
136+
}
137+
#endif
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
typedef struct IsComplete {
4+
struct S { int A; } CompositeMember;
5+
int ScalarMember;
6+
float ArrayMember[5];
7+
void *PointerMember;
8+
} Complete;
9+
void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {
10+
int LocalInt;
11+
short *LocalPointer;
12+
float LocalArray[5];
13+
Complete LocalComposite;
14+
// Check Appertainment:
15+
#pragma acc data copyin(LocalInt)
16+
;
17+
#pragma acc enter data copyin(LocalInt)
18+
19+
// expected-warning@+1{{OpenACC clause name 'pcopyin' is a deprecated clause name and is now an alias for 'copyin'}}
20+
#pragma acc data pcopyin(LocalInt)
21+
;
22+
23+
// expected-warning@+1{{OpenACC clause name 'present_or_copyin' is a deprecated clause name and is now an alias for 'copyin'}}
24+
#pragma acc data present_or_copyin(LocalInt)
25+
;
26+
27+
// Valid cases:
28+
#pragma acc data copyin(LocalInt, LocalPointer, LocalArray)
29+
;
30+
#pragma acc data copyin(LocalArray[2:1])
31+
;
32+
#pragma acc data copyin(readonly:LocalArray[2:1])
33+
;
34+
35+
#pragma acc data copyin(LocalComposite.ScalarMember, LocalComposite.ScalarMember)
36+
;
37+
38+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
39+
#pragma acc data copyin(1 + IntParam)
40+
;
41+
42+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
43+
#pragma acc data copyin(+IntParam)
44+
;
45+
46+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
47+
#pragma acc data copyin(PointerParam[2:])
48+
;
49+
50+
// expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
51+
#pragma acc data copyin(ArrayParam[2:5])
52+
;
53+
54+
// expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
55+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
56+
#pragma acc data copyin((float*)ArrayParam[2:5])
57+
;
58+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
59+
#pragma acc data copyin((float)ArrayParam[2])
60+
;
61+
// expected-error@+2{{invalid tag 'invalid' on 'copyin' clause}}
62+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
63+
#pragma acc data copyin(invalid:(float)ArrayParam[2])
64+
;
65+
66+
// expected-error@+1{{OpenACC 'copyin' clause is not valid on 'exit data' directive}}
67+
#pragma acc exit data copyin(LocalInt)
68+
// expected-error@+1{{OpenACC 'pcopyin' clause is not valid on 'host_data' directive}}
69+
#pragma acc host_data pcopyin(LocalInt)
70+
;
71+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ void TemplFunc() {
5252
#pragma acc enter data copyin(Global) if(typename T::IntTy{})
5353
;
5454
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
55+
// CHECK-NEXT: copyin clause
56+
// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
5557
// CHECK-NEXT: if clause
5658
// CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'
5759
// CHECK-NEXT: InitListExpr{{.*}} 'void'
@@ -93,6 +95,8 @@ void TemplFunc() {
9395
// CHECK-NEXT: NullStmt
9496

9597
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data
98+
// CHECK-NEXT: copyin clause
99+
// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
96100
// CHECK-NEXT: if clause
97101
// CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>
98102
// CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp>

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ void Foo() {
99
#pragma acc data default(present) if(1) if (2)
1010
;
1111

12-
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
1312
#pragma acc enter data copyin(Var) if(1)
1413

15-
// expected-warning@+3{{OpenACC clause 'copyin' not yet implemented}}
1614
// expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'enter data' directive}}
1715
// expected-note@+1{{previous clause is here}}
1816
#pragma acc enter data copyin(Var) if(1) if (2)

0 commit comments

Comments
 (0)