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()));