12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===--- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|