Index: include/llvm/Support/Error.h =================================================================== --- include/llvm/Support/Error.h +++ include/llvm/Support/Error.h @@ -963,6 +963,18 @@ handleAllErrors(std::move(Err), [](const ErrorInfoBase &) {}); } +/// Helper for converting an Error to a bool. +/// +/// This method returns true if Err is in an error state, or false if it is +/// in a success state. Puts Err in a checked state in both cases (unlike +/// Error::operator bool(), which only does this for success states). +inline bool errorToBool(Error Err) { + bool IsError = static_cast(Err); + if (IsError) + consumeError(std::move(Err)); + return IsError; +} + /// Helper for Errors used as out-parameters. /// /// This helper is for use with the Error-as-out-parameter idiom, where an error Index: lib/LTO/LTOModule.cpp =================================================================== --- lib/LTO/LTOModule.cpp +++ lib/LTO/LTOModule.cpp @@ -57,11 +57,7 @@ bool LTOModule::isBitcodeFile(const void *Mem, size_t Length) { Expected BCData = IRObjectFile::findBitcodeInMemBuffer( MemoryBufferRef(StringRef((const char *)Mem, Length), "")); - if (!BCData) { - consumeError(BCData.takeError()); - return false; - } - return true; + return !errorToBool(BCData.takeError()); } bool LTOModule::isBitcodeFile(StringRef Path) { @@ -72,11 +68,7 @@ Expected BCData = IRObjectFile::findBitcodeInMemBuffer( BufferOrErr.get()->getMemBufferRef()); - if (!BCData) { - consumeError(BCData.takeError()); - return false; - } - return true; + return !errorToBool(BCData.takeError()); } bool LTOModule::isThinLTO() { @@ -92,10 +84,8 @@ StringRef TriplePrefix) { Expected BCOrErr = IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef()); - if (!BCOrErr) { - consumeError(BCOrErr.takeError()); + if (errorToBool(BCOrErr.takeError())) return false; - } LLVMContext Context; ErrorOr TripleOrErr = expectedToErrorOrAndEmitErrors(Context, getBitcodeTargetTriple(*BCOrErr)); @@ -107,10 +97,8 @@ std::string LTOModule::getProducerString(MemoryBuffer *Buffer) { Expected BCOrErr = IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef()); - if (!BCOrErr) { - consumeError(BCOrErr.takeError()); + if (errorToBool(BCOrErr.takeError())) return ""; - } LLVMContext Context; ErrorOr ProducerOrErr = expectedToErrorOrAndEmitErrors( Context, getBitcodeProducerString(*BCOrErr));