From 2039dce75fff60d88f2b9bfae521b32aad586190 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sun, 6 Jun 2021 17:35:40 -0700 Subject: [PATCH] Detect consteval --- include/fmt/core.h | 20 ++++++++++++-------- test/format-test.cc | 9 --------- test/printf-test.cc | 28 ---------------------------- 3 files changed, 12 insertions(+), 45 deletions(-) diff --git a/include/fmt/core.h b/include/fmt/core.h index a15a80b6..bf95038d 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -284,8 +284,16 @@ # define FMT_UNICODE !FMT_MSC_VER #endif -#ifndef FMT_COMPILE_TIME_CHECKS -# define FMT_COMPILE_TIME_CHECKS 0 +#ifndef FMT_CONSTEVAL +# if ((FMT_GCC_VERSION >= 1000 || FMT_CLANG_VERSION >= 1101) && \ + __cplusplus > 201703L) || \ + (defined(__cpp_consteval) && \ + !FMT_MSC_VER) // consteval is broken in MSVC. +# define FMT_CONSTEVAL consteval +# define FMT_HAS_CONSTEVAL +# else +# define FMT_CONSTEVAL +# endif #endif #ifndef FMT_USE_NONTYPE_TEMPLATE_PARAMETERS @@ -2813,17 +2821,13 @@ template class basic_format_string { template >::value)> -#if FMT_COMPILE_TIME_CHECKS - consteval -#endif - basic_format_string(const S& s) - : str_(s) { + FMT_CONSTEVAL basic_format_string(const S& s) : str_(s) { static_assert( detail::count< (std::is_base_of>::value && std::is_reference::value)...>() == 0, "passing views as lvalues is disallowed"); -#if FMT_COMPILE_TIME_CHECKS +#ifdef FMT_HAS_CONSTEVAL if constexpr (detail::count_named_args() == 0) { using checker = detail::format_string_checker...>; diff --git a/test/format-test.cc b/test/format-test.cc index 28505304..19597a12 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -2059,15 +2059,6 @@ TEST(format_test, vformat_to) { EXPECT_EQ("42", s); } -template static std::string fmt_to_string(const T& t) { - return fmt::format(FMT_STRING("{}"), t); -} - -TEST(format_test, fmt_string_in_template) { - EXPECT_EQ(fmt_to_string(1), "1"); - EXPECT_EQ(fmt_to_string(0), "0"); -} - #endif // FMT_USE_CONSTEXPR TEST(format_test, char_traits_is_not_ambiguous) { diff --git a/test/printf-test.cc b/test/printf-test.cc index e1b606a1..295c2f42 100644 --- a/test/printf-test.cc +++ b/test/printf-test.cc @@ -52,34 +52,6 @@ std::wstring test_sprintf(fmt::basic_string_view format, << "format: " << format; \ EXPECT_EQ(expected_output, fmt::sprintf(make_positional(format), arg)) -template struct value_extractor { - T operator()(T value) { return value; } - - template FMT_NORETURN T operator()(U) { - throw std::runtime_error(fmt::format("invalid type {}", typeid(U).name())); - } - -#if FMT_USE_INT128 - // Apple Clang does not define typeid for __int128_t and __uint128_t. - FMT_NORETURN T operator()(fmt::detail::int128_t) { - throw std::runtime_error("invalid type __int128_t"); - } - - FMT_NORETURN T operator()(fmt::detail::uint128_t) { - throw std::runtime_error("invalid type __uint128_t"); - } -#endif -}; - -TEST(printf_test, arg_converter) { - long long value = max_value(); - auto arg = fmt::detail::make_arg(value); - fmt::visit_format_arg( - fmt::detail::arg_converter(arg, 'd'), - arg); - EXPECT_EQ(value, fmt::visit_format_arg(value_extractor(), arg)); -} - TEST(printf_test, no_args) { EXPECT_EQ("test", test_sprintf("test")); EXPECT_EQ(L"test", fmt::sprintf(L"test"));