From 09a13244c85de35471ff7a660b17360111b14430 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Wed, 22 Jan 2020 19:08:06 -0800 Subject: [PATCH] Disallow passing non-string-literals to FMT_STRING --- include/fmt/format.h | 14 ++++++-------- test/format-test.cc | 3 --- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/include/fmt/format.h b/include/fmt/format.h index cd3bb03f..59dc223b 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -3449,13 +3449,10 @@ template struct udl_arg { } }; -// A constexpr version of strlen. -template FMT_CONSTEXPR size_t compute_length(const Char* s) { - size_t len = 0; - while (*s++) ++len; - return len; +template +FMT_CONSTEXPR basic_string_view literal_to_view(const Char (&s)[N]) { + return {s, N - 1}; } - } // namespace internal inline namespace literals { @@ -3519,7 +3516,8 @@ FMT_END_NAMESPACE using char_type = fmt::remove_cvref_t; \ __VA_ARGS__ FMT_CONSTEXPR \ operator fmt::basic_string_view() const { \ - return {s, fmt::internal::compute_length(s)}; \ + /* FMT_STRING only accepts string literals. */ \ + return fmt::internal::literal_to_view(s); \ } \ }; \ return FMT_STRING(); \ @@ -3527,7 +3525,7 @@ FMT_END_NAMESPACE /** \rst - Constructs a compile-time format string. + Constructs a compile-time format string from a string literal *s*. **Example**:: diff --git a/test/format-test.cc b/test/format-test.cc index f479ceb6..8bce69be 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1849,10 +1849,7 @@ TEST(FormatTest, UnpackedArgs) { struct string_like {}; fmt::string_view to_string_view(string_like) { return "foo"; } -FMT_CONSTEXPR_DECL const char* format_str_ptr = "0123456789"; - TEST(FormatTest, CompileTimeString) { - EXPECT_EQ(format_str_ptr, fmt::format(FMT_STRING(format_str_ptr))); EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42)); EXPECT_EQ(L"42", fmt::format(FMT_STRING(L"{}"), 42)); EXPECT_EQ("foo", fmt::format(FMT_STRING("{}"), string_like()));