|  | // Ensure that a non-scalar dummy arguments which are implicitly used inside | 
|  | // offloaded regions are properly mapped using present_or_copy semantics. | 
|  |  | 
|  | // { dg-do run } | 
|  |  | 
|  | #include <cassert> | 
|  |  | 
|  | const int n = 100; | 
|  |  | 
|  | struct data { | 
|  | int v; | 
|  | }; | 
|  |  | 
|  | void | 
|  | kernels_present (data &d, int &x) | 
|  | { | 
|  | #pragma acc kernels present (d, x) default (none) | 
|  | { | 
|  | d.v = x; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | parallel_present (data &d, int &x) | 
|  | { | 
|  | #pragma acc parallel present (d, x) default (none) | 
|  | { | 
|  | d.v = x; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | kernels_implicit (data &d, int &x) | 
|  | { | 
|  | #pragma acc kernels | 
|  | { | 
|  | d.v = x; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | parallel_implicit (data &d, int &x) | 
|  | { | 
|  | #pragma acc parallel | 
|  | { | 
|  | d.v = x; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | reference_data (data &d, int &x) | 
|  | { | 
|  | #pragma acc data copy(d, x) | 
|  | { | 
|  | kernels_present (d, x); | 
|  |  | 
|  | #pragma acc update host(d) | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 200; | 
|  | #pragma acc update device(x) | 
|  |  | 
|  | parallel_present (d, x); | 
|  | } | 
|  |  | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 300; | 
|  | kernels_implicit (d, x); | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 400; | 
|  | parallel_implicit (d, x); | 
|  | assert (d.v == x); | 
|  | } | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | data d; | 
|  | int x = 100; | 
|  |  | 
|  | #pragma acc data copy(d, x) | 
|  | { | 
|  | kernels_present (d, x); | 
|  |  | 
|  | #pragma acc update host(d) | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 200; | 
|  | #pragma acc update device(x) | 
|  |  | 
|  | parallel_present (d, x); | 
|  | } | 
|  |  | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 300; | 
|  | kernels_implicit (d, x); | 
|  | assert (d.v == x); | 
|  |  | 
|  | x = 400; | 
|  | parallel_implicit (d, x); | 
|  | assert (d.v == x); | 
|  |  | 
|  | reference_data (d, x); | 
|  |  | 
|  | return 0; | 
|  | } |