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.