Files
clang-p2996/flang-rt/unittests/FortranRuntime/LogicalFormatTest.cpp
Paul Scoropan 6403287eff [Flang] [FlangRT] Introduce FlangRT project as solution to Flang's runtime LLVM integration
See discourse thread https://discourse.llvm.org/t/rfc-support-cmake-option-to-control-link-type-built-for-flang-runtime-libraries/71602/18 for full details.

Flang-rt is the new library target for the flang runtime libraries. It builds the Flang-rt library (which contains the sources of FortranRuntime and FortranDecimal) and the Fortran_main library. See documentation in this patch for detailed description (flang-rt/docs/GettingStarted.md).

This patch aims to:
- integrate Flang's runtime into existing llvm infrasturcture so that Flang's runtime can be built similarly to other runtimes via the runtimes target or via the llvm target as an enabled runtime
- decouple the FortranDecimal library sources that were used by both compiler and runtime so that different build configurations can be applied for compiler vs runtime
- add support for running flang-rt testsuites, which were created by migrating relevant tests from `flang/test` and `flang/unittest` to `flang-rt/test` and `flang-rt/unittest`, using a new `check-flang-rt` target.
- provide documentation on how to build and use the new FlangRT runtime

Reviewed By: DanielCChen

Differential Revision: https://reviews.llvm.org/D154869
2023-09-30 12:35:33 -04:00

57 lines
2.0 KiB
C++

//===-- 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 << "'";
}