|  | // RUN: %libomptarget-compilexx-run-and-check-generic | 
|  |  | 
|  | #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(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; | 
|  | } |