diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-09-14 19:06:08 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-09-14 19:06:08 +0200 |
commit | 26db954776c0e8f0230ca1542ad303e23ede4db1 (patch) | |
tree | 6d8cecde383615cf4961ea0cd058d2e681c84a4d | |
parent | fda680f9cf8e81f62ae815b700698958b7b0f027 (diff) |
Re-enable aliasing checks when using evaluators
-rw-r--r-- | Eigen/src/Core/Assign.h | 7 | ||||
-rw-r--r-- | Eigen/src/Core/AssignEvaluator.h | 7 | ||||
-rw-r--r-- | Eigen/src/Core/DenseBase.h | 2 | ||||
-rw-r--r-- | 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<Derived> eigen_assert(rows() == other.rows() && cols() == other.cols()); internal::assign_impl<Derived, OtherDerived, int(SameType) ? int(internal::assign_traits<Derived, OtherDerived>::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<typename Dst::Scalar>()); } +// forxard declaration +template<typename Dst, typename Src> 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<DstXprType, SrcXprType, Functor, Dense2Dense, Scalar> @@ -771,6 +774,10 @@ struct Assignment<DstXprType, SrcXprType, Functor, Dense2Dense, Scalar> { 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<typename Derived> class DenseBase EIGEN_DEVICE_FUNC void transposeInPlace(); #ifndef EIGEN_NO_DEBUG +#ifndef EIGEN_TEST_EVALUATORS protected: template<typename OtherDerived> 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<Derived, OtherDerived, false> } }; +template<typename Dst, typename Src> +void check_for_aliasing(const Dst &dst, const Src &src) +{ + internal::checkTransposeAliasing_impl<Dst, Src>::run(dst, src); +} + } // end namespace internal +#ifndef EIGEN_TEST_EVALUATORS template<typename Derived> template<typename OtherDerived> void DenseBase<Derived>::checkTransposeAliasing(const OtherDerived& other) const { internal::checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other); } -#endif +#endif // EIGEN_TEST_EVALUATORS +#endif // EIGEN_NO_DEBUG } // end namespace Eigen |