llvm-project/flang/test/Semantics/OpenMP/task-reduction.f90
Jack Styles 91e6deeef4
[Flang][OpenMP] Improve Semantics for Derived Type Array Elements (#167296)
Flang does not allow the use of Structure Component types inside of
certain OpenMP clauses. While this has been introduced, it seemed that
Structure Component Array Elements were not being captured as they got
embedded in the parse tree. To ensure all structure component types are
identified, a new `HasStructureComponent` evaluate function has been
introduced to walk a Semantics expression, identified where Components
are used within.

This replaces the previous implementation of `CheckStructureComponent`
which just looked for the StructureComponent inside of a DataRef.

Fixes #150830
2025-11-11 13:31:22 +00:00

73 lines
1.9 KiB
Fortran

!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=50
subroutine f00
real :: x
!ERROR: The type of 'x' is incompatible with the reduction operator.
!$omp taskgroup task_reduction(.or.: x)
!$omp end taskgroup
end
subroutine f01
real :: x
!ERROR: Invalid reduction operator in TASK_REDUCTION clause.
!$omp taskgroup task_reduction(.not.: x)
!$omp end taskgroup
end
subroutine f02(p)
integer, pointer, intent(in) :: p
!ERROR: Pointer 'p' with the INTENT(IN) attribute may not appear in a TASK_REDUCTION clause
!$omp taskgroup task_reduction(+: p)
!$omp end taskgroup
end
subroutine f03
common /c/ a, b
!ERROR: Common block names are not allowed in TASK_REDUCTION clause
!$omp taskgroup task_reduction(+: /c/)
!$omp end taskgroup
end
subroutine f04
integer :: x(10)
!ERROR: Reference to 'x' must be a contiguous object
!$omp taskgroup task_reduction(+: x(1:10:2))
!$omp end taskgroup
end
subroutine f05
integer :: x(10)
!ERROR: 'x' in TASK_REDUCTION clause is a zero size array section
!$omp taskgroup task_reduction(+: x(1:0))
!$omp end taskgroup
end
subroutine f06
type t
integer :: a(10)
end type
type(t) :: x
!ERROR: A variable that is part of another variable cannot appear on the TASK_REDUCTION clause
!ERROR: The base expression of an array element or section in TASK_REDUCTION clause must be an identifier
!$omp taskgroup task_reduction(+: x%a(2))
!$omp end taskgroup
end
subroutine f07
type t
integer :: a(10)
end type
type(t) :: x
!ERROR: A variable that is part of another variable cannot appear on the TASK_REDUCTION clause
!ERROR: The base expression of an array element or section in TASK_REDUCTION clause must be an identifier
!$omp taskgroup task_reduction(+: x%a(1:10))
!$omp end taskgroup
end
subroutine f08
integer :: x
!ERROR: Type parameter inquiry is not permitted in TASK_REDUCTION clause
!$omp taskgroup task_reduction(+: x%kind)
!$omp end taskgroup
end