Files
Krzysztof Parzyszek 89d79b65f7 [flang][OpenMP] Semantic checks for TASKGRAPH (#160115)
This verifies the "structural" restrictions on constructs encountered in
a TASKGRAPH construct.

There are also restrictions that apply to list items, specifically in
the following contexts:
- a list item on a clause on a replayable construct,
- data-sharing attributes for a variable on a replayable construct.
These restrictions are not verified, because that would require knowing
which clauses (on a potential compound directive) apply to the task-
generating construct of interest. This information is not available
during semantic checks.
2025-09-22 14:21:12 -05:00

119 lines
2.7 KiB
Fortran

!REQUIRES: openmp_runtime
!RUN: %python %S/../test_errors.py %s %flang %openmp_flags -fopenmp -fopenmp-version=60
module m
use omp_lib
implicit none
! Not in omp_lib yet.
integer, parameter :: omp_not_impex = 0
integer, parameter :: omp_import = 1
integer, parameter :: omp_export = 2
integer, parameter :: omp_impex = 3
contains
subroutine f00
!$omp taskgraph
!ERROR: Only task-generating constructs are allowed inside TASKGRAPH region
!$omp parallel
!$omp end parallel
!$omp end taskgraph
end
subroutine f01
!$omp taskgraph
!$omp task
!Non-task-generating constructs are ok if contained in an encountered task.
!No diagnostic expected.
!$omp parallel
!$omp end parallel
!$omp end task
!$omp end taskgraph
end
subroutine f02
!$omp taskgraph
!ERROR: Transparent replayable tasks are not allowed in a TASKGRAPH region
!$omp task transparent
!$omp end task
!$omp end taskgraph
!$omp taskgraph
!Not a transparent task.
!No diagnostic expected.
!$omp task transparent(omp_not_impex)
!$omp end task
!$omp end taskgraph
!$omp taskgraph
!Ok: transparent, but not replayable task.
!No diagnostic expected.
!$omp task replayable(.false.) transparent
!$omp end task
!$omp end taskgraph
end
subroutine f03
integer(kind=omp_event_handle_kind) :: event
!$omp taskgraph
!ERROR: Detachable replayable tasks are not allowed in a TASKGRAPH region
!$omp task detach(event)
!$omp end task
!$omp end taskgraph
!$omp taskgraph
!Ok: task is detachable, but not replayable.
!No diagnostic expected
!$omp task detach(event) replayable(.false.)
!$omp end task
!$omp end taskgraph
end
subroutine f04
!$omp taskgraph
!ERROR: Undeferred replayable tasks are not allowed in a TASKGRAPH region
!$omp task if(.false.)
!$omp end task
!$omp end taskgraph
!$omp taskgraph
!Ok: task is undeferred, but not replayable.
!No diagnostic expected.
!$omp task if(.false.) replayable(.false.)
!$omp end task
!$omp end taskgraph
end
subroutine f05
integer :: i
!$omp taskgraph
!ERROR: The NOGROUP clause must be specified on every construct in a TASKGRAPH region that could be enclosed in an implicit TASKGROUP
!$omp taskloop
do i = 1, 10
enddo
!$omp end taskloop
!$omp end taskgraph
!$omp taskgraph
!This also applies to non-replayable constructs
!ERROR: The NOGROUP clause must be specified on every construct in a TASKGRAPH region that could be enclosed in an implicit TASKGROUP
!$omp taskloop replayable(.false.)
do i = 1, 10
enddo
!$omp end taskloop
!$omp end taskgraph
!$omp taskgraph
!No diagnostic expected.
!$omp taskloop replayable(.false.) nogroup
do i = 1, 10
enddo
!$omp end taskloop
!$omp end taskgraph
end
end module