diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index 27d5622c..33dc9f38 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h @@ -892,14 +892,15 @@ public: type value; \ public: \ static PYBIND11_DESCR name() { return type_descr(py_name); } \ - static handle cast(const type *src, return_value_policy policy, handle parent) { \ + template >::value, int> = 0> \ + static handle cast(T_ *src, return_value_policy policy, handle parent) { \ if (!src) return none().release(); \ return cast(*src, policy, parent); \ } \ operator type*() { return &value; } \ operator type&() { return value; } \ operator type&&() && { return std::move(value); } \ - template using cast_op_type = pybind11::detail::movable_cast_op_type<_T> + template using cast_op_type = pybind11::detail::movable_cast_op_type template using is_std_char_type = any_of< diff --git a/tests/test_stl.cpp b/tests/test_stl.cpp index 839c1af0..6ba9cb94 100644 --- a/tests/test_stl.cpp +++ b/tests/test_stl.cpp @@ -38,6 +38,9 @@ TEST_SUBMODULE(stl, m) { // test_vector m.def("cast_vector", []() { return std::vector{1}; }); m.def("load_vector", [](const std::vector &v) { return v.at(0) == 1 && v.at(1) == 2; }); + // Unnumbered regression (caused by #936): pointers to stl containers aren't castable + static std::vector lvv{2}; + m.def("cast_ptr_vector", []() { return &lvv; }); // test_array m.def("cast_array", []() { return std::array {{1 , 2}}; }); @@ -78,7 +81,6 @@ TEST_SUBMODULE(stl, m) { v.back()[1].back().emplace("a", RValueCaster{}); return v; }); - static std::vector lvv{2}; static std::array lva; static std::unordered_map lvm{{"a", RValueCaster{}}, {"b", RValueCaster{}}}; static std::unordered_map>>> lvn; diff --git a/tests/test_stl.py b/tests/test_stl.py index 0f019821..c2fa7db1 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -15,6 +15,9 @@ def test_vector(doc): assert doc(m.cast_vector) == "cast_vector() -> List[int]" assert doc(m.load_vector) == "load_vector(arg0: List[int]) -> bool" + # Test regression caused by 936: pointers to stl containers weren't castable + assert m.cast_ptr_vector() == ["lvalue", "lvalue"] + def test_array(doc): """std::array <-> list"""