1 // RUN: %libomptarget-compilexx-run-and-check-generic 2 3 #include <stdio.h> 4 5 struct View { 6 int Data; 7 }; 8 9 struct ViewPtr { 10 int *Data; 11 }; 12 13 template <typename T> struct Foo { 14 Foo(T &V) : VRef(V) {} 15 T &VRef; 16 }; 17 18 int main() { 19 View V; 20 V.Data = 123456; 21 Foo<View> Bar(V); 22 ViewPtr V1; 23 int Data = 123456; 24 V1.Data = &Data; 25 Foo<ViewPtr> Baz(V1); 26 27 // CHECK: Host 123456. 28 printf("Host %d.\n", Bar.VRef.Data); 29 #pragma omp target map(Bar.VRef) 30 { 31 // CHECK: Device 123456. 32 printf("Device %d.\n", Bar.VRef.Data); 33 V.Data = 654321; 34 // CHECK: Device 654321. 35 printf("Device %d.\n", Bar.VRef.Data); 36 } 37 // CHECK: Host 654321 654321. 38 printf("Host %d %d.\n", Bar.VRef.Data, V.Data); 39 V.Data = 123456; 40 // CHECK: Host 123456. 41 printf("Host %d.\n", Bar.VRef.Data); 42 #pragma omp target map(Bar) map(Bar.VRef) 43 { 44 // CHECK: Device 123456. 45 printf("Device %d.\n", Bar.VRef.Data); 46 V.Data = 654321; 47 // CHECK: Device 654321. 48 printf("Device %d.\n", Bar.VRef.Data); 49 } 50 // CHECK: Host 654321 654321. 51 printf("Host %d %d.\n", Bar.VRef.Data, V.Data); 52 // CHECK: Host 123456. 53 printf("Host %d.\n", *Baz.VRef.Data); 54 #pragma omp target map(*Baz.VRef.Data) 55 { 56 // CHECK: Device 123456. 57 printf("Device %d.\n", *Baz.VRef.Data); 58 *V1.Data = 654321; 59 // CHECK: Device 654321. 60 printf("Device %d.\n", *Baz.VRef.Data); 61 } 62 // CHECK: Host 654321 654321 654321. 63 printf("Host %d %d %d.\n", *Baz.VRef.Data, *V1.Data, Data); 64 return 0; 65 } 66