Merged in realjhol/eigen/fix-warnings (pull request PR-760)

Fix warnings
This commit is contained in:
Rasmus Larsen 2019-11-26 23:24:23 +00:00
commit 2df57be856
3 changed files with 23 additions and 10 deletions

View File

@ -612,6 +612,16 @@ template<typename T, typename U> struct scalar_product_traits
// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type; // typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
// }; // };
/** \internal Obtains a POD type suitable to use as storage for an object of a size
* of at most Len bytes, aligned as specified by \c Align.
*/
template<unsigned Len, unsigned Align>
struct aligned_storage {
struct type {
EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
};
};
} // end namespace internal } // end namespace internal
namespace numext { namespace numext {

View File

@ -201,7 +201,7 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
~Ref() { ~Ref() {
if(m_hasCopy) { if(m_hasCopy) {
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes); TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(&m_storage);
obj->~TPlainObjectType(); obj->~TPlainObjectType();
} }
} }
@ -213,7 +213,7 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
{ {
if((Options & int(StandardCompressedFormat)) && (!expr.isCompressed())) if((Options & int(StandardCompressedFormat)) && (!expr.isCompressed()))
{ {
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes); TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(&m_storage);
::new (obj) TPlainObjectType(expr); ::new (obj) TPlainObjectType(expr);
m_hasCopy = true; m_hasCopy = true;
Base::construct(*obj); Base::construct(*obj);
@ -227,14 +227,14 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
template<typename Expression> template<typename Expression>
void construct(const Expression& expr, internal::false_type) void construct(const Expression& expr, internal::false_type)
{ {
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes); TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(&m_storage);
::new (obj) TPlainObjectType(expr); ::new (obj) TPlainObjectType(expr);
m_hasCopy = true; m_hasCopy = true;
Base::construct(*obj); Base::construct(*obj);
} }
protected: protected:
char m_object_bytes[sizeof(TPlainObjectType)]; typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
bool m_hasCopy; bool m_hasCopy;
}; };
@ -319,7 +319,7 @@ class Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType
~Ref() { ~Ref() {
if(m_hasCopy) { if(m_hasCopy) {
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes); TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(&m_storage);
obj->~TPlainObjectType(); obj->~TPlainObjectType();
} }
} }
@ -335,14 +335,14 @@ class Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType
template<typename Expression> template<typename Expression>
void construct(const Expression& expr, internal::false_type) void construct(const Expression& expr, internal::false_type)
{ {
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes); TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(&m_storage);
::new (obj) TPlainObjectType(expr); ::new (obj) TPlainObjectType(expr);
m_hasCopy = true; m_hasCopy = true;
Base::construct(*obj); Base::construct(*obj);
} }
protected: protected:
char m_object_bytes[sizeof(TPlainObjectType)]; typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
bool m_hasCopy; bool m_hasCopy;
}; };

View File

@ -39,9 +39,12 @@ bits(const T& x) {
// The following implement bitwise operations on floating point types // The following implement bitwise operations on floating point types
template<typename T,typename Bits,typename Func> template<typename T,typename Bits,typename Func>
T apply_bit_op(Bits a, Bits b, Func f) { T apply_bit_op(Bits a, Bits b, Func f) {
Array<unsigned char,sizeof(T),1> res; Array<unsigned char,sizeof(T),1> data;
for(Index i=0; i<res.size();++i) res[i] = f(a[i],b[i]); T res;
return *reinterpret_cast<T*>(&res); for(Index i = 0; i < data.size(); ++i)
data[i] = f(a[i], b[i]);
std::memcpy(&res, &data, sizeof(T));
return res;
} }
#define EIGEN_TEST_MAKE_BITWISE2(OP,FUNC,T) \ #define EIGEN_TEST_MAKE_BITWISE2(OP,FUNC,T) \