[flang][OpenMP] Check for OpenMP 5.0+ for the if clause on "do simd" (#151154)
The "if" clause on "do simd" is only supported from OpenMP version 5.0.
Currently the tablegen for OMP_DoSimd does not restrict it, leading to
an ICE if the clause is used with an older OpenMP version as opposed to
a semantic error. Restrict the version to show the correct semantic
error.
Add flang tests for using the if clause with -fopenmp-version=45
and -fopenmp-version=50 to check for these types of errors.
---------
Signed-off-by: Kajetan Puchalski <kajetan.puchalski@arm.com>
GitOrigin-RevId: 7c2f109811181a227ffd784c046ed8d475173f8f
diff --git a/test/Semantics/OpenMP/if-clause-45.f90 b/test/Semantics/OpenMP/if-clause-45.f90
new file mode 100644
index 0000000..b0b0a24
--- /dev/null
+++ b/test/Semantics/OpenMP/if-clause-45.f90
@@ -0,0 +1,675 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=45
+! Check OpenMP 'if' clause validity for all directives that can have it with OpenMP 45
+
+program main
+ integer :: i
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !$omp distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !$omp distribute parallel do if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE PARALLEL DO directive
+ !$omp distribute parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !ERROR: At most one IF clause can appear on the DISTRIBUTE PARALLEL DO directive
+ !$omp distribute parallel do if(.true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !$omp distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp distribute parallel do simd if(parallel: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp distribute parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !ERROR: IF clause is not allowed on directive DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !$omp distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !ERROR: IF clause is not allowed on directive DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp distribute simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !ERROR: IF clause is not allowed on directive DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE SIMD directive
+ !$omp distribute simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !ERROR: IF clause is not allowed on directive DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: IF clause is not allowed on directive DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: At most one IF clause can appear on the DISTRIBUTE SIMD directive
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp distribute simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DO SIMD
+ ! ----------------------------------------------------------------------------
+ !ERROR: IF clause is not allowed on directive DO SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !$omp do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !ERROR: IF clause is not allowed on directive DO SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp do simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !ERROR: IF clause is not allowed on directive DO SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: TARGET is not a constituent of the DO SIMD directive
+ !$omp do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !ERROR: IF clause is not allowed on directive DO SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: IF clause is not allowed on directive DO SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: At most one IF clause can appear on the DO SIMD directive
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp do simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL
+ ! ----------------------------------------------------------------------------
+ !$omp parallel if(.true.)
+ !$omp end parallel
+
+ !$omp parallel if(parallel: .true.)
+ !$omp end parallel
+
+ !ERROR: TARGET is not a constituent of the PARALLEL directive
+ !$omp parallel if(target: .true.)
+ !$omp end parallel
+
+ !ERROR: At most one IF clause can appear on the PARALLEL directive
+ !$omp parallel if(.true.) if(parallel: .false.)
+ !$omp end parallel
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !$omp parallel do if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !ERROR: TARGET is not a constituent of the PARALLEL DO directive
+ !$omp parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !ERROR: At most one IF clause can appear on the PARALLEL DO directive
+ !$omp parallel do if(.true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp parallel do simd if(parallel: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ !ERROR: TARGET is not a constituent of the PARALLEL DO SIMD directive
+ !$omp parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL SECTIONS
+ ! ----------------------------------------------------------------------------
+ !$omp parallel sections if(.true.)
+ !$omp end parallel sections
+
+ !$omp parallel sections if(parallel: .true.)
+ !$omp end parallel sections
+
+ !ERROR: TARGET is not a constituent of the PARALLEL SECTIONS directive
+ !$omp parallel sections if(target: .true.)
+ !$omp end parallel sections
+
+ !ERROR: At most one IF clause can appear on the PARALLEL SECTIONS directive
+ !$omp parallel sections if(.true.) if(parallel: .false.)
+ !$omp end parallel sections
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL WORKSHARE
+ ! ----------------------------------------------------------------------------
+ !$omp parallel workshare if(.true.)
+ !$omp end parallel workshare
+
+ !$omp parallel workshare if(parallel: .true.)
+ !$omp end parallel workshare
+
+ !ERROR: TARGET is not a constituent of the PARALLEL WORKSHARE directive
+ !$omp parallel workshare if(target: .true.)
+ !$omp end parallel workshare
+
+ !ERROR: At most one IF clause can appear on the PARALLEL WORKSHARE directive
+ !$omp parallel workshare if(.true.) if(parallel: .false.)
+ !$omp end parallel workshare
+
+ ! ----------------------------------------------------------------------------
+ ! SIMD
+ ! ----------------------------------------------------------------------------
+ !ERROR: IF clause is not allowed on directive SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !$omp simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !ERROR: IF clause is not allowed on directive SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !ERROR: IF clause is not allowed on directive SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: TARGET is not a constituent of the SIMD directive
+ !$omp simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !ERROR: IF clause is not allowed on directive SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: IF clause is not allowed on directive SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: At most one IF clause can appear on the SIMD directive
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET
+ ! ----------------------------------------------------------------------------
+ !$omp target if(.true.)
+ !$omp end target
+
+ !$omp target if(target: .true.)
+ !$omp end target
+
+ !ERROR: PARALLEL is not a constituent of the TARGET directive
+ !$omp target if(parallel: .true.)
+ !$omp end target
+
+ !ERROR: At most one IF clause can appear on the TARGET directive
+ !$omp target if(.true.) if(target: .false.)
+ !$omp end target
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target data map(tofrom: i) if(.true.)
+ !$omp end target data
+
+ !$omp target data map(tofrom: i) if(target data: .true.)
+ !$omp end target data
+
+ !ERROR: TARGET is not a constituent of the TARGET DATA directive
+ !$omp target data map(tofrom: i) if(target: .true.)
+ !$omp end target data
+
+ !ERROR: At most one IF clause can appear on the TARGET DATA directive
+ !$omp target data map(tofrom: i) if(.true.) if(target data: .false.)
+ !$omp end target data
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET ENTER DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target enter data map(to: i) if(.true.)
+
+ !$omp target enter data map(to: i) if(target enter data: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET ENTER DATA directive
+ !$omp target enter data map(to: i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET ENTER DATA directive
+ !$omp target enter data map(to: i) if(.true.) if(target enter data: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET EXIT DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target exit data map(from: i) if(.true.)
+
+ !$omp target exit data map(from: i) if(target exit data: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET EXIT DATA directive
+ !$omp target exit data map(from: i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET EXIT DATA directive
+ !$omp target exit data map(from: i) if(.true.) if(target exit data: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel if(.true.)
+ !$omp end target parallel
+
+ !$omp target parallel if(target: .true.) if(parallel: .false.)
+ !$omp end target parallel
+
+ !ERROR: SIMD is not a constituent of the TARGET PARALLEL directive
+ !$omp target parallel if(simd: .true.)
+ !$omp end target parallel
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ !$omp target parallel do if(target: .true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ !ERROR: SIMD is not a constituent of the TARGET PARALLEL DO directive
+ !$omp target parallel do if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ !$omp target parallel do simd if(target: .true.) if(parallel: .false.) &
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp& if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ !ERROR: TEAMS is not a constituent of the TARGET PARALLEL DO SIMD directive
+ !$omp target parallel do simd if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp target simd if(target: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ !ERROR: PARALLEL is not a constituent of the TARGET SIMD directive
+ !$omp target simd if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS
+ ! ----------------------------------------------------------------------------
+ !$omp target teams if(.true.)
+ !$omp end target teams
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp target teams if(target: .true.) if(teams: .false.)
+ !$omp end target teams
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS directive
+ !$omp target teams if(parallel: .true.)
+ !$omp end target teams
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp target teams distribute if(target: .true.) if(teams: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS DISTRIBUTE directive
+ !$omp target teams distribute if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ !$omp target teams distribute parallel do &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp& if(target: .true.) if(teams: .false.) if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ !ERROR: SIMD is not a constituent of the TARGET TEAMS DISTRIBUTE PARALLEL DO directive
+ !$omp target teams distribute parallel do if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ !$omp target teams distribute parallel do simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp& if(target: .true.) if(teams: .false.) if(parallel: .true.) &
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp& if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ !ERROR: TASK is not a constituent of the TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp target teams distribute parallel do simd if(task: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ !$omp target teams distribute simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp& if(target: .true.) if(teams: .false.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS DISTRIBUTE SIMD directive
+ !$omp target teams distribute simd if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET UPDATE
+ ! ----------------------------------------------------------------------------
+ !$omp target update to(i) if(.true.)
+
+ !$omp target update to(i) if(target update: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET UPDATE directive
+ !$omp target update to(i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET UPDATE directive
+ !$omp target update to(i) if(.true.) if(target update: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TASK
+ ! ----------------------------------------------------------------------------
+ !$omp task if(.true.)
+ !$omp end task
+
+ !$omp task if(task: .true.)
+ !$omp end task
+
+ !ERROR: TARGET is not a constituent of the TASK directive
+ !$omp task if(target: .true.)
+ !$omp end task
+
+ !ERROR: At most one IF clause can appear on the TASK directive
+ !$omp task if(.true.) if(task: .false.)
+ !$omp end task
+
+ ! ----------------------------------------------------------------------------
+ ! TASKLOOP
+ ! ----------------------------------------------------------------------------
+ !$omp taskloop if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !$omp taskloop if(taskloop: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !ERROR: TARGET is not a constituent of the TASKLOOP directive
+ !$omp taskloop if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !ERROR: At most one IF clause can appear on the TASKLOOP directive
+ !$omp taskloop if(.true.) if(taskloop: .false.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ ! ----------------------------------------------------------------------------
+ ! TASKLOOP SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp taskloop simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp taskloop simd if(taskloop: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ !ERROR: TARGET is not a constituent of the TASKLOOP SIMD directive
+ !$omp taskloop simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS
+ ! ----------------------------------------------------------------------------
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams if(.true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams if(teams: .true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: TARGET is not a constituent of the TEAMS directive
+ !$omp teams if(target: .true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: At most one IF clause can appear on the TEAMS directive
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams if(.true.) if(teams: .false.)
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams distribute if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE directive
+ !$omp teams distribute if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: At most one IF clause can appear on the TEAMS DISTRIBUTE directive
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams distribute if(.true.) if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !$omp teams distribute parallel do if(teams: .true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE PARALLEL DO directive
+ !$omp teams distribute parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ !$omp teams distribute parallel do simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp& if(teams: .true.) if(parallel: .true.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp teams distribute parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !ERROR: IF clause is not allowed on directive TEAMS DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !$omp teams distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+
+ !ERROR: IF clause is not allowed on directive TEAMS DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=52
+ !ERROR: IF clause is not allowed on directive TEAMS DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: SIMD is not allowed as 'directive-name-modifier' in OpenMP v4.5, try -fopenmp-version=50
+ !$omp teams distribute simd if(teams: .true.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+
+ !ERROR: IF clause is not allowed on directive TEAMS DISTRIBUTE SIMD in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE SIMD directive
+ !$omp teams distribute simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+end program main
diff --git a/test/Semantics/OpenMP/if-clause-50.f90 b/test/Semantics/OpenMP/if-clause-50.f90
new file mode 100644
index 0000000..eb59776
--- /dev/null
+++ b/test/Semantics/OpenMP/if-clause-50.f90
@@ -0,0 +1,641 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=50
+! Check OpenMP 'if' clause validity for all directives that can have it
+
+program main
+ integer :: i
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !$omp distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !$omp distribute parallel do if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE PARALLEL DO directive
+ !$omp distribute parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+
+ !ERROR: At most one IF clause can appear on the DISTRIBUTE PARALLEL DO directive
+ !$omp distribute parallel do if(.true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !$omp distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+
+ !$omp distribute parallel do simd if(parallel: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp distribute parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute parallel do simd
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams
+ !$omp distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !$omp distribute simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !ERROR: TARGET is not a constituent of the DISTRIBUTE SIMD directive
+ !$omp distribute simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+
+ !ERROR: At most one IF clause can appear on the DISTRIBUTE SIMD directive
+ !$omp distribute simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end distribute simd
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !$omp do simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !ERROR: TARGET is not a constituent of the DO SIMD directive
+ !$omp do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ !ERROR: At most one IF clause can appear on the DO SIMD directive
+ !$omp do simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end do simd
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL
+ ! ----------------------------------------------------------------------------
+ !$omp parallel if(.true.)
+ !$omp end parallel
+
+ !$omp parallel if(parallel: .true.)
+ !$omp end parallel
+
+ !ERROR: TARGET is not a constituent of the PARALLEL directive
+ !$omp parallel if(target: .true.)
+ !$omp end parallel
+
+ !ERROR: At most one IF clause can appear on the PARALLEL directive
+ !$omp parallel if(.true.) if(parallel: .false.)
+ !$omp end parallel
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !$omp parallel do if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !ERROR: TARGET is not a constituent of the PARALLEL DO directive
+ !$omp parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ !ERROR: At most one IF clause can appear on the PARALLEL DO directive
+ !$omp parallel do if(.true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ !$omp parallel do simd if(parallel: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ !ERROR: TARGET is not a constituent of the PARALLEL DO SIMD directive
+ !$omp parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL SECTIONS
+ ! ----------------------------------------------------------------------------
+ !$omp parallel sections if(.true.)
+ !$omp end parallel sections
+
+ !$omp parallel sections if(parallel: .true.)
+ !$omp end parallel sections
+
+ !ERROR: TARGET is not a constituent of the PARALLEL SECTIONS directive
+ !$omp parallel sections if(target: .true.)
+ !$omp end parallel sections
+
+ !ERROR: At most one IF clause can appear on the PARALLEL SECTIONS directive
+ !$omp parallel sections if(.true.) if(parallel: .false.)
+ !$omp end parallel sections
+
+ ! ----------------------------------------------------------------------------
+ ! PARALLEL WORKSHARE
+ ! ----------------------------------------------------------------------------
+ !$omp parallel workshare if(.true.)
+ !$omp end parallel workshare
+
+ !$omp parallel workshare if(parallel: .true.)
+ !$omp end parallel workshare
+
+ !ERROR: TARGET is not a constituent of the PARALLEL WORKSHARE directive
+ !$omp parallel workshare if(target: .true.)
+ !$omp end parallel workshare
+
+ !ERROR: At most one IF clause can appear on the PARALLEL WORKSHARE directive
+ !$omp parallel workshare if(.true.) if(parallel: .false.)
+ !$omp end parallel workshare
+
+ ! ----------------------------------------------------------------------------
+ ! SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !$omp simd if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !ERROR: TARGET is not a constituent of the SIMD directive
+ !$omp simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ !ERROR: At most one IF clause can appear on the SIMD directive
+ !$omp simd if(.true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET
+ ! ----------------------------------------------------------------------------
+ !$omp target if(.true.)
+ !$omp end target
+
+ !$omp target if(target: .true.)
+ !$omp end target
+
+ !ERROR: PARALLEL is not a constituent of the TARGET directive
+ !$omp target if(parallel: .true.)
+ !$omp end target
+
+ !ERROR: At most one IF clause can appear on the TARGET directive
+ !$omp target if(.true.) if(target: .false.)
+ !$omp end target
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target data map(tofrom: i) if(.true.)
+ !$omp end target data
+
+ !$omp target data map(tofrom: i) if(target data: .true.)
+ !$omp end target data
+
+ !ERROR: TARGET is not a constituent of the TARGET DATA directive
+ !$omp target data map(tofrom: i) if(target: .true.)
+ !$omp end target data
+
+ !ERROR: At most one IF clause can appear on the TARGET DATA directive
+ !$omp target data map(tofrom: i) if(.true.) if(target data: .false.)
+ !$omp end target data
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET ENTER DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target enter data map(to: i) if(.true.)
+
+ !$omp target enter data map(to: i) if(target enter data: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET ENTER DATA directive
+ !$omp target enter data map(to: i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET ENTER DATA directive
+ !$omp target enter data map(to: i) if(.true.) if(target enter data: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET EXIT DATA
+ ! ----------------------------------------------------------------------------
+ !$omp target exit data map(from: i) if(.true.)
+
+ !$omp target exit data map(from: i) if(target exit data: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET EXIT DATA directive
+ !$omp target exit data map(from: i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET EXIT DATA directive
+ !$omp target exit data map(from: i) if(.true.) if(target exit data: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel if(.true.)
+ !$omp end target parallel
+
+ !$omp target parallel if(target: .true.) if(parallel: .false.)
+ !$omp end target parallel
+
+ !ERROR: SIMD is not a constituent of the TARGET PARALLEL directive
+ !$omp target parallel if(simd: .true.)
+ !$omp end target parallel
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ !$omp target parallel do if(target: .true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ !ERROR: SIMD is not a constituent of the TARGET PARALLEL DO directive
+ !$omp target parallel do if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ !$omp target parallel do simd if(target: .true.) if(parallel: .false.) &
+ !$omp& if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ !ERROR: TEAMS is not a constituent of the TARGET PARALLEL DO SIMD directive
+ !$omp target parallel do simd if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ !$omp target simd if(target: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ !ERROR: PARALLEL is not a constituent of the TARGET SIMD directive
+ !$omp target simd if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS
+ ! ----------------------------------------------------------------------------
+ !$omp target teams if(.true.)
+ !$omp end target teams
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp target teams if(target: .true.) if(teams: .false.)
+ !$omp end target teams
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS directive
+ !$omp target teams if(parallel: .true.)
+ !$omp end target teams
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp target teams distribute if(target: .true.) if(teams: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS DISTRIBUTE directive
+ !$omp target teams distribute if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ !$omp target teams distribute parallel do &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp& if(target: .true.) if(teams: .false.) if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ !ERROR: SIMD is not a constituent of the TARGET TEAMS DISTRIBUTE PARALLEL DO directive
+ !$omp target teams distribute parallel do if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ !$omp target teams distribute parallel do simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp& if(target: .true.) if(teams: .false.) if(parallel: .true.) &
+ !$omp& if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ !ERROR: TASK is not a constituent of the TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp target teams distribute parallel do simd if(task: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET TEAMS DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp target teams distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ !$omp target teams distribute simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp& if(target: .true.) if(teams: .false.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ !ERROR: PARALLEL is not a constituent of the TARGET TEAMS DISTRIBUTE SIMD directive
+ !$omp target teams distribute simd if(parallel: .true.)
+ do i = 1, 10
+ end do
+ !$omp end target teams distribute simd
+
+ ! ----------------------------------------------------------------------------
+ ! TARGET UPDATE
+ ! ----------------------------------------------------------------------------
+ !$omp target update to(i) if(.true.)
+
+ !$omp target update to(i) if(target update: .true.)
+
+ !ERROR: TARGET is not a constituent of the TARGET UPDATE directive
+ !$omp target update to(i) if(target: .true.)
+
+ !ERROR: At most one IF clause can appear on the TARGET UPDATE directive
+ !$omp target update to(i) if(.true.) if(target update: .false.)
+
+ ! ----------------------------------------------------------------------------
+ ! TASK
+ ! ----------------------------------------------------------------------------
+ !$omp task if(.true.)
+ !$omp end task
+
+ !$omp task if(task: .true.)
+ !$omp end task
+
+ !ERROR: TARGET is not a constituent of the TASK directive
+ !$omp task if(target: .true.)
+ !$omp end task
+
+ !ERROR: At most one IF clause can appear on the TASK directive
+ !$omp task if(.true.) if(task: .false.)
+ !$omp end task
+
+ ! ----------------------------------------------------------------------------
+ ! TASKLOOP
+ ! ----------------------------------------------------------------------------
+ !$omp taskloop if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !$omp taskloop if(taskloop: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !ERROR: TARGET is not a constituent of the TASKLOOP directive
+ !$omp taskloop if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ !ERROR: At most one IF clause can appear on the TASKLOOP directive
+ !$omp taskloop if(.true.) if(taskloop: .false.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop
+
+ ! ----------------------------------------------------------------------------
+ ! TASKLOOP SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp taskloop simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ !$omp taskloop simd if(taskloop: .true.) if(simd: .false.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ !ERROR: TARGET is not a constituent of the TASKLOOP SIMD directive
+ !$omp taskloop simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end taskloop simd
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS
+ ! ----------------------------------------------------------------------------
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams if(.true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v5.0, try -fopenmp-version=52
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams if(teams: .true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v5.0, try -fopenmp-version=52
+ !ERROR: TARGET is not a constituent of the TEAMS directive
+ !$omp teams if(target: .true.)
+ !$omp end teams
+
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v5.0, try -fopenmp-version=52
+ !ERROR: IF clause is not allowed on directive TEAMS in OpenMP v5.0, try -fopenmp-version=52
+ !ERROR: At most one IF clause can appear on the TEAMS directive
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams if(.true.) if(teams: .false.)
+ !$omp end teams
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams distribute if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE directive
+ !$omp teams distribute if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ !ERROR: At most one IF clause can appear on the TEAMS DISTRIBUTE directive
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams distribute if(.true.) if(teams: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE PARALLEL DO
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute parallel do if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams distribute parallel do if(teams: .true.) if(parallel: .false.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE PARALLEL DO directive
+ !$omp teams distribute parallel do if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE PARALLEL DO SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute parallel do simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ !$omp teams distribute parallel do simd &
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp& if(teams: .true.) if(parallel: .true.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE PARALLEL DO SIMD directive
+ !$omp teams distribute parallel do simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute parallel do simd
+
+ ! ----------------------------------------------------------------------------
+ ! TEAMS DISTRIBUTE SIMD
+ ! ----------------------------------------------------------------------------
+ !$omp teams distribute simd if(.true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+
+ !ERROR: TEAMS is not allowed as 'directive-name-modifier' in OpenMP v5.0, try -fopenmp-version=52
+ !$omp teams distribute simd if(teams: .true.) if(simd: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+
+ !ERROR: TARGET is not a constituent of the TEAMS DISTRIBUTE SIMD directive
+ !$omp teams distribute simd if(target: .true.)
+ do i = 1, 10
+ end do
+ !$omp end teams distribute simd
+end program main