1*140ab574SGeorge Rokos // RUN: %libomptarget-compile-run-and-check-aarch64-unknown-linux-gnu
2*140ab574SGeorge Rokos // RUN: %libomptarget-compile-run-and-check-nvptx64-nvidia-cuda
3*140ab574SGeorge Rokos // RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu
4*140ab574SGeorge Rokos // RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu
5*140ab574SGeorge Rokos // RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu
6*140ab574SGeorge Rokos 
7*140ab574SGeorge Rokos #include <cstdio>
8*140ab574SGeorge Rokos #include <cstdlib>
9*140ab574SGeorge Rokos 
10*140ab574SGeorge Rokos #define NUM 1024
11*140ab574SGeorge Rokos 
12*140ab574SGeorge Rokos class C {
13*140ab574SGeorge Rokos public:
14*140ab574SGeorge Rokos   int *a;
15*140ab574SGeorge Rokos };
16*140ab574SGeorge Rokos 
17*140ab574SGeorge Rokos #pragma omp declare mapper(id: C s) map(s.a[0:NUM])
18*140ab574SGeorge Rokos 
19*140ab574SGeorge Rokos int main() {
20*140ab574SGeorge Rokos   C c;
21*140ab574SGeorge Rokos   c.a = (int*) malloc(sizeof(int)*NUM);
22*140ab574SGeorge Rokos   for (int i = 0; i < NUM; i++) {
23*140ab574SGeorge Rokos     c.a[i] = 1;
24*140ab574SGeorge Rokos   }
25*140ab574SGeorge Rokos   #pragma omp target data map(mapper(id),tofrom: c)
26*140ab574SGeorge Rokos   {
27*140ab574SGeorge Rokos   #pragma omp target teams distribute parallel for
28*140ab574SGeorge Rokos   for (int i = 0; i < NUM; i++) {
29*140ab574SGeorge Rokos     ++c.a[i];
30*140ab574SGeorge Rokos   }
31*140ab574SGeorge Rokos   }
32*140ab574SGeorge Rokos   int sum = 0;
33*140ab574SGeorge Rokos   for (int i = 0; i < NUM; i++) {
34*140ab574SGeorge Rokos     sum += c.a[i];
35*140ab574SGeorge Rokos   }
36*140ab574SGeorge Rokos   // CHECK: Sum = 2048
37*140ab574SGeorge Rokos   printf("Sum = %d\n", sum);
38*140ab574SGeorge Rokos   return 0;
39*140ab574SGeorge Rokos }
40*140ab574SGeorge Rokos 
41