1 /* { dg-do run } */
2 
3 #include <stdlib.h>
4 #include <openacc.h>
5 
6 int i;
7 
8 int
is_mapped(void * p,size_t n)9 is_mapped (void *p, size_t n)
10 {
11 #if ACC_MEM_SHARED
12   return 1;
13 #else
14   return acc_is_present (p, n);
15 #endif
16 }
17 
main(void)18 int main(void)
19 {
20   int j;
21 
22   i = -1;
23   j = -2;
24 #pragma acc data copyin (i, j)
25   {
26     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
27       abort ();
28     if (i != -1 || j != -2)
29       abort ();
30     i = 2;
31     j = 1;
32     if (i != 2 || j != 1)
33       abort ();
34   }
35   if (i != 2 || j != 1)
36     abort ();
37 
38   i = -1;
39   j = -2;
40 #pragma acc data copyout (i, j)
41   {
42     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
43       abort ();
44     if (i != -1 || j != -2)
45       abort ();
46     i = 2;
47     j = 1;
48     if (i != 2 || j != 1)
49       abort ();
50 
51 #pragma acc parallel present (i, j)
52     {
53       i = 4;
54       j = 2;
55     }
56   }
57   if (i != 4 || j != 2)
58     abort ();
59 
60   i = -1;
61   j = -2;
62 #pragma acc data create (i, j)
63   {
64     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
65       abort ();
66     if (i != -1 || j != -2)
67       abort ();
68     i = 2;
69     j = 1;
70     if (i != 2 || j != 1)
71       abort ();
72   }
73   if (i != 2 || j != 1)
74     abort ();
75 
76   i = -1;
77   j = -2;
78 #pragma acc data present_or_copyin (i, j)
79   {
80     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
81       abort ();
82     if (i != -1 || j != -2)
83       abort ();
84     i = 2;
85     j = 1;
86     if (i != 2 || j != 1)
87       abort ();
88   }
89   if (i != 2 || j != 1)
90     abort ();
91 
92   i = -1;
93   j = -2;
94 #pragma acc data present_or_copyout (i, j)
95   {
96     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
97       abort ();
98     if (i != -1 || j != -2)
99       abort ();
100     i = 2;
101     j = 1;
102     if (i != 2 || j != 1)
103       abort ();
104 
105 #pragma acc parallel present (i, j)
106     {
107       i = 4;
108       j = 2;
109     }
110   }
111   if (i != 4 || j != 2)
112     abort ();
113 
114   i = -1;
115   j = -2;
116 #pragma acc data present_or_copy (i, j)
117   {
118     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
119       abort ();
120     if (i != -1 || j != -2)
121       abort ();
122     i = 2;
123     j = 1;
124     if (i != 2 || j != 1)
125       abort ();
126   }
127 #if ACC_MEM_SHARED
128   if (i != 2 || j != 1)
129     abort ();
130 #else
131   if (i != -1 || j != -2)
132     abort ();
133 #endif
134 
135   i = -1;
136   j = -2;
137 #pragma acc data present_or_create (i, j)
138   {
139     if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
140       abort ();
141     i = 2;
142     j = 1;
143     if (i != 2 || j != 1)
144       abort ();
145   }
146 
147   if (i != 2 || j != 1)
148     abort ();
149 
150   i = -1;
151   j = -2;
152 #pragma acc data copyin (i, j)
153   {
154 #pragma acc data present (i, j)
155     {
156       if (!is_mapped (&i, sizeof (i)) || !is_mapped (&j, sizeof (j)))
157         abort ();
158       if (i != -1 || j != -2)
159         abort ();
160       i = 2;
161       j = 1;
162       if (i != 2 || j != 1)
163         abort ();
164     }
165   }
166   if (i != 2 || j != 1)
167     abort ();
168 
169   i = -1;
170   j = -2;
171 #pragma acc data
172   {
173 #if !ACC_MEM_SHARED
174     if (is_mapped (&i, sizeof (i)) || is_mapped (&j, sizeof (j)))
175       abort ();
176 #endif
177     if (i != -1 || j != -2)
178       abort ();
179     i = 2;
180     j = 1;
181     if (i != 2 || j != 1)
182       abort ();
183   }
184   if (i != 2 || j != 1)
185     abort ();
186 
187   return 0;
188 }
189