diff --git a/include/nanobind/eigen/dense.h b/include/nanobind/eigen/dense.h index 07901da6..571b1900 100644 --- a/include/nanobind/eigen/dense.h +++ b/include/nanobind/eigen/dense.h @@ -244,7 +244,7 @@ struct type_caster, is_ndarray_scalar_v>> { using Map = Eigen::Map; using NDArray = - array_for_eigen_t, + array_for_eigen_t, const typename Map::Scalar, typename Map::Scalar>>; using NDArrayCaster = type_caster; diff --git a/tests/test_eigen.cpp b/tests/test_eigen.cpp index 9a6f5214..4b6f1a99 100644 --- a/tests/test_eigen.cpp +++ b/tests/test_eigen.cpp @@ -199,9 +199,12 @@ NB_MODULE(test_eigen_ext, m) { .def(nb::init<>()) .def_rw("member", &ClassWithEigenMember::member); - m.def("castToMapVXi", [](nb::object obj) -> Eigen::Map { + m.def("castToMapVXi", [](nb::object obj) { return nb::cast>(obj); }); + m.def("castToMapCnstVXi", [](nb::object obj) { + return nb::cast>(obj); + }); m.def("castToRefVXi", [](nb::object obj) -> Eigen::VectorXi { return nb::cast>(obj); }); diff --git a/tests/test_eigen.py b/tests/test_eigen.py index d0e78272..138fdf83 100644 --- a/tests/test_eigen.py +++ b/tests/test_eigen.py @@ -334,8 +334,11 @@ def test12_cast(): vec2 = vec[::2] vecf = np.float32(vec) assert_array_equal(t.castToMapVXi(vec), vec) + assert_array_equal(t.castToMapCnstVXi(vec), vec) assert_array_equal(t.castToRefVXi(vec), vec) assert_array_equal(t.castToRefCnstVXi(vec), vec) + assert t.castToMapVXi(vec).flags.writeable + assert not t.castToMapCnstVXi(vec).flags.writeable assert_array_equal(t.castToDRefCnstVXi(vec), vec) for v in vec2, vecf: with pytest.raises(RuntimeError, match="bad[_ ]cast"):