mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-25 13:00:11 +01:00
Previously, the program exit was triggered by the destructor. Unfortunately, C++ doesn't make it precisely clear where the destructor is run, and Clang doesn't generate reliable debug information for that to give good backtraces. Among other things, when combining separate cleanup regions in Clang there may be no single canonical location. Instead, move the ExitingStream system to use an explicit low-precedence operator overload to flush the output and exit. This ensures the stream and other actions are completed first but then immediately exits the program in a way that has a definitive source location and produces reliable backtraces. I've tried to add comments and helpers to make this as clear as possible given that it is a subtle and surprising issue. Co-authored-by: Geoff Romer <gromer@google.com>
41 lines
1.3 KiB
C++
41 lines
1.3 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#ifndef EXECUTABLE_SEMANTICS_COMMON_ERROR_H_
|
|
#define EXECUTABLE_SEMANTICS_COMMON_ERROR_H_
|
|
|
|
#include "common/check.h"
|
|
|
|
namespace Carbon {
|
|
|
|
// Prints an error and exits. This should be used for non-recoverable errors
|
|
// with user input.
|
|
//
|
|
// For example:
|
|
// FATAL_PROGRAM_ERROR(line_num) << "Line is bad!";
|
|
// FATAL_PROGRAM_ERROR_NO_LINE() << "Application is bad!";
|
|
//
|
|
// Where possible, try to identify the error as a compilation or
|
|
// runtime error. Use CHECK/FATAL for internal errors. The generic program error
|
|
// option is provided as a fallback for cases that don't fit those
|
|
// classifications.
|
|
|
|
#define FATAL_PROGRAM_ERROR_NO_LINE() RAW_EXITING_STREAM() << "PROGRAM ERROR: "
|
|
|
|
#define FATAL_PROGRAM_ERROR(line) FATAL_PROGRAM_ERROR_NO_LINE() << line << ": "
|
|
|
|
#define FATAL_COMPILATION_ERROR_NO_LINE() \
|
|
RAW_EXITING_STREAM() << "COMPILATION ERROR: "
|
|
|
|
#define FATAL_COMPILATION_ERROR(line) \
|
|
FATAL_COMPILATION_ERROR_NO_LINE() << line << ": "
|
|
|
|
#define FATAL_RUNTIME_ERROR_NO_LINE() RAW_EXITING_STREAM() << "RUNTIME ERROR: "
|
|
|
|
#define FATAL_RUNTIME_ERROR(line) FATAL_RUNTIME_ERROR_NO_LINE() << line << ": "
|
|
|
|
} // namespace Carbon
|
|
|
|
#endif // EXECUTABLE_SEMANTICS_COMMON_ERROR_H_
|