diff --git a/include/fmt/format.h b/include/fmt/format.h index b8b64a30f02c..eddde2676e79 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1174,8 +1174,8 @@ template struct null {}; template struct fill_t { private: enum { max_size = 4 }; - Char data_[max_size]; - unsigned char size_; + Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)}; + unsigned char size_ = 1; public: FMT_CONSTEXPR void operator=(basic_string_view s) { @@ -1195,13 +1195,6 @@ template struct fill_t { FMT_CONSTEXPR const Char& operator[](size_t index) const { return data_[index]; } - - static FMT_CONSTEXPR fill_t make() { - auto fill = fill_t(); - fill[0] = Char(' '); - fill.size_ = 1; - return fill; - } }; } // namespace detail @@ -1233,8 +1226,7 @@ template struct basic_format_specs { type(0), align(align::none), sign(sign::none), - alt(false), - fill(detail::fill_t::make()) {} + alt(false) {} }; using format_specs = basic_format_specs; diff --git a/test/format-test.cc b/test/format-test.cc index ac1a96bb8c28..235058a3824e 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -355,22 +355,20 @@ TEST(MemoryBufferTest, ExceptionInDeallocate) { } template -class allocator_max_size: public Allocator { +class allocator_max_size : public Allocator { public: using typename Allocator::value_type; - size_t max_size() const FMT_NOEXCEPT { - return MaxSize; - } + size_t max_size() const FMT_NOEXCEPT { return MaxSize; } value_type* allocate(size_t n) { if (n > max_size()) { throw std::length_error("size > max_size"); } return std::allocator_traits::allocate( - *static_cast(this), n); + *static_cast(this), n); } void deallocate(value_type* p, size_t n) { - std::allocator_traits::deallocate( - *static_cast(this), p, n); + std::allocator_traits::deallocate(*static_cast(this), + p, n); } }; @@ -383,7 +381,7 @@ TEST(MemoryBufferTest, AllocatorMaxSize) { try { // new_capacity = 128 + 128/2 = 192 > 160 buffer.resize(160); - } catch (const std::exception &) { + } catch (const std::exception&) { throws_on_resize = true; } EXPECT_FALSE(throws_on_resize); @@ -395,7 +393,7 @@ TEST(MemoryBufferTest, AllocatorMaxSizeOverflow) { bool throws_on_resize = false; try { buffer.resize(161); - } catch (const std::exception &) { + } catch (const std::exception&) { throws_on_resize = true; } EXPECT_TRUE(throws_on_resize); @@ -2470,17 +2468,17 @@ TEST(FormatTest, CharTraitsIsNotAmbiguous) { #endif } +#if __cplusplus > 201103L struct custom_char { int value; custom_char() = default; - template custom_char(T val) : value(static_cast(val)) {} + template + constexpr custom_char(T val) : value(static_cast(val)) {} operator int() const { return value; } }; -int to_ascii(custom_char c) { return c; } - FMT_BEGIN_NAMESPACE template <> struct is_char : std::true_type {}; FMT_END_NAMESPACE @@ -2491,6 +2489,7 @@ TEST(FormatTest, FormatCustomChar) { EXPECT_EQ(result.size(), 1); EXPECT_EQ(result[0], custom_char('x')); } +#endif // Convert a char8_t string to std::string. Otherwise GTest will insist on // inserting `char8_t` NTBS into a `char` stream which is disabled by P1423.