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