Add new unit tests for external Fortran I/O that drive the Fortran I/O runtime API from C++ and exercise basic writing and read-back in the various combinations of access modes, record length variability, and formatting. Sequential modes are tested with positioning. More thorough tests written in Fortran will follow when they can be compiled and run. The Fortran runtime's error termination callback registration was extended with source file and line number positions for better failure messages in unit testing. Reviewed By: sscalpone Differential Revision: https://reviews.llvm.org/D83164
62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
//===-- runtime/terminate.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 "terminator.h"
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
|
|
namespace Fortran::runtime {
|
|
|
|
[[noreturn]] void Terminator::Crash(const char *message, ...) const {
|
|
va_list ap;
|
|
va_start(ap, message);
|
|
CrashArgs(message, ap);
|
|
}
|
|
|
|
static void (*crashHandler)(const char *, int, const char *, va_list &){
|
|
nullptr};
|
|
|
|
void Terminator::RegisterCrashHandler(
|
|
void (*handler)(const char *, int, const char *, va_list &)) {
|
|
crashHandler = handler;
|
|
}
|
|
|
|
[[noreturn]] void Terminator::CrashArgs(
|
|
const char *message, va_list &ap) const {
|
|
if (crashHandler) {
|
|
crashHandler(sourceFileName_, sourceLine_, message, ap);
|
|
}
|
|
std::fputs("\nfatal Fortran runtime error", stderr);
|
|
if (sourceFileName_) {
|
|
std::fprintf(stderr, "(%s", sourceFileName_);
|
|
if (sourceLine_) {
|
|
std::fprintf(stderr, ":%d", sourceLine_);
|
|
}
|
|
fputc(')', stderr);
|
|
}
|
|
std::fputs(": ", stderr);
|
|
std::vfprintf(stderr, message, ap);
|
|
fputc('\n', stderr);
|
|
va_end(ap);
|
|
io::FlushOutputOnCrash(*this);
|
|
NotifyOtherImagesOfErrorTermination();
|
|
std::abort();
|
|
}
|
|
|
|
[[noreturn]] void Terminator::CheckFailed(
|
|
const char *predicate, const char *file, int line) const {
|
|
Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, file,
|
|
line);
|
|
}
|
|
|
|
// TODO: These will be defined in the coarray runtime library
|
|
void NotifyOtherImagesOfNormalEnd() {}
|
|
void NotifyOtherImagesOfFailImageStatement() {}
|
|
void NotifyOtherImagesOfErrorTermination() {}
|
|
} // namespace Fortran::runtime
|