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