mirror of
https://github.com/fmtlib/fmt.git
synced 2024-12-25 15:21:54 +00:00
Fix handling of mapped types in compile checks (#1200)
This commit is contained in:
parent
4639843839
commit
4912cff65d
@ -2096,10 +2096,14 @@ FMT_CONSTEXPR void parse_format_string(basic_string_view<Char> format_str,
|
|||||||
template <typename T, typename ParseContext>
|
template <typename T, typename ParseContext>
|
||||||
FMT_CONSTEXPR const typename ParseContext::char_type* parse_format_specs(
|
FMT_CONSTEXPR const typename ParseContext::char_type* parse_format_specs(
|
||||||
ParseContext& ctx) {
|
ParseContext& ctx) {
|
||||||
// GCC 7.2 requires initializer.
|
using char_type = typename ParseContext::char_type;
|
||||||
typedef typename ParseContext::char_type char_type;
|
using context = buffer_context<char_type>;
|
||||||
conditional_t<has_formatter<T, buffer_context<char_type>>::value,
|
using mapped_type =
|
||||||
formatter<T, char_type>,
|
conditional_t<internal::mapped_type_constant<T, context>::value !=
|
||||||
|
internal::custom_type,
|
||||||
|
decltype(arg_mapper<context>().map(std::declval<T>())), T>;
|
||||||
|
conditional_t<has_formatter<mapped_type, context>::value,
|
||||||
|
formatter<mapped_type, char_type>,
|
||||||
internal::fallback_formatter<T, char_type>>
|
internal::fallback_formatter<T, char_type>>
|
||||||
f;
|
f;
|
||||||
return f.parse(ctx);
|
return f.parse(ctx);
|
||||||
|
@ -1836,6 +1836,15 @@ TEST(FormatTest, UnpackedArgs) {
|
|||||||
6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g'));
|
6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct string_like {};
|
||||||
|
fmt::string_view to_string_view(string_like) { return "foo"; }
|
||||||
|
|
||||||
|
TEST(FormatTest, CompileTimeString) {
|
||||||
|
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()));
|
||||||
|
}
|
||||||
|
|
||||||
#if FMT_USE_USER_DEFINED_LITERALS
|
#if FMT_USE_USER_DEFINED_LITERALS
|
||||||
// Passing user-defined literals directly to EXPECT_EQ causes problems
|
// Passing user-defined literals directly to EXPECT_EQ causes problems
|
||||||
// with macro argument stringification (#) on some versions of GCC.
|
// with macro argument stringification (#) on some versions of GCC.
|
||||||
@ -1867,8 +1876,6 @@ TEST(LiteralsTest, NamedArg) {
|
|||||||
TEST(FormatTest, UdlTemplate) {
|
TEST(FormatTest, UdlTemplate) {
|
||||||
EXPECT_EQ("foo", "foo"_format());
|
EXPECT_EQ("foo", "foo"_format());
|
||||||
EXPECT_EQ(" 42", "{0:10}"_format(42));
|
EXPECT_EQ(" 42", "{0:10}"_format(42));
|
||||||
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42));
|
|
||||||
EXPECT_EQ(L"42", fmt::format(FMT_STRING(L"{}"), 42));
|
|
||||||
}
|
}
|
||||||
#endif // FMT_USE_USER_DEFINED_LITERALS
|
#endif // FMT_USE_USER_DEFINED_LITERALS
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user