diff --git a/Eigen/src/Core/Map.h b/Eigen/src/Core/Map.h index f804c89d6..3a925b350 100644 --- a/Eigen/src/Core/Map.h +++ b/Eigen/src/Core/Map.h @@ -140,6 +140,7 @@ template class Ma : Base(cast_to_pointer_type(dataPtr)), m_stride(a_stride) { PlainObjectType::Base::_check_template_params(); + checkPointer(dataPtr); } /** Constructor in the dynamic-size vector case. @@ -152,6 +153,7 @@ template class Ma : Base(cast_to_pointer_type(dataPtr), a_size), m_stride(a_stride) { PlainObjectType::Base::_check_template_params(); + checkPointer(dataPtr); } /** Constructor in the dynamic-size matrix case. @@ -165,11 +167,24 @@ template class Ma : Base(cast_to_pointer_type(dataPtr), nbRows, nbCols), m_stride(a_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 77597f0eb..92e114129 100644 --- a/Eigen/src/Core/MapBase.h +++ b/Eigen/src/Core/MapBase.h @@ -156,13 +156,6 @@ template class MapBase EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits::Flags&PacketAccessBit, internal::inner_stride_at_compile_time::ret==1), PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1); - enum { - MightTryToAlignOnScalar = internal::packet_traits::AlignedOnScalar - && bool(internal::traits::Flags&PacketAccessBit) - && internal::is_lvalue::value - }; - eigen_assert(EIGEN_IMPLIES(bool(MightTryToAlignOnScalar), (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::Flags&AlignedBit, (size_t(m_data) % 16) == 0) && "input pointer is not aligned on a 16 byte boundary"); }