From fb97cb2318dd14b5c791699232e1e73782be7e57 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Thu, 20 Jul 2023 09:53:54 -0700 Subject: [PATCH] Suppress a bogus stringop-overflow warning --- include/fmt/format.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/fmt/format.h b/include/fmt/format.h index 4c321089dcec..4543037a96af 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -542,6 +542,8 @@ FMT_INLINE void assume(bool condition) { (void)condition; #if FMT_HAS_BUILTIN(__builtin_assume) && !FMT_ICC_VERSION __builtin_assume(condition); +#elif FMT_GCC_VERSION + if (!condition) __builtin_unreachable(); #endif } @@ -941,9 +943,9 @@ class basic_memory_buffer final : public detail::buffer { T* new_data = std::allocator_traits::allocate(alloc_, new_capacity); // Suppress a bogus -Wstringop-overflow in gcc 13.1 (#3481). - FMT_ASSERT(this->size() <= new_capacity, ""); + detail::assume(this->size() <= new_capacity); // The following code doesn't throw, so the raw pointer above doesn't leak. - std::uninitialized_copy(old_data, old_data + this->size(), new_data); + std::uninitialized_copy_n(old_data, this->size(), new_data); this->set(new_data, new_capacity); // deallocate must not throw according to the standard, but even if it does, // the buffer already uses the new storage and will deallocate it in