| // clang-format off |
| // RUN: %libomptarget-compilexx-generic -fopenmp-version=60 |
| // RUN: %libomptarget-run-generic | %fcheck-generic |
| // RUN: %libomptarget-compileoptxx-generic -fopenmp-version=60 |
| // RUN: %libomptarget-run-generic | %fcheck-generic |
| // clang-format on |
| |
| // Sanity test for OpenMP 6.0 declare target 'local' clause. |
| // Verify 'local' variable has device-local storage, that it has |
| // correct initial value, persists across target regions, and is |
| // independent from host copy. |
| |
| #include <cstdio> |
| int local_var = 42; |
| #pragma omp declare target local(local_var) |
| |
| int main() { |
| // Device should get the initializer value. |
| int init = -1; |
| #pragma omp target map(from : init) |
| init = local_var; |
| |
| // Device write should persist to a second region. |
| int persist = -1; |
| #pragma omp target |
| local_var = 100; |
| #pragma omp target map(from : persist) |
| persist = local_var; |
| |
| // Host copy should not be affected by device write. Should |
| // retain original value. |
| |
| // CHECK: PASS |
| if (init == 42 && persist == 100 && local_var == 42) |
| printf("PASS\n"); |
| else |
| printf("FAIL init=%d persist=%d host=%d\n", init, persist, local_var); |
| |
| return (init == 42 && persist == 100 && local_var == 42) ? 0 : 1; |
| } |