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 {
FooFoo19   Foo(T &V) : VRef(V) {}
20   T &VRef;
21 };
22 
main()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