[PATCH] D42422: Introduce errorToBool() which converts an Error to a bool and puts the Error in a checked state.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 23 08:17:20 PST 2018


LGTM.

Thanks,
Rafael

Nico Weber via Phabricator <reviews at reviews.llvm.org> writes:

> thakis created this revision.
> thakis added reviewers: lhames, espindola.
> Herald added a subscriber: mehdi_amini.
>
> Addresses review comments from https://reviews.llvm.org/D39437
>
> (Sorry for the delay; I was gone for a bit.)
>
>
> https://reviews.llvm.org/D42422
>
> Files:
>   include/llvm/Support/Error.h
>   lib/LTO/LTOModule.cpp
>
>
> 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<MemoryBufferRef> BCData = IRObjectFile::findBitcodeInMemBuffer(
>        MemoryBufferRef(StringRef((const char *)Mem, Length), "<mem>"));
> -  if (!BCData) {
> -    consumeError(BCData.takeError());
> -    return false;
> -  }
> -  return true;
> +  return !errorToBool(BCData.takeError());
>  }
>  
>  bool LTOModule::isBitcodeFile(StringRef Path) {
> @@ -72,11 +68,7 @@
>  
>    Expected<MemoryBufferRef> 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<MemoryBufferRef> BCOrErr =
>        IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef());
> -  if (!BCOrErr) {
> -    consumeError(BCOrErr.takeError());
> +  if (errorToBool(BCOrErr.takeError()))
>      return false;
> -  }
>    LLVMContext Context;
>    ErrorOr<std::string> TripleOrErr =
>        expectedToErrorOrAndEmitErrors(Context, getBitcodeTargetTriple(*BCOrErr));
> @@ -107,10 +97,8 @@
>  std::string LTOModule::getProducerString(MemoryBuffer *Buffer) {
>    Expected<MemoryBufferRef> BCOrErr =
>        IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef());
> -  if (!BCOrErr) {
> -    consumeError(BCOrErr.takeError());
> +  if (errorToBool(BCOrErr.takeError()))
>      return "";
> -  }
>    LLVMContext Context;
>    ErrorOr<std::string> ProducerOrErr = expectedToErrorOrAndEmitErrors(
>        Context, getBitcodeProducerString(*BCOrErr));
> 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<bool>(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<MemoryBufferRef> BCData = IRObjectFile::findBitcodeInMemBuffer(
>        MemoryBufferRef(StringRef((const char *)Mem, Length), "<mem>"));
> -  if (!BCData) {
> -    consumeError(BCData.takeError());
> -    return false;
> -  }
> -  return true;
> +  return !errorToBool(BCData.takeError());
>  }
>  
>  bool LTOModule::isBitcodeFile(StringRef Path) {
> @@ -72,11 +68,7 @@
>  
>    Expected<MemoryBufferRef> 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<MemoryBufferRef> BCOrErr =
>        IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef());
> -  if (!BCOrErr) {
> -    consumeError(BCOrErr.takeError());
> +  if (errorToBool(BCOrErr.takeError()))
>      return false;
> -  }
>    LLVMContext Context;
>    ErrorOr<std::string> TripleOrErr =
>        expectedToErrorOrAndEmitErrors(Context, getBitcodeTargetTriple(*BCOrErr));
> @@ -107,10 +97,8 @@
>  std::string LTOModule::getProducerString(MemoryBuffer *Buffer) {
>    Expected<MemoryBufferRef> BCOrErr =
>        IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef());
> -  if (!BCOrErr) {
> -    consumeError(BCOrErr.takeError());
> +  if (errorToBool(BCOrErr.takeError()))
>      return "";
> -  }
>    LLVMContext Context;
>    ErrorOr<std::string> ProducerOrErr = expectedToErrorOrAndEmitErrors(
>        Context, getBitcodeProducerString(*BCOrErr));
> 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<bool>(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


More information about the llvm-commits mailing list