brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 2b91e90 Raw
77 lines · c
1//===- ErrorCollector.h -----------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===-----------------------------------------------------------------------===/8///9/// This class collects errors that should be reported or ignored in aggregate.10///11/// Like llvm::Error, an ErrorCollector cannot be copied. Unlike llvm::Error,12/// an ErrorCollector may be destroyed if it was originally constructed to treat13/// errors as non-fatal. In this case, all Errors are consumed upon destruction.14/// An ErrorCollector may be initially constructed (or escalated) such that15/// errors are treated as fatal. This causes a crash if an attempt is made to16/// delete the ErrorCollector when some Errors have not been retrieved via17/// makeError().18///19//===-----------------------------------------------------------------------===/20 21#ifndef LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H22#define LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H23 24#include "llvm/Support/Error.h"25#include "llvm/Support/raw_ostream.h"26#include <vector>27 28namespace llvm {29 30namespace ifs {31 32class ErrorCollector {33public:34  /// Upon destruction, an ErrorCollector will crash if UseFatalErrors=true and35  /// there are remaining errors that haven't been fetched by makeError().36  ErrorCollector(bool UseFatalErrors = true) : ErrorsAreFatal(UseFatalErrors) {}37  // Don't allow copying.38  ErrorCollector(const ErrorCollector &Stub) = delete;39  ErrorCollector &operator=(const ErrorCollector &Other) = delete;40  ~ErrorCollector();41 42  // TODO: Add move constructor and operator= when a testable situation arises.43 44  /// Returns a single error that contains messages for all stored Errors.45  Error makeError();46 47  /// Adds an error with a descriptive tag that helps with identification.48  /// If the error is an Error::success(), it is checked and discarded.49  void addError(Error &&E, StringRef Tag);50 51  /// This ensures an ErrorCollector will treat unhandled errors as fatal.52  /// This function should be called if errors that usually can be ignored53  /// are suddenly of concern (i.e. attempt multiple things that return Error,54  /// but only care about the Errors if no attempt succeeds).55  void escalateToFatal();56 57private:58  /// Logs all errors to a raw_ostream.59  void log(raw_ostream &OS);60 61  /// Returns true if all errors have been retrieved through makeError(), or62  /// false if errors have been added since the last makeError() call.63  bool allErrorsHandled() const;64 65  /// Dump output and crash.66  [[noreturn]] void fatalUnhandledError();67 68  bool ErrorsAreFatal;69  std::vector<Error> Errors;70  std::vector<std::string> Tags;71};72 73} // end namespace ifs74} // end namespace llvm75 76#endif // LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H77