Skip to content

Conversation

@ryanofsky
Copy link
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.

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,
@ryanofsky ryanofsky merged commit 6aca5f3 into bitcoin-core:master Jul 23, 2024
@bitcoin-core bitcoin-core locked and limited conversation to collaborators Jul 23, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant