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