llvm-project/flang/test/Semantics/OpenMP/omp-firstprivate01.f90
Kiran Chandramohan 495b8e104d [Flang][OpenMP] Provide an error when the minus operator is used in a reduction
OpenMP 5.2 standard has deprecated the usage of the minus operation in
reductions. The minus operation also is an unpleasant feature with
varied interpretations.

The patch also changes the usage of the minus operator in some existing testcases.

Discussed in https://discourse.llvm.org/t/openmp-runtime-problem-with-subtraction-reduction/64404

Reviewed By: peixin

Differential Revision: https://reviews.llvm.org/D132060
2022-08-18 14:35:12 +00:00

90 lines
2.2 KiB
Fortran

! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 4.5
! 2.15.3.4 firstprivate Clause
! Variables that appear in a firstprivate clause on a distribute or
! worksharing constructs must not appear in the private or
! reduction clause in a teams or parallel constructs in the outer context
program omp_firstprivate
integer :: i, a(10), b(10), c(10)
a = 10
b = 20
!ERROR: TARGET construct with nested TEAMS region contains statements or directives outside of the TEAMS construct
!$omp target
!$omp teams private(a, b)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp distribute firstprivate(a)
do i = 1, 10
a(i) = a(i) + b(i) - i
end do
!$omp end distribute
!$omp end teams
!$omp teams reduction(+:a)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp distribute firstprivate(a)
do i = 1, 10
b(i) = b(i) + a(i) + i
end do
!$omp end distribute
!$omp end teams
!$omp end target
print *, a, b
!$omp parallel private(a,b)
!ERROR: FIRSTPRIVATE variable 'b' is PRIVATE in outer context
!$omp do firstprivate(b)
do i = 1, 10
c(i) = a(i) + b(i) + i
end do
!$omp end do
!$omp end parallel
!$omp parallel reduction(*:a)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp do firstprivate(a,b)
do i = 1, 10
c(i) = c(i) * a(i) * b(i) * i
end do
!$omp end do
!$omp end parallel
!$omp parallel reduction(+:a)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp sections firstprivate(a, b)
!$omp section
c = c * a + b
!$omp end sections
!$omp end parallel
!$omp parallel reduction(*:a)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp task firstprivate(a,b)
c = c * a * b
!$omp end task
!$omp end parallel
!$omp parallel reduction(+:b)
!ERROR: FIRSTPRIVATE variable 'b' is PRIVATE in outer context
!$omp taskloop firstprivate(b)
do i = 1, 10
c(i) = a(i) + b(i) + i
a = a+i
b = b-i
end do
!$omp end taskloop
!$omp end parallel
!$omp parallel firstprivate(a)
!ERROR: FIRSTPRIVATE variable 'a' is PRIVATE in outer context
!$omp single firstprivate(a)
print *, a
!$omp end single
!$omp end parallel
print *, c
end program omp_firstprivate