|  | //===- ErrorCollector.h -----------------------------------------*- 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 | 
|  | // | 
|  | //===-----------------------------------------------------------------------===/ | 
|  | /// | 
|  | /// This class collects errors that should be reported or ignored in aggregate. | 
|  | /// | 
|  | /// Like llvm::Error, an ErrorCollector cannot be copied. Unlike llvm::Error, | 
|  | /// an ErrorCollector may be destroyed if it was originally constructed to treat | 
|  | /// errors as non-fatal. In this case, all Errors are consumed upon destruction. | 
|  | /// An ErrorCollector may be initially constructed (or escalated) such that | 
|  | /// errors are treated as fatal. This causes a crash if an attempt is made to | 
|  | /// delete the ErrorCollector when some Errors have not been retrieved via | 
|  | /// makeError(). | 
|  | /// | 
|  | //===-----------------------------------------------------------------------===/ | 
|  |  | 
|  | #ifndef LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H | 
|  | #define LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H | 
|  |  | 
|  | #include "llvm/Support/Error.h" | 
|  | #include <vector> | 
|  |  | 
|  | namespace llvm { | 
|  | namespace ifs { | 
|  |  | 
|  | class ErrorCollector { | 
|  | public: | 
|  | /// Upon destruction, an ErrorCollector will crash if UseFatalErrors=true and | 
|  | /// there are remaining errors that haven't been fetched by makeError(). | 
|  | ErrorCollector(bool UseFatalErrors = true) : ErrorsAreFatal(UseFatalErrors) {} | 
|  | // Don't allow copying. | 
|  | ErrorCollector(const ErrorCollector &Stub) = delete; | 
|  | ErrorCollector &operator=(const ErrorCollector &Other) = delete; | 
|  | ~ErrorCollector(); | 
|  |  | 
|  | // TODO: Add move constructor and operator= when a testable situation arises. | 
|  |  | 
|  | /// Returns a single error that contains messages for all stored Errors. | 
|  | Error makeError(); | 
|  |  | 
|  | /// Adds an error with a descriptive tag that helps with identification. | 
|  | /// If the error is an Error::success(), it is checked and discarded. | 
|  | void addError(Error &&E, StringRef Tag); | 
|  |  | 
|  | /// This ensures an ErrorCollector will treat unhandled errors as fatal. | 
|  | /// This function should be called if errors that usually can be ignored | 
|  | /// are suddenly of concern (i.e. attempt multiple things that return Error, | 
|  | /// but only care about the Errors if no attempt succeeds). | 
|  | void escalateToFatal(); | 
|  |  | 
|  | private: | 
|  | /// Logs all errors to a raw_ostream. | 
|  | void log(raw_ostream &OS); | 
|  |  | 
|  | /// Returns true if all errors have been retrieved through makeError(), or | 
|  | /// false if errors have been added since the last makeError() call. | 
|  | bool allErrorsHandled() const; | 
|  |  | 
|  | /// Dump output and crash. | 
|  | [[noreturn]] void fatalUnhandledError(); | 
|  |  | 
|  | bool ErrorsAreFatal; | 
|  | std::vector<Error> Errors; | 
|  | std::vector<std::string> Tags; | 
|  | }; | 
|  |  | 
|  | } // end namespace ifs | 
|  | } // end namespace llvm | 
|  |  | 
|  | #endif // LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H |