From c03b53da9129ae2d5ac9629c4b874d0981a7d418 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 17 Feb 2020 14:30:02 +0000 Subject: [PATCH] libstdc++: Add lightweight replacement for std::numeric_limits (PR 92546) Many uses of std::numeric_limits in C++17 and C++20 features only really need the min(), max() and digits constants for integral types. By adding __detail::__int_limits we can avoid including the whole header. The header isn't especially large, but avoiding it still gives small savings in compilation time and memory usage for the compiler. There are also C++11 features that could benefit from this change (e.g. and ) but I won't change those until stage 1. The implementation of __int_limits assumes two's complement integers, which is true for all targets supported by GCC. PR libstdc++/92546 (partial) * include/Makefile.am: Add new header. * include/Makefile.in: Regenerate. * include/bits/int_limits.h: New header. * include/bits/parse_numbers.h (__select_int::_Select_int): Replace numeric_limits with __detail::__int_limits. * include/std/bit (__rotl, __rotr, __countl_zero, __countl_one) (__countr_zero, __countr_one, __popcount, __ceil2, __floor2, __log2p1): Likewise. * include/std/charconv (__to_chars_8, __from_chars_binary) (__from_chars_alpha_to_num, from_chars): Likewise. * include/std/memory_resource (polymorphic_allocator::allocate) (polymorphic_allocator::allocate_object): Likewise. * include/std/string_view (basic_string_view::_S_compare): Likewise. * include/std/utility (in_range): Likewise. * testsuite/20_util/integer_comparisons/in_range_neg.cc: Adjust for extra error about incomplete type __int_limits. * testsuite/26_numerics/bit/bit.count/countl_one.cc: Include . * testsuite/26_numerics/bit/bit.count/countl_zero.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countr_one.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countr_zero.cc: Likewise. * testsuite/26_numerics/bit/bit.count/popcount.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/ceil2.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/floor2.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/ispow2.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/log2p1.cc: Likewise. * testsuite/26_numerics/bit/bit.rotate/rotl.cc: Likewise. * testsuite/26_numerics/bit/bit.rotate/rotr.cc: Likewise. --- libstdc++-v3/ChangeLog | 30 +++++++++ libstdc++-v3/include/Makefile.am | 1 + libstdc++-v3/include/Makefile.in | 1 + libstdc++-v3/include/bits/int_limits.h | 74 ++++++++++++++++++++++ libstdc++-v3/include/bits/parse_numbers.h | 8 +-- libstdc++-v3/include/std/bit | 56 ++++++++-------- libstdc++-v3/include/std/charconv | 14 ++-- libstdc++-v3/include/std/memory_resource | 6 +- libstdc++-v3/include/std/string_view | 10 +-- libstdc++-v3/include/std/utility | 11 ++-- .../20_util/integer_comparisons/in_range_neg.cc | 1 + .../26_numerics/bit/bit.count/countl_one.cc | 1 + .../26_numerics/bit/bit.count/countl_zero.cc | 1 + .../26_numerics/bit/bit.count/countr_one.cc | 1 + .../26_numerics/bit/bit.count/countr_zero.cc | 1 + .../26_numerics/bit/bit.count/popcount.cc | 1 + .../testsuite/26_numerics/bit/bit.pow.two/ceil2.cc | 1 + .../26_numerics/bit/bit.pow.two/ceil2_neg.cc | 1 + .../26_numerics/bit/bit.pow.two/floor2.cc | 1 + .../26_numerics/bit/bit.pow.two/ispow2.cc | 1 + .../26_numerics/bit/bit.pow.two/log2p1.cc | 1 + .../testsuite/26_numerics/bit/bit.rotate/rotl.cc | 1 + .../testsuite/26_numerics/bit/bit.rotate/rotr.cc | 1 + 23 files changed, 174 insertions(+), 50 deletions(-) create mode 100644 libstdc++-v3/include/bits/int_limits.h diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9ae1e11..954eb67 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,35 @@ 2020-02-17 Jonathan Wakely + PR libstdc++/92546 (partial) + * include/Makefile.am: Add new header. + * include/Makefile.in: Regenerate. + * include/bits/int_limits.h: New header. + * include/bits/parse_numbers.h (__select_int::_Select_int): Replace + numeric_limits with __detail::__int_limits. + * include/std/bit (__rotl, __rotr, __countl_zero, __countl_one) + (__countr_zero, __countr_one, __popcount, __ceil2, __floor2, __log2p1): + Likewise. + * include/std/charconv (__to_chars_8, __from_chars_binary) + (__from_chars_alpha_to_num, from_chars): Likewise. + * include/std/memory_resource (polymorphic_allocator::allocate) + (polymorphic_allocator::allocate_object): Likewise. + * include/std/string_view (basic_string_view::_S_compare): Likewise. + * include/std/utility (in_range): Likewise. + * testsuite/20_util/integer_comparisons/in_range_neg.cc: Adjust for + extra error about incomplete type __int_limits. + * testsuite/26_numerics/bit/bit.count/countl_one.cc: Include . + * testsuite/26_numerics/bit/bit.count/countl_zero.cc: Likewise. + * testsuite/26_numerics/bit/bit.count/countr_one.cc: Likewise. + * testsuite/26_numerics/bit/bit.count/countr_zero.cc: Likewise. + * testsuite/26_numerics/bit/bit.count/popcount.cc: Likewise. + * testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc: Likewise. + * testsuite/26_numerics/bit/bit.pow.two/ceil2.cc: Likewise. + * testsuite/26_numerics/bit/bit.pow.two/floor2.cc: Likewise. + * testsuite/26_numerics/bit/bit.pow.two/ispow2.cc: Likewise. + * testsuite/26_numerics/bit/bit.pow.two/log2p1.cc: Likewise. + * testsuite/26_numerics/bit/bit.rotate/rotl.cc: Likewise. + * testsuite/26_numerics/bit/bit.rotate/rotr.cc: Likewise. + * python/libstdcxx/v6/printers.py (StdCmpCatPrinter.to_string): Update value for partial_ordering::unordered. diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index e131ce0..80aeb3f 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -129,6 +129,7 @@ bits_headers = \ ${bits_srcdir}/hashtable.h \ ${bits_srcdir}/hashtable_policy.h \ ${bits_srcdir}/indirect_array.h \ + ${bits_srcdir}/int_limits.h \ ${bits_srcdir}/invoke.h \ ${bits_srcdir}/ios_base.h \ ${bits_srcdir}/istream.tcc \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index ae20f6b..eb437ad 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -474,6 +474,7 @@ bits_headers = \ ${bits_srcdir}/hashtable.h \ ${bits_srcdir}/hashtable_policy.h \ ${bits_srcdir}/indirect_array.h \ + ${bits_srcdir}/int_limits.h \ ${bits_srcdir}/invoke.h \ ${bits_srcdir}/ios_base.h \ ${bits_srcdir}/istream.tcc \ diff --git a/libstdc++-v3/include/bits/int_limits.h b/libstdc++-v3/include/bits/int_limits.h new file mode 100644 index 0000000..7ae3437 --- /dev/null +++ b/libstdc++-v3/include/bits/int_limits.h @@ -0,0 +1,74 @@ +// Minimal replacement for numeric_limits of integers. -*- C++ -*- + +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file bits/int_limits.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{limits} + */ + +#ifndef _GLIBCXX_INT_LIMITS_H +#define _GLIBCXX_INT_LIMITS_H 1 + +#pragma GCC system_header + +#if __cplusplus >= 201103L +#include + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION +namespace __detail +{ + // This template is used for arbitrary signed and unsigned integer types + // (by headers and ) and for specific integer types + // (by and ) but also for char (). + // For simplicity's sake, all integral types except bool are supported. + + // Lightweight alternative to numeric_limits. + template::value> + struct __int_limits + { + static_assert(is_integral<_Tp>::value, "unsupported specialization"); + using _Up = typename make_unsigned<_Tp>::type; + static constexpr int digits = sizeof(_Tp) * __CHAR_BIT__ - 1; + static constexpr _Tp min() noexcept { return _Tp(_Up(1) << digits); } + static constexpr _Tp max() noexcept { return _Tp(_Up(~_Up(0)) >> 1); } + }; + + // Lightweight alternative to numeric_limits. + template + struct __int_limits<_Tp, false> + { + static_assert(is_integral<_Tp>::value, "unsupported specialization"); + static constexpr int digits = sizeof(_Tp) * __CHAR_BIT__; + static constexpr _Tp min() noexcept { return 0; } + static constexpr _Tp max() noexcept { return _Tp(-1); } + }; + + template<> struct __int_limits; // not defined +} +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace +#endif // C++11 +#endif // _GLIBCXX_INT_LIMITS_H diff --git a/libstdc++-v3/include/bits/parse_numbers.h b/libstdc++-v3/include/bits/parse_numbers.h index d7a81e5..6a75d00 100644 --- a/libstdc++-v3/include/bits/parse_numbers.h +++ b/libstdc++-v3/include/bits/parse_numbers.h @@ -34,9 +34,9 @@ // From n3642.pdf except I added binary literals and digit separator '\''. -#if __cplusplus > 201103L +#if __cplusplus >= 201402L -#include +#include namespace std _GLIBCXX_VISIBILITY(default) { @@ -265,7 +265,7 @@ namespace __select_int template struct _Select_int_base<_Val, _IntType, _Ints...> - : conditional_t<(_Val <= std::numeric_limits<_IntType>::max()), + : conditional_t<(_Val <= __detail::__int_limits<_IntType>::max()), integral_constant<_IntType, _Val>, _Select_int_base<_Val, _Ints...>> { }; @@ -289,6 +289,6 @@ namespace __select_int _GLIBCXX_END_NAMESPACE_VERSION } // namespace std -#endif // __cplusplus > 201103L +#endif // C++14 #endif // _GLIBCXX_PARSE_NUMBERS_H diff --git a/libstdc++-v3/include/std/bit b/libstdc++-v3/include/std/bit index 0203546..dc0a77e 100644 --- a/libstdc++-v3/include/std/bit +++ b/libstdc++-v3/include/std/bit @@ -34,7 +34,7 @@ #if __cplusplus >= 201402L #include -#include +#include namespace std _GLIBCXX_VISIBILITY(default) { @@ -55,7 +55,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Tp __rotl(_Tp __x, int __s) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + constexpr auto _Nd = __detail::__int_limits<_Tp>::digits; const int __r = __s % _Nd; if (__r == 0) return __x; @@ -69,7 +69,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Tp __rotr(_Tp __x, int __s) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + constexpr auto _Nd = __detail::__int_limits<_Tp>::digits; const int __r = __s % _Nd; if (__r == 0) return __x; @@ -83,14 +83,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __countl_zero(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + using std::__detail::__int_limits; + constexpr auto _Nd = __int_limits<_Tp>::digits; if (__x == 0) return _Nd; - constexpr auto _Nd_ull = numeric_limits::digits; - constexpr auto _Nd_ul = numeric_limits::digits; - constexpr auto _Nd_u = numeric_limits::digits; + constexpr auto _Nd_ull = __int_limits::digits; + constexpr auto _Nd_ul = __int_limits::digits; + constexpr auto _Nd_u = __int_limits::digits; if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) { @@ -118,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __diff = (2 * _Nd_ull) - _Nd; return __builtin_clzll(__high) - __diff; } - constexpr auto __max_ull = numeric_limits::max(); + constexpr auto __max_ull = __int_limits::max(); unsigned long long __low = __x & __max_ull; return (_Nd - _Nd_ull) + __builtin_clzll(__low); } @@ -128,8 +129,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __countl_one(_Tp __x) noexcept { - if (__x == numeric_limits<_Tp>::max()) - return numeric_limits<_Tp>::digits; + if (__x == __detail::__int_limits<_Tp>::max()) + return __detail::__int_limits<_Tp>::digits; return std::__countl_zero<_Tp>((_Tp)~__x); } @@ -137,14 +138,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __countr_zero(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + using std::__detail::__int_limits; + constexpr auto _Nd = __int_limits<_Tp>::digits; if (__x == 0) return _Nd; - constexpr auto _Nd_ull = numeric_limits::digits; - constexpr auto _Nd_ul = numeric_limits::digits; - constexpr auto _Nd_u = numeric_limits::digits; + constexpr auto _Nd_ull = __int_limits::digits; + constexpr auto _Nd_ul = __int_limits::digits; + constexpr auto _Nd_u = __int_limits::digits; if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) return __builtin_ctz(__x); @@ -157,7 +159,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_assert(_Nd <= (2 * _Nd_ull), "Maximum supported integer size is 128-bit"); - constexpr auto __max_ull = numeric_limits::max(); + constexpr auto __max_ull = __int_limits::max(); unsigned long long __low = __x & __max_ull; if (__low != 0) return __builtin_ctzll(__low); @@ -170,8 +172,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __countr_one(_Tp __x) noexcept { - if (__x == numeric_limits<_Tp>::max()) - return numeric_limits<_Tp>::digits; + if (__x == __detail::__int_limits<_Tp>::max()) + return __detail::__int_limits<_Tp>::digits; return std::__countr_zero((_Tp)~__x); } @@ -179,14 +181,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr int __popcount(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + using std::__detail::__int_limits; + constexpr auto _Nd = __int_limits<_Tp>::digits; if (__x == 0) return 0; - constexpr auto _Nd_ull = numeric_limits::digits; - constexpr auto _Nd_ul = numeric_limits::digits; - constexpr auto _Nd_u = numeric_limits::digits; + constexpr auto _Nd_ull = __int_limits::digits; + constexpr auto _Nd_ul = __int_limits::digits; + constexpr auto _Nd_u = __int_limits::digits; if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) return __builtin_popcount(__x); @@ -199,7 +202,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_assert(_Nd <= (2 * _Nd_ull), "Maximum supported integer size is 128-bit"); - constexpr auto __max_ull = numeric_limits::max(); + constexpr auto __max_ull = __int_limits::max(); unsigned long long __low = __x & __max_ull; unsigned long long __high = __x >> _Nd_ull; return __builtin_popcountll(__low) + __builtin_popcountll(__high); @@ -215,7 +218,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Tp __ceil2(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + using std::__detail::__int_limits; + constexpr auto _Nd = __int_limits<_Tp>::digits; if (__x == 0 || __x == 1) return 1; auto __shift_exponent = _Nd - std::__countl_zero((_Tp)(__x - 1u)); @@ -226,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED if (!__builtin_is_constant_evaluated()) { - __glibcxx_assert( __shift_exponent != numeric_limits<_Tp>::digits ); + __glibcxx_assert( __shift_exponent != __int_limits<_Tp>::digits ); } #endif using __promoted_type = decltype(__x << 1); @@ -247,7 +251,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Tp __floor2(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + constexpr auto _Nd = __detail::__int_limits<_Tp>::digits; if (__x == 0) return 0; return (_Tp)1u << (_Nd - std::__countl_zero((_Tp)(__x >> 1))); @@ -257,7 +261,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Tp __log2p1(_Tp __x) noexcept { - constexpr auto _Nd = numeric_limits<_Tp>::digits; + constexpr auto _Nd = __detail::__int_limits<_Tp>::digits; return _Nd - std::__countl_zero(__x); } diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv index 1fd84a8..9b5a1f7 100644 --- a/libstdc++-v3/include/std/charconv +++ b/libstdc++-v3/include/std/charconv @@ -34,11 +34,11 @@ #if __cplusplus >= 201402L #include -#include #include // for __log2p1 #include // for isdigit #include // for __to_chars_len, __to_chars_10_impl #include // for std::errc +#include // Define when floating point is supported: #define __cpp_lib_to_chars 201611L @@ -222,7 +222,7 @@ namespace __detail to_chars_result __res; unsigned __len; - if _GLIBCXX17_CONSTEXPR (numeric_limits<_Tp>::digits <= 16) + if _GLIBCXX17_CONSTEXPR (__detail::__int_limits<_Tp>::digits <= 16) { __len = __val > 077777u ? 6u : __val > 07777u ? 5u @@ -410,7 +410,7 @@ namespace __detail __i++; } __first += __i; - return __i <= numeric_limits<_Tp>::digits; + return __i <= __detail::__int_limits<_Tp>::digits; } /// std::from_chars implementation for integers in bases 3 to 10. @@ -529,7 +529,7 @@ namespace __detail case 'Z': return 35; } - return std::numeric_limits::max(); + return __detail::__int_limits::max(); } /// std::from_chars implementation for integers in bases 11 to 26. @@ -616,10 +616,10 @@ namespace __detail } else { - if _GLIBCXX17_CONSTEXPR - (numeric_limits<_Up>::max() > numeric_limits<_Tp>::max()) + if _GLIBCXX17_CONSTEXPR (__detail::__int_limits<_Up>::max() + > __detail::__int_limits<_Tp>::max()) { - if (__val > numeric_limits<_Tp>::max()) + if (__val > __detail::__int_limits<_Tp>::max()) __res.ec = errc::result_out_of_range; else __value = __val; diff --git a/libstdc++-v3/include/std/memory_resource b/libstdc++-v3/include/std/memory_resource index 13be3e9..70c56d1 100644 --- a/libstdc++-v3/include/std/memory_resource +++ b/libstdc++-v3/include/std/memory_resource @@ -33,13 +33,13 @@ #if __cplusplus >= 201703L -#include // numeric_limits #include // align, allocator_arg_t, __uses_alloc #include // pair, index_sequence #include // vector #include // size_t, max_align_t, byte #include // shared_mutex #include +#include #include namespace std _GLIBCXX_VISIBILITY(default) @@ -166,7 +166,7 @@ namespace pmr allocate(size_t __n) __attribute__((__returns_nonnull__)) { - if (__n > (numeric_limits::max() / sizeof(_Tp))) + if (__n > (__detail::__int_limits::max() / sizeof(_Tp))) std::__throw_bad_alloc(); return static_cast<_Tp*>(_M_resource->allocate(__n * sizeof(_Tp), alignof(_Tp))); @@ -192,7 +192,7 @@ namespace pmr _Up* allocate_object(size_t __n = 1) { - if ((std::numeric_limits::max() / sizeof(_Up)) < __n) + if ((__detail::__int_limits::max() / sizeof(_Up)) < __n) __throw_length_error("polymorphic_allocator::allocate_object"); return static_cast<_Up*>(allocate_bytes(__n * sizeof(_Up), alignof(_Up))); diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 798cb89..bedad24 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -37,10 +37,10 @@ #if __cplusplus >= 201703L -#include #include #include #include +#include #include namespace std _GLIBCXX_VISIBILITY(default) @@ -456,10 +456,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _S_compare(size_type __n1, size_type __n2) noexcept { const difference_type __diff = __n1 - __n2; - if (__diff > std::numeric_limits::max()) - return std::numeric_limits::max(); - if (__diff < std::numeric_limits::min()) - return std::numeric_limits::min(); + if (__diff > __detail::__int_limits::max()) + return __detail::__int_limits::max(); + if (__diff < __detail::__int_limits::min()) + return __detail::__int_limits::min(); return static_cast(__diff); } diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility index 380c059..dc6e846 100644 --- a/libstdc++-v3/include/std/utility +++ b/libstdc++-v3/include/std/utility @@ -76,7 +76,7 @@ #include #if __cplusplus > 201703L -#include +#include #endif namespace std _GLIBCXX_VISIBILITY(default) @@ -460,15 +460,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { static_assert(__is_standard_integer<_Up>::value); static_assert(__is_standard_integer<_Tp>::value); + using std::__detail::__int_limits; if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>) - return numeric_limits<_Up>::min() <= __t - && __t <= numeric_limits<_Up>::max(); + return __int_limits<_Up>::min() <= __t + && __t <= __int_limits<_Up>::max(); else if constexpr (is_signed_v<_Tp>) return __t >= 0 - && make_unsigned_t<_Tp>(__t) <= numeric_limits<_Up>::max(); + && make_unsigned_t<_Tp>(__t) <= __int_limits<_Up>::max(); else - return __t <= make_unsigned_t<_Up>(numeric_limits<_Up>::max()); + return __t <= make_unsigned_t<_Up>(__int_limits<_Up>::max()); } #endif // C++20 #endif // C++17 diff --git a/libstdc++-v3/testsuite/20_util/integer_comparisons/in_range_neg.cc b/libstdc++-v3/testsuite/20_util/integer_comparisons/in_range_neg.cc index 13e2bf7..077d9818 100644 --- a/libstdc++-v3/testsuite/20_util/integer_comparisons/in_range_neg.cc +++ b/libstdc++-v3/testsuite/20_util/integer_comparisons/in_range_neg.cc @@ -34,3 +34,4 @@ bool k = std::in_range(U'a'); // { dg-error "here" } bool l = std::in_range(97); // { dg-error "here" } // { dg-error "static assertion failed" "" { target *-*-* } 0 } +// { dg-prune-output "incomplete type" } diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_one.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_one.cc index 7fdb6ed..1e9b898 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_one.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_one.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_zero.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_zero.cc index 1a056bf..8e2f42a 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_zero.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countl_zero.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_one.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_one.cc index d6fffa9..7f53b71 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_one.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_one.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_zero.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_zero.cc index 004272c..132722f 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_zero.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/countr_zero.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/popcount.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/popcount.cc index e2f5e98..62007ed 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.count/popcount.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.count/popcount.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2.cc index e8bc0bb..f917efb 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr T max = std::numeric_limits::max(); diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc index 54b194b..b539193 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ceil2_neg.cc @@ -20,6 +20,7 @@ // { dg-xfail-run-if "__glibcxx_assert in ceil2 should fail" { *-*-* } } #include +#include // P1355R2: not a constant expression if the result is not representable diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/floor2.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/floor2.cc index 4d439bd..7d2321d 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/floor2.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/floor2.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ispow2.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ispow2.cc index 3362d40..a0a4d89 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ispow2.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/ispow2.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/log2p1.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/log2p1.cc index 4fea580..6f32d4a 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/log2p1.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.pow.two/log2p1.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr auto diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotl.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotl.cc index 802495f..b252505 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotl.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotl.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr bool diff --git a/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotr.cc b/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotr.cc index 84a86c0..bebf79d 100644 --- a/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotr.cc +++ b/libstdc++-v3/testsuite/26_numerics/bit/bit.rotate/rotr.cc @@ -19,6 +19,7 @@ // { dg-do compile { target c++2a } } #include +#include template constexpr bool -- 2.7.4