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