Fix $Proxy.wrap mapping for empty structs with no fields #104

pull ryanofsky wants to merge 1 commits into bitcoin-core:master from ryanofsky:pr/emp changing 4 files +13 −2
  1. ryanofsky commented at 5:49 PM on July 23, 2024: collaborator

    Trying to pass an empty struct that is annotated with $Proxy.wrap and has no data fields fails because the BuildOne overload for the last field number is incorrectly declared to accept an lvalue builder reference instead of a universal reference, and the CustomBuildField overload which calls BuildOne passes an rvalue builder, so the call fails with error:

    include/mp/proxy-types.h:1066:5: error: no matching function for call to 'BuildOne'
     1066 |     BuildOne<0>(local_type, invoke_context, output.init(), value);
    
    include/mp/proxy-types.h:1050:6: note: candidate function [with index = 0, LocalType = mp::test::FooEmpty, Value = mp::test::FooEmpty, Output = mp::test::messages::FooEmpty::Builder] not viable: expects an lvalue for 3rd argument
     1050 | void BuildOne(TypeList<LocalType> param,
    

    The problem did not happen as long as the wrapped struct had at least one field because CustomBuildField would call a different BuildOne overload for the first field number which does accept rvalue builders, and that BuildOne overload would call the next BuildOne overload for the next field number passing the builder as an lvalue.

  2. Fix $Proxy.wrap mapping for empty structs with no fields
    Trying to pass an empty $Proxy.wrap struct with no fields fails because
    BuildOne overload for the last field number is incorrectly declared to accept
    an lvalue Builder reference instead of a univeral reference, and the
    CustomBuildField overload which calls BuildOne passes an rvalue Builder.
    
    The problem did not happen as long as the wrapped struct had at least one field
    because CustomBuildField would call the other BuildOne overload for the first
    field number which accepts an rvalue Builder, and that BuildOne overload would
    call the next BuildOne overload for the next field number, passing the builder
    as an lvalue.
    
    A test is included which triggers the bug. Compiler output before the bugfix looked like:
    
    include/mp/proxy-types.h:1066:5: error: no matching function for call to 'BuildOne'
     1066 |     BuildOne<0>(local_type, invoke_context, output.init(), value);
    
    include/mp/proxy-types.h:1050:6: note: candidate function [with index = 0, LocalType = mp::test::FooEmpty, Value = mp::test::FooEmpty, Output = mp::test::messages::FooEmpty::Builder] not viable: expects an lvalue for 3rd argument
     1050 | void BuildOne(TypeList<LocalType> param,
    90f8b37a3b
  3. ryanofsky merged this on Jul 23, 2024
  4. ryanofsky closed this on Jul 23, 2024

  5. bitcoin-core locked this on Jul 23, 2025
Contributors

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin-core/libmultiprocess. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-04-20 18:30 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me