1 // RUN: %libomptarget-compilexx-run-and-check-generic
2 
3 #include <omp.h>
4 
5 #include <cassert>
6 #include <iostream>
7 
8 int main(int argc, char *argv[]) {
9 #pragma omp parallel for
10   for (int i = 0; i < 16; ++i) {
11     for (int n = 1; n < (1 << 13); n <<= 1) {
12       void *p = omp_target_alloc(n * sizeof(int), 0);
13       omp_target_free(p, 0);
14     }
15   }
16 
17 #pragma omp parallel for
18   for (int i = 0; i < 16; ++i) {
19     for (int n = 1; n < (1 << 13); n <<= 1) {
20       int *p = (int *)omp_target_alloc(n * sizeof(int), 0);
21 #pragma omp target teams distribute parallel for is_device_ptr(p)
22       for (int j = 0; j < n; ++j) {
23         p[j] = i;
24       }
25       int buffer[n];
26 #pragma omp target teams distribute parallel for is_device_ptr(p)              \
27     map(from                                                                   \
28         : buffer)
29       for (int j = 0; j < n; ++j) {
30         buffer[j] = p[j];
31       }
32       for (int j = 0; j < n; ++j) {
33         assert(buffer[j] == i);
34       }
35       omp_target_free(p, 0);
36     }
37   }
38 
39   std::cout << "PASS\n";
40   return 0;
41 }
42 
43 // CHECK: PASS
44