LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/Support - Error.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 49.1 % 57 28
Test Date: 2026-02-27 05:14:50 Functions: 55.6 % 18 10
Legend: Lines:     hit not hit

            Line data    Source code
       1              : //===- llvm/Support/Error.h - Recoverable error handling --------*- 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-exception
       6              : //
       7              : //===----------------------------------------------------------------------===//
       8              : //
       9              : // This file defines an API used to report recoverable errors.
      10              : //
      11              : //===----------------------------------------------------------------------===//
      12              : 
      13              : #ifndef LLVM_SUPPORT_ERROR_H
      14              : #define LLVM_SUPPORT_ERROR_H
      15              : 
      16              : #include "llvm-c/Error.h"
      17              : #include "llvm/ADT/Twine.h"
      18              : #include "llvm/Config/abi-breaking.h"
      19              : #include "llvm/Support/AlignOf.h"
      20              : #include "llvm/Support/Compiler.h"
      21              : #include "llvm/Support/Debug.h"
      22              : #include "llvm/Support/ErrorHandling.h"
      23              : #include "llvm/Support/ErrorOr.h"
      24              : #include "llvm/Support/Format.h"
      25              : #include "llvm/Support/raw_ostream.h"
      26              : #include <cassert>
      27              : #include <cstdint>
      28              : #include <cstdlib>
      29              : #include <functional>
      30              : #include <memory>
      31              : #include <new>
      32              : #include <optional>
      33              : #include <string>
      34              : #include <system_error>
      35              : #include <type_traits>
      36              : #include <utility>
      37              : #include <vector>
      38              : 
      39              : namespace llvm {
      40              : 
      41              : class ErrorSuccess;
      42              : 
      43              : /// Base class for error info classes. Do not extend this directly: Extend
      44              : /// the ErrorInfo template subclass instead.
      45              : class ErrorInfoBase {
      46              : public:
      47              :   virtual ~ErrorInfoBase() = default;
      48              : 
      49              :   /// Print an error message to an output stream.
      50              :   virtual void log(raw_ostream &OS) const = 0;
      51              : 
      52              :   /// Return the error message as a string.
      53              :   virtual std::string message() const {
      54              :     std::string Msg;
      55              :     raw_string_ostream OS(Msg);
      56              :     log(OS);
      57              :     return Msg;
      58              :   }
      59              : 
      60              :   /// Convert this error to a std::error_code.
      61              :   ///
      62              :   /// This is a temporary crutch to enable interaction with code still
      63              :   /// using std::error_code. It will be removed in the future.
      64              :   virtual std::error_code convertToErrorCode() const = 0;
      65              : 
      66              :   // Returns the class ID for this type.
      67              :   static const void *classID() { return &ID; }
      68              : 
      69              :   // Returns the class ID for the dynamic type of this ErrorInfoBase instance.
      70              :   virtual const void *dynamicClassID() const = 0;
      71              : 
      72              :   // Check whether this instance is a subclass of the class identified by
      73              :   // ClassID.
      74              :   virtual bool isA(const void *const ClassID) const {
      75              :     return ClassID == classID();
      76              :   }
      77              : 
      78              :   // Check whether this instance is a subclass of ErrorInfoT.
      79              :   template <typename ErrorInfoT> bool isA() const {
      80              :     return isA(ErrorInfoT::classID());
      81              :   }
      82              : 
      83              : private:
      84              :   virtual void anchor();
      85              : 
      86              :   static char ID;
      87              : };
      88              : 
      89              : /// Lightweight error class with error context and mandatory checking.
      90              : ///
      91              : /// Instances of this class wrap a ErrorInfoBase pointer. Failure states
      92              : /// are represented by setting the pointer to a ErrorInfoBase subclass
      93              : /// instance containing information describing the failure. Success is
      94              : /// represented by a null pointer value.
      95              : ///
      96              : /// Instances of Error also contains a 'Checked' flag, which must be set
      97              : /// before the destructor is called, otherwise the destructor will trigger a
      98              : /// runtime error. This enforces at runtime the requirement that all Error
      99              : /// instances be checked or returned to the caller.
     100              : ///
     101              : /// There are two ways to set the checked flag, depending on what state the
     102              : /// Error instance is in. For Error instances indicating success, it
     103              : /// is sufficient to invoke the boolean conversion operator. E.g.:
     104              : ///
     105              : ///   @code{.cpp}
     106              : ///   Error foo(<...>);
     107              : ///
     108              : ///   if (auto E = foo(<...>))
     109              : ///     return E; // <- Return E if it is in the error state.
     110              : ///   // We have verified that E was in the success state. It can now be safely
     111              : ///   // destroyed.
     112              : ///   @endcode
     113              : ///
     114              : /// A success value *can not* be dropped. For example, just calling 'foo(<...>)'
     115              : /// without testing the return value will raise a runtime error, even if foo
     116              : /// returns success.
     117              : ///
     118              : /// For Error instances representing failure, you must use either the
     119              : /// handleErrors or handleAllErrors function with a typed handler. E.g.:
     120              : ///
     121              : ///   @code{.cpp}
     122              : ///   class MyErrorInfo : public ErrorInfo<MyErrorInfo> {
     123              : ///     // Custom error info.
     124              : ///   };
     125              : ///
     126              : ///   Error foo(<...>) { return make_error<MyErrorInfo>(...); }
     127              : ///
     128              : ///   auto E = foo(<...>); // <- foo returns failure with MyErrorInfo.
     129              : ///   auto NewE =
     130              : ///     handleErrors(std::move(E),
     131              : ///       [](const MyErrorInfo &M) {
     132              : ///         // Deal with the error.
     133              : ///       },
     134              : ///       [](std::unique_ptr<OtherError> M) -> Error {
     135              : ///         if (canHandle(*M)) {
     136              : ///           // handle error.
     137              : ///           return Error::success();
     138              : ///         }
     139              : ///         // Couldn't handle this error instance. Pass it up the stack.
     140              : ///         return Error(std::move(M));
     141              : ///     });
     142              : ///   // Note - The error passed to handleErrors will be marked as checked. If
     143              : ///   // there is no matched handler, a new error with the same payload is
     144              : ///   // created and returned.
     145              : ///   // The handlers take the error checked by handleErrors as an argument,
     146              : ///   // which can be used to retrieve more information. If a new error is
     147              : ///   // created by a handler, it will be passed back to the caller of
     148              : ///   // handleErrors and needs to be checked or return up to the stack.
     149              : ///   // Otherwise, the passed-in error is considered consumed.
     150              : ///   @endcode
     151              : ///
     152              : /// The handleAllErrors function is identical to handleErrors, except
     153              : /// that it has a void return type, and requires all errors to be handled and
     154              : /// no new errors be returned. It prevents errors (assuming they can all be
     155              : /// handled) from having to be bubbled all the way to the top-level.
     156              : ///
     157              : /// *All* Error instances must be checked before destruction, even if
     158              : /// they're moved-assigned or constructed from Success values that have already
     159              : /// been checked. This enforces checking through all levels of the call stack.
     160              : class [[nodiscard]] Error {
     161              :   // ErrorList needs to be able to yank ErrorInfoBase pointers out of Errors
     162              :   // to add to the error list. It can't rely on handleErrors for this, since
     163              :   // handleErrors does not support ErrorList handlers.
     164              :   friend class ErrorList;
     165              : 
     166              :   // handleErrors needs to be able to set the Checked flag.
     167              :   template <typename... HandlerTs>
     168              :   friend Error handleErrors(Error E, HandlerTs &&... Handlers);
     169              :   // visitErrors needs direct access to the payload.
     170              :   template <typename HandlerT>
     171              :   friend void visitErrors(const Error &E, HandlerT H);
     172              : 
     173              :   // Expected<T> needs to be able to steal the payload when constructed from an
     174              :   // error.
     175              :   template <typename T> friend class Expected;
     176              : 
     177              :   // wrap needs to be able to steal the payload.
     178              :   friend LLVMErrorRef wrap(Error);
     179              : 
     180              : protected:
     181              :   /// Create a success value. Prefer using 'Error::success()' for readability
     182            0 :   Error() {
     183            0 :     setPtr(nullptr);
     184            0 :     setChecked(false);
     185            0 :   }
     186              : 
     187              : public:
     188              :   /// Create a success value.
     189              :   static ErrorSuccess success();
     190              : 
     191              :   // Errors are not copy-constructable.
     192              :   Error(const Error &Other) = delete;
     193              : 
     194              :   /// Move-construct an error value. The newly constructed error is considered
     195              :   /// unchecked, even if the source error had been checked. The original error
     196              :   /// becomes a checked Success value, regardless of its original state.
     197            0 :   Error(Error &&Other) {
     198            0 :     setChecked(true);
     199            0 :     *this = std::move(Other);
     200            0 :   }
     201              : 
     202              :   /// Create an error value. Prefer using the 'make_error' function, but
     203              :   /// this constructor can be useful when "re-throwing" errors from handlers.
     204            0 :   Error(std::unique_ptr<ErrorInfoBase> Payload) {
     205            0 :     setPtr(Payload.release());
     206            0 :     setChecked(false);
     207            0 :   }
     208              : 
     209              :   // Errors are not copy-assignable.
     210              :   Error &operator=(const Error &Other) = delete;
     211              : 
     212              :   /// Move-assign an error value. The current error must represent success, you
     213              :   /// you cannot overwrite an unhandled error. The current error is then
     214              :   /// considered unchecked. The source error becomes a checked success value,
     215              :   /// regardless of its original state.
     216            0 :   Error &operator=(Error &&Other) {
     217              :     // Don't allow overwriting of unchecked values.
     218            0 :     assertIsChecked();
     219            0 :     setPtr(Other.getPtr());
     220              : 
     221              :     // This Error is unchecked, even if the source error was checked.
     222            0 :     setChecked(false);
     223              : 
     224              :     // Null out Other's payload and set its checked bit.
     225            0 :     Other.setPtr(nullptr);
     226            0 :     Other.setChecked(true);
     227              : 
     228            0 :     return *this;
     229              :   }
     230              : 
     231              :   /// Destroy a Error. Fails with a call to abort() if the error is
     232              :   /// unchecked.
     233        48888 :   ~Error() {
     234        48888 :     assertIsChecked();
     235        48888 :     delete getPtr();
     236        48888 :   }
     237              : 
     238              :   /// Bool conversion. Returns true if this Error is in a failure state,
     239              :   /// and false if it is in an accept state. If the error is in a Success state
     240              :   /// it will be considered checked.
     241        48888 :   explicit operator bool() {
     242        48888 :     setChecked(getPtr() == nullptr);
     243        48888 :     return getPtr() != nullptr;
     244              :   }
     245              : 
     246              :   /// Check whether one error is a subclass of another.
     247              :   template <typename ErrT> bool isA() const {
     248              :     return getPtr() && getPtr()->isA(ErrT::classID());
     249              :   }
     250              : 
     251              :   /// Returns the dynamic class id of this error, or null if this is a success
     252              :   /// value.
     253              :   const void* dynamicClassID() const {
     254              :     if (!getPtr())
     255              :       return nullptr;
     256              :     return getPtr()->dynamicClassID();
     257              :   }
     258              : 
     259              : private:
     260              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     261              :   // assertIsChecked() happens very frequently, but under normal circumstances
     262              :   // is supposed to be a no-op.  So we want it to be inlined, but having a bunch
     263              :   // of debug prints can cause the function to be too large for inlining.  So
     264              :   // it's important that we define this function out of line so that it can't be
     265              :   // inlined.
     266              :   [[noreturn]] void fatalUncheckedError() const;
     267              : #endif
     268              : 
     269        48888 :   void assertIsChecked() {
     270              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     271              :     if (LLVM_UNLIKELY(!getChecked() || getPtr()))
     272              :       fatalUncheckedError();
     273              : #endif
     274        48888 :   }
     275              : 
     276       146664 :   ErrorInfoBase *getPtr() const {
     277              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     278              :     return reinterpret_cast<ErrorInfoBase*>(
     279              :              reinterpret_cast<uintptr_t>(Payload) &
     280              :              ~static_cast<uintptr_t>(0x1));
     281              : #else
     282       146664 :     return Payload;
     283              : #endif
     284              :   }
     285              : 
     286            0 :   void setPtr(ErrorInfoBase *EI) {
     287              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     288              :     Payload = reinterpret_cast<ErrorInfoBase*>(
     289              :                 (reinterpret_cast<uintptr_t>(EI) &
     290              :                  ~static_cast<uintptr_t>(0x1)) |
     291              :                 (reinterpret_cast<uintptr_t>(Payload) & 0x1));
     292              : #else
     293            0 :     Payload = EI;
     294              : #endif
     295            0 :   }
     296              : 
     297              :   bool getChecked() const {
     298              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     299              :     return (reinterpret_cast<uintptr_t>(Payload) & 0x1) == 0;
     300              : #else
     301              :     return true;
     302              : #endif
     303              :   }
     304              : 
     305        48888 :   void setChecked(bool V) {
     306              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     307              :     Payload = reinterpret_cast<ErrorInfoBase*>(
     308              :                 (reinterpret_cast<uintptr_t>(Payload) &
     309              :                   ~static_cast<uintptr_t>(0x1)) |
     310              :                   (V ? 0 : 1));
     311              : #endif
     312        48888 :   }
     313              : 
     314              :   std::unique_ptr<ErrorInfoBase> takePayload() {
     315              :     std::unique_ptr<ErrorInfoBase> Tmp(getPtr());
     316              :     setPtr(nullptr);
     317              :     setChecked(true);
     318              :     return Tmp;
     319              :   }
     320              : 
     321              :   friend raw_ostream &operator<<(raw_ostream &OS, const Error &E) {
     322              :     if (auto *P = E.getPtr())
     323              :       P->log(OS);
     324              :     else
     325              :       OS << "success";
     326              :     return OS;
     327              :   }
     328              : 
     329              :   ErrorInfoBase *Payload = nullptr;
     330              : };
     331              : 
     332              : /// Subclass of Error for the sole purpose of identifying the success path in
     333              : /// the type system. This allows to catch invalid conversion to Expected<T> at
     334              : /// compile time.
     335              : class ErrorSuccess final : public Error {};
     336              : 
     337            0 : inline ErrorSuccess Error::success() { return ErrorSuccess(); }
     338              : 
     339              : /// Make a Error instance representing failure using the given error info
     340              : /// type.
     341              : template <typename ErrT, typename... ArgTs> Error make_error(ArgTs &&... Args) {
     342              :   return Error(std::make_unique<ErrT>(std::forward<ArgTs>(Args)...));
     343              : }
     344              : 
     345              : /// Base class for user error types. Users should declare their error types
     346              : /// like:
     347              : ///
     348              : /// class MyError : public ErrorInfo<MyError> {
     349              : ///   ....
     350              : /// };
     351              : ///
     352              : /// This class provides an implementation of the ErrorInfoBase::kind
     353              : /// method, which is used by the Error RTTI system.
     354              : template <typename ThisErrT, typename ParentErrT = ErrorInfoBase>
     355              : class ErrorInfo : public ParentErrT {
     356              : public:
     357              :   using ParentErrT::ParentErrT; // inherit constructors
     358              : 
     359              :   static const void *classID() { return &ThisErrT::ID; }
     360              : 
     361              :   const void *dynamicClassID() const override { return &ThisErrT::ID; }
     362              : 
     363              :   bool isA(const void *const ClassID) const override {
     364              :     return ClassID == classID() || ParentErrT::isA(ClassID);
     365              :   }
     366              : };
     367              : 
     368              : /// Special ErrorInfo subclass representing a list of ErrorInfos.
     369              : /// Instances of this class are constructed by joinError.
     370              : class ErrorList final : public ErrorInfo<ErrorList> {
     371              :   // handleErrors needs to be able to iterate the payload list of an
     372              :   // ErrorList.
     373              :   template <typename... HandlerTs>
     374              :   friend Error handleErrors(Error E, HandlerTs &&... Handlers);
     375              :   // visitErrors needs to be able to iterate the payload list of an
     376              :   // ErrorList.
     377              :   template <typename HandlerT>
     378              :   friend void visitErrors(const Error &E, HandlerT H);
     379              : 
     380              :   // joinErrors is implemented in terms of join.
     381              :   friend Error joinErrors(Error, Error);
     382              : 
     383              : public:
     384              :   void log(raw_ostream &OS) const override {
     385              :     OS << "Multiple errors:\n";
     386              :     for (const auto &ErrPayload : Payloads) {
     387              :       ErrPayload->log(OS);
     388              :       OS << "\n";
     389              :     }
     390              :   }
     391              : 
     392              :   std::error_code convertToErrorCode() const override;
     393              : 
     394              :   // Used by ErrorInfo::classID.
     395              :   static char ID;
     396              : 
     397              : private:
     398              :   ErrorList(std::unique_ptr<ErrorInfoBase> Payload1,
     399              :             std::unique_ptr<ErrorInfoBase> Payload2) {
     400              :     assert(!Payload1->isA<ErrorList>() && !Payload2->isA<ErrorList>() &&
     401              :            "ErrorList constructor payloads should be singleton errors");
     402              :     Payloads.push_back(std::move(Payload1));
     403              :     Payloads.push_back(std::move(Payload2));
     404              :   }
     405              : 
     406              :   static Error join(Error E1, Error E2) {
     407              :     if (!E1)
     408              :       return E2;
     409              :     if (!E2)
     410              :       return E1;
     411              :     if (E1.isA<ErrorList>()) {
     412              :       auto &E1List = static_cast<ErrorList &>(*E1.getPtr());
     413              :       if (E2.isA<ErrorList>()) {
     414              :         auto E2Payload = E2.takePayload();
     415              :         auto &E2List = static_cast<ErrorList &>(*E2Payload);
     416              :         for (auto &Payload : E2List.Payloads)
     417              :           E1List.Payloads.push_back(std::move(Payload));
     418              :       } else
     419              :         E1List.Payloads.push_back(E2.takePayload());
     420              : 
     421              :       return E1;
     422              :     }
     423              :     if (E2.isA<ErrorList>()) {
     424              :       auto &E2List = static_cast<ErrorList &>(*E2.getPtr());
     425              :       E2List.Payloads.insert(E2List.Payloads.begin(), E1.takePayload());
     426              :       return E2;
     427              :     }
     428              :     return Error(std::unique_ptr<ErrorList>(
     429              :         new ErrorList(E1.takePayload(), E2.takePayload())));
     430              :   }
     431              : 
     432              :   std::vector<std::unique_ptr<ErrorInfoBase>> Payloads;
     433              : };
     434              : 
     435              : /// Concatenate errors. The resulting Error is unchecked, and contains the
     436              : /// ErrorInfo(s), if any, contained in E1, followed by the
     437              : /// ErrorInfo(s), if any, contained in E2.
     438              : inline Error joinErrors(Error E1, Error E2) {
     439              :   return ErrorList::join(std::move(E1), std::move(E2));
     440              : }
     441              : 
     442              : /// Tagged union holding either a T or a Error.
     443              : ///
     444              : /// This class parallels ErrorOr, but replaces error_code with Error. Since
     445              : /// Error cannot be copied, this class replaces getError() with
     446              : /// takeError(). It also adds an bool errorIsA<ErrT>() method for testing the
     447              : /// error class type.
     448              : ///
     449              : /// Example usage of 'Expected<T>' as a function return type:
     450              : ///
     451              : ///   @code{.cpp}
     452              : ///     Expected<int> myDivide(int A, int B) {
     453              : ///       if (B == 0) {
     454              : ///         // return an Error
     455              : ///         return createStringError(inconvertibleErrorCode(),
     456              : ///                                  "B must not be zero!");
     457              : ///       }
     458              : ///       // return an integer
     459              : ///       return A / B;
     460              : ///     }
     461              : ///   @endcode
     462              : ///
     463              : ///   Checking the results of to a function returning 'Expected<T>':
     464              : ///   @code{.cpp}
     465              : ///     if (auto E = Result.takeError()) {
     466              : ///       // We must consume the error. Typically one of:
     467              : ///       // - return the error to our caller
     468              : ///       // - toString(), when logging
     469              : ///       // - consumeError(), to silently swallow the error
     470              : ///       // - handleErrors(), to distinguish error types
     471              : ///       errs() << "Problem with division " << toString(std::move(E)) << "\n";
     472              : ///       return;
     473              : ///     }
     474              : ///     // use the result
     475              : ///     outs() << "The answer is " << *Result << "\n";
     476              : ///   @endcode
     477              : ///
     478              : ///  For unit-testing a function returning an 'Expected<T>', see the
     479              : ///  'EXPECT_THAT_EXPECTED' macros in llvm/Testing/Support/Error.h
     480              : 
     481              : template <class T> class [[nodiscard]] Expected {
     482              :   template <class T1> friend class ExpectedAsOutParameter;
     483              :   template <class OtherT> friend class Expected;
     484              : 
     485              :   static constexpr bool isRef = std::is_reference_v<T>;
     486              : 
     487              :   using wrap = std::reference_wrapper<std::remove_reference_t<T>>;
     488              : 
     489              :   using error_type = std::unique_ptr<ErrorInfoBase>;
     490              : 
     491              : public:
     492              :   using storage_type = std::conditional_t<isRef, wrap, T>;
     493              :   using value_type = T;
     494              : 
     495              : private:
     496              :   using reference = std::remove_reference_t<T> &;
     497              :   using const_reference = const std::remove_reference_t<T> &;
     498              :   using pointer = std::remove_reference_t<T> *;
     499              :   using const_pointer = const std::remove_reference_t<T> *;
     500              : 
     501              : public:
     502              :   /// Create an Expected<T> error value from the given Error.
     503              :   Expected(Error &&Err)
     504              :       : HasError(true)
     505              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     506              :         // Expected is unchecked upon construction in Debug builds.
     507              :         , Unchecked(true)
     508              : #endif
     509              :   {
     510              :     assert(Err && "Cannot create Expected<T> from Error success value.");
     511              :     new (getErrorStorage()) error_type(Err.takePayload());
     512              :   }
     513              : 
     514              :   /// Forbid to convert from Error::success() implicitly, this avoids having
     515              :   /// Expected<T> foo() { return Error::success(); } which compiles otherwise
     516              :   /// but triggers the assertion above.
     517              :   Expected(ErrorSuccess) = delete;
     518              : 
     519              :   /// Create an Expected<T> success value from the given OtherT value, which
     520              :   /// must be convertible to T.
     521              :   template <typename OtherT>
     522              :   Expected(OtherT &&Val,
     523              :            std::enable_if_t<std::is_convertible_v<OtherT, T>> * = nullptr)
     524              :       : HasError(false)
     525              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     526              :         // Expected is unchecked upon construction in Debug builds.
     527              :         ,
     528              :         Unchecked(true)
     529              : #endif
     530              :   {
     531              :     new (getStorage()) storage_type(std::forward<OtherT>(Val));
     532              :   }
     533              : 
     534              :   /// Move construct an Expected<T> value.
     535              :   Expected(Expected &&Other) { moveConstruct(std::move(Other)); }
     536              : 
     537              :   /// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
     538              :   /// must be convertible to T.
     539              :   template <class OtherT>
     540              :   Expected(Expected<OtherT> &&Other,
     541              :            std::enable_if_t<std::is_convertible_v<OtherT, T>> * = nullptr) {
     542              :     moveConstruct(std::move(Other));
     543              :   }
     544              : 
     545              :   /// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
     546              :   /// isn't convertible to T.
     547              :   template <class OtherT>
     548              :   explicit Expected(
     549              :       Expected<OtherT> &&Other,
     550              :       std::enable_if_t<!std::is_convertible_v<OtherT, T>> * = nullptr) {
     551              :     moveConstruct(std::move(Other));
     552              :   }
     553              : 
     554              :   /// Move-assign from another Expected<T>.
     555              :   Expected &operator=(Expected &&Other) {
     556              :     moveAssign(std::move(Other));
     557              :     return *this;
     558              :   }
     559              : 
     560              :   /// Destroy an Expected<T>.
     561           45 :   ~Expected() {
     562           45 :     assertIsChecked();
     563           45 :     if (!HasError)
     564           45 :       getStorage()->~storage_type();
     565              :     else
     566            0 :       getErrorStorage()->~error_type();
     567           45 :   }
     568              : 
     569              :   /// Return false if there is an error.
     570           45 :   explicit operator bool() {
     571              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     572              :     Unchecked = HasError;
     573              : #endif
     574           45 :     return !HasError;
     575              :   }
     576              : 
     577              :   /// Returns a reference to the stored T value.
     578           45 :   reference get() {
     579           45 :     assertIsChecked();
     580           45 :     return *getStorage();
     581              :   }
     582              : 
     583              :   /// Returns a const reference to the stored T value.
     584              :   const_reference get() const {
     585              :     assertIsChecked();
     586              :     return const_cast<Expected<T> *>(this)->get();
     587              :   }
     588              : 
     589              :   /// Returns \a takeError() after moving the held T (if any) into \p V.
     590              :   template <class OtherT>
     591              :   Error moveInto(
     592              :       OtherT &Value,
     593              :       std::enable_if_t<std::is_assignable_v<OtherT &, T &&>> * = nullptr) && {
     594              :     if (*this)
     595              :       Value = std::move(get());
     596              :     return takeError();
     597              :   }
     598              : 
     599              :   /// Check that this Expected<T> is an error of type ErrT.
     600              :   template <typename ErrT> bool errorIsA() const {
     601              :     return HasError && (*getErrorStorage())->template isA<ErrT>();
     602              :   }
     603              : 
     604              :   /// Take ownership of the stored error.
     605              :   /// After calling this the Expected<T> is in an indeterminate state that can
     606              :   /// only be safely destructed. No further calls (beside the destructor) should
     607              :   /// be made on the Expected<T> value.
     608            0 :   Error takeError() {
     609              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     610              :     Unchecked = false;
     611              : #endif
     612            0 :     return HasError ? Error(std::move(*getErrorStorage())) : Error::success();
     613              :   }
     614              : 
     615              :   /// Returns a pointer to the stored T value.
     616              :   pointer operator->() {
     617              :     assertIsChecked();
     618              :     return toPointer(getStorage());
     619              :   }
     620              : 
     621              :   /// Returns a const pointer to the stored T value.
     622              :   const_pointer operator->() const {
     623              :     assertIsChecked();
     624              :     return toPointer(getStorage());
     625              :   }
     626              : 
     627              :   /// Returns a reference to the stored T value.
     628              :   reference operator*() {
     629              :     assertIsChecked();
     630              :     return *getStorage();
     631              :   }
     632              : 
     633              :   /// Returns a const reference to the stored T value.
     634              :   const_reference operator*() const {
     635              :     assertIsChecked();
     636              :     return *getStorage();
     637              :   }
     638              : 
     639              : private:
     640              :   template <class T1>
     641              :   static bool compareThisIfSameType(const T1 &a, const T1 &b) {
     642              :     return &a == &b;
     643              :   }
     644              : 
     645              :   template <class T1, class T2>
     646              :   static bool compareThisIfSameType(const T1 &, const T2 &) {
     647              :     return false;
     648              :   }
     649              : 
     650              :   template <class OtherT> void moveConstruct(Expected<OtherT> &&Other) {
     651              :     HasError = Other.HasError;
     652              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     653              :     Unchecked = true;
     654              :     Other.Unchecked = false;
     655              : #endif
     656              : 
     657              :     if (!HasError)
     658              :       new (getStorage()) storage_type(std::move(*Other.getStorage()));
     659              :     else
     660              :       new (getErrorStorage()) error_type(std::move(*Other.getErrorStorage()));
     661              :   }
     662              : 
     663              :   template <class OtherT> void moveAssign(Expected<OtherT> &&Other) {
     664              :     assertIsChecked();
     665              : 
     666              :     if (compareThisIfSameType(*this, Other))
     667              :       return;
     668              : 
     669              :     this->~Expected();
     670              :     new (this) Expected(std::move(Other));
     671              :   }
     672              : 
     673              :   pointer toPointer(pointer Val) { return Val; }
     674              : 
     675              :   const_pointer toPointer(const_pointer Val) const { return Val; }
     676              : 
     677              :   pointer toPointer(wrap *Val) { return &Val->get(); }
     678              : 
     679              :   const_pointer toPointer(const wrap *Val) const { return &Val->get(); }
     680              : 
     681           90 :   storage_type *getStorage() {
     682           90 :     assert(!HasError && "Cannot get value when an error exists!");
     683           90 :     return reinterpret_cast<storage_type *>(&TStorage);
     684              :   }
     685              : 
     686              :   const storage_type *getStorage() const {
     687              :     assert(!HasError && "Cannot get value when an error exists!");
     688              :     return reinterpret_cast<const storage_type *>(&TStorage);
     689              :   }
     690              : 
     691            0 :   error_type *getErrorStorage() {
     692            0 :     assert(HasError && "Cannot get error when a value exists!");
     693            0 :     return reinterpret_cast<error_type *>(&ErrorStorage);
     694              :   }
     695              : 
     696              :   const error_type *getErrorStorage() const {
     697              :     assert(HasError && "Cannot get error when a value exists!");
     698              :     return reinterpret_cast<const error_type *>(&ErrorStorage);
     699              :   }
     700              : 
     701              :   // Used by ExpectedAsOutParameter to reset the checked flag.
     702              :   void setUnchecked() {
     703              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     704              :     Unchecked = true;
     705              : #endif
     706              :   }
     707              : 
     708              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     709              :   [[noreturn]] LLVM_ATTRIBUTE_NOINLINE void fatalUncheckedExpected() const {
     710              :     dbgs() << "Expected<T> must be checked before access or destruction.\n";
     711              :     if (HasError) {
     712              :       dbgs() << "Unchecked Expected<T> contained error:\n";
     713              :       (*getErrorStorage())->log(dbgs());
     714              :     } else
     715              :       dbgs() << "Expected<T> value was in success state. (Note: Expected<T> "
     716              :                 "values in success mode must still be checked prior to being "
     717              :                 "destroyed).\n";
     718              :     abort();
     719              :   }
     720              : #endif
     721              : 
     722           90 :   void assertIsChecked() const {
     723              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     724              :     if (LLVM_UNLIKELY(Unchecked))
     725              :       fatalUncheckedExpected();
     726              : #endif
     727           90 :   }
     728              : 
     729              :   union {
     730              :     AlignedCharArrayUnion<storage_type> TStorage;
     731              :     AlignedCharArrayUnion<error_type> ErrorStorage;
     732              :   };
     733              :   bool HasError : 1;
     734              : #if LLVM_ENABLE_ABI_BREAKING_CHECKS
     735              :   bool Unchecked : 1;
     736              : #endif
     737              : };
     738              : 
     739              : /// Report a serious error, calling any installed error handler. See
     740              : /// ErrorHandling.h.
     741              : [[noreturn]] void report_fatal_error(Error Err, bool gen_crash_diag = true);
     742              : 
     743              : /// Report a fatal error if Err is a failure value.
     744              : ///
     745              : /// This function can be used to wrap calls to fallible functions ONLY when it
     746              : /// is known that the Error will always be a success value. E.g.
     747              : ///
     748              : ///   @code{.cpp}
     749              : ///   // foo only attempts the fallible operation if DoFallibleOperation is
     750              : ///   // true. If DoFallibleOperation is false then foo always returns
     751              : ///   // Error::success().
     752              : ///   Error foo(bool DoFallibleOperation);
     753              : ///
     754              : ///   cantFail(foo(false));
     755              : ///   @endcode
     756              : inline void cantFail(Error Err, const char *Msg = nullptr) {
     757              :   if (Err) {
     758              :     if (!Msg)
     759              :       Msg = "Failure value returned from cantFail wrapped call";
     760              : #ifndef NDEBUG
     761              :     std::string Str;
     762              :     raw_string_ostream OS(Str);
     763              :     OS << Msg << "\n" << Err;
     764              :     Msg = Str.c_str();
     765              : #endif
     766              :     llvm_unreachable(Msg);
     767              :   }
     768              : }
     769              : 
     770              : /// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
     771              : /// returns the contained value.
     772              : ///
     773              : /// This function can be used to wrap calls to fallible functions ONLY when it
     774              : /// is known that the Error will always be a success value. E.g.
     775              : ///
     776              : ///   @code{.cpp}
     777              : ///   // foo only attempts the fallible operation if DoFallibleOperation is
     778              : ///   // true. If DoFallibleOperation is false then foo always returns an int.
     779              : ///   Expected<int> foo(bool DoFallibleOperation);
     780              : ///
     781              : ///   int X = cantFail(foo(false));
     782              : ///   @endcode
     783              : template <typename T>
     784              : T cantFail(Expected<T> ValOrErr, const char *Msg = nullptr) {
     785              :   if (ValOrErr)
     786              :     return std::move(*ValOrErr);
     787              :   else {
     788              :     if (!Msg)
     789              :       Msg = "Failure value returned from cantFail wrapped call";
     790              : #ifndef NDEBUG
     791              :     std::string Str;
     792              :     raw_string_ostream OS(Str);
     793              :     auto E = ValOrErr.takeError();
     794              :     OS << Msg << "\n" << E;
     795              :     Msg = Str.c_str();
     796              : #endif
     797              :     llvm_unreachable(Msg);
     798              :   }
     799              : }
     800              : 
     801              : /// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
     802              : /// returns the contained reference.
     803              : ///
     804              : /// This function can be used to wrap calls to fallible functions ONLY when it
     805              : /// is known that the Error will always be a success value. E.g.
     806              : ///
     807              : ///   @code{.cpp}
     808              : ///   // foo only attempts the fallible operation if DoFallibleOperation is
     809              : ///   // true. If DoFallibleOperation is false then foo always returns a Bar&.
     810              : ///   Expected<Bar&> foo(bool DoFallibleOperation);
     811              : ///
     812              : ///   Bar &X = cantFail(foo(false));
     813              : ///   @endcode
     814              : template <typename T>
     815              : T& cantFail(Expected<T&> ValOrErr, const char *Msg = nullptr) {
     816              :   if (ValOrErr)
     817              :     return *ValOrErr;
     818              :   else {
     819              :     if (!Msg)
     820              :       Msg = "Failure value returned from cantFail wrapped call";
     821              : #ifndef NDEBUG
     822              :     std::string Str;
     823              :     raw_string_ostream OS(Str);
     824              :     auto E = ValOrErr.takeError();
     825              :     OS << Msg << "\n" << E;
     826              :     Msg = Str.c_str();
     827              : #endif
     828              :     llvm_unreachable(Msg);
     829              :   }
     830              : }
     831              : 
     832              : /// Helper for testing applicability of, and applying, handlers for
     833              : /// ErrorInfo types.
     834              : template <typename HandlerT>
     835              : class ErrorHandlerTraits
     836              :     : public ErrorHandlerTraits<
     837              :           decltype(&std::remove_reference_t<HandlerT>::operator())> {};
     838              : 
     839              : // Specialization functions of the form 'Error (const ErrT&)'.
     840              : template <typename ErrT> class ErrorHandlerTraits<Error (&)(ErrT &)> {
     841              : public:
     842              :   static bool appliesTo(const ErrorInfoBase &E) {
     843              :     return E.template isA<ErrT>();
     844              :   }
     845              : 
     846              :   template <typename HandlerT>
     847              :   static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
     848              :     assert(appliesTo(*E) && "Applying incorrect handler");
     849              :     return H(static_cast<ErrT &>(*E));
     850              :   }
     851              : };
     852              : 
     853              : // Specialization functions of the form 'void (const ErrT&)'.
     854              : template <typename ErrT> class ErrorHandlerTraits<void (&)(ErrT &)> {
     855              : public:
     856              :   static bool appliesTo(const ErrorInfoBase &E) {
     857              :     return E.template isA<ErrT>();
     858              :   }
     859              : 
     860              :   template <typename HandlerT>
     861              :   static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
     862              :     assert(appliesTo(*E) && "Applying incorrect handler");
     863              :     H(static_cast<ErrT &>(*E));
     864              :     return Error::success();
     865              :   }
     866              : };
     867              : 
     868              : /// Specialization for functions of the form 'Error (std::unique_ptr<ErrT>)'.
     869              : template <typename ErrT>
     870              : class ErrorHandlerTraits<Error (&)(std::unique_ptr<ErrT>)> {
     871              : public:
     872              :   static bool appliesTo(const ErrorInfoBase &E) {
     873              :     return E.template isA<ErrT>();
     874              :   }
     875              : 
     876              :   template <typename HandlerT>
     877              :   static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
     878              :     assert(appliesTo(*E) && "Applying incorrect handler");
     879              :     std::unique_ptr<ErrT> SubE(static_cast<ErrT *>(E.release()));
     880              :     return H(std::move(SubE));
     881              :   }
     882              : };
     883              : 
     884              : /// Specialization for functions of the form 'void (std::unique_ptr<ErrT>)'.
     885              : template <typename ErrT>
     886              : class ErrorHandlerTraits<void (&)(std::unique_ptr<ErrT>)> {
     887              : public:
     888              :   static bool appliesTo(const ErrorInfoBase &E) {
     889              :     return E.template isA<ErrT>();
     890              :   }
     891              : 
     892              :   template <typename HandlerT>
     893              :   static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
     894              :     assert(appliesTo(*E) && "Applying incorrect handler");
     895              :     std::unique_ptr<ErrT> SubE(static_cast<ErrT *>(E.release()));
     896              :     H(std::move(SubE));
     897              :     return Error::success();
     898              :   }
     899              : };
     900              : 
     901              : // Specialization for member functions of the form 'RetT (const ErrT&)'.
     902              : template <typename C, typename RetT, typename ErrT>
     903              : class ErrorHandlerTraits<RetT (C::*)(ErrT &)>
     904              :     : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
     905              : 
     906              : // Specialization for member functions of the form 'RetT (const ErrT&) const'.
     907              : template <typename C, typename RetT, typename ErrT>
     908              : class ErrorHandlerTraits<RetT (C::*)(ErrT &) const>
     909              :     : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
     910              : 
     911              : // Specialization for member functions of the form 'RetT (const ErrT&)'.
     912              : template <typename C, typename RetT, typename ErrT>
     913              : class ErrorHandlerTraits<RetT (C::*)(const ErrT &)>
     914              :     : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
     915              : 
     916              : // Specialization for member functions of the form 'RetT (const ErrT&) const'.
     917              : template <typename C, typename RetT, typename ErrT>
     918              : class ErrorHandlerTraits<RetT (C::*)(const ErrT &) const>
     919              :     : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
     920              : 
     921              : /// Specialization for member functions of the form
     922              : /// 'RetT (std::unique_ptr<ErrT>)'.
     923              : template <typename C, typename RetT, typename ErrT>
     924              : class ErrorHandlerTraits<RetT (C::*)(std::unique_ptr<ErrT>)>
     925              :     : public ErrorHandlerTraits<RetT (&)(std::unique_ptr<ErrT>)> {};
     926              : 
     927              : /// Specialization for member functions of the form
     928              : /// 'RetT (std::unique_ptr<ErrT>) const'.
     929              : template <typename C, typename RetT, typename ErrT>
     930              : class ErrorHandlerTraits<RetT (C::*)(std::unique_ptr<ErrT>) const>
     931              :     : public ErrorHandlerTraits<RetT (&)(std::unique_ptr<ErrT>)> {};
     932              : 
     933              : inline Error handleErrorImpl(std::unique_ptr<ErrorInfoBase> Payload) {
     934              :   return Error(std::move(Payload));
     935              : }
     936              : 
     937              : template <typename HandlerT, typename... HandlerTs>
     938              : Error handleErrorImpl(std::unique_ptr<ErrorInfoBase> Payload,
     939              :                       HandlerT &&Handler, HandlerTs &&... Handlers) {
     940              :   if (ErrorHandlerTraits<HandlerT>::appliesTo(*Payload))
     941              :     return ErrorHandlerTraits<HandlerT>::apply(std::forward<HandlerT>(Handler),
     942              :                                                std::move(Payload));
     943              :   return handleErrorImpl(std::move(Payload),
     944              :                          std::forward<HandlerTs>(Handlers)...);
     945              : }
     946              : 
     947              : /// Pass the ErrorInfo(s) contained in E to their respective handlers. Any
     948              : /// unhandled errors (or Errors returned by handlers) are re-concatenated and
     949              : /// returned.
     950              : /// Because this function returns an error, its result must also be checked
     951              : /// or returned. If you intend to handle all errors use handleAllErrors
     952              : /// (which returns void, and will abort() on unhandled errors) instead.
     953              : template <typename... HandlerTs>
     954              : Error handleErrors(Error E, HandlerTs &&... Hs) {
     955              :   if (!E)
     956              :     return Error::success();
     957              : 
     958              :   std::unique_ptr<ErrorInfoBase> Payload = E.takePayload();
     959              : 
     960              :   if (Payload->isA<ErrorList>()) {
     961              :     ErrorList &List = static_cast<ErrorList &>(*Payload);
     962              :     Error R;
     963              :     for (auto &P : List.Payloads)
     964              :       R = ErrorList::join(
     965              :           std::move(R),
     966              :           handleErrorImpl(std::move(P), std::forward<HandlerTs>(Hs)...));
     967              :     return R;
     968              :   }
     969              : 
     970              :   return handleErrorImpl(std::move(Payload), std::forward<HandlerTs>(Hs)...);
     971              : }
     972              : 
     973              : /// Behaves the same as handleErrors, except that by contract all errors
     974              : /// *must* be handled by the given handlers (i.e. there must be no remaining
     975              : /// errors after running the handlers, or llvm_unreachable is called).
     976              : template <typename... HandlerTs>
     977              : void handleAllErrors(Error E, HandlerTs &&... Handlers) {
     978              :   cantFail(handleErrors(std::move(E), std::forward<HandlerTs>(Handlers)...));
     979              : }
     980              : 
     981              : /// Check that E is a non-error, then drop it.
     982              : /// If E is an error, llvm_unreachable will be called.
     983              : inline void handleAllErrors(Error E) {
     984              :   cantFail(std::move(E));
     985              : }
     986              : 
     987              : /// Visit all the ErrorInfo(s) contained in E by passing them to the respective
     988              : /// handler, without consuming the error.
     989              : template <typename HandlerT> void visitErrors(const Error &E, HandlerT H) {
     990              :   const ErrorInfoBase *Payload = E.getPtr();
     991              :   if (!Payload)
     992              :     return;
     993              : 
     994              :   if (Payload->isA<ErrorList>()) {
     995              :     const ErrorList &List = static_cast<const ErrorList &>(*Payload);
     996              :     for (const auto &P : List.Payloads)
     997              :       H(*P);
     998              :     return;
     999              :   }
    1000              : 
    1001              :   return H(*Payload);
    1002              : }
    1003              : 
    1004              : /// Handle any errors (if present) in an Expected<T>, then try a recovery path.
    1005              : ///
    1006              : /// If the incoming value is a success value it is returned unmodified. If it
    1007              : /// is a failure value then it the contained error is passed to handleErrors.
    1008              : /// If handleErrors is able to handle the error then the RecoveryPath functor
    1009              : /// is called to supply the final result. If handleErrors is not able to
    1010              : /// handle all errors then the unhandled errors are returned.
    1011              : ///
    1012              : /// This utility enables the follow pattern:
    1013              : ///
    1014              : ///   @code{.cpp}
    1015              : ///   enum FooStrategy { Aggressive, Conservative };
    1016              : ///   Expected<Foo> foo(FooStrategy S);
    1017              : ///
    1018              : ///   auto ResultOrErr =
    1019              : ///     handleExpected(
    1020              : ///       foo(Aggressive),
    1021              : ///       []() { return foo(Conservative); },
    1022              : ///       [](AggressiveStrategyError&) {
    1023              : ///         // Implicitly conusme this - we'll recover by using a conservative
    1024              : ///         // strategy.
    1025              : ///       });
    1026              : ///
    1027              : ///   @endcode
    1028              : template <typename T, typename RecoveryFtor, typename... HandlerTs>
    1029              : Expected<T> handleExpected(Expected<T> ValOrErr, RecoveryFtor &&RecoveryPath,
    1030              :                            HandlerTs &&... Handlers) {
    1031              :   if (ValOrErr)
    1032              :     return ValOrErr;
    1033              : 
    1034              :   if (auto Err = handleErrors(ValOrErr.takeError(),
    1035              :                               std::forward<HandlerTs>(Handlers)...))
    1036              :     return std::move(Err);
    1037              : 
    1038              :   return RecoveryPath();
    1039              : }
    1040              : 
    1041              : /// Log all errors (if any) in E to OS. If there are any errors, ErrorBanner
    1042              : /// will be printed before the first one is logged. A newline will be printed
    1043              : /// after each error.
    1044              : ///
    1045              : /// This function is compatible with the helpers from Support/WithColor.h. You
    1046              : /// can pass any of them as the OS. Please consider using them instead of
    1047              : /// including 'error: ' in the ErrorBanner.
    1048              : ///
    1049              : /// This is useful in the base level of your program to allow clean termination
    1050              : /// (allowing clean deallocation of resources, etc.), while reporting error
    1051              : /// information to the user.
    1052              : void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner = {});
    1053              : 
    1054              : /// Write all error messages (if any) in E to a string. The newline character
    1055              : /// is used to separate error messages.
    1056              : std::string toString(Error E);
    1057              : 
    1058              : /// Like toString(), but does not consume the error. This can be used to print
    1059              : /// a warning while retaining the original error object.
    1060              : std::string toStringWithoutConsuming(const Error &E);
    1061              : 
    1062              : /// Consume a Error without doing anything. This method should be used
    1063              : /// only where an error can be considered a reasonable and expected return
    1064              : /// value.
    1065              : ///
    1066              : /// Uses of this method are potentially indicative of design problems: If it's
    1067              : /// legitimate to do nothing while processing an "error", the error-producer
    1068              : /// might be more clearly refactored to return an std::optional<T>.
    1069              : inline void consumeError(Error Err) {
    1070              :   handleAllErrors(std::move(Err), [](const ErrorInfoBase &) {});
    1071              : }
    1072              : 
    1073              : /// Convert an Expected to an Optional without doing anything. This method
    1074              : /// should be used only where an error can be considered a reasonable and
    1075              : /// expected return value.
    1076              : ///
    1077              : /// Uses of this method are potentially indicative of problems: perhaps the
    1078              : /// error should be propagated further, or the error-producer should just
    1079              : /// return an Optional in the first place.
    1080              : template <typename T> std::optional<T> expectedToOptional(Expected<T> &&E) {
    1081              :   if (E)
    1082              :     return std::move(*E);
    1083              :   consumeError(E.takeError());
    1084              :   return std::nullopt;
    1085              : }
    1086              : 
    1087              : template <typename T> std::optional<T> expectedToStdOptional(Expected<T> &&E) {
    1088              :   if (E)
    1089              :     return std::move(*E);
    1090              :   consumeError(E.takeError());
    1091              :   return std::nullopt;
    1092              : }
    1093              : 
    1094              : /// Helper for converting an Error to a bool.
    1095              : ///
    1096              : /// This method returns true if Err is in an error state, or false if it is
    1097              : /// in a success state.  Puts Err in a checked state in both cases (unlike
    1098              : /// Error::operator bool(), which only does this for success states).
    1099              : inline bool errorToBool(Error Err) {
    1100              :   bool IsError = static_cast<bool>(Err);
    1101              :   if (IsError)
    1102              :     consumeError(std::move(Err));
    1103              :   return IsError;
    1104              : }
    1105              : 
    1106              : /// Helper for Errors used as out-parameters.
    1107              : ///
    1108              : /// This helper is for use with the Error-as-out-parameter idiom, where an error
    1109              : /// is passed to a function or method by reference, rather than being returned.
    1110              : /// In such cases it is helpful to set the checked bit on entry to the function
    1111              : /// so that the error can be written to (unchecked Errors abort on assignment)
    1112              : /// and clear the checked bit on exit so that clients cannot accidentally forget
    1113              : /// to check the result. This helper performs these actions automatically using
    1114              : /// RAII:
    1115              : ///
    1116              : ///   @code{.cpp}
    1117              : ///   Result foo(Error &Err) {
    1118              : ///     ErrorAsOutParameter ErrAsOutParam(&Err); // 'Checked' flag set
    1119              : ///     // <body of foo>
    1120              : ///     // <- 'Checked' flag auto-cleared when ErrAsOutParam is destructed.
    1121              : ///   }
    1122              : ///   @endcode
    1123              : ///
    1124              : /// ErrorAsOutParameter takes an Error* rather than Error& so that it can be
    1125              : /// used with optional Errors (Error pointers that are allowed to be null). If
    1126              : /// ErrorAsOutParameter took an Error reference, an instance would have to be
    1127              : /// created inside every condition that verified that Error was non-null. By
    1128              : /// taking an Error pointer we can just create one instance at the top of the
    1129              : /// function.
    1130              : class ErrorAsOutParameter {
    1131              : public:
    1132              :   ErrorAsOutParameter(Error *Err) : Err(Err) {
    1133              :     // Raise the checked bit if Err is success.
    1134              :     if (Err)
    1135              :       (void)!!*Err;
    1136              :   }
    1137              : 
    1138              :   ~ErrorAsOutParameter() {
    1139              :     // Clear the checked bit.
    1140              :     if (Err && !*Err)
    1141              :       *Err = Error::success();
    1142              :   }
    1143              : 
    1144              : private:
    1145              :   Error *Err;
    1146              : };
    1147              : 
    1148              : /// Helper for Expected<T>s used as out-parameters.
    1149              : ///
    1150              : /// See ErrorAsOutParameter.
    1151              : template <typename T>
    1152              : class ExpectedAsOutParameter {
    1153              : public:
    1154              :   ExpectedAsOutParameter(Expected<T> *ValOrErr)
    1155              :     : ValOrErr(ValOrErr) {
    1156              :     if (ValOrErr)
    1157              :       (void)!!*ValOrErr;
    1158              :   }
    1159              : 
    1160              :   ~ExpectedAsOutParameter() {
    1161              :     if (ValOrErr)
    1162              :       ValOrErr->setUnchecked();
    1163              :   }
    1164              : 
    1165              : private:
    1166              :   Expected<T> *ValOrErr;
    1167              : };
    1168              : 
    1169              : /// This class wraps a std::error_code in a Error.
    1170              : ///
    1171              : /// This is useful if you're writing an interface that returns a Error
    1172              : /// (or Expected) and you want to call code that still returns
    1173              : /// std::error_codes.
    1174              : class ECError : public ErrorInfo<ECError> {
    1175              :   friend Error errorCodeToError(std::error_code);
    1176              : 
    1177              :   void anchor() override;
    1178              : 
    1179              : public:
    1180              :   void setErrorCode(std::error_code EC) { this->EC = EC; }
    1181              :   std::error_code convertToErrorCode() const override { return EC; }
    1182              :   void log(raw_ostream &OS) const override { OS << EC.message(); }
    1183              : 
    1184              :   // Used by ErrorInfo::classID.
    1185              :   static char ID;
    1186              : 
    1187              : protected:
    1188              :   ECError() = default;
    1189              :   ECError(std::error_code EC) : EC(EC) {}
    1190              : 
    1191              :   std::error_code EC;
    1192              : };
    1193              : 
    1194              : /// The value returned by this function can be returned from convertToErrorCode
    1195              : /// for Error values where no sensible translation to std::error_code exists.
    1196              : /// It should only be used in this situation, and should never be used where a
    1197              : /// sensible conversion to std::error_code is available, as attempts to convert
    1198              : /// to/from this error will result in a fatal error. (i.e. it is a programmatic
    1199              : /// error to try to convert such a value).
    1200              : std::error_code inconvertibleErrorCode();
    1201              : 
    1202              : /// Helper for converting an std::error_code to a Error.
    1203              : Error errorCodeToError(std::error_code EC);
    1204              : 
    1205              : /// Helper for converting an ECError to a std::error_code.
    1206              : ///
    1207              : /// This method requires that Err be Error() or an ECError, otherwise it
    1208              : /// will trigger a call to abort().
    1209              : std::error_code errorToErrorCode(Error Err);
    1210              : 
    1211              : /// Helper to get errno as an std::error_code.
    1212              : ///
    1213              : /// errno should always be represented using the generic category as that's what
    1214              : /// both libc++ and libstdc++ do. On POSIX systems you can also represent them
    1215              : /// using the system category, however this makes them compare differently for
    1216              : /// values outside of those used by `std::errc` if one is generic and the other
    1217              : /// is system.
    1218              : ///
    1219              : /// See the libc++ and libstdc++ implementations of `default_error_condition` on
    1220              : /// the system category for more details on what the difference is.
    1221              : inline std::error_code errnoAsErrorCode() {
    1222              :   return std::error_code(errno, std::generic_category());
    1223              : }
    1224              : 
    1225              : /// Convert an ErrorOr<T> to an Expected<T>.
    1226              : template <typename T> Expected<T> errorOrToExpected(ErrorOr<T> &&EO) {
    1227              :   if (auto EC = EO.getError())
    1228              :     return errorCodeToError(EC);
    1229              :   return std::move(*EO);
    1230              : }
    1231              : 
    1232              : /// Convert an Expected<T> to an ErrorOr<T>.
    1233              : template <typename T> ErrorOr<T> expectedToErrorOr(Expected<T> &&E) {
    1234              :   if (auto Err = E.takeError())
    1235              :     return errorToErrorCode(std::move(Err));
    1236              :   return std::move(*E);
    1237              : }
    1238              : 
    1239              : /// This class wraps a string in an Error.
    1240              : ///
    1241              : /// StringError is useful in cases where the client is not expected to be able
    1242              : /// to consume the specific error message programmatically (for example, if the
    1243              : /// error message is to be presented to the user).
    1244              : ///
    1245              : /// StringError can also be used when additional information is to be printed
    1246              : /// along with a error_code message. Depending on the constructor called, this
    1247              : /// class can either display:
    1248              : ///    1. the error_code message (ECError behavior)
    1249              : ///    2. a string
    1250              : ///    3. the error_code message and a string
    1251              : ///
    1252              : /// These behaviors are useful when subtyping is required; for example, when a
    1253              : /// specific library needs an explicit error type. In the example below,
    1254              : /// PDBError is derived from StringError:
    1255              : ///
    1256              : ///   @code{.cpp}
    1257              : ///   Expected<int> foo() {
    1258              : ///      return llvm::make_error<PDBError>(pdb_error_code::dia_failed_loading,
    1259              : ///                                        "Additional information");
    1260              : ///   }
    1261              : ///   @endcode
    1262              : ///
    1263              : class StringError : public ErrorInfo<StringError> {
    1264              : public:
    1265              :   static char ID;
    1266              : 
    1267              :   StringError(std::string &&S, std::error_code EC, bool PrintMsgOnly);
    1268              :   /// Prints EC + S and converts to EC.
    1269              :   StringError(std::error_code EC, const Twine &S = Twine());
    1270              :   /// Prints S and converts to EC.
    1271              :   StringError(const Twine &S, std::error_code EC);
    1272              : 
    1273              :   void log(raw_ostream &OS) const override;
    1274              :   std::error_code convertToErrorCode() const override;
    1275              : 
    1276              :   const std::string &getMessage() const { return Msg; }
    1277              : 
    1278              : private:
    1279              :   std::string Msg;
    1280              :   std::error_code EC;
    1281              :   const bool PrintMsgOnly = false;
    1282              : };
    1283              : 
    1284              : /// Create formatted StringError object.
    1285              : template <typename... Ts>
    1286              : inline Error createStringError(std::error_code EC, char const *Fmt,
    1287              :                                const Ts &... Vals) {
    1288              :   std::string Buffer;
    1289              :   raw_string_ostream(Buffer) << format(Fmt, Vals...);
    1290              :   return make_error<StringError>(Buffer, EC);
    1291              : }
    1292              : 
    1293              : Error createStringError(std::string &&Msg, std::error_code EC);
    1294              : 
    1295              : inline Error createStringError(std::error_code EC, const char *S) {
    1296              :   return createStringError(std::string(S), EC);
    1297              : }
    1298              : 
    1299              : inline Error createStringError(std::error_code EC, const Twine &S) {
    1300              :   return createStringError(S.str(), EC);
    1301              : }
    1302              : 
    1303              : /// Create a StringError with an inconvertible error code.
    1304              : inline Error createStringError(const Twine &S) {
    1305              :   return createStringError(llvm::inconvertibleErrorCode(), S);
    1306              : }
    1307              : 
    1308              : template <typename... Ts>
    1309              : inline Error createStringError(char const *Fmt, const Ts &...Vals) {
    1310              :   return createStringError(llvm::inconvertibleErrorCode(), Fmt, Vals...);
    1311              : }
    1312              : 
    1313              : template <typename... Ts>
    1314              : inline Error createStringError(std::errc EC, char const *Fmt,
    1315              :                                const Ts &... Vals) {
    1316              :   return createStringError(std::make_error_code(EC), Fmt, Vals...);
    1317              : }
    1318              : 
    1319              : /// This class wraps a filename and another Error.
    1320              : ///
    1321              : /// In some cases, an error needs to live along a 'source' name, in order to
    1322              : /// show more detailed information to the user.
    1323              : class FileError final : public ErrorInfo<FileError> {
    1324              : 
    1325              :   friend Error createFileError(const Twine &, Error);
    1326              :   friend Error createFileError(const Twine &, size_t, Error);
    1327              : 
    1328              : public:
    1329              :   void log(raw_ostream &OS) const override {
    1330              :     assert(Err && "Trying to log after takeError().");
    1331              :     OS << "'" << FileName << "': ";
    1332              :     if (Line)
    1333              :       OS << "line " << *Line << ": ";
    1334              :     Err->log(OS);
    1335              :   }
    1336              : 
    1337              :   std::string messageWithoutFileInfo() const {
    1338              :     std::string Msg;
    1339              :     raw_string_ostream OS(Msg);
    1340              :     Err->log(OS);
    1341              :     return Msg;
    1342              :   }
    1343              : 
    1344              :   StringRef getFileName() const { return FileName; }
    1345              : 
    1346              :   Error takeError() { return Error(std::move(Err)); }
    1347              : 
    1348              :   std::error_code convertToErrorCode() const override;
    1349              : 
    1350              :   // Used by ErrorInfo::classID.
    1351              :   static char ID;
    1352              : 
    1353              : private:
    1354              :   FileError(const Twine &F, std::optional<size_t> LineNum,
    1355              :             std::unique_ptr<ErrorInfoBase> E) {
    1356              :     assert(E && "Cannot create FileError from Error success value.");
    1357              :     FileName = F.str();
    1358              :     Err = std::move(E);
    1359              :     Line = std::move(LineNum);
    1360              :   }
    1361              : 
    1362              :   static Error build(const Twine &F, std::optional<size_t> Line, Error E) {
    1363              :     std::unique_ptr<ErrorInfoBase> Payload;
    1364              :     handleAllErrors(std::move(E),
    1365              :                     [&](std::unique_ptr<ErrorInfoBase> EIB) -> Error {
    1366              :                       Payload = std::move(EIB);
    1367              :                       return Error::success();
    1368              :                     });
    1369              :     return Error(
    1370              :         std::unique_ptr<FileError>(new FileError(F, Line, std::move(Payload))));
    1371              :   }
    1372              : 
    1373              :   std::string FileName;
    1374              :   std::optional<size_t> Line;
    1375              :   std::unique_ptr<ErrorInfoBase> Err;
    1376              : };
    1377              : 
    1378              : /// Concatenate a source file path and/or name with an Error. The resulting
    1379              : /// Error is unchecked.
    1380              : inline Error createFileError(const Twine &F, Error E) {
    1381              :   return FileError::build(F, std::optional<size_t>(), std::move(E));
    1382              : }
    1383              : 
    1384              : /// Concatenate a source file path and/or name with line number and an Error.
    1385              : /// The resulting Error is unchecked.
    1386              : inline Error createFileError(const Twine &F, size_t Line, Error E) {
    1387              :   return FileError::build(F, std::optional<size_t>(Line), std::move(E));
    1388              : }
    1389              : 
    1390              : /// Concatenate a source file path and/or name with a std::error_code 
    1391              : /// to form an Error object.
    1392              : inline Error createFileError(const Twine &F, std::error_code EC) {
    1393              :   return createFileError(F, errorCodeToError(EC));
    1394              : }
    1395              : 
    1396              : /// Concatenate a source file path and/or name with line number and
    1397              : /// std::error_code to form an Error object.
    1398              : inline Error createFileError(const Twine &F, size_t Line, std::error_code EC) {
    1399              :   return createFileError(F, Line, errorCodeToError(EC));
    1400              : }
    1401              : 
    1402              : Error createFileError(const Twine &F, ErrorSuccess) = delete;
    1403              : 
    1404              : /// Helper for check-and-exit error handling.
    1405              : ///
    1406              : /// For tool use only. NOT FOR USE IN LIBRARY CODE.
    1407              : ///
    1408              : class ExitOnError {
    1409              : public:
    1410              :   /// Create an error on exit helper.
    1411              :   ExitOnError(std::string Banner = "", int DefaultErrorExitCode = 1)
    1412              :       : Banner(std::move(Banner)),
    1413              :         GetExitCode([=](const Error &) { return DefaultErrorExitCode; }) {}
    1414              : 
    1415              :   /// Set the banner string for any errors caught by operator().
    1416              :   void setBanner(std::string Banner) { this->Banner = std::move(Banner); }
    1417              : 
    1418              :   /// Set the exit-code mapper function.
    1419              :   void setExitCodeMapper(std::function<int(const Error &)> GetExitCode) {
    1420              :     this->GetExitCode = std::move(GetExitCode);
    1421              :   }
    1422              : 
    1423              :   /// Check Err. If it's in a failure state log the error(s) and exit.
    1424              :   void operator()(Error Err) const { checkError(std::move(Err)); }
    1425              : 
    1426              :   /// Check E. If it's in a success state then return the contained value. If
    1427              :   /// it's in a failure state log the error(s) and exit.
    1428              :   template <typename T> T operator()(Expected<T> &&E) const {
    1429              :     checkError(E.takeError());
    1430              :     return std::move(*E);
    1431              :   }
    1432              : 
    1433              :   /// Check E. If it's in a success state then return the contained reference. If
    1434              :   /// it's in a failure state log the error(s) and exit.
    1435              :   template <typename T> T& operator()(Expected<T&> &&E) const {
    1436              :     checkError(E.takeError());
    1437              :     return *E;
    1438              :   }
    1439              : 
    1440              : private:
    1441              :   void checkError(Error Err) const {
    1442              :     if (Err) {
    1443              :       int ExitCode = GetExitCode(Err);
    1444              :       logAllUnhandledErrors(std::move(Err), errs(), Banner);
    1445              :       exit(ExitCode);
    1446              :     }
    1447              :   }
    1448              : 
    1449              :   std::string Banner;
    1450              :   std::function<int(const Error &)> GetExitCode;
    1451              : };
    1452              : 
    1453              : /// Conversion from Error to LLVMErrorRef for C error bindings.
    1454              : inline LLVMErrorRef wrap(Error Err) {
    1455              :   return reinterpret_cast<LLVMErrorRef>(Err.takePayload().release());
    1456              : }
    1457              : 
    1458              : /// Conversion from LLVMErrorRef to Error for C error bindings.
    1459              : inline Error unwrap(LLVMErrorRef ErrRef) {
    1460              :   return Error(std::unique_ptr<ErrorInfoBase>(
    1461              :       reinterpret_cast<ErrorInfoBase *>(ErrRef)));
    1462              : }
    1463              : 
    1464              : } // end namespace llvm
    1465              : 
    1466              : #endif // LLVM_SUPPORT_ERROR_H
        

Generated by: LCOV version 2.0-1