[llvm] r264467 - [Support] Add Error::errorForOutParameter helper.
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 25 15:05:00 PDT 2016
On Fri, Mar 25, 2016 at 2:56 PM, Lang Hames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: lhames
> Date: Fri Mar 25 16:56:35 2016
> New Revision: 264467
>
> URL: http://llvm.org/viewvc/llvm-project?rev=264467&view=rev
> Log:
> [Support] Add Error::errorForOutParameter helper.
>
> This helper method creates a pre-checked Error suitable for use as an out
> parameter in a constructor. This avoids the need to have the constructor
> check a known-good error before assigning to it.
>
Hmm, thinking about it - how does this work to ensure safety?
If the callee only assigns to the parameter on failure cases, won't the
code fail to assert on successful cases?
(ie: shouldn't it actually be unchecked by default as it was before - the
caller should check it on return regardless of what the function did)
>
>
> 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=264467&r1=264466&r2=264467&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Error.h (original)
> +++ llvm/trunk/include/llvm/Support/Error.h Fri Mar 25 16:56:35 2016
> @@ -143,6 +143,13 @@ public:
> /// constructor, but should be preferred for readability where possible.
> static Error success() { return Error(); }
>
> + /// Create a 'pre-checked' success value suitable for use as an
> out-parameter.
> + static Error errorForOutParameter() {
> + Error Err;
> + (void)!!Err;
> + return Err;
> + }
> +
> // Errors are not copy-constructable.
> Error(const Error &Other) = delete;
>
>
> Modified: llvm/trunk/unittests/Support/ErrorTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ErrorTest.cpp?rev=264467&r1=264466&r2=264467&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/Support/ErrorTest.cpp (original)
> +++ llvm/trunk/unittests/Support/ErrorTest.cpp Fri Mar 25 16:56:35 2016
> @@ -105,6 +105,12 @@ TEST(Error, UncheckedSuccess) {
> }
> #endif
>
> +// Test that errors to be used as out parameters are implicitly checked (
> +// and thus destruct quietly).
> +TEST(Error, ErrorAsOutParameter) {
> + Error E = Error::errorForOutParameter();
> +}
> +
> // Check that we abort on unhandled failure cases. (Force conversion to
> bool
> // to make sure that we don't accidentally treat checked errors as
> handled).
> // Test runs in debug mode only.
>
>
> _______________________________________________
> 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/20160325/a7a1fd87/attachment.html>
More information about the llvm-commits
mailing list