//===--- MSVCErrorWorkarounds.h - Enable future 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 class MSVCPExpected : public Expected { public: MSVCPExpected() : Expected(make_error("", inconvertibleErrorCode())) { consumeError(this->takeError()); } MSVCPExpected(MSVCPExpected &&Other) : Expected(std::move(Other)) {} MSVCPExpected &operator=(MSVCPExpected &&Other) { Expected::operator=(std::move(Other)); return *this; } MSVCPExpected(Error Err) : Expected(std::move(Err)) {} template MSVCPExpected( OtherT &&Val, std::enable_if_t::value> * = nullptr) : Expected(std::move(Val)) {} template MSVCPExpected( Expected &&Other, std::enable_if_t::value> * = nullptr) : Expected(std::move(Other)) {} template explicit MSVCPExpected( Expected &&Other, std::enable_if_t::value> * = nullptr) : Expected(std::move(Other)) {} }; } // end namespace llvm #endif // LLVM_SUPPORT_MSVCERRORWORKAROUNDS_H