diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index 9ae463018..6f3ea2d10 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -605,9 +605,24 @@ struct copy_using_evaluator_impl class StorageBase, typename SrcXprType> +EIGEN_STRONG_INLINE +const DstXprType& copy_using_evaluator(const NoAlias& dst, + const EigenBase& src) +{ + return noalias_copy_using_evaluator(dst.expression(), src.derived()); +} + template EIGEN_STRONG_INLINE -const DstXprType& copy_using_evaluator(const PlainObjectBase& dst, const EigenBase& src) +const DstXprType& copy_using_evaluator(const EigenBase& dst, const EigenBase& src) +{ + return noalias_copy_using_evaluator(dst.const_cast_derived(), src.derived()); +} + +template +EIGEN_STRONG_INLINE +const DstXprType& noalias_copy_using_evaluator(const PlainObjectBase& dst, const EigenBase& src) { #ifdef EIGEN_DEBUG_ASSIGN internal::copy_using_evaluator_traits::debug(); @@ -624,7 +639,7 @@ const DstXprType& copy_using_evaluator(const PlainObjectBase& dst, c template EIGEN_STRONG_INLINE -const DstXprType& copy_using_evaluator(const EigenBase& dst, const EigenBase& src) +const DstXprType& noalias_copy_using_evaluator(const EigenBase& dst, const EigenBase& src) { return copy_using_evaluator_without_resizing(dst.const_cast_derived(), src.derived()); } diff --git a/Eigen/src/Core/NoAlias.h b/Eigen/src/Core/NoAlias.h index 5278cfb73..f0810803d 100644 --- a/Eigen/src/Core/NoAlias.h +++ b/Eigen/src/Core/NoAlias.h @@ -97,6 +97,11 @@ class NoAlias { return m_expression.derived() -= CoeffBasedProduct(other.lhs(), other.rhs()); } #endif + ExpressionType& expression() const + { + return m_expression; + } + protected: ExpressionType& m_expression; }; diff --git a/test/evaluators.cpp b/test/evaluators.cpp index a95b5319a..62ba5b126 100644 --- a/test/evaluators.cpp +++ b/test/evaluators.cpp @@ -60,6 +60,7 @@ void test_evaluators() VERIFY_IS_APPROX_EVALUATOR(d, (a + b)); VERIFY_IS_APPROX_EVALUATOR(d, (a + b).transpose()); VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b), a*b); + VERIFY_IS_APPROX_EVALUATOR2(d.noalias(), prod(a,b), a*b); VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b) + c, a*b + c); VERIFY_IS_APPROX_EVALUATOR2(d, s * prod(a,b), s * a*b); VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b).transpose(), (a*b).transpose());