[flang-commits] [PATCH] D88606: Fix descriptor-based array data item I/O for list-directed CHARACTER & LOGICAL
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed Sep 30 12:47:42 PDT 2020
klausler created this revision.
klausler added a reviewer: tskeith.
klausler added a project: Flang.
Herald added a reviewer: jdoerfert.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
klausler requested review of this revision.
These types have to distinguish list-directed I/O from formatted I/O,
and the subscript incrementation call was in the formatted branch
of the if() rather than after the if().
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D88606
Files:
flang/runtime/descriptor-io.h
flang/unittests/Runtime/hello.cpp
Index: flang/unittests/Runtime/hello.cpp
===================================================================
--- flang/unittests/Runtime/hello.cpp
+++ flang/unittests/Runtime/hello.cpp
@@ -118,6 +118,41 @@
}
}
+static void descrOutputTest() {
+ char buffer[9];
+ // Formatted
+ const char *format{"(2A4)"};
+ auto cookie{IONAME(BeginInternalFormattedOutput)(
+ buffer, sizeof buffer, format, std::strlen(format))};
+ StaticDescriptor<1> staticDescriptor;
+ Descriptor &desc{staticDescriptor.descriptor()};
+ SubscriptValue extent[]{2};
+ char data[2][4];
+ std::memcpy(data[0], "ABCD", 4);
+ std::memcpy(data[1], "EFGH", 4);
+ desc.Establish(TypeCode{CFI_type_char}, sizeof data[0], &data, 1, extent);
+ desc.Dump();
+ desc.Check();
+ IONAME(OutputDescriptor)(cookie, desc);
+ if (auto status{IONAME(EndIoStatement)(cookie)}) {
+ Fail() << "descrOutputTest: '" << format << "' failed, status "
+ << static_cast<int>(status) << '\n';
+ } else {
+ test("descrOutputTest(formatted)", "ABCDEFGH ",
+ std::string{buffer, sizeof buffer});
+ }
+ // List-directed
+ cookie = IONAME(BeginInternalListOutput)(buffer, sizeof buffer);
+ IONAME(OutputDescriptor)(cookie, desc);
+ if (auto status{IONAME(EndIoStatement)(cookie)}) {
+ Fail() << "descrOutputTest: list-directed failed, status "
+ << static_cast<int>(status) << '\n';
+ } else {
+ test("descrOutputTest(list)", " ABCDEFGH",
+ std::string{buffer, sizeof buffer});
+ }
+}
+
static void realTest(const char *format, double x, const char *expect) {
char buffer[800];
auto cookie{IONAME(BeginInternalFormattedOutput)(
@@ -485,6 +520,7 @@
realInTest("(DC,F18.0)", " 12,5", 0x4029000000000000);
listInputTest();
+ descrOutputTest();
return EndTests();
}
Index: flang/runtime/descriptor-io.h
===================================================================
--- flang/runtime/descriptor-io.h
+++ flang/runtime/descriptor-io.h
@@ -159,13 +159,13 @@
}
}
}
- if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) {
- io.GetIoErrorHandler().Crash(
- "FormattedCharacterIO: subscripts out of bounds");
- }
} else {
return false;
}
+ if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) {
+ io.GetIoErrorHandler().Crash(
+ "FormattedCharacterIO: subscripts out of bounds");
+ }
}
return true;
}
@@ -198,13 +198,13 @@
}
}
}
- if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) {
- io.GetIoErrorHandler().Crash(
- "FormattedLogicalIO: subscripts out of bounds");
- }
} else {
return false;
}
+ if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) {
+ io.GetIoErrorHandler().Crash(
+ "FormattedLogicalIO: subscripts out of bounds");
+ }
}
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88606.295380.patch
Type: text/x-patch
Size: 2979 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20200930/723cffde/attachment.bin>
More information about the flang-commits
mailing list