-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Description
Required prerequisites
- Make sure you've read the documentation. Your issue may be addressed there.
- Search the issue tracker and Discussions to verify that this hasn't already been reported. +1 or comment there if it has.
- Consider asking first in the Gitter chat room or in a Discussion.
What version (or hash if on master) of pybind11 are you using?
2.11.1
Problem description
If you have a concat function in the code you are creating bindings for, it is possible for pybind11 to fail to compile the bindings.
pybind11/include/pybind11/cast.h
Line 1477 in 705efcc
| static constexpr auto arg_names = concat(type_descr(make_caster<Args>::name)...); |
At the above line, the wrong concat function will be found due ADL rules while compiling the example causing the failure.
I originally discovered this issue in code I had that created bindings for nlohmann::json from https://github.com/nlohmann/json. The reproducible example code is based off the code there. In that case, the concat function was inside the nlohmann::detail namespace and wasn't discoverable until nlohmann::json inherited from a class inside the detail namespace (from commit nlohmann/json@bed648c).
Compiler explorer link to example: https://godbolt.org/z/Y1Y6nave9
Reproducible example code
#include <pybind11/pybind11.h>
namespace example
{
template<typename OutStringType = std::string, typename... Args>
OutStringType concat(Args&&... args)
{
return OutStringType();
}
struct test
{
};
}
void bind(pybind11::module_& mod)
{
mod.def("foo", [](const example::test& self){});
}
Is this a regression? Put the last known working version here if it is.
Not a regression