| ! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp |
| ! OpenMP Version 4.5 |
| ! Various checks with the nesting of SIMD construct |
| |
| SUBROUTINE NESTED_GOOD(N) |
| INTEGER N, I, J, K, A(10), B(10) |
| !$OMP SIMD |
| DO I = 1,N |
| !$OMP ATOMIC |
| K = K + 1 |
| IF (I <= 10) THEN |
| !$OMP ORDERED SIMD |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END ORDERED |
| ENDIF |
| END DO |
| !$OMP END SIMD |
| |
| !$OMP SIMD |
| DO I = 1,N |
| IF (I <= 10) THEN |
| !$OMP SIMD |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END SIMD |
| ENDIF |
| END DO |
| !$OMP END SIMD |
| END SUBROUTINE NESTED_GOOD |
| |
| SUBROUTINE NESTED_BAD(N) |
| INTEGER N, I, J, K, A(10), B(10) |
| |
| !$OMP SIMD |
| DO I = 1,N |
| IF (I <= 10) THEN |
| !$OMP ORDERED SIMD |
| DO J = 1,N |
| print *, "Hi" |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region |
| !$omp teams |
| DO K = 1,N |
| print *, 'Hello' |
| END DO |
| !$omp end teams |
| END DO |
| !$OMP END ORDERED |
| ENDIF |
| END DO |
| !$OMP END SIMD |
| |
| !$OMP SIMD |
| DO I = 1,N |
| !$OMP ATOMIC |
| K = K + 1 |
| IF (I <= 10) THEN |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp task |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end task |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp target |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end target |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END DO |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP PARALLEL DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END PARALLEL DO |
| ENDIF |
| END DO |
| !$OMP END SIMD |
| |
| !$OMP DO SIMD |
| DO I = 1,N |
| !$OMP ATOMIC |
| K = K + 1 |
| IF (I <= 10) THEN |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp task |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end task |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp target |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end target |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region |
| !$OMP DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END DO |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP PARALLEL DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END PARALLEL DO |
| ENDIF |
| END DO |
| !$OMP END DO SIMD |
| |
| !$OMP PARALLEL DO SIMD |
| DO I = 1,N |
| !$OMP ATOMIC |
| K = K + 1 |
| IF (I <= 10) THEN |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp task |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end task |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp target |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end target |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region |
| !$OMP DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END DO |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP PARALLEL DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END PARALLEL DO |
| ENDIF |
| END DO |
| !$OMP END PARALLEL DO SIMD |
| |
| !$OMP TARGET SIMD |
| DO I = 1,N |
| !$OMP ATOMIC |
| K = K + 1 |
| IF (I <= 10) THEN |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp task |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end task |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$omp target |
| do J = 1, N |
| K = 2 |
| end do |
| !$omp end target |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END DO |
| !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause. |
| !$OMP PARALLEL DO |
| DO J = 1,N |
| A(J) = J |
| END DO |
| !$OMP END PARALLEL DO |
| ENDIF |
| END DO |
| !$OMP END TARGET SIMD |
| |
| |
| END SUBROUTINE NESTED_BAD |