From 864bdf9638f9895db3770e017207e94d25b816cb Mon Sep 17 00:00:00 2001 From: Dean Glazeski Date: Sun, 2 Mar 2025 08:47:03 -0700 Subject: [PATCH] Report error on duplicate named arg names (#4367) --- include/fmt/base.h | 16 ++++++++++++++++ test/format-test.cc | 2 ++ 2 files changed, 18 insertions(+) diff --git a/include/fmt/base.h b/include/fmt/base.h index b886317d..11d3ccff 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -1064,13 +1064,28 @@ template struct named_arg_info { int id; }; +template +FMT_CONSTEXPR void check_for_duplicate(named_arg_info* named_args, + int named_arg_index, + basic_string_view arg_name) { + if (named_arg_index <= 0) return; + + for (auto i = 0; i < named_arg_index; ++i) { + if (basic_string_view(named_args[i].name) == arg_name) { + report_error("duplicate named args found"); + } + } +} + template ::value)> void init_named_arg(named_arg_info*, int& arg_index, int&, const T&) { ++arg_index; } + template ::value)> void init_named_arg(named_arg_info* named_args, int& arg_index, int& named_arg_index, const T& arg) { + check_for_duplicate(named_args, named_arg_index, arg.name); named_args[named_arg_index++] = {arg.name, arg_index++}; } @@ -1084,6 +1099,7 @@ template ::value)> FMT_CONSTEXPR void init_static_named_arg(named_arg_info* named_args, int& arg_index, int& named_arg_index) { + check_for_duplicate(named_args, named_arg_index, T::name); named_args[named_arg_index++] = {T::name, arg_index++}; } diff --git a/test/format-test.cc b/test/format-test.cc index c16f895b..e2c595c9 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -599,6 +599,8 @@ TEST(format_test, named_arg) { EXPECT_THROW_MSG((void)fmt::format(runtime("{a} {}"), fmt::arg("a", 2), 42), format_error, "cannot switch from manual to automatic argument indexing"); + EXPECT_THROW_MSG((void)fmt::format("{a}", fmt::arg("a", 1), + fmt::arg("a", 10)), format_error, "duplicate named args found"); } TEST(format_test, auto_arg_index) {