Skip to content

Commit 4e330fa

Browse files
committed
[OpenACC] Implement combined construct allowed-after device-type rule
This patch implements the 'only X is allowed after' rule for combined constructs on a device-type clause. This was left as a set of 'TODO' in the previous patch, plus more issues were found with the TODO list, which are fixed here.
1 parent b904166 commit 4e330fa

File tree

2 files changed

+71
-73
lines changed

2 files changed

+71
-73
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ bool checkValidAfterDeviceType(
434434
// This is only a requirement on compute and loop constructs so far, so this
435435
// is fine otherwise.
436436
if (!isOpenACCComputeDirectiveKind(NewClause.getDirectiveKind()) &&
437+
!isOpenACCCombinedDirectiveKind(NewClause.getDirectiveKind()) &&
437438
NewClause.getDirectiveKind() != OpenACCDirectiveKind::Loop)
438439
return false;
439440

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

Lines changed: 70 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,12 @@ void uses() {
4343
#pragma acc parallel loop device_type(*) vector
4444
for(int i = 0; i < 5; ++i);
4545

46-
// TODOexpected-error@+2{{OpenACC clause 'finalize' may not follow a 'device_type' clause in a 'serial loop' construct}}
47-
// TODOexpected-note@+1{{previous clause is here}}
48-
// expected-warning@+1{{OpenACC clause 'finalize' not yet implemented, clause ignored}}
46+
// expected-error@+2{{OpenACC clause 'finalize' may not follow a 'device_type' clause in a 'serial loop' construct}}
47+
// expected-note@+1{{previous clause is here}}
4948
#pragma acc serial loop device_type(*) finalize
5049
for(int i = 0; i < 5; ++i);
51-
// TODOexpected-error@+2{{OpenACC clause 'if_present' may not follow a 'device_type' clause in a 'kernels loop' construct}}
52-
// TODOexpected-note@+1{{previous clause is here}}
53-
// expected-warning@+1{{OpenACC clause 'if_present' not yet implemented, clause ignored}}
50+
// expected-error@+2{{OpenACC clause 'if_present' may not follow a 'device_type' clause in a 'kernels loop' construct}}
51+
// expected-note@+1{{previous clause is here}}
5452
#pragma acc kernels loop device_type(*) if_present
5553
for(int i = 0; i < 5; ++i);
5654
#pragma acc parallel loop device_type(*) seq
@@ -62,133 +60,134 @@ void uses() {
6260
// expected-warning@+1{{OpenACC clause 'worker' not yet implemented, clause ignored}}
6361
#pragma acc parallel loop device_type(*) worker
6462
for(int i = 0; i < 5; ++i);
65-
// TODOexpected-error@+2{{OpenACC clause 'nohost' may not follow a 'device_type' clause in a 'loop' construct}}
66-
// TODOexpected-note@+1{{previous clause is here}}
67-
// expected-warning@+1{{OpenACC clause 'nohost' not yet implemented, clause ignored}}
63+
// expected-error@+2{{OpenACC clause 'nohost' may not follow a 'device_type' clause in a 'serial loop' construct}}
64+
// expected-note@+1{{previous clause is here}}
6865
#pragma acc serial loop device_type(*) nohost
6966
for(int i = 0; i < 5; ++i);
70-
// expected-warning@+1{{OpenACC clause 'default' not yet implemented, clause ignored}}
67+
// expected-error@+2{{OpenACC clause 'default' may not follow a 'device_type' clause in a 'kernels loop' construct}}
68+
// expected-note@+1{{previous clause is here}}
7169
#pragma acc kernels loop device_type(*) default(none)
7270
for(int i = 0; i < 5; ++i);
73-
// expected-warning@+1{{OpenACC clause 'if' not yet implemented, clause ignored}}
71+
// expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'parallel loop' construct}}
72+
// expected-note@+1{{previous clause is here}}
7473
#pragma acc parallel loop device_type(*) if(1)
7574
for(int i = 0; i < 5; ++i);
76-
// expected-warning@+1{{OpenACC clause 'self' not yet implemented, clause ignored}}
75+
// expected-error@+2{{OpenACC clause 'self' may not follow a 'device_type' clause in a 'serial loop' construct}}
76+
// expected-note@+1{{previous clause is here}}
7777
#pragma acc serial loop device_type(*) self
7878
for(int i = 0; i < 5; ++i);
7979

8080
int Var;
8181
int *VarPtr;
82-
// expected-warning@+1{{OpenACC clause 'copy' not yet implemented, clause ignored}}
82+
// expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' clause in a 'kernels loop' construct}}
83+
// expected-note@+1{{previous clause is here}}
8384
#pragma acc kernels loop device_type(*) copy(Var)
8485
for(int i = 0; i < 5; ++i);
85-
// expected-warning@+2{{OpenACC clause name 'pcopy' is a deprecated clause name and is now an alias for 'copy'}}
86-
// expected-warning@+1{{OpenACC clause 'pcopy' not yet implemented, clause ignored}}
86+
// expected-error@+2{{OpenACC clause 'pcopy' may not follow a 'device_type' clause in a 'parallel loop' construct}}
87+
// expected-note@+1{{previous clause is here}}
8788
#pragma acc parallel loop device_type(*) pcopy(Var)
8889
for(int i = 0; i < 5; ++i);
89-
// expected-warning@+2{{OpenACC clause name 'present_or_copy' is a deprecated clause name and is now an alias for 'copy'}}
90-
// expected-warning@+1{{OpenACC clause 'present_or_copy' not yet implemented, clause ignored}}
90+
// expected-error@+2{{OpenACC clause 'present_or_copy' may not follow a 'device_type' clause in a 'serial loop' construct}}
91+
// expected-note@+1{{previous clause is here}}
9192
#pragma acc serial loop device_type(*) present_or_copy(Var)
9293
for(int i = 0; i < 5; ++i);
93-
// TODOexpected-error@+2{{OpenACC clause 'use_device' may not follow a 'device_type' clause in a 'loop' construct}}
94-
// TODOexpected-note@+1{{previous clause is here}}
95-
// expected-warning@+1{{OpenACC clause 'use_device' not yet implemented, clause ignored}}
94+
// expected-error@+2{{OpenACC clause 'use_device' may not follow a 'device_type' clause in a 'kernels loop' construct}}
95+
// expected-note@+1{{previous clause is here}}
9696
#pragma acc kernels loop device_type(*) use_device(Var)
9797
for(int i = 0; i < 5; ++i);
98-
// expected-warning@+1{{OpenACC clause 'attach' not yet implemented, clause ignored}}
98+
// expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' clause in a 'parallel loop' construct}}
99+
// expected-note@+1{{previous clause is here}}
99100
#pragma acc parallel loop device_type(*) attach(Var)
100101
for(int i = 0; i < 5; ++i);
101-
// TODOexpected-error@+2{{OpenACC clause 'delete' may not follow a 'device_type' clause in a 'loop' construct}}
102-
// TODOexpected-note@+1{{previous clause is here}}
103-
// expected-warning@+1{{OpenACC clause 'delete' not yet implemented, clause ignored}}
102+
// expected-error@+2{{OpenACC clause 'delete' may not follow a 'device_type' clause in a 'serial loop' construct}}
103+
// expected-note@+1{{previous clause is here}}
104104
#pragma acc serial loop device_type(*) delete(Var)
105105
for(int i = 0; i < 5; ++i);
106-
// TODOexpected-error@+2{{OpenACC clause 'detach' may not follow a 'device_type' clause in a 'loop' construct}}
107-
// TODOexpected-note@+1{{previous clause is here}}
108-
// expected-warning@+1{{OpenACC clause 'detach' not yet implemented, clause ignored}}
106+
// expected-error@+2{{OpenACC clause 'detach' may not follow a 'device_type' clause in a 'kernels loop' construct}}
107+
// expected-note@+1{{previous clause is here}}
109108
#pragma acc kernels loop device_type(*) detach(Var)
110109
for(int i = 0; i < 5; ++i);
111-
// TODOexpected-error@+2{{OpenACC clause 'device' may not follow a 'device_type' clause in a 'loop' construct}}
112-
// TODOexpected-note@+1{{previous clause is here}}
113-
// expected-warning@+1{{OpenACC clause 'device' not yet implemented, clause ignored}}
110+
// expected-error@+2{{OpenACC clause 'device' may not follow a 'device_type' clause in a 'parallel loop' construct}}
111+
// expected-note@+1{{previous clause is here}}
114112
#pragma acc parallel loop device_type(*) device(VarPtr)
115113
for(int i = 0; i < 5; ++i);
116-
// expected-warning@+1{{OpenACC clause 'deviceptr' not yet implemented, clause ignored}}
114+
// expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 'device_type' clause in a 'serial loop' construct}}
115+
// expected-note@+1{{previous clause is here}}
117116
#pragma acc serial loop device_type(*) deviceptr(VarPtr)
118117
for(int i = 0; i < 5; ++i);
119-
// TODOexpected-error@+2{{OpenACC clause 'device_resident' may not follow a 'device_type' clause in a 'loop' construct}}
120-
// TODOexpected-note@+1{{previous clause is here}}
121-
// expected-warning@+1{{OpenACC clause 'device_resident' not yet implemented, clause ignored}}
118+
// expected-error@+2{{OpenACC clause 'device_resident' may not follow a 'device_type' clause in a 'kernels loop' construct}}
119+
// expected-note@+1{{previous clause is here}}
122120
#pragma acc kernels loop device_type(*) device_resident(VarPtr)
123121
for(int i = 0; i < 5; ++i);
124-
// expected-warning@+1{{OpenACC clause 'firstprivate' not yet implemented, clause ignored}}
122+
// expected-error@+2{{OpenACC clause 'firstprivate' may not follow a 'device_type' clause in a 'parallel loop' construct}}
123+
// expected-note@+1{{previous clause is here}}
125124
#pragma acc parallel loop device_type(*) firstprivate(Var)
126125
for(int i = 0; i < 5; ++i);
127-
// TODOexpected-error@+2{{OpenACC clause 'host' may not follow a 'device_type' clause in a 'loop' construct}}
128-
// TODOexpected-note@+1{{previous clause is here}}
129-
// expected-warning@+1{{OpenACC clause 'host' not yet implemented, clause ignored}}
126+
// expected-error@+2{{OpenACC clause 'host' may not follow a 'device_type' clause in a 'serial loop' construct}}
127+
// expected-note@+1{{previous clause is here}}
130128
#pragma acc serial loop device_type(*) host(Var)
131129
for(int i = 0; i < 5; ++i);
132-
// TODOexpected-error@+2{{OpenACC clause 'link' may not follow a 'device_type' clause in a 'loop' construct}}
133-
// TODOexpected-note@+1{{previous clause is here}}
134-
// expected-warning@+1{{OpenACC clause 'link' not yet implemented, clause ignored}}
130+
// expected-error@+2{{OpenACC clause 'link' may not follow a 'device_type' clause in a 'parallel loop' construct}}
131+
// expected-note@+1{{previous clause is here}}
135132
#pragma acc parallel loop device_type(*) link(Var)
136133
for(int i = 0; i < 5; ++i);
137-
// expected-warning@+1{{OpenACC clause 'no_create' not yet implemented, clause ignored}}
134+
// expected-error@+2{{OpenACC clause 'no_create' may not follow a 'device_type' clause in a 'serial loop' construct}}
135+
// expected-note@+1{{previous clause is here}}
138136
#pragma acc serial loop device_type(*) no_create(Var)
139137
for(int i = 0; i < 5; ++i);
140-
// expected-warning@+1{{OpenACC clause 'present' not yet implemented, clause ignored}}
138+
// expected-error@+2{{OpenACC clause 'present' may not follow a 'device_type' clause in a 'kernels loop' construct}}
139+
// expected-note@+1{{previous clause is here}}
141140
#pragma acc kernels loop device_type(*) present(Var)
142141
for(int i = 0; i < 5; ++i);
143-
// TODOexpected-error@+2{{OpenACC clause 'private' may not follow a 'device_type' clause in a 'loop' construct}}
144-
// TODOexpected-note@+1{{previous clause is here}}
145-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented, clause ignored}}
142+
// expected-error@+2{{OpenACC clause 'private' may not follow a 'device_type' clause in a 'parallel loop' construct}}
143+
// expected-note@+1{{previous clause is here}}
146144
#pragma acc parallel loop device_type(*) private(Var)
147145
for(int i = 0; i < 5; ++i);
148-
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented, clause ignored}}
146+
// expected-error@+2{{OpenACC clause 'copyout' may not follow a 'device_type' clause in a 'serial loop' construct}}
147+
// expected-note@+1{{previous clause is here}}
149148
#pragma acc serial loop device_type(*) copyout(Var)
150149
for(int i = 0; i < 5; ++i);
151-
// expected-warning@+2{{OpenACC clause name 'pcopyout' is a deprecated clause name and is now an alias for 'copyout'}}
152-
// expected-warning@+1{{OpenACC clause 'pcopyout' not yet implemented, clause ignored}}
150+
// expected-error@+2{{OpenACC clause 'pcopyout' may not follow a 'device_type' clause in a 'serial loop' construct}}
151+
// expected-note@+1{{previous clause is here}}
153152
#pragma acc serial loop device_type(*) pcopyout(Var)
154153
for(int i = 0; i < 5; ++i);
155-
// expected-warning@+2{{OpenACC clause name 'present_or_copyout' is a deprecated clause name and is now an alias for 'copyout'}}
156-
// expected-warning@+1{{OpenACC clause 'present_or_copyout' not yet implemented, clause ignored}}
154+
// expected-error@+2{{OpenACC clause 'present_or_copyout' may not follow a 'device_type' clause in a 'parallel loop' construct}}
155+
// expected-note@+1{{previous clause is here}}
157156
#pragma acc parallel loop device_type(*) present_or_copyout(Var)
158157
for(int i = 0; i < 5; ++i);
159-
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented, clause ignored}}
158+
// expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' clause in a 'serial loop' construct}}
159+
// expected-note@+1{{previous clause is here}}
160160
#pragma acc serial loop device_type(*) copyin(Var)
161161
for(int i = 0; i < 5; ++i);
162-
// expected-warning@+2{{OpenACC clause name 'pcopyin' is a deprecated clause name and is now an alias for 'copyin'}}
163-
// expected-warning@+1{{OpenACC clause 'pcopyin' not yet implemented, clause ignored}}
162+
// expected-error@+2{{OpenACC clause 'pcopyin' may not follow a 'device_type' clause in a 'serial loop' construct}}
163+
// expected-note@+1{{previous clause is here}}
164164
#pragma acc serial loop device_type(*) pcopyin(Var)
165165
for(int i = 0; i < 5; ++i);
166-
// expected-warning@+2{{OpenACC clause name 'present_or_copyin' is a deprecated clause name and is now an alias for 'copyin'}}
167-
// expected-warning@+1{{OpenACC clause 'present_or_copyin' not yet implemented, clause ignored}}
166+
// expected-error@+2{{OpenACC clause 'present_or_copyin' may not follow a 'device_type' clause in a 'parallel loop' construct}}
167+
// expected-note@+1{{previous clause is here}}
168168
#pragma acc parallel loop device_type(*) present_or_copyin(Var)
169169
for(int i = 0; i < 5; ++i);
170-
// expected-warning@+1{{OpenACC clause 'create' not yet implemented, clause ignored}}
170+
// expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' clause in a 'serial loop' construct}}
171+
// expected-note@+1{{previous clause is here}}
171172
#pragma acc serial loop device_type(*) create(Var)
172173
for(int i = 0; i < 5; ++i);
173-
// expected-warning@+2{{OpenACC clause name 'pcreate' is a deprecated clause name and is now an alias for 'create'}}
174-
// expected-warning@+1{{OpenACC clause 'pcreate' not yet implemented, clause ignored}}
174+
// expected-error@+2{{OpenACC clause 'pcreate' may not follow a 'device_type' clause in a 'serial loop' construct}}
175+
// expected-note@+1{{previous clause is here}}
175176
#pragma acc serial loop device_type(*) pcreate(Var)
176177
for(int i = 0; i < 5; ++i);
177-
// expected-warning@+2{{OpenACC clause name 'present_or_create' is a deprecated clause name and is now an alias for 'create'}}
178-
// expected-warning@+1{{OpenACC clause 'present_or_create' not yet implemented, clause ignored}}
178+
// expected-error@+2{{OpenACC clause 'present_or_create' may not follow a 'device_type' clause in a 'parallel loop' construct}}
179+
// expected-note@+1{{previous clause is here}}
179180
#pragma acc parallel loop device_type(*) present_or_create(Var)
180181
for(int i = 0; i < 5; ++i);
181-
// TODOexpected-error@+2{{OpenACC clause 'reduction' may not follow a 'device_type' clause in a 'loop' construct}}
182-
// TODOexpected-note@+1{{previous clause is here}}
183-
// expected-warning@+1{{OpenACC clause 'reduction' not yet implemented, clause ignored}}
182+
// expected-error@+2{{OpenACC clause 'reduction' may not follow a 'device_type' clause in a 'serial loop' construct}}
183+
// expected-note@+1{{previous clause is here}}
184184
#pragma acc serial loop device_type(*) reduction(+:Var)
185185
for(int i = 0; i < 5; ++i);
186186
// expected-warning@+1{{OpenACC clause 'collapse' not yet implemented, clause ignored}}
187187
#pragma acc serial loop device_type(*) collapse(1)
188188
for(int i = 0; i < 5; ++i);
189-
// TODOexpected-error@+2{{OpenACC clause 'bind' may not follow a 'device_type' clause in a 'loop' construct}}
190-
// TODOexpected-note@+1{{previous clause is here}}
191-
// expected-warning@+1{{OpenACC clause 'bind' not yet implemented, clause ignored}}
189+
// expected-error@+2{{OpenACC clause 'bind' may not follow a 'device_type' clause in a 'parallel loop' construct}}
190+
// expected-note@+1{{previous clause is here}}
192191
#pragma acc parallel loop device_type(*) bind(Var)
193192
for(int i = 0; i < 5; ++i);
194193
// expected-error@+1{{OpenACC 'vector_length' clause is not valid on 'serial loop' directive}}
@@ -200,14 +199,12 @@ void uses() {
200199
// expected-warning@+1{{OpenACC clause 'num_workers' not yet implemented, clause ignored}}
201200
#pragma acc parallel loop device_type(*) num_workers(1)
202201
for(int i = 0; i < 5; ++i);
203-
// TODOexpected-error@+2{{OpenACC clause 'device_num' may not follow a 'device_type' clause in a 'loop' construct}}
204-
// TODOexpected-note@+1{{previous clause is here}}
205-
// expected-warning@+1{{OpenACC clause 'device_num' not yet implemented, clause ignored}}
202+
// expected-error@+2{{OpenACC clause 'device_num' may not follow a 'device_type' clause in a 'serial loop' construct}}
203+
// expected-note@+1{{previous clause is here}}
206204
#pragma acc serial loop device_type(*) device_num(1)
207205
for(int i = 0; i < 5; ++i);
208-
// TODOexpected-error@+2{{OpenACC clause 'default_async' may not follow a 'device_type' clause in a 'loop' construct}}
209-
// TODOexpected-note@+1{{previous clause is here}}
210-
// expected-warning@+1{{OpenACC clause 'default_async' not yet implemented, clause ignored}}
206+
// expected-error@+2{{OpenACC clause 'default_async' may not follow a 'device_type' clause in a 'serial loop' construct}}
207+
// expected-note@+1{{previous clause is here}}
211208
#pragma acc serial loop device_type(*) default_async(1)
212209
for(int i = 0; i < 5; ++i);
213210
// expected-warning@+1{{OpenACC clause 'async' not yet implemented, clause ignored}}

0 commit comments

Comments
 (0)