| // RUN: %libomptarget-compilexx-run-and-check-generic | |
| // https://github.com/llvm/llvm-project/issues/182119 | |
| // UNSUPPORTED: intelgpu | |
| #include <stdio.h> | |
| struct View { | |
| int Data; | |
| }; | |
| struct ViewPtr { | |
| int *Data; | |
| }; | |
| template <typename T> struct Foo { | |
| Foo(T &V) : VRef(V) {} | |
| T &VRef; | |
| }; | |
| int main() { | |
| View V; | |
| V.Data = 123456; | |
| Foo<View> Bar(V); | |
| ViewPtr V1; | |
| int Data = 123456; | |
| V1.Data = &Data; | |
| Foo<ViewPtr> Baz(V1); | |
| int D1, D2; | |
| // CHECK: Host 123456. | |
| printf("Host %d.\n", Bar.VRef.Data); | |
| #pragma omp target map(Bar.VRef) map(from : D1, D2) | |
| { | |
| // CHECK: Device 123456. | |
| D1 = Bar.VRef.Data; | |
| printf("Device %d.\n", D1); | |
| V.Data = 654321; | |
| // CHECK: Device 654321. | |
| D2 = Bar.VRef.Data; | |
| printf("Device %d.\n", D2); | |
| } | |
| printf("Device %d.\n", D1); | |
| printf("Device %d.\n", D2); | |
| // CHECK: Host 654321 654321. | |
| printf("Host %d %d.\n", Bar.VRef.Data, V.Data); | |
| V.Data = 123456; | |
| // CHECK: Host 123456. | |
| printf("Host %d.\n", Bar.VRef.Data); | |
| #pragma omp target map(Bar) map(Bar.VRef) map(from : D1, D2) | |
| { | |
| // CHECK: Device 123456. | |
| D1 = Bar.VRef.Data; | |
| printf("Device %d.\n", D1); | |
| V.Data = 654321; | |
| // CHECK: Device 654321. | |
| D2 = Bar.VRef.Data; | |
| printf("Device %d.\n", D2); | |
| } | |
| printf("Device %d.\n", D1); | |
| printf("Device %d.\n", D2); | |
| // CHECK: Host 654321 654321. | |
| printf("Host %d %d.\n", Bar.VRef.Data, V.Data); | |
| // CHECK: Host 123456. | |
| printf("Host %d.\n", *Baz.VRef.Data); | |
| #pragma omp target map(Baz.VRef.Data) map(*Baz.VRef.Data) map(V1.Data[0 : 0]) \ | |
| map(from : D1, D2) | |
| { | |
| // CHECK: Device 123456. | |
| D1 = *Baz.VRef.Data; | |
| printf("Device %d.\n", D1); | |
| *V1.Data = 654321; | |
| // CHECK: Device 654321. | |
| D2 = *Baz.VRef.Data; | |
| printf("Device %d.\n", D2); | |
| } | |
| printf("Device %d.\n", D1); | |
| printf("Device %d.\n", D2); | |
| // CHECK: Host 654321 654321 654321. | |
| printf("Host %d %d %d.\n", *Baz.VRef.Data, *V1.Data, Data); | |
| return 0; | |
| } |