| ! RUN: %flang_fc1 -fdebug-dump-symbols -fopenmp -fopenmp-version=50 %s | FileCheck %s | |
| !! Test that the name mangling for min & max (also used for iand, ieor and ior). | |
| module mymod | |
| type :: tt | |
| real r | |
| end type tt | |
| contains | |
| function mymax(a, b) | |
| type(tt) :: a, b, mymax | |
| if (a%r > b%r) then | |
| mymax = a | |
| else | |
| mymax = b | |
| end if | |
| end function mymax | |
| end module mymod | |
| program omp_examples | |
| !CHECK-LABEL: MainProgram scope: OMP_EXAMPLES | |
| use mymod | |
| implicit none | |
| integer, parameter :: n = 100 | |
| integer :: i | |
| type(tt) :: values(n), big, small | |
| !$omp declare reduction(max:tt:omp_out = mymax(omp_out, omp_in)) initializer(omp_priv%r = 0) | |
| !$omp declare reduction(min:tt:omp_out%r = min(omp_out%r, omp_in%r)) initializer(omp_priv%r = 1) | |
| !CHECK: min, ELEMENTAL, INTRINSIC, PURE (Function): ProcEntity | |
| !CHECK: mymax (Function): Use from mymax in mymod | |
| !CHECK: op.max: UserReductionDetails TYPE(tt) | |
| !CHECK: op.min: UserReductionDetails TYPE(tt) | |
| big%r = 0 | |
| !$omp parallel do reduction(max:big) | |
| !CHECK: big (OmpReduction, OmpExplicit): HostAssoc | |
| !CHECK: max, INTRINSIC: ProcEntity | |
| do i = 1, n | |
| big = mymax(values(i), big) | |
| end do | |
| small%r = 1 | |
| !$omp parallel do reduction(min:small) | |
| !CHECK: small (OmpReduction, OmpExplicit): HostAssoc | |
| do i = 1, n | |
| small%r = min(values(i)%r, small%r) | |
| end do | |
| print *, "small=", small%r, " big=", big%r | |
| end program omp_examples |