Files
clang-p2996/flang/test/Semantics/omp-nested-master.f90
Peixin Qiao 42f5110701 [flang][OpenMP] Add semantic check for teams nesting
This patch implements the following check for TEAMS construct:
```
OpenMP Version 5.0 Teams construct restriction: A teams region can
only be strictly nested within the implicit parallel region or a target
region. If a teams construct is nested within a target construct, that
target construct must contain no statements, declarations or directives
outside of the teams construct.
```

Also add one test case for the check.

Reviewed By: kiranchandramohan, clementval

Differential Revision: https://reviews.llvm.org/D106335
2021-08-13 10:42:47 -04:00

155 lines
3.8 KiB
Fortran

! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
! REQUIRES: shell
! OpenMP Version 4.5
! Various checks with the nesting of MASTER construct
program omp_nest_master
integer i, k, j
k = 0;
!$omp do
do i = 1, 10
k = k + 1
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp sections
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
do i = 1, 10
k = k + 1
end do
!$omp end master
!$omp end sections
!$omp single
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
do i = 1, 10
k = k + 1
end do
!$omp end master
!$omp end single
!$omp task
do i = 1, 10
k = k + 1
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp end task
!$omp taskloop
do i = 1, 10
k = k + 1
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp end taskloop
!$omp target parallel do simd
do i = 1, 10
k = k + 1
!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 and the `ORDERED` construct with the `SIMD` clause.
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp end target parallel do simd
!$omp critical
do i = 1, 10
k = k + 1
!$omp master
j = j -1
!$omp end master
end do
!$omp end critical
!$omp ordered
do i = 1, 10
k = k + 1
!$omp master
j = j -1
!$omp end master
end do
!$omp end ordered
!$omp ordered
do i = 1, 10
!ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
!$omp teams
!$omp distribute
do k =1, 10
print *, "hello"
!$omp master
j = j -1
!$omp end master
end do
!$omp end distribute
!$omp end teams
end do
!$omp end ordered
!$omp critical
do i = 1, 10
!ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
!$omp teams
!$omp distribute
do k =1, 10
print *, "hello"
!$omp master
j = j -1
!$omp end master
end do
!$omp end distribute
!$omp end teams
end do
!$omp end critical
!$omp taskloop
do i = 1, 10
!ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
!$omp teams
!$omp distribute
do k =1, 10
print *, "hello"
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp end distribute
!$omp end teams
end do
!$omp end taskloop
!$omp task
do i = 1, 10
!ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
!$omp teams
!$omp distribute
do k =1, 10
print *, "hello"
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$omp master
j = j -1
!$omp end master
end do
!$omp end distribute
!$omp end teams
end do
!$omp end task
end program omp_nest_master