[llvm] r312066 - [Error] Add an optional error message to cantFail.
don hinton via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 29 17:01:29 PDT 2017
Very cool, thanks...
On Tue, Aug 29, 2017 at 4:30 PM Lang Hames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: lhames
> Date: Tue Aug 29 16:29:09 2017
> New Revision: 312066
>
> URL: http://llvm.org/viewvc/llvm-project?rev=312066&view=rev
> Log:
> [Error] Add an optional error message to cantFail.
>
> cantFail is the moral equivalent of an assertion that the wrapped call must
> return a success value. This patch allows clients to include an associated
> error message (the same way they would for an assertion for
> llvm_unreachable).
>
> If the error message is not specified it will default to: "Failure value
> returned from cantFail wrapped call".
>
>
> Modified:
> llvm/trunk/include/llvm/Support/Error.h
> llvm/trunk/unittests/Support/ErrorTest.cpp
>
> Modified: llvm/trunk/include/llvm/Support/Error.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Error.h?rev=312066&r1=312065&r2=312066&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Error.h (original)
> +++ llvm/trunk/include/llvm/Support/Error.h Tue Aug 29 16:29:09 2017
> @@ -676,9 +676,12 @@ LLVM_ATTRIBUTE_NORETURN void report_fata
> ///
> /// cantFail(foo(false));
> /// @endcode
> -inline void cantFail(Error Err) {
> - if (Err)
> - llvm_unreachable("Failure value returned from cantFail wrapped call");
> +inline void cantFail(Error Err, const char *Msg = nullptr) {
> + if (Err) {
> + if (!Msg)
> + Msg = "Failure value returned from cantFail wrapped call";
> + llvm_unreachable(Msg);
> + }
> }
>
> /// Report a fatal error if ValOrErr is a failure value, otherwise
> unwraps and
> @@ -695,11 +698,14 @@ inline void cantFail(Error Err) {
> /// int X = cantFail(foo(false));
> /// @endcode
> template <typename T>
> -T cantFail(Expected<T> ValOrErr) {
> +T cantFail(Expected<T> ValOrErr, const char *Msg = nullptr) {
> if (ValOrErr)
> return std::move(*ValOrErr);
> - else
> - llvm_unreachable("Failure value returned from cantFail wrapped call");
> + else {
> + if (!Msg)
> + Msg = "Failure value returned from cantFail wrapped call";
> + llvm_unreachable(Msg);
> + }
> }
>
> /// Report a fatal error if ValOrErr is a failure value, otherwise
> unwraps and
> @@ -716,11 +722,14 @@ T cantFail(Expected<T> ValOrErr) {
> /// Bar &X = cantFail(foo(false));
> /// @endcode
> template <typename T>
> -T& cantFail(Expected<T&> ValOrErr) {
> +T& cantFail(Expected<T&> ValOrErr, const char *Msg = nullptr) {
> if (ValOrErr)
> return *ValOrErr;
> - else
> - llvm_unreachable("Failure value returned from cantFail wrapped call");
> + else {
> + if (!Msg)
> + Msg = "Failure value returned from cantFail wrapped call";
> + llvm_unreachable(Msg);
> + }
> }
>
> /// Helper for testing applicability of, and applying, handlers for
> @@ -775,7 +784,7 @@ public:
> }
> };
>
> -/// Specialization for functions of the form 'Error
> (std::unique_ptr<ErrT>)'.
> +/// Specialization for functions of the form 'void
> (std::unique_ptr<ErrT>)'.
> template <typename ErrT>
> class ErrorHandlerTraits<void (&)(std::unique_ptr<ErrT>)> {
> public:
> @@ -813,7 +822,7 @@ class ErrorHandlerTraits<RetT (C::*)(con
> : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
>
> /// Specialization for member functions of the form
> -/// 'RetT (std::unique_ptr<ErrT>) const'.
> +/// 'RetT (std::unique_ptr<ErrT>)'.
> template <typename C, typename RetT, typename ErrT>
> class ErrorHandlerTraits<RetT (C::*)(std::unique_ptr<ErrT>)>
> : public ErrorHandlerTraits<RetT (&)(std::unique_ptr<ErrT>)> {};
>
> Modified: llvm/trunk/unittests/Support/ErrorTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ErrorTest.cpp?rev=312066&r1=312065&r2=312066&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/Support/ErrorTest.cpp (original)
> +++ llvm/trunk/unittests/Support/ErrorTest.cpp Tue Aug 29 16:29:09 2017
> @@ -486,8 +486,9 @@ TEST(Error, CantFailSuccess) {
> #if LLVM_ENABLE_ABI_BREAKING_CHECKS && !defined(NDEBUG)
> TEST(Error, CantFailDeath) {
> EXPECT_DEATH(
> - cantFail(make_error<StringError>("foo", inconvertibleErrorCode())),
> - "Failure value returned from cantFail wrapped call")
> + cantFail(make_error<StringError>("foo", inconvertibleErrorCode()),
> + "Cantfail call failed"),
> + "Cantfail call failed")
> << "cantFail(Error) did not cause an abort for failure value";
>
> EXPECT_DEATH(
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170830/686bcced/attachment.html>
More information about the llvm-commits
mailing list