! Test lowering of IO input items with vector subscripts ! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s ! UNSUPPORTED: system-windows ! CHECK-LABEL: func @_QPsimple( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}) { subroutine simple(x, y) integer :: y(3) integer :: x(10) read(*,*) x(y) ! CHECK-DAG: %[[VAL_C10:.*]] = arith.constant 10 : index ! CHECK-DAG: %[[VAL_C3:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFsimpleEx"} ! CHECK-DAG: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFsimpleEy"} ! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 5 : i32 ! CHECK: %[[VAL_7:.*]] = fir.address_of(@_QQ{{.*}}) : !fir.ref> ! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[VAL_9:.*]] = fir.call @_FortranAioBeginExternalListInput(%[[VAL_5]], %[[VAL_8]], %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[SHAPE:.*]] = fir.shape %[[VAL_C10]] : (index) -> !fir.shape<1> ! CHECK: %[[VAL_11:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.slice<1> ! CHECK: %[[VAL_BOUND:.*]] = arith.subi %{{.*}}, %{{.*}} : index ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %[[VAL_BOUND]] step %{{.*}} { ! CHECK: %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_15]] : !fir.ref ! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i32) -> index ! CHECK: %[[VAL_19:.*]] = fir.array_coor %[[VAL_X]]#0(%[[SHAPE]]) {{\[}}%[[VAL_11]]] %[[VAL_18]] : (!fir.ref>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref ! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_19]] : (!fir.ref) -> !fir.ref ! CHECK: %[[VAL_22:.*]] = fir.call @_FortranAioInputInteger(%[[VAL_9]], %[[VAL_21]], %{{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: } ! CHECK: %[[VAL_25:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_9]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPonly_once( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.box>{{.*}}) { subroutine only_once(x) interface function get_vector() integer, allocatable :: get_vector(:) end function integer function get_substcript() end function end interface real :: x(:, :) ! Test subscripts are only evaluated once. read(*,*) x(get_substcript(), get_vector()) ! CHECK: %[[VAL_RES:.*]] = fir.alloca !fir.box>> {bindc_name = ".result"} ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]]{{.*}}{uniq_name = "_QFonly_onceEx"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_SUB:.*]] = fir.call @_QPget_substcript() {{.*}}: () -> i32 ! CHECK: %[[VAL_SUB_I64:.*]] = fir.convert %[[VAL_SUB]] : (i32) -> i64 ! CHECK: %[[VAL_RES_DECL:.*]]:2 = hlfir.declare %[[VAL_RES]] {uniq_name = ".tmp.func_result"} ! CHECK: %[[VAL_GETVEC:.*]] = fir.call @_QPget_vector() {{.*}}: () -> !fir.box>> ! CHECK: fir.save_result %[[VAL_GETVEC]] to %[[VAL_RES_DECL]]#0 ! CHECK: %[[VAL_LOAD:.*]] = fir.load %[[VAL_RES_DECL]]#0 : !fir.ref>>> ! CHECK: %[[VAL_EXPR:.*]] = hlfir.as_expr %[[VAL_LOAD]] move %{{.*}} : (!fir.box>>, i1) -> !hlfir.expr ! CHECK: %[[VAL_DIMS:.*]]:3 = fir.box_dims %[[VAL_LOAD]], %{{.*}} : (!fir.box>>, index) -> (index, index, index) ! CHECK: %[[VAL_SHAPE:.*]] = fir.shape %[[VAL_DIMS]]#1 : (index) -> !fir.shape<1> ! CHECK: %[[VAL_ASSOC:.*]]:3 = hlfir.associate %[[VAL_EXPR]](%[[VAL_SHAPE]]) {adapt.valuebyref} : (!hlfir.expr, !fir.shape<1>) -> (!fir.box>, !fir.ref>, i1) ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %[[VAL_SUB_I64]], %{{.*}}, %{{.*}}, %{{.*}}, %[[VAL_DIMS]]#1, %{{.*}} : (i64, index, index, index, index, index) -> !fir.slice<2> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[SUB_IDX:.*]] = fir.convert %[[VAL_SUB_I64]] : (i64) -> index ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_ASSOC]]#1, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1 {{\[}}%[[VAL_SLICE]]] %[[SUB_IDX]], %[[VEL_IDX]] : (!fir.box>, !fir.slice<2>, index, index) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputReal32(%[[VAL_BEGIN]], %[[ELEM]]) {{.*}}: (!fir.ref, !fir.ref) -> i1 ! CHECK: } ! CHECK: hlfir.end_associate %[[VAL_ASSOC]]#1, %[[VAL_ASSOC]]#2 : !fir.ref>, i1 ! CHECK: hlfir.destroy %[[VAL_EXPR]] : !hlfir.expr ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPwith_assumed_shapes( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.box>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.box>{{.*}}) { subroutine with_assumed_shapes(x, y) integer :: y(:) integer :: x(:) read(*,*) x(y) ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]]{{.*}}{uniq_name = "_QFwith_assumed_shapesEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]]{{.*}}{uniq_name = "_QFwith_assumed_shapesEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_DIMS:.*]]:3 = fir.box_dims %[[VAL_Y]]#1, %{{.*}} : (!fir.box>, index) -> (index, index, index) ! CHECK: %[[VAL_C1:.*]] = arith.constant 1 : index ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %[[VAL_C1]], %[[VAL_DIMS]]#1, %[[VAL_C1]] : (index, index, index) -> !fir.slice<1> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#1, %[[IDX]] : (!fir.box>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1 {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] : (!fir.box>, !fir.slice<1>, index) -> !fir.ref ! CHECK: %[[VAL_79:.*]] = fir.convert %[[ELEM]] : (!fir.ref) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputInteger(%[[VAL_BEGIN]], %[[VAL_79]], %{{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPlower_bounds( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}) { subroutine lower_bounds(x, y) integer :: y(3) integer :: x(2:5,3:8) read(*,*) x(3, y) ! CHECK: %[[VAL_SS:.*]] = fir.shape_shift %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index, index) -> !fir.shapeshift<2> ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]](%[[VAL_SS]]){{.*}}{uniq_name = "_QFlower_boundsEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFlower_boundsEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_C3I64:.*]] = arith.constant 3 : i64 ! CHECK: %[[VAL_SS2:.*]] = fir.shape_shift %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index, index) -> !fir.shapeshift<2> ! CHECK: %[[VAL_UNDEF:.*]] = fir.undefined index ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %[[VAL_C3I64]], %[[VAL_UNDEF]], %[[VAL_UNDEF]], %{{.*}}, %{{.*}}, %{{.*}} : (i64, index, index, index, index, index) -> !fir.slice<2> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VAL_C3IDX:.*]] = fir.convert %[[VAL_C3I64]] : (i64) -> index ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1(%[[VAL_SS2]]) {{\[}}%[[VAL_SLICE]]] %[[VAL_C3IDX]], %[[VEL_IDX]] : (!fir.ref>, !fir.shapeshift<2>, !fir.slice<2>, index, index) -> !fir.ref ! CHECK: %{{.*}} = fir.convert %[[ELEM]] : (!fir.ref) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputInteger({{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPtwo_vectors( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_Y1_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_Y2_ARG:.*]]: !fir.ref>{{.*}}) { subroutine two_vectors(x, y1, y2) integer :: y1(3), y2(3) real :: x(4, 4) read(*,*) x(y1, y2) ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFtwo_vectorsEx"} ! CHECK: %[[VAL_Y1:.*]]:2 = hlfir.declare %[[VAL_Y1_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFtwo_vectorsEy1"} ! CHECK: %[[VAL_Y2:.*]]:2 = hlfir.declare %[[VAL_Y2_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFtwo_vectorsEy2"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2> ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index, index, index, index) -> !fir.slice<2> ! CHECK: fir.do_loop %[[IDX_OUTER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: fir.do_loop %[[IDX_INNER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[Y1_EL:.*]] = fir.coordinate_of %[[VAL_Y1]]#0, %[[IDX_INNER]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[Y1_LD:.*]] = fir.load %[[Y1_EL]] : !fir.ref ! CHECK: %[[Y1_IDX:.*]] = fir.convert %[[Y1_LD]] : (i32) -> index ! CHECK: %[[Y2_EL:.*]] = fir.coordinate_of %[[VAL_Y2]]#0, %[[IDX_OUTER]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[Y2_LD:.*]] = fir.load %[[Y2_EL]] : !fir.ref ! CHECK: %[[Y2_IDX:.*]] = fir.convert %[[Y2_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#0(%[[VAL_SHAPE]]) {{\[}}%[[VAL_SLICE]]] %[[Y1_IDX]], %[[Y2_IDX]] : (!fir.ref>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputReal32(%[[VAL_BEGIN]], %[[ELEM]]) {{.*}}: (!fir.ref, !fir.ref) -> i1 ! CHECK: } ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPtriplets_and_vector( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.ref>>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}) { subroutine triplets_and_vector(x, y) integer :: y(3) complex :: x(4, 4) read(*,*) x(1:4:2, y) ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFtriplets_and_vectorEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFtriplets_and_vectorEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2> ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index, index, index, index) -> !fir.slice<2> ! CHECK: fir.do_loop %[[IDX_OUTER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: fir.do_loop %[[IDX_INNER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[Y_EL:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX_OUTER]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[Y_LD:.*]] = fir.load %[[Y_EL]] : !fir.ref ! CHECK: %[[Y_IDX:.*]] = fir.convert %[[Y_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#0(%[[VAL_SHAPE]]) {{\[}}%[[VAL_SLICE]]] %[[IDX_INNER]], %[[Y_IDX]] : (!fir.ref>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref> ! CHECK: %[[ELEM_F32:.*]] = fir.convert %[[ELEM]] : (!fir.ref>) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputComplex32(%[[VAL_BEGIN]], %[[ELEM_F32]]) {{.*}}: (!fir.ref, !fir.ref) -> i1 ! CHECK: } ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPsimple_char( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}) { subroutine simple_char(x, y) integer :: y(3) character(*) :: x(3:8) read(*,*) x(y) ! CHECK: %[[VAL_UNBOX:.*]]:2 = fir.unboxchar %[[VAL_X_ARG]] : (!fir.boxchar<1>) -> (!fir.ref>, index) ! CHECK: %[[VAL_X_CAST:.*]] = fir.convert %[[VAL_UNBOX]]#0 : (!fir.ref>) -> !fir.ref>> ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_CAST]](%{{.*}}) typeparams %[[VAL_UNBOX]]#1{{.*}}{uniq_name = "_QFsimple_charEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFsimple_charEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_SS:.*]] = fir.shape_shift %{{.*}}, %{{.*}} : (index, index) -> !fir.shapeshift<1> ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.slice<1> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1(%[[VAL_SS]]) {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] typeparams %[[VAL_UNBOX]]#1 : (!fir.ref>>, !fir.shapeshift<1>, !fir.slice<1>, index, index) -> !fir.ref> ! CHECK: %[[ELEM_I8:.*]] = fir.convert %[[ELEM]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[LEN_I64:.*]] = fir.convert %[[VAL_UNBOX]]#1 : (index) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranAioInputAscii(%[[VAL_BEGIN]], %[[ELEM_I8]], %[[LEN_I64]]) {{.*}}: (!fir.ref, !fir.ref, i64) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPsubstring( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.box>>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_I_ARG:.*]]: !fir.ref{{.*}}, %[[VAL_J_ARG:.*]]: !fir.ref{{.*}}) { subroutine substring(x, y, i, j) integer :: y(3), i, j character(*) :: x(:) read(*,*) x(y)(i:j) ! CHECK: %[[VAL_I:.*]]:2 = hlfir.declare %[[VAL_I_ARG]]{{.*}}{uniq_name = "_QFsubstringEi"} ! CHECK: %[[VAL_J:.*]]:2 = hlfir.declare %[[VAL_J_ARG]]{{.*}}{uniq_name = "_QFsubstringEj"} ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]]{{.*}}{uniq_name = "_QFsubstringEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFsubstringEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_I_LD:.*]] = fir.load %[[VAL_I]]#0 : !fir.ref ! CHECK: %[[VAL_I_I64:.*]] = fir.convert %[[VAL_I_LD]] : (i32) -> i64 ! CHECK: %[[VAL_I_IDX:.*]] = fir.convert %[[VAL_I_I64]] : (i64) -> index ! CHECK: %[[VAL_J_LD:.*]] = fir.load %[[VAL_J]]#0 : !fir.ref ! CHECK: %[[VAL_J_I64:.*]] = fir.convert %[[VAL_J_LD]] : (i32) -> i64 ! CHECK: %[[VAL_J_IDX:.*]] = fir.convert %[[VAL_J_I64]] : (i64) -> index ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.slice<1> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1 {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] : (!fir.box>>, !fir.slice<1>, index) -> !fir.ref> ! CHECK: %[[OFFSET:.*]] = arith.subi %[[VAL_I_IDX]], %{{.*}} : index ! CHECK: %[[ELEM_AS_ARR:.*]] = fir.convert %[[ELEM]] : (!fir.ref>) -> !fir.ref>> ! CHECK: %[[SUBSTR:.*]] = fir.coordinate_of %[[ELEM_AS_ARR]], %[[OFFSET]] : (!fir.ref>>, index) -> !fir.ref> ! CHECK: %[[SUBSTR_AS_C1Q:.*]] = fir.convert %[[SUBSTR]] : (!fir.ref>) -> !fir.ref> ! CHECK: %[[LEN_DIFF:.*]] = arith.subi %[[VAL_J_IDX]], %[[VAL_I_IDX]] : index ! CHECK: %[[LEN_PLUS_1:.*]] = arith.addi %[[LEN_DIFF]], %{{.*}} : index ! CHECK: %[[LT0:.*]] = arith.cmpi slt, %[[LEN_PLUS_1]], %{{.*}} : index ! CHECK: %[[LEN:.*]] = arith.select %[[LT0]], %{{.*}}, %[[LEN_PLUS_1]] : index ! CHECK: %[[ELEM_I8:.*]] = fir.convert %[[SUBSTR_AS_C1Q]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[LEN_I64:.*]] = fir.convert %[[LEN]] : (index) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranAioInputAscii(%[[VAL_BEGIN]], %[[ELEM_I8]], %[[LEN_I64]]) {{.*}}: (!fir.ref, !fir.ref, i64) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPcomplex_part( ! CHECK-SAME: %[[VAL_Z_ARG:.*]]: !fir.box>>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.box>{{.*}}) { subroutine complex_part(z, y) integer :: y(:) complex :: z(:) read(*,*) z(y)%IM ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]]{{.*}}{uniq_name = "_QFcomplex_partEy"} ! CHECK: %[[VAL_Z:.*]]:2 = hlfir.declare %[[VAL_Z_ARG]]{{.*}}{uniq_name = "_QFcomplex_partEz"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_DIMS:.*]]:3 = fir.box_dims %[[VAL_Y]]#1, %{{.*}} : (!fir.box>, index) -> (index, index, index) ! CHECK: %[[VAL_C1I32:.*]] = arith.constant 1 : i32 ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %[[VAL_DIMS]]#1, %{{.*}} path %[[VAL_C1I32]] : (index, index, index, i32) -> !fir.slice<1> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#1, %[[IDX]] : (!fir.box>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_Z]]#1 {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] : (!fir.box>>, !fir.slice<1>, index) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputReal32(%[[VAL_BEGIN]], %[[ELEM]]) {{.*}}: (!fir.ref, !fir.ref) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine module derived_types type t integer :: i character(2) :: c end type type t2 type(t) :: a(5,5) end type end module ! CHECK-LABEL: func @_QPsimple_derived( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.ref}>>>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.ref>{{.*}}) { subroutine simple_derived(x, y) use derived_types integer :: y(4) type(t) :: x(3:8) read(*,*) x(y) ! CHECK: %[[VAL_SS:.*]] = fir.shape_shift %{{.*}}, %{{.*}} : (index, index) -> !fir.shapeshift<1> ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]](%[[VAL_SS]]){{.*}}{uniq_name = "_QFsimple_derivedEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFsimple_derivedEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_SS2:.*]] = fir.shape_shift %{{.*}}, %{{.*}} : (index, index) -> !fir.shapeshift<1> ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.slice<1> ! CHECK: fir.do_loop %[[IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#0, %[[IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1(%[[VAL_SS2]]) {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] : (!fir.ref}>>>, !fir.shapeshift<1>, !fir.slice<1>, index) -> !fir.ref}>> ! CHECK: %[[ELEM_BOX:.*]] = fir.embox %[[ELEM]] : (!fir.ref}>>) -> !fir.box}>> ! CHECK: %[[ELEM_BOX_NONE:.*]] = fir.convert %[[ELEM_BOX]] : (!fir.box}>>) -> !fir.box ! CHECK: %{{.*}} = fir.call @_FortranAioInputDerivedType(%[[VAL_BEGIN]], %[[ELEM_BOX_NONE]], {{.*}}) {{.*}}: (!fir.ref, !fir.box, !fir.ref) -> i1 ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPwith_path( ! CHECK-SAME: %[[VAL_B_ARG:.*]]: !fir.box}>>}>>>{{.*}}, %[[VAL_I_ARG:.*]]: !fir.box>{{.*}}) { subroutine with_path(b, i) use derived_types type(t2) :: b(4:, 4:, 4:) integer :: i(:) read (*, *) b(5, i, 8:9:1)%a(4,5)%i ! CHECK: %[[VAL_SHIFT:.*]] = fir.shift %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.shift<3> ! CHECK: %[[VAL_B:.*]]:2 = hlfir.declare %[[VAL_B_ARG]](%[[VAL_SHIFT]]){{.*}}{uniq_name = "_QFwith_pathEb"} ! CHECK: %[[VAL_I:.*]]:2 = hlfir.declare %[[VAL_I_ARG]]{{.*}}{uniq_name = "_QFwith_pathEi"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[VAL_DIMS:.*]]:3 = fir.box_dims %[[VAL_I]]#1, %{{.*}} : (!fir.box>, index) -> (index, index, index) ! CHECK: %[[VAL_FIELD_A:.*]] = fir.field_index a, !fir.type<_QMderived_typesTt2{a:!fir.array<5x5x!fir.type<_QMderived_typesTt{i:i32,c:!fir.char<1,2>}>>}> ! CHECK: %[[VAL_FIELD_I:.*]] = fir.field_index i, !fir.type<_QMderived_typesTt{i:i32,c:!fir.char<1,2>}> ! CHECK: %[[VAL_SHIFT2:.*]] = fir.shift %{{.*}}, %{{.*}}, %{{.*}} : (index, index, index) -> !fir.shift<3> ! CHECK: %[[VAL_UNDEF:.*]] = fir.undefined index ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %[[VAL_UNDEF]], %[[VAL_UNDEF]], %{{.*}}, %[[VAL_DIMS]]#1, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} path %[[VAL_FIELD_A]], %{{.*}}, %{{.*}}, %[[VAL_FIELD_I]] : (i64, index, index, index, index, index, index, index, index, !fir.field, i64, i64, !fir.field) -> !fir.slice<3> ! CHECK: fir.do_loop %[[IDX_OUTER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: fir.do_loop %[[IDX_INNER:.*]] = %{{.*}} to %{{.*}} step %{{.*}} { ! CHECK: %[[FIVE_IDX:.*]] = fir.convert %{{.*}} : (i64) -> index ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_I]]#1, %[[IDX_INNER]] : (!fir.box>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_B]]#1(%[[VAL_SHIFT2]]) {{\[}}%[[VAL_SLICE]]] %[[FIVE_IDX]], %[[VEL_IDX]], %[[IDX_OUTER]] : (!fir.box}>>}>>>, !fir.shift<3>, !fir.slice<3>, index, index, index) -> !fir.ref ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (!fir.ref) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputInteger(%[[VAL_BEGIN]], %[[ELEM_I64]], %{{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: } ! CHECK: } ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPsimple_iostat( ! CHECK-SAME: %[[VAL_X_ARG:.*]]: !fir.box>{{.*}}, %[[VAL_Y_ARG:.*]]: !fir.box>{{.*}}, %[[VAL_J_ARG:.*]]: !fir.ref{{.*}}, %[[VAL_STAT_ARG:.*]]: !fir.ref{{.*}}) { subroutine simple_iostat(x, y, j, stat) integer :: j, y(:), stat real :: x(:) read(*, *, iostat=stat) x(y), j ! CHECK: %[[VAL_J:.*]]:2 = hlfir.declare %[[VAL_J_ARG]]{{.*}}{uniq_name = "_QFsimple_iostatEj"} ! CHECK: %[[VAL_STAT:.*]]:2 = hlfir.declare %[[VAL_STAT_ARG]]{{.*}}{uniq_name = "_QFsimple_iostatEstat"} ! CHECK: %[[VAL_X:.*]]:2 = hlfir.declare %[[VAL_X_ARG]]{{.*}}{uniq_name = "_QFsimple_iostatEx"} ! CHECK: %[[VAL_Y:.*]]:2 = hlfir.declare %[[VAL_Y_ARG]]{{.*}}{uniq_name = "_QFsimple_iostatEy"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: fir.call @_FortranAioEnableHandlers(%[[VAL_BEGIN]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref, i1, i1, i1, i1, i1) -> () ! CHECK: %[[VAL_DIMS:.*]]:3 = fir.box_dims %[[VAL_Y]]#1, %{{.*}} : (!fir.box>, index) -> (index, index, index) ! CHECK: %[[VAL_TRUE:.*]] = arith.constant true ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %{{.*}}, %[[VAL_DIMS]]#1, %{{.*}} : (index, index, index) -> !fir.slice<1> ! CHECK: %[[BOUND:.*]] = arith.subi %[[VAL_DIMS]]#1, %{{.*}} : index ! CHECK: %[[ITER_RES:.*]] = fir.iterate_while (%[[IDX:.*]] = %{{.*}} to %[[BOUND]] step %{{.*}}) and (%[[COND:.*]] = %[[VAL_TRUE]]) { ! CHECK: %[[VEL:.*]] = fir.coordinate_of %[[VAL_Y]]#1, %[[IDX]] : (!fir.box>, index) -> !fir.ref ! CHECK: %[[VEL_LD:.*]] = fir.load %[[VEL]] : !fir.ref ! CHECK: %[[VEL_IDX:.*]] = fir.convert %[[VEL_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_X]]#1 {{\[}}%[[VAL_SLICE]]] %[[VEL_IDX]] : (!fir.box>, !fir.slice<1>, index) -> !fir.ref ! CHECK: %[[OK:.*]] = fir.call @_FortranAioInputReal32(%[[VAL_BEGIN]], %[[ELEM]]) {{.*}}: (!fir.ref, !fir.ref) -> i1 ! CHECK: fir.result %[[OK]] : i1 ! CHECK: } ! CHECK: fir.if %[[ITER_RES]] { ! CHECK: %[[J_I64:.*]] = fir.convert %[[VAL_J]]#0 : (!fir.ref) -> !fir.ref ! CHECK: %{{.*}} = fir.call @_FortranAioInputInteger(%[[VAL_BEGIN]], %[[J_I64]], %{{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: } ! CHECK: %[[END_ST:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: fir.store %[[END_ST]] to %[[VAL_STAT]]#0 : !fir.ref ! CHECK: return end subroutine ! CHECK-LABEL: func @_QPiostat_in_io_loop( ! CHECK-SAME: %[[VAL_K_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_J_ARG:.*]]: !fir.ref>{{.*}}, %[[VAL_STAT_ARG:.*]]: !fir.ref{{.*}}) { subroutine iostat_in_io_loop(k, j, stat) integer :: k(3, 5) integer :: j(3) integer :: stat read(*, *, iostat=stat) (k(i, j), i=1,3,1) ! CHECK: %[[VAL_I_ALLOC:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFiostat_in_io_loopEi"} ! CHECK: %[[VAL_I:.*]]:2 = hlfir.declare %[[VAL_I_ALLOC]] {uniq_name = "_QFiostat_in_io_loopEi"} ! CHECK: %[[VAL_J:.*]]:2 = hlfir.declare %[[VAL_J_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFiostat_in_io_loopEj"} ! CHECK: %[[VAL_K:.*]]:2 = hlfir.declare %[[VAL_K_ARG]](%{{.*}}){{.*}}{uniq_name = "_QFiostat_in_io_loopEk"} ! CHECK: %[[VAL_STAT:.*]]:2 = hlfir.declare %[[VAL_STAT_ARG]]{{.*}}{uniq_name = "_QFiostat_in_io_loopEstat"} ! CHECK: %[[VAL_BEGIN:.*]] = fir.call @_FortranAioBeginExternalListInput({{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: fir.call @_FortranAioEnableHandlers(%[[VAL_BEGIN]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref, i1, i1, i1, i1, i1) -> () ! CHECK: %[[VAL_TRUE:.*]] = arith.constant true ! CHECK: %[[OUTER:.*]]:2 = fir.iterate_while (%[[I_IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}}) and (%[[I_COND:.*]] = %[[VAL_TRUE]]) -> (index, i1) { ! CHECK: %[[I_AS_I32:.*]] = fir.convert %[[I_IDX]] : (index) -> i32 ! CHECK: fir.store %[[I_AS_I32]] to %[[VAL_I]]#0 : !fir.ref ! CHECK: %[[INNER_RES:.*]] = fir.if %[[I_COND]] -> (i1) { ! CHECK: %[[I_LD:.*]] = fir.load %[[VAL_I]]#0 : !fir.ref ! CHECK: %[[I_I64:.*]] = fir.convert %[[I_LD]] : (i32) -> i64 ! CHECK: %[[K_SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2> ! CHECK: %[[VAL_UNDEF:.*]] = fir.undefined index ! CHECK: %[[VAL_SLICE:.*]] = fir.slice %[[I_I64]], %[[VAL_UNDEF]], %[[VAL_UNDEF]], %{{.*}}, %{{.*}}, %{{.*}} : (i64, index, index, index, index, index) -> !fir.slice<2> ! CHECK: %[[INNER_ITER:.*]] = fir.iterate_while (%[[J_IDX:.*]] = %{{.*}} to %{{.*}} step %{{.*}}) and (%{{.*}} = %[[I_COND]]) { ! CHECK: %[[I_AS_IDX:.*]] = fir.convert %[[I_I64]] : (i64) -> index ! CHECK: %[[J_EL:.*]] = fir.coordinate_of %[[VAL_J]]#0, %[[J_IDX]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[J_LD:.*]] = fir.load %[[J_EL]] : !fir.ref ! CHECK: %[[J_AS_IDX:.*]] = fir.convert %[[J_LD]] : (i32) -> index ! CHECK: %[[ELEM:.*]] = fir.array_coor %[[VAL_K]]#0(%[[K_SHAPE]]) {{\[}}%[[VAL_SLICE]]] %[[I_AS_IDX]], %[[J_AS_IDX]] : (!fir.ref>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (!fir.ref) -> !fir.ref ! CHECK: %[[OK:.*]] = fir.call @_FortranAioInputInteger(%[[VAL_BEGIN]], %[[ELEM_I64]], %{{.*}}) {{.*}}: (!fir.ref, !fir.ref, i32) -> i1 ! CHECK: fir.result %[[OK]] : i1 ! CHECK: } ! CHECK: fir.result %[[INNER_ITER]] : i1 ! CHECK: } else { ! CHECK: fir.result %{{.*}} : i1 ! CHECK: } ! CHECK: %{{.*}} = arith.addi %[[I_IDX]], %{{.*}} overflow : index ! CHECK: %{{.*}} = arith.select %[[INNER_RES]], %{{.*}}, %[[I_IDX]] : index ! CHECK: fir.result %{{.*}}, %[[INNER_RES]] : index, i1 ! CHECK: } ! CHECK: %[[FINAL_I:.*]] = fir.convert %[[OUTER]]#0 : (index) -> i32 ! CHECK: fir.store %[[FINAL_I]] to %[[VAL_I]]#0 : !fir.ref ! CHECK: %[[END_ST:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_BEGIN]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: fir.store %[[END_ST]] to %[[VAL_STAT]]#0 : !fir.ref ! CHECK: return end subroutine