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