case 'Z':
return EditBOZOutput<4>(
io, edit, reinterpret_cast<const unsigned char *>(&n), KIND);
+ case 'L':
+ return EditLogicalOutput(io, edit, *reinterpret_cast<const char *>(&n));
case 'A': // legacy extension
return EditCharacterOutput(
io, edit, reinterpret_cast<char *>(&n), sizeof n);
common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3);
case 'G':
return Edit(EditForGOutput(edit));
+ case 'L':
+ return EditLogicalOutput(io_, edit, *reinterpret_cast<const char *>(&x_));
case 'A': // legacy extension
return EditCharacterOutput(
io_, edit, reinterpret_cast<char *>(&x_), sizeof x_);
case 'Z':
return EditBOZOutput<4>(io, edit,
reinterpret_cast<const unsigned char *>(x), sizeof(CHAR) * length);
+ case 'L':
+ return EditLogicalOutput(io, edit, *reinterpret_cast<const char *>(x));
default:
io.GetIoErrorHandler().SignalError(IostatErrorInFormat,
"Data edit descriptor '%c' may not be used with a CHARACTER data item",
--- /dev/null
+//===-- flang/unittests/Runtime/LogicalFormatTest.cpp -----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CrashHandlerFixture.h"
+#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/io-api.h"
+#include <algorithm>
+#include <array>
+#include <cstring>
+#include <gtest/gtest.h>
+#include <tuple>
+
+using namespace Fortran::runtime;
+using namespace Fortran::runtime::io;
+
+TEST(IOApiTests, LogicalFormatTest) {
+ static constexpr int bufferSize{29};
+ char buffer[bufferSize];
+
+ // Create format for all types and values to be written
+ const char *format{"(L,L3,I3,L2,L2,I3,L2,A3,L2,L,F4.1,L2)"};
+ auto cookie{IONAME(BeginInternalFormattedOutput)(
+ buffer, bufferSize, format, std::strlen(format))};
+
+ // Write string, integer, and logical values to buffer
+ IONAME(OutputLogical)(cookie, true);
+ IONAME(OutputLogical)(cookie, false);
+ IONAME(OutputInteger64)(cookie, 6);
+ IONAME(OutputInteger32)(cookie, 22);
+ IONAME(OutputInteger32)(cookie, 0);
+ IONAME(OutputInteger32)(cookie, -2);
+ IONAME(OutputCharacter)(cookie, "ABC", 3);
+ IONAME(OutputCharacter)(cookie, "AB", 2);
+ IONAME(OutputReal64)(cookie, 0.0);
+ IONAME(OutputCharacter)(cookie, "", 0);
+ IONAME(OutputReal32)(cookie, 2.3);
+ IONAME(OutputReal32)(cookie, 2.3);
+
+ // Ensure IO succeeded
+ auto status{IONAME(EndIoStatement)(cookie)};
+ ASSERT_EQ(status, 0) << "logical format: '" << format << "' failed, status "
+ << static_cast<int>(status);
+
+ // Ensure final buffer matches expected string output
+ static const std::string expect{"T F 6 T F -2 T AB FF 2.3 T"};
+
+ // expect.size() == bufferSize - 1
+ std::string bufferStr = std::string(buffer, bufferSize - 1);
+ ASSERT_TRUE(expect == bufferStr)
+ << "Expected '" << expect << "', got '" << bufferStr << "'";
+}