Skip to content

Commit 1da0730

Browse files
committed
[OpenACC] enable 'copyout' clause sema for data constructs
Same as the previous few, this just enables copyout for data constructs and ensures we have sufficient test coverage.
1 parent b2b1eec commit 1da0730

11 files changed

+242
-19
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -981,11 +981,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyInClause(
981981

982982
OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyOutClause(
983983
SemaOpenACC::OpenACCParsedClause &Clause) {
984-
// Restrictions only properly implemented on 'compute'/'combined' constructs,
985-
// and 'compute'/'combined' constructs are the only construct that can do
986-
// anything with this yet, so skip/treat as unimplemented in this case.
984+
// Restrictions only properly implemented on 'compute'/'combined'/'data'
985+
// constructs, and 'compute'/'combined'/'data' constructs are the only
986+
// construct that can do anything with this yet, so skip/treat as
987+
// unimplemented in this case.
987988
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
988-
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
989+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()) &&
990+
!isOpenACCDataDirectiveKind(Clause.getDirectiveKind()))
989991
return isNotImplemented();
990992
// ActOnVar ensured that everything is a valid variable reference, so there
991993
// really isn't anything to do here. GCC does some duplicate-finding, though

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ void foo() {
1717
// CHECK: #pragma acc enter data copyin(Var)
1818
#pragma acc enter data copyin(Var)
1919
;
20-
// CHECK: #pragma acc exit data
21-
// CHECK-NOT: copyout(Var)
20+
// CHECK: #pragma acc exit data copyout(Var)
2221
#pragma acc exit data copyout(Var)
2322
;
2423
// CHECK: #pragma acc host_data
@@ -36,7 +35,7 @@ void foo() {
3635
// CHECK: #pragma acc enter data copyin(Var) if(i == array[1])
3736
#pragma acc enter data copyin(Var) if(i == array[1])
3837
;
39-
// CHECK: #pragma acc exit data if(i == array[1])
38+
// CHECK: #pragma acc exit data copyout(Var) if(i == array[1])
4039
#pragma acc exit data copyout(Var) if(i == array[1])
4140
;
4241
// CHECK: #pragma acc host_data if(i == array[1])
@@ -48,7 +47,7 @@ void foo() {
4847
;
4948
// CHECK: #pragma acc enter data copyin(i) async(i)
5049
#pragma acc enter data copyin(i) async(i)
51-
// CHECK: #pragma acc exit data async
50+
// CHECK: #pragma acc exit data copyout(i) async
5251
#pragma acc exit data copyout(i) async
5352

5453
// CHECK: #pragma acc data default(none) wait
@@ -58,7 +57,7 @@ void foo() {
5857
// CHECK: #pragma acc enter data copyin(Var) wait()
5958
#pragma acc enter data copyin(Var) wait()
6059

61-
// CHECK: #pragma acc exit data wait(*iPtr, i)
60+
// CHECK: #pragma acc exit data copyout(Var) wait(*iPtr, i)
6261
#pragma acc exit data copyout(Var) wait(*iPtr, i)
6362

6463
// CHECK: #pragma acc data default(none) wait(queues: *iPtr, i)
@@ -68,7 +67,7 @@ void foo() {
6867
// CHECK: #pragma acc enter data copyin(Var) wait(devnum: i : *iPtr, i)
6968
#pragma acc enter data copyin(Var) wait(devnum:i:*iPtr, i)
7069

71-
// CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i)
70+
// CHECK: #pragma acc exit data copyout(Var) wait(devnum: i : queues: *iPtr, i)
7271
#pragma acc exit data copyout(Var) wait(devnum:i:queues:*iPtr, i)
7372

7473
// CHECK: #pragma acc data default(none)
@@ -95,7 +94,7 @@ void foo() {
9594
// 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])
9695
#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])
9796

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])
97+
// CHECK: #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])
9998
#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])
10099

101100
// 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])

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ void NormalFunc() {
3131
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
3232
#pragma acc exit data copyout(Var)
3333
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
34+
// CHECK-NEXT: copyout clause
35+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
3436
#pragma acc host_data use_device(Var)
3537
while (Var);
3638
// CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
@@ -61,6 +63,8 @@ void TemplFunc() {
6163
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
6264
#pragma acc exit data copyout(Var)
6365
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
66+
// CHECK-NEXT: copyout clause
67+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'T'
6468
#pragma acc host_data use_device(Var)
6569
while (Var);
6670
// CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
@@ -86,6 +90,8 @@ void TemplFunc() {
8690
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
8791

8892
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
93+
// CHECK-NEXT: copyout clause
94+
// CHECK-NEXT: DeclRefExpr{{.*}}'Var' 'int'
8995

9096
// CHECK-NEXT: OpenACCHostDataConstruct{{.*}} host_data
9197
// CHECK-NEXT: WhileStmt

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ void Test() {
88
#pragma acc data copyin(I) async(I)
99
;
1010
#pragma acc enter data copyin(I) async(I)
11-
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
1211
#pragma acc exit data copyout(I) async(I)
1312
// expected-warning@+2{{OpenACC clause 'use_device' not yet implemented}}
1413
// expected-error@+1{{OpenACC 'async' clause is not valid on 'host_data' directive}}
@@ -20,7 +19,6 @@ void Test() {
2019
;
2120
// expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
2221
#pragma acc enter data copyin(NC) async(NC)
23-
// expected-warning@+2{{OpenACC clause 'copyout' not yet implemented}}
2422
// expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}
2523
#pragma acc exit data copyout(NC) async(NC)
2624
// expected-warning@+2{{OpenACC clause 'use_device' not yet implemented}}
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 copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(Global)
18+
;
19+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
20+
// CHECK-NEXT: copyout clause
21+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
22+
// CHECK-NEXT: pcopyout clause : zero
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_copyout clause
29+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
30+
// CHECK-NEXT: NullStmt
31+
32+
#pragma acc exit data copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(Global)
33+
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
34+
// CHECK-NEXT: copyout clause
35+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
36+
// CHECK-NEXT: pcopyout clause : zero
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_copyout 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 copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
58+
;
59+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
60+
// CHECK-NEXT: copyout clause
61+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
62+
// CHECK-NEXT: pcopyout clause : zero
63+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
64+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
65+
// CHECK-NEXT: present_or_copyout 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 exit data copyout(t) pcopyout(zero: NTTP, u) present_or_copyout(u[0:t])
73+
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}} exit data
74+
// CHECK-NEXT: copyout clause
75+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
76+
// CHECK-NEXT: pcopyout clause : zero
77+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
78+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
79+
// CHECK-NEXT: present_or_copyout 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: copyout clause
100+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
101+
// CHECK-NEXT: pcopyout clause : zero
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_copyout 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: OpenACCExitDataConstruct{{.*}} exit data
116+
// CHECK-NEXT: copyout clause
117+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
118+
// CHECK-NEXT: pcopyout clause : zero
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_copyout 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 copyout(LocalInt)
16+
;
17+
#pragma acc exit data copyout(LocalInt)
18+
19+
// expected-warning@+1{{OpenACC clause name 'pcopyout' is a deprecated clause name and is now an alias for 'copyout'}}
20+
#pragma acc data pcopyout(LocalInt)
21+
;
22+
23+
// expected-warning@+1{{OpenACC clause name 'present_or_copyout' is a deprecated clause name and is now an alias for 'copyout'}}
24+
#pragma acc data present_or_copyout(LocalInt)
25+
;
26+
27+
// Valid cases:
28+
#pragma acc data copyout(LocalInt, LocalPointer, LocalArray)
29+
;
30+
#pragma acc data copyout(LocalArray[2:1])
31+
;
32+
#pragma acc data copyout(zero:LocalArray[2:1])
33+
;
34+
35+
#pragma acc data copyout(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 copyout(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 copyout(+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 copyout(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 copyout(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 copyout((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 copyout((float)ArrayParam[2])
60+
;
61+
// expected-error@+2{{invalid tag 'invalid' on 'copyout' 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 copyout(invalid:(float)ArrayParam[2])
64+
;
65+
66+
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'enter data' directive}}
67+
#pragma acc enter data copyout(LocalInt)
68+
// expected-error@+1{{OpenACC 'pcopyout' clause is not valid on 'host_data' directive}}
69+
#pragma acc host_data pcopyout(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
@@ -62,6 +62,8 @@ void TemplFunc() {
6262
#pragma acc exit data copyout(Global) if(T::SomeFloat)
6363
;
6464
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
65+
// CHECK-NEXT: copyout clause
66+
// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
6567
// CHECK-NEXT: if clause
6668
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
6769
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
@@ -104,6 +106,8 @@ void TemplFunc() {
104106
// CHECK-NEXT: NullStmt
105107

106108
// CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data
109+
// CHECK-NEXT: copyout clause
110+
// CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
107111
// CHECK-NEXT: if clause
108112
// CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>
109113
// CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ void Foo() {
1515
// expected-note@+1{{previous clause is here}}
1616
#pragma acc enter data copyin(Var) if(1) if (2)
1717

18-
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
1918
#pragma acc exit data copyout(Var) if(1)
20-
// expected-warning@+3{{OpenACC clause 'copyout' not yet implemented}}
2119
// expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'exit data' directive}}
2220
// expected-note@+1{{previous clause is here}}
2321
#pragma acc exit data copyout(Var) if(1) if (2)

0 commit comments

Comments
 (0)