Skip to content

Commit afcb7d4

Browse files
committed
[OpenACC] Implement 'wait' sema for data constructs
This is once again simply enabling this for 'data', 'enter data', and 'exit data' (and ensuring we error for 'host_data'). Implementation is very simply to enable it rather than emit the not-implemented diagnostic.
1 parent 4e828f8 commit afcb7d4

File tree

7 files changed

+307
-10
lines changed

7 files changed

+307
-10
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,11 +1070,13 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitDevicePtrClause(
10701070

10711071
OpenACCClause *SemaOpenACCClauseVisitor::VisitWaitClause(
10721072
SemaOpenACC::OpenACCParsedClause &Clause) {
1073-
// Restrictions only properly implemented on 'compute'/'combined' constructs,
1074-
// and 'compute'/'combined' constructs are the only construct that can do
1075-
// anything with this yet, so skip/treat as unimplemented in this case.
1073+
// Restrictions only properly implemented on 'compute'/'combined'/'data'
1074+
// constructs, and 'compute'/'combined'/'data' constructs are the only
1075+
// construct that can do anything with this yet, so skip/treat as
1076+
// unimplemented in this case.
10761077
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
1077-
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
1078+
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()) &&
1079+
!isOpenACCDataDirectiveKind(Clause.getDirectiveKind()))
10781080
return isNotImplemented();
10791081

10801082
return OpenACCWaitClause::Create(

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ void foo() {
2929
;
3030

3131
int i;
32+
int *iPtr;
3233
int array[5];
3334

3435
// CHECK: #pragma acc data if(i == array[1])
@@ -51,4 +52,24 @@ void foo() {
5152
#pragma acc enter data copyin(i) async(i)
5253
// CHECK: #pragma acc exit data async
5354
#pragma acc exit data copyout(i) async
55+
56+
// CHECK: #pragma acc data wait
57+
#pragma acc data default(none) wait()
58+
;
59+
60+
// CHECK: #pragma acc enter data wait()
61+
#pragma acc enter data copyin(Var) wait()
62+
63+
// CHECK: #pragma acc exit data wait(*iPtr, i)
64+
#pragma acc exit data copyout(Var) wait(*iPtr, i)
65+
66+
// CHECK: #pragma acc data wait(queues: *iPtr, i)
67+
#pragma acc data default(none) wait(queues:*iPtr, i)
68+
;
69+
70+
// CHECK: #pragma acc enter data wait(devnum: i : *iPtr, i)
71+
#pragma acc enter data copyin(Var) wait(devnum:i:*iPtr, i)
72+
73+
// CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i)
74+
#pragma acc exit data copyout(Var) wait(devnum:i:queues:*iPtr, i)
5475
}

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ void func() {
1919
// expected-error@+1{{invalid OpenACC clause 'invalid'}}
2020
#pragma acc enter data finalize invalid invalid finalize
2121

22-
// expected-warning@+2{{OpenACC clause 'wait' not yet implemented, clause ignored}}
2322
// expected-warning@+1{{OpenACC clause 'finalize' not yet implemented, clause ignored}}
2423
#pragma acc enter data wait finalize
2524

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ void uses() {
44
int Var;
55
#pragma acc data device_type(foo) async
66
;
7-
// expected-warning@+1{{OpenACC clause 'wait' not yet implemented}}
87
#pragma acc data device_type(foo) wait
98
;
109
#pragma acc data device_type(foo) dtype(false)
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
2+
3+
// Test this with PCH.
4+
// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
5+
// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
6+
7+
#ifndef PCH_HELPER
8+
#define PCH_HELPER
9+
10+
int some_int();
11+
long some_long();
12+
13+
void NormalUses() {
14+
// CHECK: FunctionDecl{{.*}}NormalUses
15+
// CHECK-NEXT: CompoundStmt
16+
17+
int I;
18+
// CHECK-NEXT: DeclStmt
19+
// CHECK-NEXT: VarDecl
20+
21+
#pragma acc data copyin(I) wait
22+
;
23+
// CHECK-NEXT: OpenACCDataConstruct{{.*}}data
24+
// CHECK-NEXT: wait clause
25+
// CHECK-NEXT: <<<NULL>>>
26+
// CHECK-NEXT: NullStmt
27+
#pragma acc enter data copyin(I) wait()
28+
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
29+
// CHECK-NEXT: wait clause
30+
// CHECK-NEXT: <<<NULL>>>
31+
#pragma acc exit data copyout(I) wait(some_int(), some_long())
32+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
33+
// CHECK-NEXT: wait clause
34+
// CHECK-NEXT: <<<NULL>>>
35+
// CHECK-NEXT: CallExpr{{.*}}'int'
36+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
37+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
38+
// CHECK-NEXT: CallExpr{{.*}}'long'
39+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
40+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
41+
#pragma acc data copyin(I) wait(queues:some_int(), some_long())
42+
;
43+
// CHECK: OpenACCDataConstruct{{.*}}data
44+
// CHECK-NEXT: wait clause has queues tag
45+
// CHECK-NEXT: <<<NULL>>>
46+
// CHECK-NEXT: CallExpr{{.*}}'int'
47+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
48+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
49+
// CHECK-NEXT: CallExpr{{.*}}'long'
50+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
51+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
52+
// CHECK-NEXT: NullStmt
53+
#pragma acc enter data copyin(I) wait(devnum: some_int() :some_int(), some_long())
54+
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
55+
// CHECK-NEXT: wait clause has devnum
56+
// CHECK-NEXT: CallExpr{{.*}}'int'
57+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
58+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
59+
// CHECK-NEXT: CallExpr{{.*}}'int'
60+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
61+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
62+
// CHECK-NEXT: CallExpr{{.*}}'long'
63+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
64+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
65+
#pragma acc exit data copyout(I) wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())
66+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
67+
// CHECK-NEXT: wait clause has devnum has queues tag
68+
// CHECK-NEXT: CallExpr{{.*}}'int'
69+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
70+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
71+
// CHECK-NEXT: CallExpr{{.*}}'int'
72+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
73+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
74+
// CHECK-NEXT: CallExpr{{.*}}'long'
75+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
76+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
77+
// CHECK-NEXT: wait clause has devnum has queues tag
78+
// CHECK-NEXT: CallExpr{{.*}}'int'
79+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
80+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
81+
// CHECK-NEXT: CallExpr{{.*}}'int'
82+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>
83+
// CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'
84+
// CHECK-NEXT: CallExpr{{.*}}'long'
85+
// CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>
86+
// CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'
87+
}
88+
89+
template<typename U>
90+
void TemplUses(U u) {
91+
// CHECK: FunctionTemplateDecl
92+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 U
93+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (U)'
94+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
95+
// CHECK-NEXT: CompoundStmt
96+
97+
U I;
98+
// CHECK-NEXT: DeclStmt
99+
// CHECK-NEXT: VarDecl
100+
101+
#pragma acc data copyin(I) wait
102+
;
103+
// CHECK: OpenACCDataConstruct{{.*}}data
104+
// CHECK-NEXT: wait clause
105+
// CHECK-NEXT: <<<NULL>>>
106+
// CHECK-NEXT: NullStmt
107+
108+
#pragma acc enter data copyin(I) wait()
109+
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
110+
// CHECK-NEXT: wait clause
111+
// CHECK-NEXT: <<<NULL>>>
112+
113+
#pragma acc exit data copyout(I) wait(U::value, u)
114+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
115+
// CHECK-NEXT: wait clause
116+
// CHECK-NEXT: <<<NULL>>>
117+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
118+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
119+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
120+
121+
#pragma acc data copyin(I) wait(queues: U::value, u)
122+
;
123+
// CHECK: OpenACCDataConstruct{{.*}}data
124+
// CHECK-NEXT: wait clause has queues tag
125+
// CHECK-NEXT: <<<NULL>>>
126+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
127+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
128+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
129+
// CHECK-NEXT: NullStmt
130+
131+
#pragma acc enter data copyin(I) wait(devnum:u:queues: U::value, u)
132+
// CHECK: OpenACCEnterDataConstruct{{.*}}data
133+
// CHECK-NEXT: wait clause has devnum has queues tag
134+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
135+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
136+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
137+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
138+
139+
#pragma acc exit data copyout(I) wait(devnum:u: U::value, u)
140+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
141+
// CHECK-NEXT: wait clause has devnum
142+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
143+
// CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
144+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'
145+
// CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'
146+
147+
// Check the instantiated versions of the above.
148+
// CHECK: FunctionDecl{{.*}} used TemplUses 'void (HasInt)' implicit_instantiation
149+
// CHECK-NEXT: TemplateArgument type 'HasInt'
150+
// CHECK-NEXT: RecordType{{.*}} 'HasInt'
151+
// CHECK-NEXT: CXXRecord{{.*}} 'HasInt'
152+
// CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'
153+
// CHECK-NEXT: CompoundStmt
154+
155+
// CHECK-NEXT: DeclStmt
156+
// CHECK-NEXT: VarDecl
157+
158+
// CHECK: OpenACCDataConstruct{{.*}}data
159+
// CHECK-NEXT: wait clause
160+
// CHECK-NEXT: <<<NULL>>>
161+
// CHECK-NEXT: NullStmt
162+
163+
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
164+
// CHECK-NEXT: wait clause
165+
// CHECK-NEXT: <<<NULL>>>
166+
167+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
168+
// CHECK-NEXT: wait clause
169+
// CHECK-NEXT: <<<NULL>>>
170+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
171+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
172+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
173+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
174+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
175+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
176+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
177+
178+
// CHECK: OpenACCDataConstruct{{.*}}data
179+
// CHECK-NEXT: wait clause has queues tag
180+
// CHECK-NEXT: <<<NULL>>>
181+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
182+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
183+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
184+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
185+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
186+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
187+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
188+
// CHECK-NEXT: NullStmt
189+
190+
// CHECK: OpenACCEnterDataConstruct{{.*}}enter data
191+
// CHECK-NEXT: wait clause has devnum has queues tag
192+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
193+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
194+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
195+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
196+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
197+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
198+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
199+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
200+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
201+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
202+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
203+
204+
// CHECK: OpenACCExitDataConstruct{{.*}}exit data
205+
// CHECK-NEXT: wait clause has devnum
206+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
207+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
208+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
209+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
210+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
211+
// CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'
212+
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'
213+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>
214+
// CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'
215+
// CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char
216+
// CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar
217+
}
218+
219+
struct HasInt {
220+
using IntTy = int;
221+
using ShortTy = short;
222+
static constexpr int value = 1;
223+
224+
operator char();
225+
};
226+
227+
void Inst() {
228+
TemplUses<HasInt>({});
229+
}
230+
#endif
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
struct NotConvertible{} NC;
4+
short getS();
5+
int getI();
6+
7+
void uses() {
8+
int arr[5];
9+
10+
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
11+
#pragma acc data copyin(arr[0]) wait
12+
;
13+
14+
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
15+
#pragma acc enter data copyin(arr[0]) wait()
16+
17+
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
18+
#pragma acc exit data copyout(arr[0]) wait(getS(), getI())
19+
20+
// expected-warning@+2{{OpenACC clause 'use_device' not yet implemented}}
21+
// expected-error@+1{{OpenACC 'wait' clause is not valid on 'host_data' directive}}
22+
#pragma acc host_data use_device(arr[0]) wait(getS(), getI())
23+
;
24+
25+
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
26+
#pragma acc data copyin(arr[0]) wait(devnum:getS(): getI())
27+
;
28+
29+
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
30+
#pragma acc enter data copyin(arr[0]) wait(devnum:getS(): queues: getI()) wait(devnum:getI(): queues: getS(), getI(), 5)
31+
32+
// expected-warning@+2{{OpenACC clause 'copyout' not yet implemented}}
33+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
34+
#pragma acc exit data copyout(arr[0]) wait(devnum:NC : 5)
35+
36+
// expected-warning@+2{{OpenACC clause 'copyin' not yet implemented}}
37+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
38+
#pragma acc data copyin(arr[0]) wait(devnum:5 : NC)
39+
;
40+
41+
// expected-warning@+4{{OpenACC clause 'copyin' not yet implemented}}
42+
// expected-error@+3{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
43+
// expected-error@+2{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}
44+
// expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}
45+
#pragma acc enter data copyin(arr[0]) wait(devnum:arr : queues: arr, NC, 5)
46+
47+
// expected-error@+1{{OpenACC 'wait' clause is not valid on 'loop' directive}}
48+
#pragma acc loop wait
49+
for(int i = 5; i < 10;++i);
50+
}

clang/test/SemaOpenACC/data-construct.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ void AtLeastOneOf() {
5858
#pragma acc data async
5959
;
6060

61-
// expected-warning@+1{{OpenACC clause 'wait' not yet implemented}}
6261
#pragma acc data wait
6362
;
6463

@@ -80,7 +79,6 @@ void AtLeastOneOf() {
8079

8180
#pragma acc enter data if(Var)
8281
#pragma acc enter data async
83-
// expected-warning@+1{{OpenACC clause 'wait' not yet implemented}}
8482
#pragma acc enter data wait
8583
#pragma acc enter data
8684

@@ -97,7 +95,6 @@ void AtLeastOneOf() {
9795

9896
#pragma acc exit data if(Var)
9997
#pragma acc exit data async
100-
// expected-warning@+1{{OpenACC clause 'wait' not yet implemented}}
10198
#pragma acc exit data wait
10299
// expected-warning@+1{{OpenACC clause 'finalize' not yet implemented}}
103100
#pragma acc exit data finalize
@@ -166,7 +163,6 @@ void DataRules() {
166163
;
167164
#pragma acc data device_type(*) async
168165
;
169-
// expected-warning@+1{{OpenACC clause 'wait' not yet implemented}}
170166
#pragma acc data device_type(*) wait
171167
;
172168
}

0 commit comments

Comments
 (0)