This PR changes the build system to use use the sources for the module `omp_lib` and the `omp_lib.h` include file from the `openmp` runtime project and not from a separate copy of these files. This will greatly reduce potential for inconsistencies when adding features to the OpenMP runtime implementation. When the OpenMP subproject is not configured, this PR also disables the corresponding LIT tests with a "REQUIRES" directive at the beginning of the OpenMP test files. --------- Co-authored-by: Valentin Clement (バレンタイン クレメン) <clementval@gmail.com>
140 lines
3.6 KiB
Fortran
140 lines
3.6 KiB
Fortran
! REQUIRES: openmp_runtime
|
|
|
|
! 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
|