1// RUN: %libomptarget-compilexx-run-and-check-generic
2
3#include <stdio.h>
4
5struct View {
6 int Data;
7};
8
9struct ViewPtr {
10 int *Data;
11};
12
13template <typename T> struct Foo {
14 Foo(T &V) : VRef(V) {}
15 T &VRef;
16};
17
18int 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 int D1, D2;
27
28 // CHECK: Host 123456.
29 printf(format: "Host %d.\n", Bar.VRef.Data);
30#pragma omp target map(Bar.VRef) map(from : D1, D2)
31 {
32 // CHECK: Device 123456.
33 D1 = Bar.VRef.Data;
34 printf(format: "Device %d.\n", D1);
35 V.Data = 654321;
36 // CHECK: Device 654321.
37 D2 = Bar.VRef.Data;
38 printf(format: "Device %d.\n", D2);
39 }
40 printf(format: "Device %d.\n", D1);
41 printf(format: "Device %d.\n", D2);
42 // CHECK: Host 654321 654321.
43 printf(format: "Host %d %d.\n", Bar.VRef.Data, V.Data);
44 V.Data = 123456;
45 // CHECK: Host 123456.
46 printf(format: "Host %d.\n", Bar.VRef.Data);
47#pragma omp target map(Bar) map(Bar.VRef) map(from : D1, D2)
48 {
49 // CHECK: Device 123456.
50 D1 = Bar.VRef.Data;
51 printf(format: "Device %d.\n", D1);
52 V.Data = 654321;
53 // CHECK: Device 654321.
54 D2 = Bar.VRef.Data;
55 printf(format: "Device %d.\n", D2);
56 }
57 printf(format: "Device %d.\n", D1);
58 printf(format: "Device %d.\n", D2);
59 // CHECK: Host 654321 654321.
60 printf(format: "Host %d %d.\n", Bar.VRef.Data, V.Data);
61 // CHECK: Host 123456.
62 printf(format: "Host %d.\n", *Baz.VRef.Data);
63#pragma omp target map(*Baz.VRef.Data) map(from : D1, D2)
64 {
65 // CHECK: Device 123456.
66 D1 = *Baz.VRef.Data;
67 printf(format: "Device %d.\n", D1);
68 *V1.Data = 654321;
69 // CHECK: Device 654321.
70 D2 = *Baz.VRef.Data;
71 printf(format: "Device %d.\n", D2);
72 }
73 printf(format: "Device %d.\n", D1);
74 printf(format: "Device %d.\n", D2);
75 // CHECK: Host 654321 654321 654321.
76 printf(format: "Host %d %d %d.\n", *Baz.VRef.Data, *V1.Data, Data);
77 return 0;
78}
79

source code of offload/test/mapping/data_member_ref.cpp