[flang] Fix descriptor-based array data item I/O for list-directed CHARACTER & LOGICAL

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().

Differential revision: https://reviews.llvm.org/D88606
This commit is contained in:
peter klausler 2020-09-30 12:43:21 -07:00
parent ae4c400e02
commit 0c3c8f4ae6
2 changed files with 44 additions and 8 deletions

View File

@ -159,13 +159,13 @@ inline bool FormattedCharacterIO(
}
}
}
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 @@ inline bool FormattedLogicalIO(
}
}
}
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;
}

View File

@ -118,6 +118,41 @@ static void listInputTest() {
}
}
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 @@ int main() {
realInTest("(DC,F18.0)", " 12,5", 0x4029000000000000);
listInputTest();
descrOutputTest();
return EndTests();
}