From 26db954776c0e8f0230ca1542ad303e23ede4db1 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Sun, 14 Sep 2014 19:06:08 +0200 Subject: [PATCH] Re-enable aliasing checks when using evaluators --- Eigen/src/Core/Assign.h | 7 ++++--- Eigen/src/Core/AssignEvaluator.h | 7 +++++++ Eigen/src/Core/DenseBase.h | 2 ++ Eigen/src/Core/Transpose.h | 10 +++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h index 071cfbf7e..5395e5436 100644 --- a/Eigen/src/Core/Assign.h +++ b/Eigen/src/Core/Assign.h @@ -521,12 +521,13 @@ EIGEN_STRONG_INLINE Derived& DenseBase eigen_assert(rows() == other.rows() && cols() == other.cols()); internal::assign_impl::Traversal) : int(InvalidTraversal)>::run(derived(),other.derived()); - -#endif // EIGEN_TEST_EVALUATORS - + #ifndef EIGEN_NO_DEBUG checkTransposeAliasing(other.derived()); #endif + +#endif // EIGEN_TEST_EVALUATORS + return derived(); } diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index 1727a6a4a..521b8a93a 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -763,6 +763,9 @@ void call_assignment_no_alias(Dst& dst, const Src& src) call_assignment_no_alias(dst, src, internal::assign_op()); } +// forxard declaration +template void check_for_aliasing(const Dst &dst, const Src &src); + // Generic Dense to Dense assignment template< typename DstXprType, typename SrcXprType, typename Functor, typename Scalar> struct Assignment @@ -771,6 +774,10 @@ struct Assignment { eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); +#ifndef EIGEN_NO_DEBUG + internal::check_for_aliasing(dst, src); +#endif + call_dense_assignment_loop(dst, src, func); } }; diff --git a/Eigen/src/Core/DenseBase.h b/Eigen/src/Core/DenseBase.h index 14643b5a8..f35c2edc4 100644 --- a/Eigen/src/Core/DenseBase.h +++ b/Eigen/src/Core/DenseBase.h @@ -314,11 +314,13 @@ template class DenseBase EIGEN_DEVICE_FUNC void transposeInPlace(); #ifndef EIGEN_NO_DEBUG +#ifndef EIGEN_TEST_EVALUATORS protected: template void checkTransposeAliasing(const OtherDerived& other) const; public: #endif +#endif EIGEN_DEVICE_FUNC static const ConstantReturnType diff --git a/Eigen/src/Core/Transpose.h b/Eigen/src/Core/Transpose.h index f5148221d..b22b50a8f 100644 --- a/Eigen/src/Core/Transpose.h +++ b/Eigen/src/Core/Transpose.h @@ -437,15 +437,23 @@ struct checkTransposeAliasing_impl } }; +template +void check_for_aliasing(const Dst &dst, const Src &src) +{ + internal::checkTransposeAliasing_impl::run(dst, src); +} + } // end namespace internal +#ifndef EIGEN_TEST_EVALUATORS template template void DenseBase::checkTransposeAliasing(const OtherDerived& other) const { internal::checkTransposeAliasing_impl::run(derived(), other); } -#endif +#endif // EIGEN_TEST_EVALUATORS +#endif // EIGEN_NO_DEBUG } // end namespace Eigen