1 #include <omp.h>
2 #include <stdlib.h>
3
4 int
5 main ()
6 {
7 int d = omp_get_default_device ();
8 int id = omp_get_initial_device ();
9 struct s_t { int m1; char m2; } s;
10 void *p1 = NULL, *p2 = NULL;
11
12 if (d < 0 || d >= omp_get_num_devices ())
13 d = id;
14
15 #pragma omp target data map(alloc: s, s.m2) device(d)
16 {
17 #pragma omp target map(from: p1, p2) map(alloc: s, s.m2) device(d)
18 {
19 p1 = &s;
20 p2 = &s.m2;
21 }
22 if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : p1)
23 || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : p2))
24 abort ();
25 }
26
27 if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : NULL)
28 || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : NULL))
29 abort ();
30
31 #pragma omp target enter data map(alloc: s, s.m2) device (d)
32 #pragma omp target map(from: p1, p2) map(alloc: s, s.m2) device(d)
33 {
34 p1 = &s;
35 p2 = &s.m2;
36 }
37
38 if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : p1)
39 || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : p2))
40 abort ();
41
42 #pragma omp target exit data map (delete: s, s.m2) device (d)
43
44 if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : NULL)
45 || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : NULL))
46 abort ();
47
48 return 0;
49 }