Viewing file: MSVCErrorWorkarounds.h (2.62 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===--- MSVCErrorWorkarounds.h - Enable future<Error> in MSVC --*- 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 // //===----------------------------------------------------------------------===// // // MSVC's promise/future implementation requires types to be default // constructible, so this header provides analogues of Error an Expected // that are default constructed in a safely destructible state. // // FIXME: Kill off this header and migrate all users to Error/Expected once we // move to MSVC versions that support non-default-constructible types. // //===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_MSVCERRORWORKAROUNDS_H #define LLVM_SUPPORT_MSVCERRORWORKAROUNDS_H
#include "llvm/Support/Error.h"
namespace llvm {
// A default-constructible llvm::Error that is suitable for use with MSVC's // std::future implementation which requires default constructible types. class MSVCPError : public Error { public: MSVCPError() { (void)!!*this; }
MSVCPError(MSVCPError &&Other) : Error(std::move(Other)) {}
MSVCPError &operator=(MSVCPError Other) { Error::operator=(std::move(Other)); return *this; }
MSVCPError(Error Err) : Error(std::move(Err)) {} };
// A default-constructible llvm::Expected that is suitable for use with MSVC's // std::future implementation, which requires default constructible types. template <typename T> class MSVCPExpected : public Expected<T> { public: MSVCPExpected() : Expected<T>(make_error<StringError>("", inconvertibleErrorCode())) { consumeError(this->takeError()); }
MSVCPExpected(MSVCPExpected &&Other) : Expected<T>(std::move(Other)) {}
MSVCPExpected &operator=(MSVCPExpected &&Other) { Expected<T>::operator=(std::move(Other)); return *this; }
MSVCPExpected(Error Err) : Expected<T>(std::move(Err)) {}
template <typename OtherT> MSVCPExpected( OtherT &&Val, std::enable_if_t<std::is_convertible<OtherT, T>::value> * = nullptr) : Expected<T>(std::move(Val)) {}
template <class OtherT> MSVCPExpected( Expected<OtherT> &&Other, std::enable_if_t<std::is_convertible<OtherT, T>::value> * = nullptr) : Expected<T>(std::move(Other)) {}
template <class OtherT> explicit MSVCPExpected( Expected<OtherT> &&Other, std::enable_if_t<!std::is_convertible<OtherT, T>::value> * = nullptr) : Expected<T>(std::move(Other)) {} };
} // end namespace llvm
#endif // LLVM_SUPPORT_MSVCERRORWORKAROUNDS_H
|