]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/OpenMP/teams_distribute_parallel_for_simd_linear_messages.cpp
Vendor import of clang trunk r290819:
[FreeBSD/FreeBSD.git] / test / OpenMP / teams_distribute_parallel_for_simd_linear_messages.cpp
1 // RUN: %clang_cc1 -verify -fopenmp %s
2
3 namespace X {
4   int x;
5 };
6
7 struct B {
8   static int ib; // expected-note {{'B::ib' declared here}}
9   static int bfoo() { return 8; }
10 };
11
12 int bfoo() { return 4; }
13
14 int z;
15 const int C1 = 1;
16 const int C2 = 2;
17 void test_linear_colons()
18 {
19   int B = 0;
20
21 #pragma omp target
22 #pragma omp teams distribute parallel for simd linear(B:bfoo())
23   for (int i = 0; i < 10; ++i) ;
24
25 #pragma omp target
26 #pragma omp teams distribute parallel for simd linear(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}}
27   for (int i = 0; i < 10; ++i) ;
28
29 #pragma omp target
30 #pragma omp teams distribute parallel for simd linear(B:ib) // expected-error {{use of undeclared identifier 'ib'; did you mean 'B::ib'}}
31   for (int i = 0; i < 10; ++i) ;
32
33 #pragma omp target
34 #pragma omp teams distribute parallel for simd linear(z:B:ib) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}}
35   for (int i = 0; i < 10; ++i) ;
36
37 #pragma omp target
38 #pragma omp teams distribute parallel for simd linear(B:B::bfoo())
39   for (int i = 0; i < 10; ++i) ;
40
41 #pragma omp target
42 #pragma omp teams distribute parallel for simd linear(X::x : ::z)
43   for (int i = 0; i < 10; ++i) ;
44
45 #pragma omp target
46 #pragma omp teams distribute parallel for simd linear(B,::z, X::x)
47   for (int i = 0; i < 10; ++i) ;
48
49 #pragma omp target
50 #pragma omp teams distribute parallel for simd linear(::z)
51   for (int i = 0; i < 10; ++i) ;
52
53 #pragma omp target
54 #pragma omp teams distribute parallel for simd linear(B::bfoo()) // expected-error {{expected variable name}}
55   for (int i = 0; i < 10; ++i) ;
56
57 #pragma omp target
58 #pragma omp teams distribute parallel for simd linear(B::ib,B:C1+C2)
59   for (int i = 0; i < 10; ++i) ;
60 }
61
62 template<int L, class T, class N> T test_template(T* arr, N num) {
63   N i;
64   T sum = (T)0;
65   T ind2 = - num * L; // expected-note {{'ind2' defined here}}
66
67 #pragma omp target
68 #pragma omp teams distribute parallel for simd linear(ind2:L) // expected-error {{argument of a linear clause should be of integral or pointer type}}
69   for (i = 0; i < num; ++i) {
70     T cur = arr[(int)ind2];
71     ind2 += L;
72     sum += cur;
73   }
74   return T();
75 }
76
77 template<int LEN> int test_warn() {
78   int ind2 = 0;
79   #pragma omp target
80   #pragma omp teams distribute parallel for simd linear(ind2:LEN) // expected-warning {{zero linear step (ind2 should probably be const)}}
81   for (int i = 0; i < 100; i++) {
82     ind2 += LEN;
83   }
84   return ind2;
85 }
86
87 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
88 extern S1 a;
89 class S2 {
90   mutable int a;
91 public:
92   S2():a(0) { }
93 };
94 const S2 b; // expected-note 2 {{'b' defined here}}
95 const S2 ba[5];
96 class S3 {
97   int a;
98 public:
99   S3():a(0) { }
100 };
101 const S3 ca[5];
102 class S4 {
103   int a;
104   S4();
105 public:
106   S4(int v):a(v) { }
107 };
108 class S5 {
109   int a;
110   S5():a(0) {}
111 public:
112   S5(int v):a(v) { }
113 };
114
115 S3 h;
116 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
117
118 template<class I, class C> int foomain(I argc, C **argv) {
119   I e(4);
120   I g(5);
121   int i;
122   int &j = i;
123
124 #pragma omp target
125 #pragma omp teams distribute parallel for simd linear // expected-error {{expected '(' after 'linear'}}
126   for (int k = 0; k < argc; ++k) ++k;
127
128 #pragma omp target
129 #pragma omp teams distribute parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
130   for (int k = 0; k < argc; ++k) ++k;
131
132 #pragma omp target
133 #pragma omp teams distribute parallel for simd linear () // expected-error {{expected expression}}
134   for (int k = 0; k < argc; ++k) ++k;
135
136 #pragma omp target
137 #pragma omp teams distribute parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
138   for (int k = 0; k < argc; ++k) ++k;
139
140 #pragma omp target
141 #pragma omp teams distribute parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
142   for (int k = 0; k < argc; ++k) ++k;
143
144 #pragma omp target
145 #pragma omp teams distribute parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
146   for (int k = 0; k < argc; ++k) ++k;
147
148 #pragma omp target
149 #pragma omp teams distribute parallel for simd linear (argc : 5)
150   for (int k = 0; k < argc; ++k) ++k;
151
152 #pragma omp target
153 #pragma omp teams distribute parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}
154   for (int k = 0; k < argc; ++k) ++k;
155
156 #pragma omp target
157 #pragma omp teams distribute parallel for simd linear (a, b:B::ib) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}}
158   for (int k = 0; k < argc; ++k) ++k;
159
160 #pragma omp target
161 #pragma omp teams distribute parallel for simd linear (argv[1]) // expected-error {{expected variable name}}
162   for (int k = 0; k < argc; ++k) ++k;
163
164 #pragma omp target
165 #pragma omp teams distribute parallel for simd linear(e, g)
166   for (int k = 0; k < argc; ++k) ++k;
167
168 #pragma omp target
169 #pragma omp teams distribute parallel for simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}
170   for (int k = 0; k < argc; ++k) ++k;
171
172 #pragma omp target
173 #pragma omp teams distribute parallel for simd linear(i)
174   for (int k = 0; k < argc; ++k) ++k;
175
176   #pragma omp parallel
177   {
178     int v = 0;
179     int i;
180     #pragma omp target
181     #pragma omp teams distribute parallel for simd linear(v:i)
182     for (int k = 0; k < argc; ++k) { i = k; v += i; }
183   }
184
185 #pragma omp target
186 #pragma omp teams distribute parallel for simd linear(j)
187   for (int k = 0; k < argc; ++k) ++k;
188
189   int v = 0;
190
191 #pragma omp target
192 #pragma omp teams distribute parallel for simd linear(v:j)
193   for (int k = 0; k < argc; ++k) { ++k; v += j; }
194
195 #pragma omp target
196 #pragma omp teams distribute parallel for simd linear(i)
197   for (int k = 0; k < argc; ++k) ++k;
198   return 0;
199 }
200
201 namespace A {
202 double x;
203 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
204 }
205 namespace C {
206 using A::x;
207 }
208
209 int main(int argc, char **argv) {
210   double darr[100];
211   // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}
212   test_template<-4>(darr, 4);
213   // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}
214   test_warn<0>();
215
216   S4 e(4); // expected-note {{'e' defined here}}
217   S5 g(5); // expected-note {{'g' defined here}}
218   int i;
219   int &j = i;
220
221 #pragma omp target
222 #pragma omp teams distribute parallel for simd linear // expected-error {{expected '(' after 'linear'}}
223   for (int k = 0; k < argc; ++k) ++k;
224
225 #pragma omp target
226 #pragma omp teams distribute parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
227   for (int k = 0; k < argc; ++k) ++k;
228
229 #pragma omp target
230 #pragma omp teams distribute parallel for simd linear () // expected-error {{expected expression}}
231   for (int k = 0; k < argc; ++k) ++k;
232
233 #pragma omp target
234 #pragma omp teams distribute parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
235   for (int k = 0; k < argc; ++k) ++k;
236
237 #pragma omp target
238 #pragma omp teams distribute parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
239   for (int k = 0; k < argc; ++k) ++k;
240
241 #pragma omp target
242 #pragma omp teams distribute parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
243   for (int k = 0; k < argc; ++k) ++k;
244
245 #pragma omp target
246 #pragma omp teams distribute parallel for simd linear (argc)
247   for (int k = 0; k < argc; ++k) ++k;
248
249 #pragma omp target
250 #pragma omp teams distribute parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}
251   for (int k = 0; k < argc; ++k) ++k;
252
253
254 #pragma omp target
255 #pragma omp teams distribute parallel for simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}}
256   for (int k = 0; k < argc; ++k) ++k;
257
258 #pragma omp target
259 #pragma omp teams distribute parallel for simd linear (argv[1]) // expected-error {{expected variable name}}
260   for (int k = 0; k < argc; ++k) ++k;
261
262 #pragma omp target
263 #pragma omp teams distribute parallel for simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
264   for (int k = 0; k < argc; ++k) ++k;
265
266 #pragma omp target
267 #pragma omp teams distribute parallel for simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}}
268   for (int k = 0; k < argc; ++k) ++k;
269
270   #pragma omp parallel
271   {
272     int i;
273     #pragma omp target
274     #pragma omp teams distribute parallel for simd linear(i)
275       for (int k = 0; k < argc; ++k) ++k;
276
277     #pragma omp target
278     #pragma omp teams distribute parallel for simd linear(i : 4)
279       for (int k = 0; k < argc; ++k) { ++k; i += 4; }
280   }
281
282 #pragma omp target
283 #pragma omp teams distribute parallel for simd linear(j)
284   for (int k = 0; k < argc; ++k) ++k;
285
286 #pragma omp target
287 #pragma omp teams distribute parallel for simd linear(i)
288   for (int k = 0; k < argc; ++k) ++k;
289
290   foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
291   return 0;
292 }
293