diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp --- a/flang/lib/Lower/IO.cpp +++ b/flang/lib/Lower/IO.cpp @@ -599,9 +599,9 @@ const fir::ExtendedValue &item) { mlir::Type argType = inputFunc.getFunctionType().getInput(1); llvm::SmallVector inputFuncArgs = {cookie}; - if (argType.isa()) { + if (argType.isa()) { mlir::Value box = fir::getBase(item); - assert(box.getType().isa() && "must be previously emboxed"); + assert(box.getType().isa() && "must be previously emboxed"); inputFuncArgs.push_back(builder.createConvert(loc, argType, box)); } else { mlir::Value itemAddr = fir::getBase(item); diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90 --- a/flang/test/Lower/polymorphic.f90 +++ b/flang/test/Lower/polymorphic.f90 @@ -12,6 +12,10 @@ procedure :: elemental_fct procedure :: elemental_sub procedure, pass(this) :: elemental_sub_pass + procedure :: read_p1 + procedure :: write_p1 + generic :: read(formatted) => read_p1 + generic :: write(formatted) => write_p1 generic :: assignment(=) => assign_p1_int procedure :: host_assoc procedure, pass(poly) :: lt @@ -681,6 +685,43 @@ ! CHECK: fir.dispatch "elemental_sub_pass"(%[[EMBOXED]] : !fir.class>) (%{{.*}}, %[[EMBOXED]] : !fir.ref, !fir.class>) {pass_arg_pos = 1 : i32} ! CHECK: } + subroutine write_p1(dtv, unit, iotype, v_list, iostat, iomsg) + class(p1), intent(in) :: dtv + integer, intent(in) :: unit + character(*), intent(in) :: iotype + integer, intent(in) :: v_list(:) + integer, intent(out) :: iostat + character(*), intent(inout) :: iomsg + ! dummy subroutine for testing purpose + end subroutine + + subroutine read_p1(dtv, unit, iotype, v_list, iostat, iomsg) + class(p1), intent(inout) :: dtv + integer, intent(in) :: unit + character(*), intent(in) :: iotype + integer, intent(in) :: v_list(:) + integer, intent(out) :: iostat + character(*), intent(inout) :: iomsg + ! dummy subroutine for testing purpose + end subroutine + + subroutine test_polymorphic_io() + type(p1), target :: t + class(p1), pointer :: p + open(17, form='formatted', access='stream') + write(17, 1) t + 1 Format(1X,I10) + p => t + rewind(17) + read(17, 1) p + end subroutine + +! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_polymorphic_io() { +! CHECK: %[[P:.*]] = fir.alloca !fir.class>> {bindc_name = "p", uniq_name = "_QMpolymorphic_testFtest_polymorphic_ioEp"} +! CHECK: %[[LOAD_P:.*]] = fir.load %[[P]] : !fir.ref>>> +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[LOAD_P]] : (!fir.class>>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranAioInputDescriptor(%{{.*}}, %[[BOX_NONE]]) {{.*}} : (!fir.ref, !fir.box) -> i1 + end module program test