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 @@ -99,7 +99,7 @@ mkIOKey(SetFile), mkIOKey(GetNewUnit), mkIOKey(GetSize), mkIOKey(GetIoLength), mkIOKey(GetIoMsg), mkIOKey(InquireCharacter), mkIOKey(InquireLogical), mkIOKey(InquirePendingId), - mkIOKey(InquireInteger64), mkIOKey(EndIoStatement)> + mkIOKey(InquireInteger64), mkIOKey(EndIoStatement), mkIOKey(SetConvert)> newIOTable; } // namespace Fortran::lower @@ -983,7 +983,8 @@ ioFunc = getIORuntimeFunc(loc, builder); break; case Fortran::parser::ConnectSpec::CharExpr::Kind::Convert: - TODO(loc, "CONVERT not part of the runtime::io interface"); + ioFunc = getIORuntimeFunc(loc, builder); + break; case Fortran::parser::ConnectSpec::CharExpr::Kind::Dispose: TODO(loc, "DISPOSE not part of the runtime::io interface"); } diff --git a/flang/test/Lower/io-statement-open-options.f90 b/flang/test/Lower/io-statement-open-options.f90 new file mode 100755 --- /dev/null +++ b/flang/test/Lower/io-statement-open-options.f90 @@ -0,0 +1,20 @@ +! Test lowering of OPEN statment options +! RUN: bbc %s -emit-fir -o - | FileCheck %s + +! CHECK-LABEL: func.func @_QPtest_convert_specifier( +subroutine test_convert_specifier(unit) + integer :: unit + ! CHECK: %[[cookie:.*]] = fir.call @_FortranAioBeginOpenUnit(%{{.*}}, %{{.*}}, %{{.*}}) : (i32, !fir.ref, i32) -> !fir.ref + ! CHECK: %[[be_str:.*]] = fir.address_of(@[[be_str_name:.*]]) : !fir.ref> + ! CHECK: %[[len:.*]] = arith.constant 10 : index + ! CHECK: %[[be_str_conv:.*]] = fir.convert %[[be_str]] : (!fir.ref>) -> !fir.ref + ! CHECK: %[[len_conv:.*]] = fir.convert %[[len]] : (index) -> i64 + ! CHECK: %{{.*}} = fir.call @_FortranAioSetConvert(%[[cookie]], %[[be_str_conv]], %[[len_conv]]) : (!fir.ref, !fir.ref, i64) -> i1 + ! CHECK: %{{.*}} = fir.call @_FortranAioEndIoStatement(%[[cookie]]) : (!fir.ref) -> i32 + open(unit, form="UNFORMATTED", convert="BIG_ENDIAN") + close(unit) +end subroutine + +! CHECK: fir.global linkonce @[[be_str_name]] constant : !fir.char<1,10> { +! CHECK: %[[be_str_lit:.*]] = fir.string_lit "BIG_ENDIAN"(10) : !fir.char<1,10> +! CHECK: fir.has_value %[[be_str_lit]] : !fir.char<1,10>