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
138 lines
3.5 KiB
Fortran
138 lines
3.5 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang -fopenmp
|
|
! OpenMP version 5.0.0
|
|
! 2.8.1 sections construct
|
|
! The code enclosed in a sections construct must be a structured block.
|
|
program OmpConstructSections01
|
|
use omp_lib
|
|
integer :: section_count = 0
|
|
integer, parameter :: NT = 4
|
|
print *, 'section_count', section_count
|
|
!ERROR: invalid branch into an OpenMP structured block
|
|
!ERROR: invalid branch into an OpenMP structured block
|
|
!ERROR: invalid branch into an OpenMP structured block
|
|
if (NT) 20, 30, 40
|
|
!ERROR: invalid branch into an OpenMP structured block
|
|
goto 20
|
|
!$omp sections
|
|
!$omp section
|
|
print *, "This is a single statement structured block"
|
|
!$omp section
|
|
open (10, file="random-file-name.txt", err=30)
|
|
!ERROR: invalid branch into an OpenMP structured block
|
|
!ERROR: invalid branch leaving an OpenMP structured block
|
|
open (10, file="random-file-name.txt", err=40)
|
|
!$omp section
|
|
section_count = section_count + 1
|
|
20 print *, 'Entering into section'
|
|
call calledFromWithinSection()
|
|
print *, 'section_count', section_count
|
|
!$omp section
|
|
section_count = section_count + 1
|
|
print *, 'section_count', section_count
|
|
!ERROR: invalid branch leaving an OpenMP structured block
|
|
goto 10
|
|
!$omp section
|
|
30 print *, "Error in opening file"
|
|
!$omp end sections
|
|
10 print *, 'Jump from section'
|
|
|
|
!$omp sections
|
|
!$omp section
|
|
40 print *, 'Error in opening file'
|
|
!$omp end sections
|
|
end program OmpConstructSections01
|
|
|
|
function returnFromSections()
|
|
!$omp sections
|
|
!$omp section
|
|
!ERROR: RETURN statement is not allowed in a SECTIONS construct
|
|
RETURN
|
|
!$omp end sections
|
|
end function
|
|
|
|
subroutine calledFromWithinSection()
|
|
print *, "I am called from within a 'section' structured block"
|
|
return
|
|
end subroutine calledFromWithinSection
|
|
|
|
subroutine continueWithinSections()
|
|
integer i
|
|
do i = 1, 10
|
|
print *, "Statement within loop but outside section construct"
|
|
!$omp sections
|
|
!$omp section
|
|
IF (i .EQ. 5) THEN
|
|
!ERROR: CYCLE to construct outside of SECTIONS construct is not allowed
|
|
CYCLE
|
|
END IF
|
|
!$omp end sections
|
|
print *, "Statement within loop but outside section contruct"
|
|
end do
|
|
|
|
!$omp sections
|
|
!$omp section
|
|
do i = 1, 10
|
|
CYCLE
|
|
end do
|
|
!$omp end sections
|
|
|
|
!$omp sections
|
|
!$omp section
|
|
loop_1: do i = 1, 10
|
|
IF (i .EQ. 5) THEN
|
|
CYCLE loop_1
|
|
END IF
|
|
end do loop_1
|
|
!$omp end sections
|
|
|
|
loop_2: do i = 1, 10
|
|
!$omp sections
|
|
!$omp section
|
|
IF (i .EQ. 5) THEN
|
|
!ERROR: CYCLE to construct 'loop_2' outside of SECTIONS construct is not allowed
|
|
CYCLE loop_2
|
|
END IF
|
|
!$omp end sections
|
|
end do loop_2
|
|
end subroutine continueWithinSections
|
|
|
|
subroutine breakWithinSections()
|
|
loop_3: do i = 1, 10
|
|
!$omp sections
|
|
!$omp section
|
|
IF (i .EQ. 5) THEN
|
|
!ERROR: EXIT to construct 'loop_3' outside of SECTIONS construct is not allowed
|
|
EXIT loop_3
|
|
END IF
|
|
!$omp end sections
|
|
end do loop_3
|
|
|
|
loop_4: do i = 1, 10
|
|
!$omp sections
|
|
!$omp section
|
|
IF (i .EQ. 5) THEN
|
|
!ERROR: EXIT to construct outside of SECTIONS construct is not allowed
|
|
EXIT
|
|
END IF
|
|
!$omp end sections
|
|
end do loop_4
|
|
|
|
!$omp sections
|
|
!$omp section
|
|
do i = 1, 10
|
|
IF (i .EQ. 5) THEN
|
|
EXIT
|
|
END IF
|
|
end do
|
|
!$omp end sections
|
|
|
|
!$omp sections
|
|
!$omp section
|
|
loop_5: do i = 1, 10
|
|
IF (i .EQ. 5) THEN
|
|
EXIT loop_5
|
|
END IF
|
|
end do loop_5
|
|
!$omp end sections
|
|
end subroutine breakWithinSections
|