Merge branch 'master' into sh_merge_master

This commit is contained in:
Ralf W. Grosse-Kunstleve 2022-08-07 15:40:38 -07:00
commit 1f6e9a8945
20 changed files with 65 additions and 48 deletions

View File

@ -912,7 +912,7 @@ jobs:
- name: Configure C++11 - name: Configure C++11
# LTO leads to many undefined reference like # LTO leads to many undefined reference like
# `pybind11::detail::function_call::function_call(pybind11::detail::function_call&&) # `pybind11::detail::function_call::function_call(pybind11::detail::function_call&&)
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=11 -DDOWNLOAD_CATCH=ON -S . -B build run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=11 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -S . -B build
- name: Build C++11 - name: Build C++11
run: cmake --build build -j 2 run: cmake --build build -j 2
@ -930,7 +930,7 @@ jobs:
run: git clean -fdx run: git clean -fdx
- name: Configure C++14 - name: Configure C++14
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=14 -DDOWNLOAD_CATCH=ON -S . -B build2 run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=14 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -S . -B build2
- name: Build C++14 - name: Build C++14
run: cmake --build build2 -j 2 run: cmake --build build2 -j 2
@ -948,7 +948,7 @@ jobs:
run: git clean -fdx run: git clean -fdx
- name: Configure C++17 - name: Configure C++17
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=17 -DDOWNLOAD_CATCH=ON -S . -B build3 run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=17 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -S . -B build3
- name: Build C++17 - name: Build C++17
run: cmake --build build3 -j 2 run: cmake --build build3 -j 2

View File

@ -938,7 +938,7 @@ jobs:
- name: Configure C++11 - name: Configure C++11
# LTO leads to many undefined reference like # LTO leads to many undefined reference like
# `pybind11::detail::function_call::function_call(pybind11::detail::function_call&&) # `pybind11::detail::function_call::function_call(pybind11::detail::function_call&&)
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=11 -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=11 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build
- name: Build C++11 - name: Build C++11
run: cmake --build build -j 2 run: cmake --build build -j 2
@ -956,7 +956,7 @@ jobs:
run: git clean -fdx run: git clean -fdx
- name: Configure C++14 - name: Configure C++14
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=14 -DDOWNLOAD_CATCH=O -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build2 run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=14 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build2
- name: Build C++14 - name: Build C++14
run: cmake --build build2 -j 2 run: cmake --build build2 -j 2
@ -974,7 +974,7 @@ jobs:
run: git clean -fdx run: git clean -fdx
- name: Configure C++17 - name: Configure C++17
run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=17 -DDOWNLOAD_CATCH=O -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build3 run: cmake -G "MinGW Makefiles" -DCMAKE_CXX_STANDARD=17 -DCMAKE_VERBOSE_MAKEFILE=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_FLAGS="-DPYBIND11_USE_SMART_HOLDER_AS_DEFAULT" -S . -B build3
- name: Build C++17 - name: Build C++17
run: cmake --build build3 -j 2 run: cmake --build build3 -j 2

View File

@ -99,13 +99,13 @@ jobs:
- uses: actions/download-artifact@v3 - uses: actions/download-artifact@v3
- name: Publish standard package - name: Publish standard package
uses: pypa/gh-action-pypi-publish@v1.5.0 uses: pypa/gh-action-pypi-publish@v1.5.1
with: with:
password: ${{ secrets.pypi_password }} password: ${{ secrets.pypi_password }}
packages_dir: standard/ packages_dir: standard/
- name: Publish global package - name: Publish global package
uses: pypa/gh-action-pypi-publish@v1.5.0 uses: pypa/gh-action-pypi-publish@v1.5.1
with: with:
password: ${{ secrets.pypi_password_global }} password: ${{ secrets.pypi_password_global }}
packages_dir: global/ packages_dir: global/

View File

@ -104,7 +104,7 @@ jobs:
run: cmake --build build3 --target pytest run: cmake --build build3 --target pytest
- name: Interface test - name: Interface test
run: cmake --build build2 --target test_cmake_build run: cmake --build build3 --target test_cmake_build
# This makes sure the setup_helpers module can build packages using # This makes sure the setup_helpers module can build packages using
# setuptools # setuptools

View File

@ -33,7 +33,7 @@ repos:
# Upgrade old Python syntax # Upgrade old Python syntax
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: "v2.37.1" rev: "v2.37.3"
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [--py36-plus] args: [--py36-plus]
@ -73,7 +73,7 @@ repos:
# Autoremoves unused imports # Autoremoves unused imports
- repo: https://github.com/hadialqattan/pycln - repo: https://github.com/hadialqattan/pycln
rev: "v2.0.4" rev: "v2.1.1"
hooks: hooks:
- id: pycln - id: pycln
stages: [manual] stages: [manual]
@ -102,7 +102,7 @@ repos:
# Flake8 also supports pre-commit natively (same author) # Flake8 also supports pre-commit natively (same author)
- repo: https://github.com/PyCQA/flake8 - repo: https://github.com/PyCQA/flake8
rev: "4.0.1" rev: "5.0.2"
hooks: hooks:
- id: flake8 - id: flake8
exclude: ^(docs/.*|tools/.*|ubench/.*)$ exclude: ^(docs/.*|tools/.*|ubench/.*)$
@ -126,7 +126,7 @@ repos:
# Check static types with mypy # Check static types with mypy
- repo: https://github.com/pre-commit/mirrors-mypy - repo: https://github.com/pre-commit/mirrors-mypy
rev: "v0.961" rev: "v0.971"
hooks: hooks:
- id: mypy - id: mypy
args: [] args: []

View File

@ -38,7 +38,7 @@ type is explicitly allowed.
.. code-block:: cpp .. code-block:: cpp
namespace pybind11 { namespace detail { namespace PYBIND11_NAMESPACE { namespace detail {
template <> struct type_caster<inty> { template <> struct type_caster<inty> {
public: public:
/** /**
@ -78,7 +78,7 @@ type is explicitly allowed.
return PyLong_FromLong(src.long_value); return PyLong_FromLong(src.long_value);
} }
}; };
}} // namespace pybind11::detail }} // namespace PYBIND11_NAMESPACE::detail
.. note:: .. note::

View File

@ -42,7 +42,7 @@ types:
.. code-block:: cpp .. code-block:: cpp
// `boost::optional` as an example -- can be any `std::optional`-like container // `boost::optional` as an example -- can be any `std::optional`-like container
namespace pybind11 { namespace detail { namespace PYBIND11_NAMESPACE { namespace detail {
template <typename T> template <typename T>
struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {}; struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {};
}} }}
@ -54,7 +54,7 @@ for custom variant types:
.. code-block:: cpp .. code-block:: cpp
// `boost::variant` as an example -- can be any `std::variant`-like container // `boost::variant` as an example -- can be any `std::variant`-like container
namespace pybind11 { namespace detail { namespace PYBIND11_NAMESPACE { namespace detail {
template <typename... Ts> template <typename... Ts>
struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {}; struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {};
@ -66,7 +66,7 @@ for custom variant types:
return boost::apply_visitor(args...); return boost::apply_visitor(args...);
} }
}; };
}} // namespace pybind11::detail }} // namespace PYBIND11_NAMESPACE::detail
The ``visit_helper`` specialization is not required if your ``name::variant`` provides The ``visit_helper`` specialization is not required if your ``name::variant`` provides
a ``name::visit()`` function. For any other function name, the specialization must be a ``name::visit()`` function. For any other function name, the specialization must be

View File

@ -1228,7 +1228,7 @@ whether a downcast is safe, you can proceed by specializing the
std::string bark() const { return sound; } std::string bark() const { return sound; }
}; };
namespace pybind11 { namespace PYBIND11_NAMESPACE {
template<> struct polymorphic_type_hook<Pet> { template<> struct polymorphic_type_hook<Pet> {
static const void *get(const Pet *src, const std::type_info*& type) { static const void *get(const Pet *src, const std::type_info*& type) {
// note that src may be nullptr // note that src may be nullptr
@ -1239,7 +1239,7 @@ whether a downcast is safe, you can proceed by specializing the
return src; return src;
} }
}; };
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
When pybind11 wants to convert a C++ pointer of type ``Base*`` to a When pybind11 wants to convert a C++ pointer of type ``Base*`` to a
Python object, it calls ``polymorphic_type_hook<Base>::get()`` to Python object, it calls ``polymorphic_type_hook<Base>::get()`` to

View File

@ -433,7 +433,7 @@ following:
{ 2, 4 }, // shape (rows, cols) { 2, 4 }, // shape (rows, cols)
{ sizeof(uint8_t) * 4, sizeof(uint8_t) } // strides in bytes { sizeof(uint8_t) * 4, sizeof(uint8_t) } // strides in bytes
); );
}) });
This approach is meant for providing a ``memoryview`` for a C/C++ buffer not This approach is meant for providing a ``memoryview`` for a C/C++ buffer not
managed by Python. The user is responsible for managing the lifetime of the managed by Python. The user is responsible for managing the lifetime of the
@ -449,7 +449,7 @@ We can also use ``memoryview::from_memory`` for a simple 1D contiguous buffer:
buffer, // buffer pointer buffer, // buffer pointer
sizeof(uint8_t) * 8 // buffer size sizeof(uint8_t) * 8 // buffer size
); );
}) });
.. versionchanged:: 2.6 .. versionchanged:: 2.6
``memoryview::from_memory`` added. ``memoryview::from_memory`` added.

View File

@ -164,7 +164,7 @@ specialized:
PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>); PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>);
// Only needed if the type's `.get()` goes by another name // Only needed if the type's `.get()` goes by another name
namespace pybind11 { namespace detail { namespace PYBIND11_NAMESPACE { namespace detail {
template <typename T> template <typename T>
struct holder_helper<SmartPtr<T>> { // <-- specialization struct holder_helper<SmartPtr<T>> { // <-- specialization
static const T *get(const SmartPtr<T> &p) { return p.getPointer(); } static const T *get(const SmartPtr<T> &p) { return p.getPointer(); }

View File

@ -27,6 +27,9 @@
# pragma warning(disable : 4127) // C4127: conditional expression is constant # pragma warning(disable : 4127) // C4127: conditional expression is constant
# pragma warning(disable : 5054) // https://github.com/pybind/pybind11/pull/3741 # pragma warning(disable : 5054) // https://github.com/pybind/pybind11/pull/3741
// C5054: operator '&': deprecated between enumerations of different types // C5054: operator '&': deprecated between enumerations of different types
#elif defined(__MINGW32__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#endif #endif
#include <Eigen/Core> #include <Eigen/Core>
@ -34,6 +37,8 @@
#if defined(_MSC_VER) #if defined(_MSC_VER)
# pragma warning(pop) # pragma warning(pop)
#elif defined(__MINGW32__)
# pragma GCC diagnostic pop
#endif #endif
// Eigen prior to 3.2.7 doesn't have proper move constructors--but worse, some classes get implicit // Eigen prior to 3.2.7 doesn't have proper move constructors--but worse, some classes get implicit

View File

@ -2328,7 +2328,7 @@ struct enum_base {
+ "\" already exists!"); + "\" already exists!");
} }
entries[name] = std::make_pair(value, doc); entries[name] = pybind11::make_tuple(value, doc);
m_base.attr(std::move(name)) = std::move(value); m_base.attr(std::move(name)) = std::move(value);
} }

View File

@ -2420,6 +2420,7 @@ PYBIND11_MATH_OPERATOR_BINARY_INPLACE(operator>>=, PyNumber_InPlaceRshift)
#undef PYBIND11_MATH_OPERATOR_UNARY #undef PYBIND11_MATH_OPERATOR_UNARY
#undef PYBIND11_MATH_OPERATOR_BINARY #undef PYBIND11_MATH_OPERATOR_BINARY
#undef PYBIND11_MATH_OPERATOR_BINARY_INPLACE
PYBIND11_NAMESPACE_END(detail) PYBIND11_NAMESPACE_END(detail)
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -46,5 +46,5 @@ zip_safe = False
max-line-length = 120 max-line-length = 120
show_source = True show_source = True
exclude = .git, __pycache__, build, dist, docs, tools, venv exclude = .git, __pycache__, build, dist, docs, tools, venv
extend-ignore = E203, E722, B950 extend-ignore = E203, E722, B903, B950
extend-select = B9 extend-select = B9

View File

@ -273,9 +273,14 @@ TEST_SUBMODULE(builtin_casters, m) {
}); });
m.def("lvalue_nested", []() -> const decltype(lvnested) & { return lvnested; }); m.def("lvalue_nested", []() -> const decltype(lvnested) & { return lvnested; });
static std::pair<int, std::string> int_string_pair{2, "items"};
m.def( m.def(
"int_string_pair", []() { return &int_string_pair; }, py::return_value_policy::reference); "int_string_pair",
[]() {
// Using no-destructor idiom to side-step warnings from overzealous compilers.
static auto *int_string_pair = new std::pair<int, std::string>{2, "items"};
return int_string_pair;
},
py::return_value_policy::reference);
// test_builtins_cast_return_none // test_builtins_cast_return_none
m.def("return_none_string", []() -> std::string * { return nullptr; }); m.def("return_none_string", []() -> std::string * { return nullptr; });

View File

@ -21,7 +21,7 @@ public:
}; };
class ArgAlwaysConverts {}; class ArgAlwaysConverts {};
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <> template <>
struct type_caster<ArgInspector1> { struct type_caster<ArgInspector1> {
@ -74,7 +74,7 @@ public:
} }
}; };
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
// test_custom_caster_destruction // test_custom_caster_destruction
class DestructionTester { class DestructionTester {
@ -92,7 +92,7 @@ public:
return *this; return *this;
} }
}; };
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <> template <>
struct type_caster<DestructionTester> { struct type_caster<DestructionTester> {
@ -104,7 +104,7 @@ struct type_caster<DestructionTester> {
} }
}; };
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
// Define type caster outside of `pybind11::detail` and then alias it. // Define type caster outside of `pybind11::detail` and then alias it.
namespace other_lib { namespace other_lib {
@ -112,7 +112,7 @@ struct MyType {};
// Corrupt `py` shorthand alias for surrounding context. // Corrupt `py` shorthand alias for surrounding context.
namespace py {} namespace py {}
// Corrupt unqualified relative `pybind11` namespace. // Corrupt unqualified relative `pybind11` namespace.
namespace pybind11 {} namespace PYBIND11_NAMESPACE {}
// Correct alias. // Correct alias.
namespace py_ = ::pybind11; namespace py_ = ::pybind11;
// Define caster. This is effectively no-op, we only ensure it compiles and we // Define caster. This is effectively no-op, we only ensure it compiles and we
@ -127,12 +127,12 @@ struct my_caster {
}; };
} // namespace other_lib } // namespace other_lib
// Effectively "alias" it into correct namespace (via inheritance). // Effectively "alias" it into correct namespace (via inheritance).
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <> template <>
struct type_caster<other_lib::MyType> : public other_lib::my_caster {}; struct type_caster<other_lib::MyType> : public other_lib::my_caster {};
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
TEST_SUBMODULE(custom_type_casters, m) { TEST_SUBMODULE(custom_type_casters, m) {
// test_custom_type_casters // test_custom_type_casters

View File

@ -185,8 +185,8 @@ def test_custom(msg):
with pytest.raises(m.MyException5) as excinfo: with pytest.raises(m.MyException5) as excinfo:
try: try:
m.throws5() m.throws5()
except m.MyException5_1: except m.MyException5_1 as err:
raise RuntimeError("Exception error: caught child from parent") raise RuntimeError("Exception error: caught child from parent") from err
assert msg(excinfo.value) == "this is a helper-defined translated exception" assert msg(excinfo.value) == "this is a helper-defined translated exception"

View File

@ -266,14 +266,14 @@ struct ElementList {
// It is always possible to construct a ref<T> from an Object* pointer without // It is always possible to construct a ref<T> from an Object* pointer without
// possible inconsistencies, hence the 'true' argument at the end. // possible inconsistencies, hence the 'true' argument at the end.
// Make pybind11 aware of the non-standard getter member function // Make pybind11 aware of the non-standard getter member function
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <typename T> template <typename T>
struct holder_helper<ref<T>> { struct holder_helper<ref<T>> {
static const T *get(const ref<T> &p) { return p.get_ptr(); } static const T *get(const ref<T> &p) { return p.get_ptr(); }
}; };
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
// Make pybind aware of the ref-counted wrapper type (s): // Make pybind aware of the ref-counted wrapper type (s):
PYBIND11_DECLARE_HOLDER_TYPE(T, ref<T>, true); PYBIND11_DECLARE_HOLDER_TYPE(T, ref<T>, true);

View File

@ -23,7 +23,7 @@
#if defined(PYBIND11_TEST_BOOST) #if defined(PYBIND11_TEST_BOOST)
# include <boost/optional.hpp> # include <boost/optional.hpp>
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <typename T> template <typename T>
struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {}; struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {};
@ -31,7 +31,7 @@ struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {};
template <> template <>
struct type_caster<boost::none_t> : void_caster<boost::none_t> {}; struct type_caster<boost::none_t> : void_caster<boost::none_t> {};
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
#endif #endif
// Test with `std::variant` in C++17 mode, or with `boost::variant` in C++11/14 // Test with `std::variant` in C++17 mode, or with `boost::variant` in C++11/14
@ -43,7 +43,7 @@ using std::variant;
# define PYBIND11_TEST_VARIANT 1 # define PYBIND11_TEST_VARIANT 1
using boost::variant; using boost::variant;
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <typename... Ts> template <typename... Ts>
struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {}; struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {};
@ -56,7 +56,7 @@ struct visit_helper<boost::variant> {
} }
}; };
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
#endif #endif
PYBIND11_MAKE_OPAQUE(std::vector<std::string, std::allocator<std::string>>); PYBIND11_MAKE_OPAQUE(std::vector<std::string, std::allocator<std::string>>);
@ -159,13 +159,13 @@ private:
std::vector<T> storage; std::vector<T> storage;
}; };
namespace pybind11 { namespace PYBIND11_NAMESPACE {
namespace detail { namespace detail {
template <typename T> template <typename T>
struct type_caster<ReferenceSensitiveOptional<T>> struct type_caster<ReferenceSensitiveOptional<T>>
: optional_caster<ReferenceSensitiveOptional<T>> {}; : optional_caster<ReferenceSensitiveOptional<T>> {};
} // namespace detail } // namespace detail
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
TEST_SUBMODULE(stl, m) { TEST_SUBMODULE(stl, m) {
// test_vector // test_vector
@ -176,9 +176,14 @@ TEST_SUBMODULE(stl, m) {
m.def("load_bool_vector", m.def("load_bool_vector",
[](const std::vector<bool> &v) { return v.at(0) == true && v.at(1) == false; }); [](const std::vector<bool> &v) { return v.at(0) == true && v.at(1) == false; });
// Unnumbered regression (caused by #936): pointers to stl containers aren't castable // Unnumbered regression (caused by #936): pointers to stl containers aren't castable
static std::vector<RValueCaster> lvv{2};
m.def( m.def(
"cast_ptr_vector", []() { return &lvv; }, py::return_value_policy::reference); "cast_ptr_vector",
[]() {
// Using no-destructor idiom to side-step warnings from overzealous compilers.
static auto *v = new std::vector<RValueCaster>{2};
return v;
},
py::return_value_policy::reference);
// test_deque // test_deque
m.def("cast_deque", []() { return std::deque<int>{1}; }); m.def("cast_deque", []() { return std::deque<int>{1}; });
@ -237,6 +242,7 @@ TEST_SUBMODULE(stl, m) {
lvn["b"].emplace_back(); // add a list lvn["b"].emplace_back(); // add a list
lvn["b"].back().emplace_back(); // add an array lvn["b"].back().emplace_back(); // add an array
lvn["b"].back().emplace_back(); // add another array lvn["b"].back().emplace_back(); // add another array
static std::vector<RValueCaster> lvv{2};
m.def("cast_lv_vector", []() -> const decltype(lvv) & { return lvv; }); m.def("cast_lv_vector", []() -> const decltype(lvv) & { return lvv; });
m.def("cast_lv_array", []() -> const decltype(lva) & { return lva; }); m.def("cast_lv_array", []() -> const decltype(lva) & { return lva; });
m.def("cast_lv_map", []() -> const decltype(lvm) & { return lvm; }); m.def("cast_lv_map", []() -> const decltype(lvm) & { return lvm; });

View File

@ -117,7 +117,7 @@ std::string Animal::name_of_kind(Kind kind) {
return raw_name; return raw_name;
} }
namespace pybind11 { namespace PYBIND11_NAMESPACE {
template <typename itype> template <typename itype>
struct polymorphic_type_hook<itype, detail::enable_if_t<std::is_base_of<Animal, itype>::value>> { struct polymorphic_type_hook<itype, detail::enable_if_t<std::is_base_of<Animal, itype>::value>> {
static const void *get(const itype *src, const std::type_info *&type) { static const void *get(const itype *src, const std::type_info *&type) {
@ -125,7 +125,7 @@ struct polymorphic_type_hook<itype, detail::enable_if_t<std::is_base_of<Animal,
return src; return src;
} }
}; };
} // namespace pybind11 } // namespace PYBIND11_NAMESPACE
TEST_SUBMODULE(tagbased_polymorphic, m) { TEST_SUBMODULE(tagbased_polymorphic, m) {
py::class_<Animal>(m, "Animal").def_readonly("name", &Animal::name); py::class_<Animal>(m, "Animal").def_readonly("name", &Animal::name);