Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

interop: a registry spelled on an `any` virtual parameter is never validated against the method's

Open
#123 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
68/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
cpp
Domain
backend

Research direction

Start with detail::validate_method_parameter and param_registry in core.hpp, then compare the interop specializations in interop/std_any.hpp, interop/boost_any.hpp, and interop/boost_type_erasure.hpp. Run the compile_fail_registrymismatch* tests and test_dispatch_std_any.cpp. Done means interop parameters reject registry mismatches while retaining their documented registry-selection behavior.

Written by the indexing model from the issue text.

Description

(Written by Claude Code, on behalf of @jll63.)

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>

using namespace boost::openmethod;
struct other_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:

  • interop/std_any.hpp:24,29,33
  • interop/boost_any.hpp:24,29,33
  • interop/boost_type_erasure.hpp:98,103,108,113,118,123

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.

Consequence
BOOST_OPENMETHOD(f, (virtual_<const std::any&, other_registry>), void);

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).

Dominant language
C++
Stars
13
Forks
6
Avg merge
2d 14m
Merged PRs (30d)
27

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from boostorg/openmethod

All issues in boostorg/openmethod

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.