mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-12 19:20:36 +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
|
||||
|
||||
// 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
|
||||
// While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
|
||||
#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] ***
|
||||
*****************************************************************************/
|
||||
|
||||
#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
|
||||
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
|
||||
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>=64) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/4)==0)) )))
|
||||
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/** \class aligned_allocator
|
||||
|
@ -107,7 +107,7 @@ template<typename T> void check_custom_new_delete()
|
||||
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::operator delete)(t, sizeof(T));
|
||||
|
Loading…
x
Reference in New Issue
Block a user