| ! RUN: %python %S/test_errors.py %s %flang -fopenmp |
| |
| ! Check the association between OpenMPLoopConstruct and DoConstruct |
| |
| integer :: b = 128 |
| integer :: c = 32 |
| integer, parameter :: num = 16 |
| N = 1024 |
| |
| ! Different DO loops |
| |
| !$omp parallel |
| !$omp do |
| do 10 i=1, N |
| a = 3.14 |
| 10 print *, a |
| !$omp end parallel |
| |
| !$omp parallel do |
| DO CONCURRENT (i = 1:N) |
| a = 3.14 |
| END DO |
| |
| !$omp parallel do simd |
| outer: DO WHILE (c > 1) |
| inner: do while (b > 100) |
| a = 3.14 |
| b = b - 1 |
| enddo inner |
| c = c - 1 |
| END DO outer |
| |
| c = 16 |
| !ERROR: DO loop after the PARALLEL DO directive must have loop control |
| !$omp parallel do |
| do |
| a = 3.14 |
| c = c - 1 |
| if (c < 1) exit |
| enddo |
| |
| ! Loop association check |
| |
| ! If an end do directive follows a do-construct in which several DO |
| ! statements share a DO termination statement, then a do directive |
| ! can only be specified for the outermost of these DO statements. |
| do 100 i=1, N |
| !$omp do |
| do 100 j=1, N |
| a = 3.14 |
| 100 continue |
| !ERROR: The ENDDO directive must follow the DO loop associated with the loop construct |
| !$omp enddo |
| |
| !$omp parallel do copyin(a) |
| do i = 1, N |
| !$omp parallel do |
| do j = 1, i |
| enddo |
| !$omp end parallel do |
| a = 3. |
| enddo |
| !$omp end parallel do |
| |
| !$omp parallel do |
| do i = 1, N |
| enddo |
| !$omp end parallel do |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| |
| !$omp parallel |
| a = 3.0 |
| !$omp do simd |
| do i = 1, N |
| enddo |
| !$omp end do simd |
| |
| !$omp parallel do copyin(a) |
| do i = 1, N |
| enddo |
| !$omp end parallel |
| |
| a = 0.0 |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| !$omp parallel do private(c) |
| do i = 1, N |
| do j = 1, N |
| !ERROR: A DO loop must follow the PARALLEL DO directive |
| !$omp parallel do shared(b) |
| a = 3.14 |
| enddo |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| enddo |
| a = 1.414 |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| |
| do i = 1, N |
| !$omp parallel do |
| do j = 2*i*N, (2*i+1)*N |
| a = 3.14 |
| enddo |
| enddo |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| |
| !ERROR: A DO loop must follow the PARALLEL DO directive |
| !$omp parallel do private(c) |
| 5 FORMAT (1PE12.4, I10) |
| do i=1, N |
| a = 3.14 |
| enddo |
| !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do |
| |
| !$omp parallel do simd |
| do i = 1, N |
| a = 3.14 |
| enddo |
| !$omp end parallel do simd |
| !ERROR: The END PARALLEL DO SIMD directive must follow the DO loop associated with the loop construct |
| !$omp end parallel do simd |
| end |