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