diff options
author | Niall Murphy <nmurphy@snap.com> | 2021-05-10 11:43:49 +0100 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2021-05-20 23:17:02 +0000 |
commit | 391094c50743f28f9174f455661f650bf07e0177 (patch) | |
tree | 305b2a012ba1ebb39b6491f0c6df4d134319e7c0 | |
parent | 8877f8d9b2631301ba070d645cdc3fc9b9f764f5 (diff) |
Use derived object type in conservative_resize_like_impl
When calling conservativeResize() on a matrix with DontAlign flag, the
temporary variable used to perform the resize should have the same
Options as the original matrix to ensure that the correct override of
swap is called (i.e. PlainObjectBase::swap(DenseBase<OtherDerived> &
other). Calling the base class swap (i.e in DenseBase) results in
assertions errors or memory corruption.
-rw-r--r-- | Eigen/src/Core/PlainObjectBase.h | 4 | ||||
-rw-r--r-- | test/conservative_resize.cpp | 1 |
2 files changed, 3 insertions, 2 deletions
diff --git a/Eigen/src/Core/PlainObjectBase.h b/Eigen/src/Core/PlainObjectBase.h index 202ed7100..e2ddbd1d5 100644 --- a/Eigen/src/Core/PlainObjectBase.h +++ b/Eigen/src/Core/PlainObjectBase.h @@ -1019,7 +1019,7 @@ struct conservative_resize_like_impl else { // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(rows,cols); + Derived tmp(rows,cols); const Index common_rows = numext::mini(rows, _this.rows()); const Index common_cols = numext::mini(cols, _this.cols()); tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); @@ -1054,7 +1054,7 @@ struct conservative_resize_like_impl else { // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(other); + Derived tmp(other); const Index common_rows = numext::mini(tmp.rows(), _this.rows()); const Index common_cols = numext::mini(tmp.cols(), _this.cols()); tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); diff --git a/test/conservative_resize.cpp b/test/conservative_resize.cpp index 5dc500068..d709e3346 100644 --- a/test/conservative_resize.cpp +++ b/test/conservative_resize.cpp @@ -148,6 +148,7 @@ EIGEN_DECLARE_TEST(conservative_resize) CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::ColMajor>())); CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::RowMajor>())); CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::ColMajor>())); + CALL_SUBTEST_1((run_matrix_tests<int, Eigen::RowMajor | Eigen::DontAlign>())); CALL_SUBTEST_1((run_vector_tests<int>())); CALL_SUBTEST_2((run_vector_tests<float>())); |