mirror of
https://github.com/fmtlib/fmt.git
synced 2025-03-01 01:13:32 +00:00
Fix length computation of constexpr C strings
This commit is contained in:
parent
9fc4161f5e
commit
419db8baa1
@ -3449,6 +3449,13 @@ template <typename Char> struct udl_arg {
|
||||
}
|
||||
};
|
||||
|
||||
// A constexpr version of strlen.
|
||||
template <typename Char> FMT_CONSTEXPR size_t compute_length(const Char* s) {
|
||||
size_t len = 0;
|
||||
while (*s++) ++len;
|
||||
return len;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
inline namespace literals {
|
||||
@ -3512,7 +3519,7 @@ FMT_END_NAMESPACE
|
||||
using char_type = fmt::remove_cvref_t<decltype(*s)>; \
|
||||
__VA_ARGS__ FMT_CONSTEXPR \
|
||||
operator fmt::basic_string_view<char_type>() const { \
|
||||
return {s, sizeof(s) / sizeof(char_type) - 1}; \
|
||||
return {s, fmt::internal::compute_length(s)}; \
|
||||
} \
|
||||
}; \
|
||||
return FMT_STRING(); \
|
||||
|
@ -1849,7 +1849,10 @@ 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()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user