aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-09-14 19:06:08 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-09-14 19:06:08 +0200
commit26db954776c0e8f0230ca1542ad303e23ede4db1 (patch)
tree6d8cecde383615cf4961ea0cd058d2e681c84a4d
parentfda680f9cf8e81f62ae815b700698958b7b0f027 (diff)
Re-enable aliasing checks when using evaluators
-rw-r--r--Eigen/src/Core/Assign.h7
-rw-r--r--Eigen/src/Core/AssignEvaluator.h7
-rw-r--r--Eigen/src/Core/DenseBase.h2
-rw-r--r--Eigen/src/Core/Transpose.h10
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