aboutsummaryrefslogtreecommitdiff
path: root/clang/test/OpenMP/declare_target_messages.cpp
blob: 26c47ecfb36b0633da45644ed6839fe5770c7489 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
// DEFINE: %{common_opts_mac} = -triple x86_64-apple-macos10.7.0
// DEFINE: %{limit} = -fnoopenmp-use-tls -ferror-limit 100 
// DEFINE: %{target_mac} = -fopenmp-targets=x86_64-apple-macos10.7.0
// DEFINE: %{aux_triple} = -aux-triple x86_64-apple-macos10.7.0
// DEFINE: %{openmp45} = -fopenmp -fopenmp-version=45
// DEFINE: %{openmp50} = -fopenmp -fopenmp-version=50
// DEFINE: %{openmp50_simd} = -fopenmp-simd -fopenmp-version=50
// DEFINE: %{openmp52} = -fopenmp -fopenmp-version=52
// DEFINE: %{openmp60} = -fopenmp -fopenmp-version=60
// DEFINE: %{openmp60_simd} = -fopenmp-simd -fopenmp-version=60

// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause,omp45-to-51-clause  %{openmp45} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51  %{openmp50} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var  %{openmp60} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51,dev5  %{openmp50} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s

// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s

// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause -fopenmp-version=45 -fopenmp-simd %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s

// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s

// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s

#pragma omp begin declare target
static int gg;
// expected-warning@+1 {{variable 'recursive' is uninitialized when used within its own initialization}}
int recursive = recursive ^ 3 + gg;
#pragma omp end declare target

// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target 

// ompvar-error@+1 {{variable captured in declare target region must appear in a to clause}}
int a, b, z;
// expected-note@+1 {{defined as threadprivate or thread local}}
__thread int t;

// omp60-error@+3 {{expected '(' after 'declare_target'}}
// omp52-error@+2 {{expected '(' after 'declare target'}}
// omp45-to-51-error@+1 {{expected '(' after 'declare target'}}
#pragma omp declare target . 
// omp52-or-later-warning@+1 {{the delimited form of '#pragma omp declare target' without clauses is deprecated; use '#pragma omp begin declare target' instead}}
#pragma omp declare target
void f();
// omp60-warning@+3 {{extra tokens at the end of '#pragma omp end declare_target' are ignored}}
// omp52-warning@+2 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
// omp45-to-51-warning@+1 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
#pragma omp end declare target shared(a) 

// omp60-error@+10 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp60-error@+9 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+8 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp52-error@+7 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp51-error@+6 {{unexpected 'map' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}} 
// omp51-error@+5 {{expected at least one 'to', 'link' or 'indirect' clause}}
// omp5-error@+4 {{unexpected 'map' clause, only 'to', 'link' or 'device_type' clauses expected}}
// omp5-error@+3 {{expected at least one 'to' or 'link' clause}}
// omp45-error@+2 {{unexpected 'map' clause, only 'to' or 'link' clauses expected}}
// omp45-error@+1 {{expected at least one 'to' or 'link' clause}} 
#pragma omp declare target map(a)

// omp60-error@+5 {{unexpected 'to' clause, use 'enter' instead}}
// omp60-error@+4 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-to-51-error@+1 {{use of undeclared identifier 'foo1'}}
#pragma omp declare target to(foo1) 

// expected-error@+1 {{use of undeclared identifier 'foo2'}}
#pragma omp declare target link(foo2) 

// omp60-error@+6 {{unexpected 'to' clause, use 'enter' instead}}
// omp60-error@+5 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// dev5-note@+2 {{marked as 'device_type(host)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(f) device_type(host)

void q();
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp5-and-51-warning@+2 {{more than one 'device_type' clause is specified}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(q) device_type(any) device_type(any) device_type(host) 

#if _OPENMP == 202011
// omp51-error@+1 {{directive '#pragma omp declare target' cannot contain more than one 'indirect' clause}}
#pragma omp declare target to(q) indirect(true) indirect(false)

// expected-note@+1 {{declared here}}
int xxx;
// omp51-error@+2 {{expression is not an integral constant expression}}
// omp51-note@+1 {{read of non-const variable 'xxx' is not allowed in a constant expression}}
#pragma omp declare target to(q) indirect(xxx)

constexpr bool fz() {return true;}
// omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}}
#pragma omp begin declare target to(q) indirect(fz()) device_type(nohost)
#pragma omp end declare target

// omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}}
#pragma omp begin declare target indirect to(xxx)
void bar();
#pragma omp end declare target

// omp51-error@+2 {{unexpected 'tofrom' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
// omp51-error@+1 {{expected at least one 'to', 'link' or 'indirect' clause}}
#pragma omp declare target tofrom(xxx)

// omp51-error@+1 {{only 'device_type(any)' clause is allowed with indirect clause}}
#pragma omp begin declare target device_type(host) indirect
void bar();
#pragma omp end declare target
#endif  // _OPENMP

void c();

// expected-note@+1 {{'func' defined here}}
void func() {} 

// omp52-or-later-error@+5 {{unexpected 'allocate' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp51-error@+4 {{unexpected 'allocate' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
// omp5-error@+3 {{unexpected 'allocate' clause, only 'to', 'link' or 'device_type' clauses expected}}
// expected-error@+2 {{function name is not allowed in 'link' clause}}
// omp45-error@+1 {{unexpected 'allocate' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target link(func) allocate(a)

void bar();
void baz() {bar();}
// omp5-or-later-warning@+1 {{declaration marked as declare target after first use, it may lead to incorrect results}}
#pragma omp declare target(bar)

extern int b;

struct NonT {
  int a;
};

typedef int sint;

template <typename T>
T bla1() { return 0; }

#pragma omp begin declare target
template <typename T>
T bla2() { return 0; }
#pragma omp end declare target

template<>
float bla2() { return 1.0; }

#pragma omp begin declare target
void blub2() {
  bla2<float>();
  bla2<int>();
}
#pragma omp end declare target

void t2() {
#pragma omp target
  {
    bla2<float>();
    bla2<long>();
  }
}

#pragma omp begin declare target
  void abc();
#pragma omp end declare target
void cba();
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target 

#pragma omp begin declare target
#pragma omp begin declare target
void def();
#pragma omp end declare target
void fed();

#pragma omp begin declare target
// expected-note@+1 {{defined as threadprivate or thread local}}
#pragma omp threadprivate(a) 
extern int b;
int g;

struct T {
  int a;
  virtual int method();
};

class VC {
  T member;
  NonT member1;
  public:
    virtual int method() { T a; return 0; }
};

struct C {
  NonT a;
  sint b;
  int method();
  int method1();
};

int C::method1() {
  return 0;
}

void foo(int p) {
// expected-error@+1 {{threadprivate variables cannot be used in target constructs}}
  a = 0; 
  b = 0;
// expected-error@+1 {{threadprivate variables cannot be used in target constructs}}
  t = 1; 
  C object;
  VC object1;
  g = object.method();
  g += object.method1();
  g += object1.method() + p;
  // dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
  f(); 
  q();
  c();
}
#pragma omp begin declare target
void foo1() {
  // omp5-or-later-var-note@+1 {{variable 'z' is captured here}}
  [&](){ (void)(b+z);}(); 
}
#pragma omp end declare target

#pragma omp end declare target
#pragma omp end declare target
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target 

int C::method() {
  return 0;
}

struct S {
#pragma omp begin declare target
  int v;
#pragma omp end declare target
};

void foo3() {
  return;
}

int *y;
int **w = &y;
int main (int argc, char **argv) {
  int a = 2;
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp declare target'}}
#pragma omp declare target 
  int v;
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target 
  foo(v);

  // omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
  // omp52-or-later-error@+1 {{unexpected 'to' clause, use 'enter' instead}}
#pragma omp declare target to(foo3) link(w)
  // omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
  // omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
  // omp45-to-51-var-error@+1 {{local variable 'a' should not be used in 'declare target' directive}}
#pragma omp declare target to(a) 
  return (0);
}

namespace {
#pragma omp begin declare target
  int x;
}
#pragma omp end declare target

// expected-error@+1 {{'S' used in declare target directive is not a variable or a function name}}
#pragma omp declare target link(S) 

// expected-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
#pragma omp declare target (x, x) 
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-to-51-clause-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
#pragma omp declare target to(x) to(x)
// expected-error@+1 {{'x' must not appear in both clauses 'to' and 'link'}}
#pragma omp declare target link(x) 

void bazz() {}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host5-note@+2 3 {{marked as 'device_type(nohost)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 
#pragma omp declare target to(bazz) device_type(nohost)
void bazzz() {bazz();}
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(bazzz) device_type(nohost) 
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void any() {bazz();} 
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void host1() {bazz();}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// dev5-note@+2 3 {{marked as 'device_type(host)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(host1) device_type(host)
//host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void host2() {bazz();}
// omp52-or-later-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
#pragma omp declare target to(host2) 
// dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
void device() {host1();}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host5-note@+2 2 {{marked as 'device_type(nohost)' here}} 
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(device) device_type(nohost)
void host3() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}}
// omp52-or-later-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
#pragma omp declare target to(host3)

#pragma omp begin declare target
void any1() {any();}
// dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
void any2() {host1();} 
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void any3() {device();}
void any4() {any2();}
#pragma omp end declare target

void any5() {any();}
void any6() {host1();}
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void any7() {device();}
void any8() {any2();}

int MultiDevTy;
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(any)
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host-5-and-51-error@+2 {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(host)
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// no-host5-and-51-error@+2 {{'device_type(nohost)' does not match previously specified 'device_type(any)' for the same declaration}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(nohost)

// expected-warning@+1 {{declaration is not declared in any declare target region}}
static int variable = 100; 
static float variable1 = 200;
// expected-warning@+1 {{declaration is not declared in any declare target region}}
static float variable2 = variable1;  

// expected-warning@+1 {{declaration is not declared in any declare target region}}
static int var = 1;  

static int var1 = 10;
static int *var2 = &var1;
// expected-warning@+1 {{declaration is not declared in any declare target region}}
static int **ptr1 = &var2;  

int arr[2] = {1,2};
// expected-warning@+1 {{declaration is not declared in any declare target region}}
int (*arrptr)[2] = &arr;  

class declare{
  public: int x;
          void print();
};
declare obj1;
// expected-warning@+1 {{declaration is not declared in any declare target region}}
declare *obj2 = &obj1;  

struct target{
  int x;
  void print();
};
// expected-warning@+1 {{declaration is not declared in any declare target region}}
static target S;  

#pragma omp begin declare target
// expected-note@+1 {{used here}}
int target_var = variable;  
// expected-note@+1 {{used here}}
float target_var1 = variable2;  
// expected-note@+1 {{used here}}
int *ptr = &var;  
// expected-note@+1 {{used here}}
int ***ptr2 = &ptr1; 
// expected-note@+1 {{used here}}
int (**ptr3)[2] = &arrptr;
// expected-note@+1 {{used here}}
declare **obj3 = &obj2;
// expected-note@+1 {{used here}}
target *S1 = &S;
#pragma omp end declare target

#if TESTENDINC
#include "unterminated_declare_target_include.h"
#elif TESTEND
// expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp declare target'}}
#pragma omp declare target
#else
// omp60-warning@+3 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare_target'}}
// omp52-warning@+2 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
// omp45-to-51-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
#pragma omp begin declare target
#endif