diff --git a/Eigen/src/Core/Map.h b/Eigen/src/Core/Map.h index 6b2b3ade4..ce431edc8 100644 --- a/Eigen/src/Core/Map.h +++ b/Eigen/src/Core/Map.h @@ -124,6 +124,7 @@ template class Ma : Base(cast_to_pointer_type(dataPtr)), m_stride(stride) { PlainObjectType::Base::_check_template_params(); + checkPointer(dataPtr); } /** Constructor in the dynamic-size vector case. @@ -137,6 +138,7 @@ template class Ma : Base(cast_to_pointer_type(dataPtr), size), m_stride(stride) { PlainObjectType::Base::_check_template_params(); + checkPointer(dataPtr); } /** Constructor in the dynamic-size matrix case. @@ -151,11 +153,24 @@ template class Ma : Base(cast_to_pointer_type(dataPtr), rows, cols), m_stride(stride) { PlainObjectType::Base::_check_template_params(); + checkPointer(dataPtr); } EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map) protected: + + static void checkPointer(const Scalar* dataPtr) + { + enum { + MightTryToAlignOnScalar = internal::packet_traits::AlignedOnScalar + && bool(internal::traits::Flags&PacketAccessBit) + && internal::is_lvalue::value + }; + eigen_assert(EIGEN_IMPLIES(bool(MightTryToAlignOnScalar), (size_t(dataPtr) % sizeof(Scalar)) == 0) + && "input pointer is not aligned on scalar boundary, e.g., use \"EIGEN_ALIGN8 T ptr[N];\" for double or complex"); + } + StrideType m_stride; }; diff --git a/Eigen/src/Core/MapBase.h b/Eigen/src/Core/MapBase.h index 0d85085c8..fe61d2a28 100644 --- a/Eigen/src/Core/MapBase.h +++ b/Eigen/src/Core/MapBase.h @@ -160,8 +160,6 @@ template class MapBase EIGEN_DEVICE_FUNC void checkSanity() const { - eigen_assert(EIGEN_IMPLIES(internal::packet_traits::AlignedOnScalar, (size_t(m_data) % sizeof(Scalar)) == 0) - && "input pointer is not aligned on scalar boundary, e.g., use \"EIGEN_ALIGN8 T ptr[N];\" for double or complex"); eigen_assert(EIGEN_IMPLIES(internal::traits::IsAligned, (size_t(m_data) % EIGEN_ALIGN_BYTES) == 0) && "data is not aligned"); }