From d4717b9b9def89c503a20eaf7700f87c4b52d530 Mon Sep 17 00:00:00 2001 From: Nimish Mishra Date: Tue, 12 Oct 2021 15:11:29 +0530 Subject: [PATCH] [flang][OpenMP] Added test case for OpenMP 5.0 specification based semantic checks for parallel sections construct Parallel sections directive borrows the semantic checks from both sections directive and parallel directive. Semantic checks for both are merged in main branch; this test case is added to make sure correct semantic checks upon merging the two. Reviewed By: kiranchandramohan Differential Revision: https://reviews.llvm.org/D111438 --- flang/test/Semantics/omp-parallel-sections01.f90 | 153 +++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 flang/test/Semantics/omp-parallel-sections01.f90 diff --git a/flang/test/Semantics/omp-parallel-sections01.f90 b/flang/test/Semantics/omp-parallel-sections01.f90 new file mode 100644 index 0000000..b522a31 --- /dev/null +++ b/flang/test/Semantics/omp-parallel-sections01.f90 @@ -0,0 +1,153 @@ +! RUN: %python %S/test_errors.py %s %flang -fopenmp +! OpenMP version 5.0.0 +! 2.13.3 parallel sections Construct +! The restrictions for the parallel construct and the sections construct apply +program OmpConstructSections01 + use omp_lib + integer :: section_count = 0 + integer, parameter :: NT = 4 + integer :: i, array(10) + type my_type + integer :: array(10) + end type my_type + type(my_type) :: my_var + print *, 'section_count', section_count + do i = 1, 10 + array(i) = i + end do +!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause +!$omp parallel sections shared(array(i)) +!$omp end parallel sections +!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause +!$omp parallel sections shared(my_var%array) +!$omp end parallel sections + +!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 +!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause +!$omp parallel sections private(my_var%array) + !$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 parallel sections +10 print *, 'Jump from section' +!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause +!$omp parallel sections private(array(i)) + !$omp section +40 print *, 'Error in opening file' +!$omp end parallel sections +end program OmpConstructSections01 + +function returnFromSections() + !$omp parallel sections + !$omp section + !ERROR: RETURN statement is not allowed in a PARALLEL SECTIONS construct + RETURN + !$omp end parallel 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 parallel sections + !$omp section + IF (i .EQ. 5) THEN + !ERROR: CYCLE to construct outside of PARALLEL SECTIONS construct is not allowed + CYCLE + END IF + !$omp end parallel sections + print *, "Statement within loop but outside section contruct" + end do + + !$omp parallel sections + !$omp section + do i = 1, 10 + CYCLE + end do + !$omp end parallel sections + + !$omp parallel 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 parallel sections + + loop_2: do i = 1, 10 + !$omp parallel sections + !$omp section + IF (i .EQ. 5) THEN + !ERROR: CYCLE to construct 'loop_2' outside of PARALLEL SECTIONS construct is not allowed + CYCLE loop_2 + END IF + !$omp end parallel sections + end do loop_2 +end subroutine continueWithinSections + +subroutine breakWithinSections() + loop_3: do i = 1, 10 + !$omp parallel sections + !$omp section + IF (i .EQ. 5) THEN + !ERROR: EXIT to construct 'loop_3' outside of PARALLEL SECTIONS construct is not allowed + EXIT loop_3 + END IF + !$omp end parallel sections + end do loop_3 + + loop_4: do i = 1, 10 + !$omp parallel sections + !$omp section + IF (i .EQ. 5) THEN + !ERROR: EXIT to construct outside of PARALLEL SECTIONS construct is not allowed + EXIT + END IF + !$omp end parallel sections + end do loop_4 + + !$omp parallel sections + !$omp section + do i = 1, 10 + IF (i .EQ. 5) THEN + EXIT + END IF + end do + !$omp end parallel sections + + !$omp parallel 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 parallel sections +end subroutine breakWithinSections -- 2.7.4