From b0890243138cdba862ee5c86b2b6022e7424c09d Mon Sep 17 00:00:00 2001 From: Caleb Kiage <747955+calebkiage@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:13:26 +0300 Subject: [PATCH] Fix issue #3817 --- include/fmt/base.h | 6 ++++++ include/fmt/format.h | 1 + test/args-test.cc | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/include/fmt/base.h b/include/fmt/base.h index 7d75a1bc..860b4aa6 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -773,6 +773,12 @@ template class basic_format_parse_context { do_check_arg_id(id); } FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + FMT_CONSTEXPR void increment_next_id_if_match(int id) { + if (next_arg_id_ == id) { + // Skip named args. + next_arg_id_++; + } + } FMT_CONSTEXPR void check_dynamic_spec(int arg_id); }; diff --git a/include/fmt/format.h b/include/fmt/format.h index 8df6c965..5292f5d6 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -4269,6 +4269,7 @@ void vformat_to(buffer& buf, basic_string_view fmt, FMT_CONSTEXPR auto on_arg_id(basic_string_view id) -> int { int arg_id = context.arg_id(id); if (arg_id < 0) report_error("argument not found"); + parse_context.increment_next_id_if_match(arg_id); return arg_id; } diff --git a/test/args-test.cc b/test/args-test.cc index 9c72cb95..2de67f58 100644 --- a/test/args-test.cc +++ b/test/args-test.cc @@ -110,6 +110,15 @@ TEST(args_test, named_arg_by_ref) { EXPECT_EQ(fmt::vformat("{band}", store), "Rolling Scones"); } +TEST(args_test, named_with_unnamed) { + fmt::dynamic_format_arg_store store; + store.push_back(1); + store.push_back(fmt::arg("a1", 2)); + store.push_back(fmt::arg("a2", 3)); + store.push_back(4); + EXPECT_EQ("1 2 3 4", fmt::vformat("{} {a1} {a2} {}", store)); +} + TEST(args_test, named_custom_format) { fmt::dynamic_format_arg_store store; auto c = custom_type();