diff options
author | Gael Guennebaud <g.gael@free.fr> | 2017-06-08 12:55:25 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2017-06-08 12:55:25 +0200 |
commit | 4bbc32046810f65bb0f77f6dbe538abad51de281 (patch) | |
tree | 237c9dee16d2d3b9f03c82a51237396e5b15c62b | |
parent | 2971503fed85add086cb163d24ee5d402d631aab (diff) |
bug #1435: fix aliasing issue in exressions like: A = C - B*A;
-rw-r--r-- | Eigen/src/Core/ProductEvaluators.h | 6 | ||||
-rw-r--r-- | test/product_notemporary.cpp | 1 |
2 files changed, 7 insertions, 0 deletions
diff --git a/Eigen/src/Core/ProductEvaluators.h b/Eigen/src/Core/ProductEvaluators.h index 583b7f59e..c42725dbd 100644 --- a/Eigen/src/Core/ProductEvaluators.h +++ b/Eigen/src/Core/ProductEvaluators.h @@ -207,6 +207,12 @@ struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_sum_op<typename static const bool value = true; }; +template<typename OtherXpr, typename Lhs, typename Rhs> +struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_difference_op<typename OtherXpr::Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, const OtherXpr, + const Product<Lhs,Rhs,DefaultProduct> >, DenseShape > { + static const bool value = true; +}; + template<typename DstXprType, typename OtherXpr, typename ProductType, typename Func1, typename Func2> struct assignment_from_xpr_op_product { diff --git a/test/product_notemporary.cpp b/test/product_notemporary.cpp index 8bf71b4f2..30592b79e 100644 --- a/test/product_notemporary.cpp +++ b/test/product_notemporary.cpp @@ -51,6 +51,7 @@ template<typename MatrixType> void product_notemporary(const MatrixType& m) VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * (m1 * m2.transpose()), 0); VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()), 1); + VERIFY_EVALUATION_COUNT( m3 = m3 - (m1 * m2.adjoint()), 1); VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()).transpose(), 1); VERIFY_EVALUATION_COUNT( m3.noalias() = m3 + m1 * m2.transpose(), 0); |