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
90 lines
2.2 KiB
Fortran
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
|