mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-19 11:24:26 +08:00
bug #1409: make EIGEN_MAKE_ALIGNED_OPERATOR_NEW* macros empty in c++17 mode:
- this helps clang 5 and 6 to support alignas in STL's containers. - this makes the public API of our (and users) classes cleaner
This commit is contained in:
parent
3b5deeb546
commit
edd413c184
@ -698,6 +698,23 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// NOTE: the required Apple's clang version is very conservative
|
||||||
|
// and it could be that XCode 9 works just fine.
|
||||||
|
// NOTE: the MSVC version is based on https://en.cppreference.com/w/cpp/compiler_support
|
||||||
|
// and not tested.
|
||||||
|
#ifndef EIGEN_HAS_CXX17_OVERALIGN
|
||||||
|
#if EIGEN_MAX_CPP_VER>=17 && EIGEN_COMP_CXXVER>=17 && ( \
|
||||||
|
(EIGEN_COMP_MSVC >= 1912) \
|
||||||
|
|| (EIGEN_GNUC_AT_LEAST(7,0)) \
|
||||||
|
|| ((!defined(__apple_build_version__)) && (EIGEN_COMP_CLANG>=500)) \
|
||||||
|
|| (( defined(__apple_build_version__)) && (__apple_build_version__>=10000000)) \
|
||||||
|
)
|
||||||
|
#define EIGEN_HAS_CXX17_OVERALIGN 1
|
||||||
|
#else
|
||||||
|
#define EIGEN_HAS_CXX17_OVERALIGN 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(EIGEN_CUDACC) && EIGEN_HAS_CONSTEXPR
|
#if defined(EIGEN_CUDACC) && EIGEN_HAS_CONSTEXPR
|
||||||
// While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
|
// While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
|
||||||
#if defined(__NVCC__)
|
#if defined(__NVCC__)
|
||||||
|
@ -789,6 +789,17 @@ template<typename T> void swap(scoped_array<T> &a,scoped_array<T> &b)
|
|||||||
*** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF] ***
|
*** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF] ***
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#if EIGEN_HAS_CXX17_OVERALIGN
|
||||||
|
|
||||||
|
// C++17 -> no need to bother about alignment anymore :)
|
||||||
|
|
||||||
|
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)
|
||||||
|
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
|
||||||
|
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
|
||||||
|
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar,Size)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#if EIGEN_MAX_ALIGN_BYTES!=0
|
#if EIGEN_MAX_ALIGN_BYTES!=0
|
||||||
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
|
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
|
||||||
void* operator new(std::size_t size, const std::nothrow_t&) EIGEN_NO_THROW { \
|
void* operator new(std::size_t size, const std::nothrow_t&) EIGEN_NO_THROW { \
|
||||||
@ -831,6 +842,8 @@ template<typename T> void swap(scoped_array<T> &a,scoped_array<T> &b)
|
|||||||
((EIGEN_MAX_ALIGN_BYTES>=32) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/2)==0)) || \
|
((EIGEN_MAX_ALIGN_BYTES>=32) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/2)==0)) || \
|
||||||
((EIGEN_MAX_ALIGN_BYTES>=64) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/4)==0)) )))
|
((EIGEN_MAX_ALIGN_BYTES>=64) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/4)==0)) )))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/** \class aligned_allocator
|
/** \class aligned_allocator
|
||||||
|
@ -107,7 +107,7 @@ template<typename T> void check_custom_new_delete()
|
|||||||
delete[] t;
|
delete[] t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EIGEN_MAX_ALIGN_BYTES>0
|
#if EIGEN_MAX_ALIGN_BYTES>0 && (!EIGEN_HAS_CXX17_OVERALIGN)
|
||||||
{
|
{
|
||||||
T* t = static_cast<T *>((T::operator new)(sizeof(T)));
|
T* t = static_cast<T *>((T::operator new)(sizeof(T)));
|
||||||
(T::operator delete)(t, sizeof(T));
|
(T::operator delete)(t, sizeof(T));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user