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