diff --git a/flang/runtime/io-api.cpp b/flang/runtime/io-api.cpp --- a/flang/runtime/io-api.cpp +++ b/flang/runtime/io-api.cpp @@ -843,6 +843,35 @@ return false; } +bool IONAME(OutputReal32)(Cookie cookie, float x) { + IoStatementState &io{*cookie}; + if (!io.get_if()) { + io.GetIoErrorHandler().Crash( + "OutputReal32() called for a non-output I/O statement"); + return false; + } + if (auto edit{io.GetNextDataEdit()}) { + return RealOutputEditing<24>{io, x}.Edit(*edit); + } + return false; +} + +bool IONAME(InputReal32)(Cookie cookie, float &x) { + IoStatementState &io{*cookie}; + if (!io.get_if()) { + io.GetIoErrorHandler().Crash( + "InputReal32() called for a non-input I/O statement"); + return false; + } + if (auto edit{io.GetNextDataEdit()}) { + if (edit->descriptor == DataEdit::ListDirectedNullValue) { + return true; + } + return EditRealInput<24>(io, *edit, reinterpret_cast(&x)); + } + return false; +} + bool IONAME(OutputReal64)(Cookie cookie, double x) { IoStatementState &io{*cookie}; if (!io.get_if()) { @@ -872,6 +901,18 @@ return false; } +bool IONAME(OutputComplex32)(Cookie cookie, float r, float z) { + IoStatementState &io{*cookie}; + if (io.get_if>()) { + DataEdit real, imaginary; + real.descriptor = DataEdit::ListDirectedRealPart; + imaginary.descriptor = DataEdit::ListDirectedImaginaryPart; + return RealOutputEditing<24>{io, r}.Edit(real) && + RealOutputEditing<24>{io, z}.Edit(imaginary); + } + return IONAME(OutputReal32)(cookie, r) && IONAME(OutputReal32)(cookie, z); +} + bool IONAME(OutputComplex64)(Cookie cookie, double r, double z) { IoStatementState &io{*cookie}; if (io.get_if>()) {