blob: 2452f730e9d2c8af1215be8ed9c59753e9a59403 [file] [edit]
! Allocatable CHARACTER UDR lowers via the existing by-ref char path (character
! is not trivial, so it is not wrapped by the boxed-trivial synthesis)
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=45 %s -o - | FileCheck %s
subroutine test_udr_char_allocatable()
implicit none
integer :: i
character(len=3), allocatable :: s
!$omp declare reduction(cmax : character(len=3) : omp_out = max(omp_out, omp_in)) &
!$omp& initializer(omp_priv = ' ')
allocate(s)
s = 'aaa'
!$omp parallel do reduction(cmax : s)
do i = 1, 3
s = max(s, 'bbb')
end do
end subroutine
! CHECK-LABEL: omp.declare_reduction @{{.*}}cmax_byref_c8x3 : !fir.ref<!fir.char<1,3>>
! CHECK-SAME: attributes {byref_element_type = !fir.char<1,3>}
! CHECK: init {
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.char<1,3>>, %{{.*}}: !fir.ref<!fir.char<1,3>>):
! CHECK: hlfir.assign
! CHECK: omp.yield
! CHECK: } combiner {
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<!fir.char<1,3>>, %{{.*}}: !fir.ref<!fir.char<1,3>>):
! CHECK: hlfir.char_extremum max
! CHECK: fir.store %{{.*}} to %[[ARG0]]
! CHECK: omp.yield(%[[ARG0]] : !fir.ref<!fir.char<1,3>>)
! The clause binds the character op with the boxed allocatable operand.
! CHECK-LABEL: func.func @_QPtest_udr_char_allocatable
! CHECK: omp.wsloop {{.*}} reduction(byref @{{.*}}cmax_byref_c8x3 %{{.*}} -> %{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.char<1,3>>>>)