Fix argument count in dynamic stores with named arguments (#4933)

This commit is contained in:
IfkumRfnl 2026-09-11 19:01:06 +04:00 committed by GitHub
parent 8dc5d3f69f
commit 854fc9567a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 2 deletions

View File

@ -131,7 +131,7 @@ FMT_EXPORT template <typename Context> class dynamic_format_arg_store {
constexpr dynamic_format_arg_store() = default;
operator basic_format_args<Context>() const {
return basic_format_args<Context>(data(), static_cast<int>(data_.size()),
return basic_format_args<Context>(data(), static_cast<int>(size()),
!named_info_.empty());
}
@ -210,7 +210,9 @@ FMT_EXPORT template <typename Context> class dynamic_format_arg_store {
}
/// Returns the number of elements in the store.
auto size() const noexcept -> size_t { return data_.size(); }
auto size() const noexcept -> size_t {
return data_.size() - (named_info_.empty() ? 0 : 1);
}
};
FMT_END_NAMESPACE

View File

@ -200,3 +200,38 @@ TEST(args_test, size) {
store.clear();
EXPECT_EQ(store.size(), 0);
}
TEST(args_test, named_arg_count) {
fmt::dynamic_format_arg_store<fmt::format_context> store;
EXPECT_EQ(store.size(), 0u);
EXPECT_THROW(fmt::vformat("{0}", store), fmt::format_error);
store.push_back(fmt::arg("a", 42));
EXPECT_EQ(store.size(), 1u);
EXPECT_EQ("42 42", fmt::vformat("{0} {a}", store));
EXPECT_THROW(fmt::vformat("{1}", store), fmt::format_error);
store.push_back(fmt::arg("b", 43));
EXPECT_EQ(store.size(), 2u);
EXPECT_EQ("42 43 43", fmt::vformat("{0} {1} {b}", store));
EXPECT_THROW(fmt::vformat("{2}", store), fmt::format_error);
store.push_back(44);
EXPECT_EQ(store.size(), 3u);
EXPECT_EQ("42 43 44", fmt::vformat("{a} {b} {2}", store));
EXPECT_THROW(fmt::vformat("{3}", store), fmt::format_error);
store.clear();
EXPECT_EQ(store.size(), 0u);
EXPECT_THROW(fmt::vformat("{0}", store), fmt::format_error);
store.push_back(45);
EXPECT_EQ(store.size(), 1u);
EXPECT_EQ("45", fmt::vformat("{0}", store));
EXPECT_THROW(fmt::vformat("{1}", store), fmt::format_error);
store.push_back(fmt::arg("c", 46));
EXPECT_EQ(store.size(), 2u);
EXPECT_EQ("45 46 46", fmt::vformat("{0} {1} {c}", store));
EXPECT_THROW(fmt::vformat("{2}", store), fmt::format_error);
}