From 4c5b4af04d779394fff544d91ca37d4ed8aa36e9 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Fri, 19 Jan 2024 16:06:06 -0800 Subject: [PATCH] Improve name argument validation --- include/fmt/base.h | 4 +++- include/fmt/format.h | 4 +++- test/args-test.cc | 6 +++--- test/format-test.cc | 5 ++++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/fmt/base.h b/include/fmt/base.h index 7d75a1bc..3850871b 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -772,7 +772,9 @@ template class basic_format_parse_context { next_arg_id_ = -1; do_check_arg_id(id); } - FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + FMT_CONSTEXPR void check_arg_id(basic_string_view) { + next_arg_id_ = -1; + } FMT_CONSTEXPR void check_dynamic_spec(int arg_id); }; diff --git a/include/fmt/format.h b/include/fmt/format.h index 8df6c965..f118057e 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -4264,9 +4264,11 @@ void vformat_to(buffer& buf, basic_string_view fmt, return parse_context.next_arg_id(); } FMT_CONSTEXPR auto on_arg_id(int id) -> int { - return parse_context.check_arg_id(id), id; + parse_context.check_arg_id(id); + return id; } FMT_CONSTEXPR auto on_arg_id(basic_string_view id) -> int { + parse_context.check_arg_id(id); int arg_id = context.arg_id(id); if (arg_id < 0) report_error("argument not found"); return arg_id; diff --git a/test/args-test.cc b/test/args-test.cc index 9c72cb95..f99ff74e 100644 --- a/test/args-test.cc +++ b/test/args-test.cc @@ -144,9 +144,9 @@ TEST(args_test, reserve) { fmt::dynamic_format_arg_store store; store.reserve(2, 1); store.push_back(1.5f); - store.push_back(fmt::arg("a1", 42)); - auto result = fmt::vformat("{a1} and {}", store); - EXPECT_EQ("42 and 1.5", result); + store.push_back(fmt::arg("a", 42)); + auto result = fmt::vformat("{} and {a}", store); + EXPECT_EQ("1.5 and 42", result); } struct copy_throwable { diff --git a/test/format-test.cc b/test/format-test.cc index db68ca08..2b8255a5 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -555,6 +555,9 @@ TEST(format_test, named_arg) { "argument not found"); EXPECT_THROW_MSG((void)fmt::format(runtime("{a}"), 42), format_error, "argument not found"); + EXPECT_THROW_MSG((void)fmt::format(runtime("{a} {}"), fmt::arg("a", 2), 42), + format_error, + "cannot switch from manual to automatic argument indexing"); } TEST(format_test, auto_arg_index) { @@ -1742,7 +1745,7 @@ TEST(format_test, print) { } TEST(format_test, big_print) { - enum {count = 5000}; + enum { count = 5000 }; auto big_print = []() { for (int i = 0; i < count / 5; ++i) fmt::print("xxxxx"); };