diff --git a/include/boost/core/default_allocator.hpp b/include/boost/core/default_allocator.hpp index b108e1a..00bfd61 100644 --- a/include/boost/core/default_allocator.hpp +++ b/include/boost/core/default_allocator.hpp @@ -59,13 +59,16 @@ struct default_allocator { BOOST_CONSTEXPR default_allocator(const default_allocator&) BOOST_NOEXCEPT { } +#if defined(PTRDIFF_MAX) && defined(SIZE_MAX) BOOST_CONSTEXPR std::size_t max_size() const BOOST_NOEXCEPT { -#if defined(PTRDIFF_MAX) && defined(SIZE_MAX) && (PTRDIFF_MAX < SIZE_MAX) - return PTRDIFF_MAX; -#else - return ~static_cast(0) / sizeof(T); -#endif + return PTRDIFF_MAX < SIZE_MAX / sizeof(T) + ? PTRDIFF_MAX : SIZE_MAX / sizeof(T); } +#else + BOOST_CONSTEXPR std::size_t max_size() const BOOST_NOEXCEPT { + return ~static_cast(0) / sizeof(T); + } +#endif #if !defined(BOOST_NO_EXCEPTIONS) T* allocate(std::size_t n) { diff --git a/test/default_allocator_test.cpp b/test/default_allocator_test.cpp index 5c1d657..763318b 100644 --- a/test/default_allocator_test.cpp +++ b/test/default_allocator_test.cpp @@ -135,11 +135,20 @@ void test_construct_other() (void)a5; } +#if defined(PTRDIFF_MAX) && defined(SIZE_MAX) +template +std::size_t max_size() +{ + return PTRDIFF_MAX < SIZE_MAX / sizeof(T) + ? PTRDIFF_MAX : SIZE_MAX / sizeof(T); +} +#else template std::size_t max_size() { return ~static_cast(0) / sizeof(T); } +#endif void test_max_size() {