The util::ResultPtr class is a wrapper for util::Result providing syntax sugar to make it less awkward to use with returned pointers. Instead of needing to be deferenced twice with **result or (*result)->member, it only needs to be dereferenced once with *result or result->member. Also when it is used in a boolean context, instead of evaluating to true when there is no error and the pointer is null, it evaluates to false so it is straightforward to determine whether the result points to something.
This PR is only partial a solution to #26004 because while it makes it easier to check for null pointer values, it does not make it impossible to return a null pointer value inside a successful result. It would be possible to enforce that successful results always contain non-null pointers by using a not_null type (https://github.com/bitcoin/bitcoin/issues/24423) in combination with ResultPtr, though.
ryanofsky
commented at 3:57 pm on September 6, 2022:
contributor
In draft state because it’s a partial solution to #26004 and could be discussed more
DrahtBot
commented at 11:11 pm on September 6, 2022:
contributor
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.
LLM Linter (✨ experimental)
Possible typos and grammar issues:
“defines helper functions types” -> “defines helper function types” [plural noun order: should be “function types” not “functions types”]
“to for dealing with error and warning messages.” -> “for dealing with error and warning messages.” [extra/preposition “to” is incorrect]
“allowing each to be understood to changed more easily.” -> “allowing each to be understood or changed more easily.” [ungrammatical phrasing: “to changed” is invalid; “or changed” fixes meaning]
No other typos were found.
2025-12-16
DrahtBot added the label
Needs rebase
on Sep 19, 2022
ryanofsky force-pushed
on Sep 20, 2022
ryanofsky
commented at 6:28 pm on September 20, 2022:
contributor
I also rewrote the commit and PR description. I think this is in a good state to review, despite being based on another PR.
DrahtBot removed the label
CI failed
on Feb 22, 2024
DrahtBot added the label
Needs rebase
on Apr 30, 2024
ryanofsky force-pushed
on May 1, 2024
ryanofsky
commented at 5:56 pm on May 1, 2024:
contributor
Rebased 8ecac0885ef5b6fc2313cd2f8dfb48c10a05db27 -> 9f58eb795ec5592c59f9af3269f004e589a2368f (pr/bresult-ptr.4 -> pr/bresult-ptr.5, compare) on top of latest #25665 (no other changes)
DrahtBot removed the label
Needs rebase
on May 1, 2024
DrahtBot added the label
Needs rebase
on May 20, 2024
ryanofsky force-pushed
on Jun 17, 2024
DrahtBot removed the label
Needs rebase
on Jun 17, 2024
DrahtBot added the label
Needs rebase
on Jul 2, 2024
ryanofsky force-pushed
on Jul 18, 2024
DrahtBot
commented at 10:16 pm on July 18, 2024:
contributor
Make sure to run all tests locally, according to the documentation.
The failure may happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being
incompatible with the current code in the target branch). If so, make sure to rebase on the latest
commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the
affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
DrahtBot added the label
CI failed
on Jul 18, 2024
DrahtBot removed the label
Needs rebase
on Jul 18, 2024
DrahtBot removed the label
CI failed
on Jul 19, 2024
hebasto added the label
Needs CMake port
on Aug 16, 2024
DrahtBot
commented at 5:21 am on August 29, 2024:
contributor
Make sure to run all tests locally, according to the documentation.
The failure may happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being
incompatible with the current code in the target branch). If so, make sure to rebase on the latest
commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the
affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
DrahtBot added the label
CI failed
on Aug 29, 2024
maflcko removed the label
Needs CMake port
on Aug 29, 2024
DrahtBot added the label
Needs rebase
on Sep 2, 2024
ryanofsky force-pushed
on Nov 4, 2024
ryanofsky
commented at 1:34 pm on November 4, 2024:
contributor
Rebased 5f6f91c5fd848fecdc71db25ce1c5ddbedc78f29 -> c7e73097f4a8336e23d098c2fb4296319aba318e (pr/bresult-ptr.8 -> pr/bresult-ptr.9, compare) on top of updated base PR (no changes or conflicts)
Rebased c7e73097f4a8336e23d098c2fb4296319aba318e -> f8254e78c140f5756fbd981994d17f6a91ee027b (pr/bresult-ptr.9 -> pr/bresult-ptr.10, compare) on top of updated base PR (no changes or conflicts)
Rebased f8254e78c140f5756fbd981994d17f6a91ee027b -> f44cb2416fe98a6ffafba2b37ee8e1a18b731a1f (pr/bresult-ptr.10 -> pr/bresult-ptr.11, compare) on top of updated base PR (no changes or conflicts)
Rebased f44cb2416fe98a6ffafba2b37ee8e1a18b731a1f -> 06512c44b6264f4ece4108dfcb572c0a90ec55b9 (pr/bresult-ptr.11 -> pr/bresult-ptr.12, compare) due to silent conflict with #31061
DrahtBot removed the label
Needs rebase
on Nov 4, 2024
DrahtBot removed the label
CI failed
on Nov 4, 2024
DrahtBot added the label
Needs rebase
on Dec 5, 2024
ryanofsky force-pushed
on Dec 6, 2024
ryanofsky force-pushed
on Dec 6, 2024
DrahtBot removed the label
Needs rebase
on Dec 6, 2024
DrahtBot added the label
Needs rebase
on Jan 17, 2025
ryanofsky force-pushed
on Mar 12, 2025
DrahtBot removed the label
Needs rebase
on Mar 12, 2025
DrahtBot added the label
CI failed
on May 19, 2025
DrahtBot removed the label
CI failed
on May 22, 2025
DrahtBot added the label
Needs rebase
on Jul 30, 2025
ryanofsky force-pushed
on Aug 1, 2025
DrahtBot removed the label
Needs rebase
on Aug 2, 2025
DrahtBot added the label
Needs rebase
on Nov 4, 2025
ryanofsky force-pushed
on Nov 11, 2025
DrahtBot removed the label
Needs rebase
on Nov 11, 2025
DrahtBot added the label
Needs rebase
on Dec 9, 2025
ryanofsky force-pushed
on Dec 12, 2025
DrahtBot removed the label
Needs rebase
on Dec 12, 2025
DrahtBot added the label
CI failed
on Dec 12, 2025
DrahtBot
commented at 6:03 pm on December 12, 2025:
contributor
🚧 At least one of the CI tasks failed.
Task lint: https://github.com/bitcoin/bitcoin/actions/runs/20166560660/job/57895210798
LLM reason (✨ experimental): Lint failure: a new circular dependency between util::messages and util::result triggered by lint-circular-dependencies.py causing the CI to fail.
Try to run the tests locally, according to the documentation. However, a CI failure may still
happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being
incompatible with the current code in the target branch). If so, make sure to rebase on the latest
commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the
affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
refactor: Add util::Result failure values
Add util::Result support for returning more error information. For better error
handling, adds the ability to return a value on failure, not just a value on
success. This is a key missing feature that made the result class not useful
for functions like LoadChainstate() which produce different errors that need to
be handled differently.
This change also makes some more minor improvements:
- Smaller type size. On 64-bit platforms, util::Result<int> is 16 bytes, and
util::Result<void> is 8 bytes. Previously util::Result<int> and
util::Result<void> were 72 bytes.
- More documentation and tests.
Previous commit causes the warning to be triggered, but the suboptimal return
from const statement was added earlier in 517e204bacd9d.
Warning was causing CI failure https://cirrus-ci.com/task/6159914970644480
3b679db80f
refactor: Add util::Result::Update() method
Add util::Result Update method to make it possible to change the value of an
existing Result object. This will be useful for functions that can return
multiple error and warning messages, and want to be able to change the result
value while keeping existing messages.
db7d166f49
refactor: Use util::Result class in LoadChainstate and VerifyLoadedChainstated47c19c169
refactor: Add util::Result multiple error and warning messages
Add util::Result support for returning warning messages and multiple errors,
not just a single error string. This provides a way for functions to report
errors and warnings in a standard way, and simplifies interfaces.
The functionality is unit tested here, and put to use in followup PR
https://github.com/bitcoin/bitcoin/pull/25722
7214d8f06e
test: add static test for util::Result memory usage
Suggested by Martin Leitner-Ankerl <martin.ankerl@gmail.com>
https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174298529
Co-authored-by: Martin Leitner-Ankerl <martin.ankerl@gmail.com>
Avoid false positive maybe-uninitialized errors in
00_setup_env_native_fuzz_with_valgrind CI jobs. Similar errors also happen in
00_setup_env_arm and 00_setup_env_win64 jobs.
Problem was pointed out and fix was suggested by maflcko in
https://github.com/bitcoin/bitcoin/pull/25665#issuecomment-3457573218
CI errors look like:
https://github.com/bitcoin/bitcoin/actions/runs/18881332233/job/53885646274?pr=25665
/home/admin/actions-runner/_work/_temp/src/wallet/test/util.cpp: In function ‘wallet::DescriptorScriptPubKeyMan* wallet::CreateDescriptor(CWallet&, const std::string&, bool)’:
/home/admin/actions-runner/_work/_temp/src/wallet/test/util.cpp:213:29: error: ‘*(const std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>*)((char*)&spkm + offsetof(util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>,util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>.util::detail::SuccessHolder<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>)).std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>::_M_data’ may be used uninitialized [-Werror=maybe-uninitialized]
213 | return &spkm.value().get();
| ~~~~~~~~~~~~~~~~^~
/home/admin/actions-runner/_work/_temp/src/wallet/test/util.cpp:212:10: note: ‘*(const std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>*)((char*)&spkm + offsetof(util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>,util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>.util::detail::SuccessHolder<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>)).std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>::_M_data’ was declared here
212 | auto spkm = Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/"", /*internal=*/false));
| ^~~~
bbcabe3206
Merge branch 'pr/bresult2' into pr/bresult-ptr2a6ad96b2d
Add util::ResultPtr class
The util::ResultPtr class is a wrapper for util::Result providing syntax sugar
to make it less awkward to use with returned pointers. Instead of needing to be
deferenced twice with **result or (*result)->member, it only needs to be
dereferenced once with *result or result->member. Also when it is used in a
boolean context, instead of evaluating to true when there is no error and the
pointer is null, it evaluates to false so it is straightforward to determine
whether the result points to something.
This PR is only partial a solution to #26004 because while it makes it easier
to check for null pointer values, it does not make it impossible to return a
null pointer value inside a successful result. It would be possible to enforce
that successful results always contain non-null pointers by using a not_null
type (https://github.com/bitcoin/bitcoin/issues/24423) in combination with
ResultPtr, though.
4096f32742
Use ResultPtr<unique_ptr> instead of Result<unique_ptr>cf734e5b47
DrahtBot added the label
Needs rebase
on Dec 15, 2025
ryanofsky force-pushed
on Dec 16, 2025
DrahtBot removed the label
Needs rebase
on Dec 16, 2025
DrahtBot removed the label
CI failed
on Dec 16, 2025
DrahtBot added the label
Needs rebase
on Dec 16, 2025
DrahtBot
commented at 3:46 pm on December 16, 2025:
contributor
🐙 This pull request conflicts with the target branch and needs rebase.
This is a metadata mirror of the GitHub repository
bitcoin/bitcoin.
This site is not affiliated with GitHub.
Content is generated from a GitHub metadata backup.
generated: 2026-01-01 06:13 UTC
This site is hosted by @0xB10C More mirrored repositories can be found on mirror.b10c.me