]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/testsuite/libgomp.c-c++-common/baseptrs-2.c
OpenMP/OpenACC: Rework clause expansion and nested struct handling
[thirdparty/gcc.git] / libgomp / testsuite / libgomp.c-c++-common / baseptrs-2.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <assert.h>
4
5 #define N 32
6
7 typedef struct {
8 int arr[N];
9 int *ptr;
10 } sc;
11
12 typedef struct {
13 sc *c;
14 } sb;
15
16 typedef struct {
17 sb *b;
18 sc *c;
19 } sa;
20
21 int main (int argc, char *argv[])
22 {
23 sa *p;
24
25 p = (sa *) malloc (sizeof *p);
26 p->b = (sb *) malloc (sizeof *p->b);
27 p->b->c = (sc *) malloc (sizeof *p->b->c);
28 p->c = (sc *) malloc (sizeof *p->c);
29 p->b->c->ptr = (int *) malloc (N * sizeof (int));
30 p->c->ptr = (int *) malloc (N * sizeof (int));
31
32 for (int i = 0; i < N; i++)
33 {
34 p->b->c->ptr[i] = 0;
35 p->c->ptr[i] = 0;
36 p->b->c->arr[i] = 0;
37 p->c->arr[i] = 0;
38 }
39
40 #pragma omp target map(to: p->b, p->b[0], p->c, p->c[0], p->b->c, p->b->c[0]) \
41 map(to: p->b->c->ptr, p->c->ptr) \
42 map(tofrom: p->b->c->ptr[:N], p->c->ptr[:N])
43 {
44 for (int i = 0; i < N; i++)
45 {
46 p->b->c->ptr[i] = i;
47 p->c->ptr[i] = i * 2;
48 }
49 }
50
51 #pragma omp target map(to: p->b, p->b[0], p->b->c, p->c) \
52 map(tofrom: p->c[0], p->b->c[0])
53 {
54 for (int i = 0; i < N; i++)
55 {
56 p->b->c->arr[i] = i * 3;
57 p->c->arr[i] = i * 4;
58 }
59 }
60
61 for (int i = 0; i < N; i++)
62 {
63 assert (p->b->c->ptr[i] == i);
64 assert (p->c->ptr[i] == i * 2);
65 assert (p->b->c->arr[i] == i * 3);
66 assert (p->c->arr[i] == i * 4);
67 }
68
69 return 0;
70 }