! RUN: bbc -emit-hlfir -fwrapv -o - --outline-intrinsics %s | FileCheck %s ! CHECK-LABEL: func @_QQmain() attributes {fir.bindc_name = "P"} { ! CHECK: %[[a1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFEa1"} ! CHECK: %[[a2:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFEa2"} ! CHECK: %[[a3:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFEa3"} ! CHECK: %[[iv:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFEiv"} ! CHECK: fir.do_loop ! CHECK: fir.do_loop ! CHECK: fir.call @fir.cos ! CHECK: hlfir.assign ! CHECK: fir.call @fir.sin ! CHECK: hlfir.assign ! a2 = a1(4, 2:10:3) ! CHECK: %[[slice1:.*]] = hlfir.designate %[[a1]]#0 (%c4{{.*}}, %c2{{.*}}:%c10{{.*}}:%c3{{.*}}) ! CHECK: hlfir.assign %[[slice1]] to %[[a2]]#0 ! a3(1:10:4) = a2 ! CHECK: %[[slice2:.*]] = hlfir.designate %[[a3]]#0 (%c1{{.*}}:%c10{{.*}}:%c4{{.*}}) ! CHECK: hlfir.assign %[[a2]]#0 to %[[slice2]] ! a2 = a2(iv) ! CHECK: %[[iv_expr:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<3xi64> { ! CHECK: fir.load ! CHECK: fir.convert ! CHECK: hlfir.yield_element ! CHECK: } ! CHECK: %[[vec_slice:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<3xf32> { ! CHECK: ^bb0(%[[idx:.*]]: index): ! CHECK: %[[iv_val:.*]] = hlfir.apply %[[iv_expr]], %[[idx]] ! CHECK: %[[a2_elem:.*]] = hlfir.designate %[[a2]]#0 (%[[iv_val]]) ! CHECK: %[[val:.*]] = fir.load %[[a2_elem]] ! CHECK: hlfir.yield_element %[[val]] ! CHECK: } ! CHECK: hlfir.assign %[[vec_slice]] to %[[a2]]#0 program p real :: a1(10,10) real :: a2(3) real :: a3(10) integer iv(3) integer k k = 0 do j = 1, 10 do i = 1, 10 k = k + 1 a1(i,j) = cos(real(k)) end do a3(j) = sin(real(k)) end do a2 = a1(4, 2:10:3) if (a1(4,2) .ne. a2(1)) print *, "mismatch 1", a2(1), a1(4,2) if (a1(4,5) .ne. a2(2)) print *, "mismatch 2", a2(2), a1(4,5) if (a1(4,8) .ne. a2(3)) print *, "mismatch 3", a2(3), a1(4,8) a3(1:10:4) = a2 if (a1(4,2) .ne. a3(1)) print *, "mismatch 4", a1(4,2), a3(1) if (a1(4,5) .ne. a3(5)) print *, "mismatch 5", a1(4,5), a3(5) if (a1(4,8) .ne. a3(9)) print *, "mismatch 6", a1(4,8), a3(9) iv = (/ 3, 1, 2 /) a2 = a2(iv) if (a1(4,2) .ne. a2(2)) print *, "mismatch 7", a1(4,2), a2(2) if (a1(4,5) .ne. a2(3)) print *, "mismatch 8", a1(4,5), a2(3) if (a1(4,8) .ne. a2(1)) print *, "mismatch 9", a1(4,8), a2(1) end program p ! CHECK-LABEL: func @_QPsub( ! CHECK-SAME: %[[arg:.*]]: !fir.boxchar<1>{{.*}}) { ! CHECK: %[[unbox:.*]]:2 = fir.unboxchar %[[arg]] ! CHECK: %[[addr:.*]] = fir.convert %[[unbox]]#0 ! CHECK: %[[a:.*]]:2 = hlfir.declare %[[addr]](%{{.*}}) typeparams %{{.*}} ! CHECK: %[[slice:.*]] = hlfir.designate %[[a]]#0 (%c1{{.*}}:%c5{{.*}}:%c2{{.*}}) ! CHECK: fir.call @_FortranAioOutputDescriptor ! CHECK: } ! Slice operation on array of CHARACTER subroutine sub(a) character :: a(10) print *, "a = ", a(1:5:2) end subroutine sub