diff --git a/include/foonathan/memory/detail/align.hpp b/include/foonathan/memory/detail/align.hpp index 8fcf426..ea4e1d2 100644 --- a/include/foonathan/memory/detail/align.hpp +++ b/include/foonathan/memory/detail/align.hpp @@ -24,8 +24,9 @@ namespace foonathan constexpr std::size_t round_up_to_multiple_of_alignment(std::size_t size, std::size_t alignment) noexcept { - FOONATHAN_MEMORY_ASSERT(is_valid_alignment(alignment)); - return (size + alignment - 1) & ~(alignment - 1); + return FOONATHAN_MEMORY_ASSERT_RETURN( + is_valid_alignment(alignment), + (size + alignment - 1) & ~(alignment - 1)); } // returns the offset needed to align ptr for given alignment diff --git a/include/foonathan/memory/detail/assert.hpp b/include/foonathan/memory/detail/assert.hpp index 7317503..4786d78 100644 --- a/include/foonathan/memory/detail/assert.hpp +++ b/include/foonathan/memory/detail/assert.hpp @@ -37,6 +37,12 @@ namespace foonathan __FILE__, __LINE__, __func__), \ true)) +#define FOONATHAN_MEMORY_ASSERT_RETURN(Expr, Ret) \ + ((Expr) ? (Ret) \ + : (detail::handle_failed_assert("Assertion \"" #Expr "\" failed", __FILE__, \ + __LINE__, "some constexpr"), \ + (Ret))) + #define FOONATHAN_MEMORY_UNREACHABLE(Msg) \ detail::handle_failed_assert("Unreachable code reached: " Msg, __FILE__, __LINE__, __func__) @@ -45,6 +51,7 @@ namespace foonathan #elif !defined(FOONATHAN_MEMORY_ASSERT) #define FOONATHAN_MEMORY_ASSERT(Expr) #define FOONATHAN_MEMORY_ASSERT_MSG(Expr, Msg) +#define FOONATHAN_MEMORY_ASSERT_RETURN(Expr, Ret) (Ret) #define FOONATHAN_MEMORY_UNREACHABLE(Msg) std::abort() #define FOONATHAN_MEMORY_WARNING(Msg) #endif