1! RUN: %python %S/../test_errors.py %s %flang -fopenmp 2 3! Check the association between OpenMPLoopConstruct and DoConstruct 4 5 integer :: b = 128 6 integer :: c = 32 7 integer, parameter :: num = 16 8 N = 1024 9 10! Different DO loops 11 12 !$omp parallel 13 !$omp do 14 do 10 i=1, N 15 a = 3.14 1610 print *, a 17 !$omp end parallel 18 19 !$omp parallel do 20 DO CONCURRENT (i = 1:N) 21 a = 3.14 22 END DO 23 24 !$omp parallel do simd 25 outer: DO WHILE (c > 1) 26 inner: do while (b > 100) 27 a = 3.14 28 b = b - 1 29 enddo inner 30 c = c - 1 31 END DO outer 32 33 ! Accept directives between parallel do and actual loop. 34 !$OMP PARALLEL DO 35 !DIR$ VECTOR ALIGNED 36 DO 20 i=1,N 37 a = a + 0.5 3820 CONTINUE 39 !$OMP END PARALLEL DO 40 41 c = 16 42 !ERROR: DO loop after the PARALLEL DO directive must have loop control 43 !$omp parallel do 44 do 45 a = 3.14 46 c = c - 1 47 if (c < 1) exit 48 enddo 49 50! Loop association check 51 52 ! If an end do directive follows a do-construct in which several DO 53 ! statements share a DO termination statement, then a do directive 54 ! can only be specified for the outermost of these DO statements. 55 do 100 i=1, N 56 !$omp do 57 do 100 j=1, N 58 a = 3.14 59100 continue 60 !ERROR: The ENDDO directive must follow the DO loop associated with the loop construct 61 !$omp enddo 62 63 !$omp parallel do copyin(a) 64 do i = 1, N 65 !$omp parallel do 66 do j = 1, i 67 enddo 68 !$omp end parallel do 69 a = 3. 70 enddo 71 !$omp end parallel do 72 73 !$omp parallel do 74 do i = 1, N 75 enddo 76 !$omp end parallel do 77 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 78 !$omp end parallel do 79 80 !$omp parallel 81 a = 3.0 82 !$omp do simd 83 do i = 1, N 84 enddo 85 !$omp end do simd 86 87 !$omp parallel do copyin(a) 88 do i = 1, N 89 enddo 90 !$omp end parallel 91 92 a = 0.0 93 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 94 !$omp end parallel do 95 !$omp parallel do private(c) 96 do i = 1, N 97 do j = 1, N 98 !ERROR: A DO loop must follow the PARALLEL DO directive 99 !$omp parallel do shared(b) 100 a = 3.14 101 enddo 102 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 103 !$omp end parallel do 104 enddo 105 a = 1.414 106 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 107 !$omp end parallel do 108 109 do i = 1, N 110 !$omp parallel do 111 do j = 2*i*N, (2*i+1)*N 112 a = 3.14 113 enddo 114 enddo 115 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 116 !$omp end parallel do 117 118 !ERROR: A DO loop must follow the PARALLEL DO directive 119 !$omp parallel do private(c) 1205 FORMAT (1PE12.4, I10) 121 do i=1, N 122 a = 3.14 123 enddo 124 !ERROR: The END PARALLEL DO directive must follow the DO loop associated with the loop construct 125 !$omp end parallel do 126 127 !$omp parallel do simd 128 do i = 1, N 129 a = 3.14 130 enddo 131 !$omp end parallel do simd 132 !ERROR: The END PARALLEL DO SIMD directive must follow the DO loop associated with the loop construct 133 !$omp end parallel do simd 134 135 !ERROR: A DO loop must follow the SIMD directive 136 !$omp simd 137 a = i + 1 138 !ERROR: The END SIMD directive must follow the DO loop associated with the loop construct 139 !$omp end simd 140end 141