| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // 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 "llvm/Support/ErrorHandling.h"
- #include "llvm/Support/Signals.h"
- #include "llvm/Support/raw_ostream.h"
- namespace Carbon {
- namespace ErrorInternal {
- // An error-printing stream that exits on destruction.
- class ExitingStream {
- public:
- // Ends the error with a newline and exits.
- LLVM_ATTRIBUTE_NORETURN virtual ~ExitingStream() {
- llvm::errs() << "\n";
- exit(-1);
- }
- // Forward output to llvm::errs.
- template <typename T>
- ExitingStream& operator<<(const T& message) {
- llvm::errs() << message;
- return *this;
- }
- };
- } // namespace ErrorInternal
- // Prints an error and exits. This should be used for non-recoverable errors
- // with user input.
- //
- // For example:
- // FATAL_USER_ERROR(line_num) << "Line is bad!";
- // FATAL_USER_ERROR_NO_LINE() << "Application is bad!";
- //
- // Where possible, try to identify the error as a compilation error or runtime
- // error. The generic user error option is provided as a fallback for cases that
- // don't fit either of those classifications.
- #define FATAL_USER_ERROR_NO_LINE() ErrorInternal::ExitingStream() << "ERROR: "
- #define FATAL_USER_ERROR(line) FATAL_USER_ERROR_NO_LINE() << line << ": "
- #define FATAL_COMPILATION_ERROR_NO_LINE() \
- ErrorInternal::ExitingStream() << "COMPILATION ERROR: "
- #define FATAL_COMPILATION_ERROR(line) \
- FATAL_COMPILATION_ERROR_NO_LINE() << line << ": "
- #define FATAL_RUNTIME_ERROR_NO_LINE() \
- ErrorInternal::ExitingStream() << "RUNTIME ERROR: "
- #define FATAL_RUNTIME_ERROR(line) FATAL_RUNTIME_ERROR_NO_LINE() << line << ": "
- } // namespace Carbon
- #endif // EXECUTABLE_SEMANTICS_COMMON_ERROR_H_
|