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