Skip to content

Commit e9d0f8b

Browse files
committed
[flang] Don't drop format string for external child I/O
In user-defined derived type I/O to an external unit, don't omit the format string from the constructor of ChildFormattedIoStatement. And include any user IOMSG text in the crash message of the parent, if it doesn't catch errors. Differential Revision: https://reviews.llvm.org/D117903
1 parent 26fffc1 commit e9d0f8b

File tree

3 files changed

+8
-4
lines changed

3 files changed

+8
-4
lines changed

flang/runtime/format-implementation.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ DataEdit FormatControl<CONTEXT>::GetNextDataEdit(
353353
++offset_;
354354
}
355355
} else if (edit.descriptor == 'D' && Capitalize(PeekNext()) == 'T') {
356-
// DT'iotype'(v_list) user-defined derived type I/O
356+
// DT['iotype'][(v_list)] user-defined derived type I/O
357357
edit.descriptor = DataEdit::DefinedDerivedType;
358358
++offset_;
359359
if (auto quote{static_cast<char>(PeekNext())};

flang/runtime/io-api.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ Cookie BeginExternalFormattedIO(const char *format, std::size_t formatLength,
215215
: "formatted input",
216216
false, DIR)
217217
? &child->BeginIoStatement<ChildFormattedIoStatementState<DIR>>(
218-
*child, sourceFile, sourceLine)
218+
*child, format, formatLength, sourceFile, sourceLine)
219219
: nullptr;
220220
} else {
221221
IoErrorHandler handler{terminator};

flang/runtime/io-error.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,14 @@ void IoErrorHandler::SignalError(int iostatOrErrno) {
5959

6060
void IoErrorHandler::Forward(
6161
int ioStatOrErrno, const char *msg, std::size_t length) {
62-
SignalError(ioStatOrErrno);
63-
if (ioStat_ != IostatOk && (flags_ & hasIoMsg)) {
62+
if (ioStat_ != IostatOk && msg && (flags_ & hasIoMsg)) {
6463
ioMsg_ = SaveDefaultCharacter(msg, length, *this);
6564
}
65+
if (ioStatOrErrno != IostatOk && msg) {
66+
SignalError(ioStatOrErrno, "%.*s", static_cast<int>(length), msg);
67+
} else {
68+
SignalError(ioStatOrErrno);
69+
}
6670
}
6771

6872
void IoErrorHandler::SignalErrno() { SignalError(errno); }

0 commit comments

Comments
 (0)