Disallow passing non-string-literals to FMT_STRING

This commit is contained in:
Victor Zverovich
2020-01-22 19:08:06 -08:00
parent 419db8baa1
commit 09a13244c8
2 changed files with 6 additions and 11 deletions

View File

@@ -3449,13 +3449,10 @@ 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;
template <typename Char, size_t N>
FMT_CONSTEXPR basic_string_view<Char> 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<decltype(*s)>; \
__VA_ARGS__ FMT_CONSTEXPR \
operator fmt::basic_string_view<char_type>() 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**::