From 10cda465edf19ed0303a0655b762ea752f8a0997 Mon Sep 17 00:00:00 2001 From: fhgffy <102001626+fhgffy@users.noreply.github.com> Date: Thu, 8 Oct 2026 03:32:48 +0800 Subject: [PATCH] Fix output position for compiled variant and expected formatting (#4968) --- include/fmt/std.h | 1 + test/compile-test.cc | 53 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/include/fmt/std.h b/include/fmt/std.h index ca26905c..2bab00f2 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -143,6 +143,7 @@ FMT_CONSTEXPR auto write_escaped_alternative(OutputIt out, const T& v, formatter, Char> underlying; maybe_set_debug_format(underlying, true); + ctx.advance_to(out); return underlying.format(v, ctx); } #endif diff --git a/test/compile-test.cc b/test/compile-test.cc index a5c04ae0..058c0e71 100644 --- a/test/compile-test.cc +++ b/test/compile-test.cc @@ -185,6 +185,59 @@ TEST(compile_test, format_to) { EXPECT_STREQ("2a", buf); } +TEST(compile_test, format_variant) { +# ifdef __cpp_lib_variant + char buffer[100]; + auto end = + fmt::format_to(buffer, FMT_COMPILE("<{}> {}"), std::variant{42}, 7); + EXPECT_EQ(" 7", std::string(buffer, end)); + + end = + fmt::format_to(buffer, FMT_COMPILE("{}"), std::variant{}); + EXPECT_EQ("variant(monostate)", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), + std::variant>{std::variant{42}}); + EXPECT_EQ("variant(variant(42))", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), + std::variant{"test"}); + EXPECT_EQ("variant(\"test\")", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), std::variant{'a'}); + EXPECT_EQ("variant('a')", std::string(buffer, end)); +# endif +} + +TEST(compile_test, format_expected) { +# ifdef __cpp_lib_expected + char buffer[100]; + auto end = fmt::format_to(buffer, FMT_COMPILE("<{}> {}"), + std::expected{42}, 7); + EXPECT_EQ(" 7", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), + std::expected{std::unexpected(42)}); + EXPECT_EQ("unexpected(42)", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), std::expected{}); + EXPECT_EQ("expected()", std::string(buffer, end)); + + end = fmt::format_to(buffer, FMT_COMPILE("{}"), + std::expected{"test"}); + EXPECT_EQ("expected(\"test\")", std::string(buffer, end)); +# endif +} + +TEST(compile_test, format_unexpected) { +# ifdef __cpp_lib_expected + char buffer[100]; + auto end = fmt::format_to(buffer, FMT_COMPILE("<{}> {}"), + std::unexpected{42}, 7); + EXPECT_EQ(" 7", std::string(buffer, end)); +# endif +} + TEST(compile_test, format_to_n) { constexpr auto buffer_size = 8; char buffer[buffer_size];