You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
interop: a registry spelled on an any virtual parameter is never validated against the method's #123
detail::validate_method_parameter for the any and Boost.TypeErasure interop headers takes a ParamRegistry and never compares it with the method's registry. A mismatch that every other
virtual parameter shape rejects is accepted silently — and the parameter is not inert, because it decides the registry of a method that does not name one.
Behaviour
Parameter spells R, method is on other_registry:
parameter
decides an unannotated method's registry
checked against a method naming another
virtual_<Animal&, R> — ordinary carrier
yes
yes — core.hpp:2330, "registry mismatch: the parameter belongs to another registry"
virtual_<const std::any&, R> — interop
yes
no — accepted silently
virtual_any<A, R>&
no, abstains
yes — virtual_any.hpp:552, "registry mismatch"
Reproducer
#include<any>
#include<boost/openmethod.hpp>
#include<boost/openmethod/interop/std_any.hpp>usingnamespaceboost::openmethod;structother_registry : default_registry::with<> {};
// Passes: the mismatch is accepted.static_assert(detail::validate_method_parameter<
virtual_<const std::any&, default_registry>, other_registry, void>::value);
// Also passes: the spelled registry decided the method's registry.static_assert(std::is_same_v<
detail::method_registry<void(virtual_<const std::any&, other_registry>)>,
other_registry>);
Both compile on GCC 13 at -std=c++17. Replacing the first parameter with a plain virtual_<Animal&, default_registry> hard-errors at core.hpp:2330 instead.
Cause
The specializations are unconditional : std::true_type {}, with ParamRegistry deduced and then
unused:
Meanwhile param_registry's generic virtual_<T, Registry> pattern (core.hpp:2392) picks the
registry up — no interop header specializes param_registry — so the parameter votes in agreed_registry and method_registry_aux takes it.
virtual_any is unaffected: its specializations match virtual_any<Any, Registry>&, a different
shape, and do compare.
with no registry named on the method builds f in other_registry. Overriders registered against
the default registry land in a different dispatch table, and the call reports no_overrider at run
time after initialize().
Coverage
None of the five compile_fail_*registry*mismatch* tests uses an interop shape; #116 added only
positive static_asserts (test_dispatch_std_any.cpp).
Activity
doc: correct what an interop virtual parameter does with a registry