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