llvm-project/flang/test/Semantics/omp-simd01.f90
Nimish Mishra 063c5bc31b [flang][OpenMP] Added OpenMP 5.0 specification based semantic checks for sections construct and test case for simd construct
According to OpenMP 5.0 spec document, the following semantic restrictions have been dealt with in this patch.

1. [sections construct] Orphaned section directives are prohibited. That is, the section directives must appear within the sections construct and must not be encountered elsewhere in the sections region.

 Semantic checks for the following are not necessary, since use of orphaned section construct (i.e. without an enclosing sections directive) throws parser errors and control flow never reaches the semantic checking phase. Added a test case for the same.

2. [sections construct] Must be a structured block

Added test case and made changes to branching logic

3. [simd construct] Must be a structured block / A program that branches in or out of a function with declare simd is non conforming

4. Fixed !$omp do's handling of unlabeled CYCLEs

Reviewed By: kiranchandramohan

Differential Revision: https://reviews.llvm.org/D108904
2021-10-02 08:40:53 +05:30

41 lines
1.0 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang -fopenmp
! OpenMP Version 5.0
! 2.9.3.1 simd Construct
! - A program that branches into or out of a simd region is non-conforming.
! - The associated loops must be structured blocks
program omp_simd
integer i, j
!$omp simd
do i = 1, 10
do j = 1, 10
print *, "omp simd"
!ERROR: invalid branch leaving an OpenMP structured block
goto 10
end do
if (i .EQ. 5) THEN
call function1()
else if (i .EQ. 7) THEN
open (10, file="random-file-name.txt", err=20)
20 print *, "Error message doesn't branch out of the loop's structured block"
else
!ERROR: invalid branch leaving an OpenMP structured block
open (10, file="random-file-name.txt", err=10)
end if
end do
!$omp end simd
10 stop
end program omp_simd
subroutine function1()
integer i, option
option = 1
!$omp simd
do i = 1, 10
print *, "CORRECT SIMD LOOP"
end do
!$omp end simd
end subroutine function1