xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-device_type-clause.c (revision be32621ce8cbffe674c62e87c0c51c9fc4a21e5f)
1 // RUN: %clang_cc1 %s -fopenacc -verify
2 
3 #define MACRO +FOO
4 
5 void uses() {
6   typedef struct S{} STy;
7   STy SImpl;
8 
9 #pragma acc parallel device_type(I)
10   while(1);
11 #pragma acc serial device_type(S) dtype(STy)
12   while(1);
13 #pragma acc kernels dtype(SImpl)
14   while(1);
15 #pragma acc kernels dtype(int) device_type(*)
16   while(1);
17 #pragma acc kernels dtype(true) device_type(false)
18   while(1);
19 
20   // expected-error@+1{{expected identifier}}
21 #pragma acc kernels dtype(int, *)
22   while(1);
23 
24 #pragma acc parallel device_type(I, int)
25   while(1);
26   // expected-error@+2{{expected ','}}
27   // expected-error@+1{{expected identifier}}
28 #pragma acc kernels dtype(int{})
29   while(1);
30   // expected-error@+1{{expected identifier}}
31 #pragma acc kernels dtype(5)
32   while(1);
33   // expected-error@+1{{expected identifier}}
34 #pragma acc kernels dtype(MACRO)
35   while(1);
36 
37   // expected-error@+2{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
38   // expected-error@+1{{OpenACC 'device_type' clause is not valid on 'enter data' directive}}
39 #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}}
41   // expected-error@+1{{OpenACC 'dtype' clause is not valid on 'enter data' directive}}
42 #pragma acc enter data dtype(I)
43 
44 
45   // Only 'async', 'wait', num_gangs', 'num_workers', 'vector_length' allowed after 'device_type'.
46 
47   // expected-error@+1{{OpenACC 'finalize' clause is not valid on 'kernels' directive}}
48 #pragma acc kernels device_type(*) finalize
49   while(1);
50   // expected-error@+1{{OpenACC 'if_present' clause is not valid on 'kernels' directive}}
51 #pragma acc kernels device_type(*) if_present
52   while(1);
53   // expected-error@+1{{OpenACC 'seq' clause is not valid on 'kernels' directive}}
54 #pragma acc kernels device_type(*) seq
55   while(1);
56   // expected-error@+1{{OpenACC 'independent' clause is not valid on 'kernels' directive}}
57 #pragma acc kernels device_type(*) independent
58   while(1);
59   // expected-error@+1{{OpenACC 'auto' clause is not valid on 'kernels' directive}}
60 #pragma acc kernels device_type(*) auto
61   while(1);
62   // expected-error@+1{{OpenACC 'worker' clause is not valid on 'kernels' directive}}
63 #pragma acc kernels device_type(*) worker
64   while(1);
65   // expected-error@+2{{OpenACC clause 'nohost' may not follow a 'device_type' clause in a 'kernels' construct}}
66   // expected-note@+1{{previous clause is here}}
67 #pragma acc kernels device_type(*) nohost
68   while(1);
69   // expected-error@+2{{OpenACC clause 'default' may not follow a 'device_type' clause in a 'kernels' construct}}
70   // expected-note@+1{{previous clause is here}}
71 #pragma acc kernels device_type(*) default(none)
72   while(1);
73   // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'kernels' construct}}
74   // expected-note@+1{{previous clause is here}}
75 #pragma acc kernels device_type(*) if(1)
76   while(1);
77   // expected-error@+2{{OpenACC clause 'self' may not follow a 'device_type' clause in a 'kernels' construct}}
78   // expected-note@+1{{previous clause is here}}
79 #pragma acc kernels device_type(*) self
80   while(1);
81 
82   int Var;
83   int *VarPtr;
84   // expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' clause in a 'kernels' construct}}
85   // expected-note@+1{{previous clause is here}}
86 #pragma acc kernels device_type(*) copy(Var)
87   while(1);
88   // expected-error@+2{{OpenACC clause 'pcopy' may not follow a 'device_type' clause in a 'kernels' construct}}
89   // expected-note@+1{{previous clause is here}}
90 #pragma acc kernels device_type(*) pcopy(Var)
91   while(1);
92   // expected-error@+2{{OpenACC clause 'present_or_copy' may not follow a 'device_type' clause in a 'kernels' construct}}
93   // expected-note@+1{{previous clause is here}}
94 #pragma acc kernels device_type(*) present_or_copy(Var)
95   while(1);
96   // expected-error@+1{{OpenACC 'use_device' clause is not valid on 'kernels' directive}}
97 #pragma acc kernels device_type(*) use_device(Var)
98   while(1);
99   // expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' clause in a 'kernels' construct}}
100   // expected-note@+1{{previous clause is here}}
101 #pragma acc kernels device_type(*) attach(Var)
102   while(1);
103   // expected-error@+1{{OpenACC 'delete' clause is not valid on 'kernels' directive}}
104 #pragma acc kernels device_type(*) delete(Var)
105   while(1);
106   // expected-error@+1{{OpenACC 'detach' clause is not valid on 'kernels' directive}}
107 #pragma acc kernels device_type(*) detach(Var)
108   while(1);
109   // expected-error@+1{{OpenACC 'device' clause is not valid on 'kernels' directive}}
110 #pragma acc kernels device_type(*) device(VarPtr)
111   while(1);
112   // expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 'device_type' clause in a 'kernels' construct}}
113   // expected-note@+1{{previous clause is here}}
114 #pragma acc kernels device_type(*) deviceptr(VarPtr)
115   while(1);
116   // expected-error@+2{{OpenACC clause 'device_resident' may not follow a 'device_type' clause in a 'kernels' construct}}
117   // expected-note@+1{{previous clause is here}}
118 #pragma acc kernels device_type(*)  device_resident(VarPtr)
119   while(1);
120   // expected-error@+2{{OpenACC clause 'firstprivate' may not follow a 'device_type' clause in a 'parallel' construct}}
121   // expected-note@+1{{previous clause is here}}
122 #pragma acc parallel device_type(*) firstprivate(Var)
123   while(1);
124   // expected-error@+1{{OpenACC 'host' clause is not valid on 'kernels' directive}}
125 #pragma acc kernels device_type(*) host(Var)
126   while(1);
127   // expected-error@+2{{OpenACC clause 'link' may not follow a 'device_type' clause in a 'kernels' construct}}
128   // expected-note@+1{{previous clause is here}}
129 #pragma acc kernels device_type(*) link(Var)
130   while(1);
131   // expected-error@+2{{OpenACC clause 'no_create' may not follow a 'device_type' clause in a 'kernels' construct}}
132   // expected-note@+1{{previous clause is here}}
133 #pragma acc kernels device_type(*) no_create(Var)
134   while(1);
135   // expected-error@+2{{OpenACC clause 'present' may not follow a 'device_type' clause in a 'kernels' construct}}
136   // expected-note@+1{{previous clause is here}}
137 #pragma acc kernels device_type(*) present(Var)
138   while(1);
139   // expected-error@+2{{OpenACC clause 'private' may not follow a 'device_type' clause in a 'parallel' construct}}
140   // expected-note@+1{{previous clause is here}}
141 #pragma acc parallel device_type(*) private(Var)
142   while(1);
143   // expected-error@+2{{OpenACC clause 'copyout' may not follow a 'device_type' clause in a 'kernels' construct}}
144   // expected-note@+1{{previous clause is here}}
145 #pragma acc kernels device_type(*) copyout(Var)
146   while(1);
147   // expected-error@+2{{OpenACC clause 'pcopyout' may not follow a 'device_type' clause in a 'kernels' construct}}
148   // expected-note@+1{{previous clause is here}}
149 #pragma acc kernels device_type(*) pcopyout(Var)
150   while(1);
151   // expected-error@+2{{OpenACC clause 'present_or_copyout' may not follow a 'device_type' clause in a 'kernels' construct}}
152   // expected-note@+1{{previous clause is here}}
153 #pragma acc kernels device_type(*) present_or_copyout(Var)
154   while(1);
155   // expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' clause in a 'kernels' construct}}
156   // expected-note@+1{{previous clause is here}}
157 #pragma acc kernels device_type(*) copyin(Var)
158   while(1);
159   // expected-error@+2{{OpenACC clause 'pcopyin' may not follow a 'device_type' clause in a 'kernels' construct}}
160   // expected-note@+1{{previous clause is here}}
161 #pragma acc kernels device_type(*) pcopyin(Var)
162   while(1);
163   // expected-error@+2{{OpenACC clause 'present_or_copyin' may not follow a 'device_type' clause in a 'kernels' construct}}
164   // expected-note@+1{{previous clause is here}}
165 #pragma acc kernels device_type(*) present_or_copyin(Var)
166   while(1);
167   // expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' clause in a 'kernels' construct}}
168   // expected-note@+1{{previous clause is here}}
169 #pragma acc kernels device_type(*) create(Var)
170   while(1);
171   // expected-error@+2{{OpenACC clause 'pcreate' may not follow a 'device_type' clause in a 'kernels' construct}}
172   // expected-note@+1{{previous clause is here}}
173 #pragma acc kernels device_type(*) pcreate(Var)
174   while(1);
175   // expected-error@+2{{OpenACC clause 'present_or_create' may not follow a 'device_type' clause in a 'kernels' construct}}
176   // expected-note@+1{{previous clause is here}}
177 #pragma acc kernels device_type(*) present_or_create(Var)
178   while(1);
179   // expected-error@+2{{OpenACC clause 'reduction' may not follow a 'device_type' clause in a 'serial' construct}}
180   // expected-note@+1{{previous clause is here}}
181 #pragma acc serial device_type(*) reduction(+:Var)
182   while(1);
183   // expected-error@+1{{OpenACC 'collapse' clause is not valid on 'kernels' directive}}
184 #pragma acc kernels device_type(*) collapse(1)
185   while(1);
186   // expected-error@+2{{OpenACC clause 'bind' may not follow a 'device_type' clause in a 'kernels' construct}}
187   // expected-note@+1{{previous clause is here}}
188 #pragma acc kernels device_type(*) bind(Var)
189   while(1);
190 #pragma acc kernels device_type(*) vector_length(1)
191   while(1);
192 #pragma acc kernels device_type(*) num_gangs(1)
193   while(1);
194 #pragma acc kernels device_type(*) num_workers(1)
195   while(1);
196   // expected-error@+1{{OpenACC 'device_num' clause is not valid on 'kernels' directive}}
197 #pragma acc kernels device_type(*) device_num(1)
198   while(1);
199   // expected-error@+1{{OpenACC 'default_async' clause is not valid on 'kernels' directive}}
200 #pragma acc kernels device_type(*) default_async(1)
201   while(1);
202 #pragma acc kernels device_type(*) async
203   while(1);
204   // expected-error@+1{{OpenACC 'tile' clause is not valid on 'kernels' directive}}
205 #pragma acc kernels device_type(*) tile(Var, 1)
206   while(1);
207   // expected-error@+1{{OpenACC 'gang' clause is not valid on 'kernels' directive}}
208 #pragma acc kernels dtype(*) gang
209   while(1);
210 #pragma acc kernels device_type(*) wait
211   while(1);
212 }
213