diff --git a/include/concepts/swap.hpp b/include/concepts/swap.hpp index dd7086411..700cbe4c5 100644 --- a/include/concepts/swap.hpp +++ b/include/concepts/swap.hpp @@ -28,7 +28,7 @@ #endif #ifndef CPP_CXX_INLINE_VARIABLES -#ifdef __cpp_inline_variables // TODO: fix this if SD-6 picks another name +#ifdef __cpp_inline_variables #define CPP_CXX_INLINE_VARIABLES __cpp_inline_variables // TODO: remove once clang defines __cpp_inline_variables (or equivalent) #elif defined(__clang__) && \ @@ -124,8 +124,11 @@ namespace concepts { static constexpr T const value {}; }; + +#if CPP_CXX_INLINE_VARIABLES < 201606L template constexpr T const static_const::value; +#endif } /// \endcond diff --git a/include/meta/meta.hpp b/include/meta/meta.hpp index 6b13d9f51..dc06cd110 100644 --- a/include/meta/meta.hpp +++ b/include/meta/meta.hpp @@ -2835,12 +2835,14 @@ namespace meta template struct static_const { - static constexpr T value{}; + static constexpr T const value{}; }; +#if !META_CXX_INLINE_VARIABLES // Avoid potential ODR violations with global objects: - template - constexpr T static_const::value; + template + constexpr T const static_const::value; +#endif } // namespace detail ///\endcond @@ -3776,9 +3778,9 @@ namespace meta { /// A user-defined literal that generates objects of type \c meta::size_t. /// \ingroup integral - template + template constexpr fold...>, meta::size_t<0>, quote> - operator"" _z() + operator""_z() { return {}; } diff --git a/include/range/v3/detail/prologue.hpp b/include/range/v3/detail/prologue.hpp index 8f3578794..53d23130c 100644 --- a/include/range/v3/detail/prologue.hpp +++ b/include/range/v3/detail/prologue.hpp @@ -48,7 +48,3 @@ RANGES_DIAGNOSTIC_KEYWORD_MACRO #pragma push_macro("I") #undef I - -#if defined(__apple_build_version__) -RANGES_DIAGNOSTIC_IGNORE("-Wdeprecated") -#endif diff --git a/include/range/v3/iterator/diffmax_t.hpp b/include/range/v3/iterator/diffmax_t.hpp index a08ef3f72..0c6d117a2 100644 --- a/include/range/v3/iterator/diffmax_t.hpp +++ b/include/range/v3/iterator/diffmax_t.hpp @@ -347,6 +347,85 @@ namespace ranges template constexpr bool _is_integer_like_ = true; #endif + + template + struct diffmax_numeric_limits + { + static constexpr bool const is_specialized = true; + static constexpr bool const is_signed = true; + static constexpr bool const is_integer = true; + static constexpr bool const is_exact = true; + static constexpr bool const has_infinity = false; + static constexpr bool const has_quiet_NaN = false; + static constexpr bool const has_signaling_NaN = false; + static constexpr bool const has_denorm = false; + static constexpr bool const has_denorm_loss = false; + static constexpr std::float_round_style const round_style = + std::round_toward_zero; + static constexpr bool const is_iec559 = false; + static constexpr bool const is_bounded = true; + static constexpr bool const is_modulo = false; + static constexpr int const digits = CHAR_BIT * sizeof(std::uintmax_t) + 1; + static constexpr int const digits10 = + static_cast(digits * 0.301029996); // digits * std::log10(2) + static constexpr int const max_digits10 = 0; + static constexpr int const radix = 2; + static constexpr int const min_exponent = 0; + static constexpr int const min_exponent10 = 0; + static constexpr int const max_exponent = 0; + static constexpr int const max_exponent10 = 0; + static constexpr bool const traps = true; + static constexpr bool const tinyness_before = false; + }; + +#if RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17 + template + constexpr bool const diffmax_numeric_limits::is_specialized; + template + constexpr bool const diffmax_numeric_limits::is_signed; + template + constexpr bool const diffmax_numeric_limits::is_integer; + template + constexpr bool const diffmax_numeric_limits::is_exact; + template + constexpr bool const diffmax_numeric_limits::has_infinity; + template + constexpr bool const diffmax_numeric_limits::has_quiet_NaN; + template + constexpr bool const diffmax_numeric_limits::has_signaling_NaN; + template + constexpr bool const diffmax_numeric_limits::has_denorm; + template + constexpr bool const diffmax_numeric_limits::has_denorm_loss; + template + constexpr std::float_round_style const diffmax_numeric_limits::round_style; + template + constexpr bool const diffmax_numeric_limits::is_iec559; + template + constexpr bool const diffmax_numeric_limits::is_bounded; + template + constexpr bool const diffmax_numeric_limits::is_modulo; + template + constexpr int const diffmax_numeric_limits::digits; + template + constexpr int const diffmax_numeric_limits::digits10; + template + constexpr int const diffmax_numeric_limits::max_digits10; + template + constexpr int const diffmax_numeric_limits::radix; + template + constexpr int const diffmax_numeric_limits::min_exponent; + template + constexpr int const diffmax_numeric_limits::min_exponent10; + template + constexpr int const diffmax_numeric_limits::max_exponent; + template + constexpr int const diffmax_numeric_limits::max_exponent10; + template + constexpr bool const diffmax_numeric_limits::traps; + template + constexpr bool const diffmax_numeric_limits::tinyness_before; +#endif } // namespace detail /// \endcond } // namespace ranges @@ -358,32 +437,8 @@ namespace std { template<> struct numeric_limits<::ranges::detail::diffmax_t> + : ::ranges::detail::diffmax_numeric_limits<> { - static constexpr bool is_specialized = true; - static constexpr bool is_signed = true; - static constexpr bool is_integer = true; - static constexpr bool is_exact = true; - static constexpr bool has_infinity = false; - static constexpr bool has_quiet_NaN = false; - static constexpr bool has_signaling_NaN = false; - static constexpr bool has_denorm = false; - static constexpr bool has_denorm_loss = false; - static constexpr std::float_round_style round_style = std::round_toward_zero; - static constexpr bool is_iec559 = false; - static constexpr bool is_bounded = true; - static constexpr bool is_modulo = false; - static constexpr int digits = CHAR_BIT * sizeof(std::uintmax_t) + 1; - static constexpr int digits10 = - static_cast(digits * 0.301029996); // digits * std::log10(2) - static constexpr int max_digits10 = 0; - static constexpr int radix = 2; - static constexpr int min_exponent = 0; - static constexpr int min_exponent10 = 0; - static constexpr int max_exponent = 0; - static constexpr int max_exponent10 = 0; - static constexpr bool traps = true; - static constexpr bool tinyness_before = false; - static constexpr ::ranges::detail::diffmax_t max() noexcept { return std::uintmax_t(-1); @@ -421,45 +476,21 @@ namespace std return 0; } }; + template<> struct numeric_limits<::ranges::detail::diffmax_t const> : numeric_limits<::ranges::detail::diffmax_t> {}; + template<> struct numeric_limits<::ranges::detail::diffmax_t volatile> : numeric_limits<::ranges::detail::diffmax_t> {}; + template<> struct numeric_limits<::ranges::detail::diffmax_t const volatile> : numeric_limits<::ranges::detail::diffmax_t> {}; - -#if RANGES_CXX_INLINE_VARIABLES >= RANGES_CXX_INLINE_VARIABLES_17 - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_specialized; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_signed; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_integer; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_exact; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::has_infinity; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::has_quiet_NaN; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::has_signaling_NaN; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::has_denorm; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::has_denorm_loss; - inline constexpr std::float_round_style - numeric_limits<::ranges::detail::diffmax_t>::round_style; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_iec559; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_bounded; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_modulo; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::digits; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::digits10; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::max_digits10; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::radix; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::min_exponent; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::min_exponent10; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::max_exponent; - inline constexpr int numeric_limits<::ranges::detail::diffmax_t>::max_exponent10; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::traps; - inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::tinyness_before; -#endif } // namespace std /// \endcond diff --git a/include/range/v3/utility/static_const.hpp b/include/range/v3/utility/static_const.hpp index 690a14285..2a400c0ac 100644 --- a/include/range/v3/utility/static_const.hpp +++ b/include/range/v3/utility/static_const.hpp @@ -13,20 +13,23 @@ #ifndef RANGES_V3_UTILITY_STATIC_CONST_HPP #define RANGES_V3_UTILITY_STATIC_CONST_HPP +#include + namespace ranges { /// \ingroup group-utility - template struct static_const { - static constexpr T value{}; + static constexpr T const value{}; }; +#if RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17 /// \ingroup group-utility /// \sa `static_const` template - constexpr T static_const::value; + constexpr T const static_const::value; +#endif } // namespace ranges #endif