1 /* Test nested dynamic/structured data mappings.  */
2 
3 /* { dg-skip-if "" { *-*-* } { "-DACC_MEM_SHARED=1" } } */
4 
5 #include <openacc.h>
6 #include <assert.h>
7 #include <stdlib.h>
8 
9 #define SIZE 1024
10 
11 void
f1(void)12 f1 (void)
13 {
14   char *block1 = (char *) malloc (SIZE);
15 
16 #pragma acc data copy(block1[0:SIZE])
17   {
18 #ifdef OPENACC_API
19     acc_copyin (block1, SIZE);
20     acc_copyout (block1, SIZE);
21 #else
22 #pragma acc enter data copyin(block1[0:SIZE])
23 #pragma acc exit data copyout(block1[0:SIZE])
24 #endif
25   }
26 
27   assert (!acc_is_present (block1, SIZE));
28 
29   free (block1);
30 }
31 
32 void
f2(void)33 f2 (void)
34 {
35   char *block1 = (char *) malloc (SIZE);
36 
37 #ifdef OPENACC_API
38   acc_copyin (block1, SIZE);
39 #else
40 #pragma acc enter data copyin(block1[0:SIZE])
41 #endif
42 
43 #pragma acc data copy(block1[0:SIZE])
44   {
45   }
46 
47 #ifdef OPENACC_API
48   acc_copyout (block1, SIZE);
49 #else
50 #pragma acc exit data copyout(block1[0:SIZE])
51 #endif
52 
53   assert (!acc_is_present (block1, SIZE));
54 
55   free (block1);
56 }
57 
58 void
f3(void)59 f3 (void)
60 {
61   char *block1 = (char *) malloc (SIZE);
62 
63 #pragma acc data copy(block1[0:SIZE])
64   {
65 #ifdef OPENACC_API
66     acc_copyin (block1, SIZE);
67     acc_copyin (block1, SIZE);
68     acc_copyout (block1, SIZE);
69     acc_copyout (block1, SIZE);
70 #else
71 #pragma acc enter data copyin(block1[0:SIZE])
72 #pragma acc enter data copyin(block1[0:SIZE])
73 #pragma acc exit data copyout(block1[0:SIZE])
74 #pragma acc exit data copyout(block1[0:SIZE])
75 #endif
76   }
77 
78   assert (!acc_is_present (block1, SIZE));
79 
80   free (block1);
81 }
82 
83 void
f4(void)84 f4 (void)
85 {
86   char *block1 = (char *) malloc (SIZE);
87 
88 #pragma acc data copy(block1[0:SIZE])
89   {
90 #ifdef OPENACC_API
91     acc_copyin (block1, SIZE);
92 #else
93 #pragma acc enter data copyin(block1[0:SIZE])
94 #endif
95 
96 #pragma acc data copy(block1[0:SIZE])
97     {
98 #ifdef OPENACC_API
99       acc_copyin (block1, SIZE);
100       acc_copyout (block1, SIZE);
101 #else
102 #pragma acc enter data copyin(block1[0:SIZE])
103 #pragma acc exit data copyout(block1[0:SIZE])
104 #endif
105     }
106 
107 #ifdef OPENACC_API
108   acc_copyout (block1, SIZE);
109 #else
110 #pragma acc exit data copyout(block1[0:SIZE])
111 #endif
112   }
113 
114   assert (!acc_is_present (block1, SIZE));
115 
116   free (block1);
117 }
118 
119 void
f5(void)120 f5 (void)
121 {
122   char *block1 = (char *) malloc (SIZE);
123 
124 #ifdef OPENACC_API
125   acc_copyin (block1, SIZE);
126 #else
127 #pragma acc enter data copyin(block1[0:SIZE])
128 #endif
129 
130 #pragma acc data copy(block1[0:SIZE])
131   {
132 #ifdef OPENACC_API
133     acc_copyin (block1, SIZE);
134 #else
135 #pragma acc enter data copyin(block1[0:SIZE])
136 #endif
137 #pragma acc data copy(block1[0:SIZE])
138     {
139     }
140 #ifdef OPENACC_API
141     acc_copyout (block1, SIZE);
142 #else
143 #pragma acc exit data copyout(block1[0:SIZE])
144 #endif
145   }
146 #ifdef OPENACC_API
147   acc_copyout (block1, SIZE);
148 #else
149 #pragma acc exit data copyout(block1[0:SIZE])
150 #endif
151 
152   assert (!acc_is_present (block1, SIZE));
153 
154   free (block1);
155 }
156 
157 int
main(int argc,char * argv[])158 main (int argc, char *argv[])
159 {
160   f1 ();
161   f2 ();
162   f3 ();
163   f4 ();
164   f5 ();
165   return 0;
166 }
167