diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index 01abf3f2c..6cb02fd3a 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h @@ -657,6 +657,8 @@ struct type_caster, enable_if_t(PyUnicode_FromObject(load_src.ptr())); if (!temp) { PyErr_Clear(); return false; } load_src = temp; diff --git a/tests/test_numpy_array.cpp b/tests/test_numpy_array.cpp index 14c4c2999..23da91695 100644 --- a/tests/test_numpy_array.cpp +++ b/tests/test_numpy_array.cpp @@ -150,4 +150,9 @@ test_initializer numpy_array([](py::module &m) { "array_t"_a=py::array_t(o) ); }); + + // Issue 685: ndarray shouldn't go to std::string overload + sm.def("issue685", [](std::string) { return "string"; }); + sm.def("issue685", [](py::array) { return "array"; }); + sm.def("issue685", [](py::object) { return "other"; }); }); diff --git a/tests/test_numpy_array.py b/tests/test_numpy_array.py index b96790c39..25defe7d9 100644 --- a/tests/test_numpy_array.py +++ b/tests/test_numpy_array.py @@ -272,3 +272,12 @@ def test_constructors(): assert results["array"].dtype == np.int_ assert results["array_t"].dtype == np.int32 assert results["array_t"].dtype == np.float64 + + +@pytest.requires_numpy +def test_greedy_string_overload(): # issue 685 + from pybind11_tests.array import issue685 + + assert issue685("abc") == "string" + assert issue685(np.array([97, 98, 99], dtype='b')) == "array" + assert issue685(123) == "other"