| // Show that the ALWAYS map-type modifier on the outer map clause is propagated |
| // to the entries pushed by a user-defined mapper. |
| // |
| // The mapper transfers s.y. We pre-map s.y so that on the target region below |
| // it already has a device copy with a nonzero reference count. Without ALWAYS, |
| // the `from` at the end of the target region would be suppressed (a present, |
| // ref-counted entry is not copied back), so the write of 111 would be lost. |
| // ALWAYS forces the copy-back, which only happens if ALWAYS is propagated from |
| // the outer clause to the mapper's s.y entry. |
| |
| // RUN: %libomptarget-compile-run-and-check-generic |
| |
| #include <stdio.h> |
| |
| typedef struct { |
| int x; |
| int y; |
| int z; |
| } S; |
| |
| #pragma omp declare mapper(default : S s) map(tofrom : s.y) |
| |
| S s; |
| |
| int main() { |
| s.y = 0; |
| |
| #pragma omp target enter data map(alloc : s.y) |
| |
| #pragma omp target map(always, from : s) |
| { |
| s.y = 111; |
| } |
| |
| // ALWAYS forces s.y back even though it is still mapped (ref count > 0). |
| printf("s.y = %d\n", s.y); // CHECK: s.y = 111 |
| |
| #pragma omp target exit data map(delete : s.y) |
| } |