| // RUN: %libomptarget-compilexx-run-and-check-generic |
| |
| #include <cstdlib> |
| #include <cstdio> |
| #include <cassert> |
| |
| struct S { |
| int a; |
| int b; |
| int c; |
| }; |
| |
| struct T { |
| S *s0; |
| S *s1; |
| S *s2; |
| }; |
| |
| int main() { |
| T *v = (T *) malloc (sizeof(T)); |
| v->s0 = (S *) malloc (sizeof(S)); |
| v->s1 = (S *) malloc (sizeof(S)); |
| v->s2 = (S *) malloc (sizeof(S)); |
| v->s0->a = 10; |
| v->s0->b = 10; |
| v->s0->c = 10; |
| v->s1->a = 20; |
| v->s1->b = 20; |
| v->s1->c = 20; |
| v->s2->a = 30; |
| v->s2->b = 30; |
| v->s2->c = 30; |
| |
| #pragma omp target map(to: v[:1]) map(tofrom: v->s1->b, v->s1->c, v->s2->b) |
| { |
| v->s1->b += 3; |
| v->s1->c += 5; |
| v->s2->b += 7; |
| } |
| |
| printf ("%d\n", v->s0->a); // CHECK: 10 |
| printf ("%d\n", v->s0->b); // CHECK: 10 |
| printf ("%d\n", v->s0->c); // CHECK: 10 |
| printf ("%d\n", v->s1->a); // CHECK: 20 |
| printf ("%d\n", v->s1->b); // CHECK: 23 |
| printf ("%d\n", v->s1->c); // CHECK: 25 |
| printf ("%d\n", v->s2->a); // CHECK: 30 |
| printf ("%d\n", v->s2->b); // CHECK: 37 |
| printf ("%d\n", v->s2->c); // CHECK: 30 |
| |
| free(v->s0); |
| free(v->s1); |
| free(v->s2); |
| free(v); |
| |
| return 0; |
| } |