From e22d58e81616cdf26037650f016134a6a82e2c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Schl=C3=BCter?= Date: Fri, 25 Mar 2022 04:00:58 +0000 Subject: [PATCH] Add is_constant_evaluated, update alignment checks --- Eigen/src/Core/CoreEvaluators.h | 4 ++-- Eigen/src/Core/DenseStorage.h | 5 +++-- Eigen/src/Core/util/Meta.h | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h index 53f3dd4ac..1729507cc 100644 --- a/Eigen/src/Core/CoreEvaluators.h +++ b/Eigen/src/Core/CoreEvaluators.h @@ -1225,8 +1225,8 @@ struct block_evaluator(block) { - // TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime - eigen_assert(((internal::UIntPtr(block.data()) % plain_enum_max(1,evaluator::Alignment)) == 0) && "data is not aligned"); + eigen_internal_assert((internal::is_constant_evaluated() || (internal::UIntPtr(block.data()) % plain_enum_max(1,evaluator::Alignment)) == 0) \ + && "data is not aligned"); } }; diff --git a/Eigen/src/Core/DenseStorage.h b/Eigen/src/Core/DenseStorage.h index 371da3cb9..5e2763ef8 100644 --- a/Eigen/src/Core/DenseStorage.h +++ b/Eigen/src/Core/DenseStorage.h @@ -69,13 +69,14 @@ struct plain_array template EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; } #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \ + eigen_assert((internal::is_constant_evaluated() \ + || (internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0) \ && "this assertion is explained here: " \ "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ " **** READ THIS WEB PAGE !!! ****"); #else #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \ + eigen_assert((internal::is_constant_evaluated() || (internal::UIntPtr(array) & (sizemask)) == 0) \ && "this assertion is explained here: " \ "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ " **** READ THIS WEB PAGE !!! ****"); diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index d5fd14014..cbfb92ec2 100755 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -508,6 +508,14 @@ inline constexpr bool logical_xor(bool a, bool b) { inline constexpr bool check_implication(bool a, bool b) { return !a || b; } + +/// \internal Provide fallback for std::is_constant_evaluated for pre-C++20. +#if EIGEN_COMP_CXXVER >= 20 +using std::is_constant_evaluated; +#else +constexpr bool is_constant_evaluated() { return false; } +#endif + } // end namespace internal } // end namespace Eigen