Jack Styles 671caef379
[Flang][OpenMP] Update relevant warnings to emit when OMP >= v5.2 (#144492)
There has been a number of deprecation warnings that have been added to
Flang, however these features are only deprecated when the OpenMP
Version being used is 5.2 or later. Previously, flang did not consider
the version with the warnings so would always be emitted.

Flang now ensures warnings are emitted for the appropriate version of
OpenMP, and tests are updated to reflect this change.
2025-06-18 14:35:53 +01:00

149 lines
4.2 KiB
Fortran

! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! OpenMP Version 4.5
! Various checks with the ordered construct
SUBROUTINE WORK(I)
INTEGER I
END SUBROUTINE WORK
SUBROUTINE ORDERED_GOOD(N)
INTEGER N, I, A(10), B(10), C(10)
!$OMP SIMD
DO I = 1,N
IF (I <= 10) THEN
!$OMP ORDERED SIMD
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END SIMD
END SUBROUTINE ORDERED_GOOD
SUBROUTINE ORDERED_BAD(N)
INTEGER N, I, A(10), B(10), C(10)
!$OMP DO SIMD
DO I = 1,N
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, the `SCAN` construct and the `ORDERED` construct with the `SIMD` clause.
!ERROR: An ORDERED directive without the DEPEND clause must be closely nested in a worksharing-loop (or worksharing-loop SIMD) region with ORDERED clause without the parameter
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END DO SIMD
!$OMP PARALLEL DO
DO I = 1,N
IF (I <= 10) THEN
!ERROR: An ORDERED directive without the DEPEND clause must be closely nested in a worksharing-loop (or worksharing-loop SIMD) region with ORDERED clause without the parameter
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END PARALLEL DO
!$OMP CRITICAL
DO I = 1,N
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END CRITICAL
!$OMP CRITICAL
WRITE(*,*) I
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
!$OMP END CRITICAL
!$OMP ORDERED
WRITE(*,*) I
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
!$OMP END ORDERED
!$OMP TASK
C = C - A * B
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
!$OMP END TASK
!$OMP TASKLOOP
DO I = 1,N
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END TASKLOOP
!$OMP CRITICAL
C = C - A * B
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END CRITICAL
!$OMP ORDERED
C = C - A * B
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END ORDERED
!$OMP TASK
C = C - A * B
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END TASK
!$OMP TASKLOOP
DO J= 1,N
C = C - A * B
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
END DO
!$OMP END TASKLOOP
END SUBROUTINE ORDERED_BAD