! The predefined identifiers omp_initial_device (-1) and omp_invalid_device ! (-2) from the OpenMP 5.2+ specification must be accepted as valid device ! numbers in the DEVICE clause of target constructs. ! REQUIRES: openmp_runtime ! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52 ! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=60 program main use omp_lib real(8) :: arrayA(256) integer :: N, dev arrayA = 1.414d0 N = 256 ! Literal values allowed by the OpenMP 5.2 / 6.0 specification. !$omp target device(-1) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target !$omp target device(-2) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target !$omp target device(0) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target ! Using the predefined identifiers from the omp_lib module. !$omp target device(omp_initial_device) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target !$omp target device(omp_invalid_device) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target ! Also accepted on target data and its data motion variants. !$omp target data map(to: arrayA) device(omp_initial_device) !$omp end target data !$omp target data map(to: arrayA) device(omp_invalid_device) !$omp end target data !$omp target enter data map(alloc: arrayA) device(omp_initial_device) !$omp target enter data map(alloc: arrayA) device(omp_invalid_device) !$omp target exit data map(delete: arrayA) device(omp_initial_device) !$omp target exit data map(delete: arrayA) device(omp_invalid_device) !$omp target update to(arrayA) device(omp_initial_device) !$omp target update to(arrayA) device(omp_invalid_device) ! Runtime-determined values pass the semantic check. dev = -1 !$omp target device(dev) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target ! Values below -2 are still rejected. !ERROR: The device expression of the DEVICE clause must be a non-negative integer expression, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2) !$omp target device(-3) do i = 1, N arrayA(i) = 3.14d0 enddo !$omp end target end program main