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