libstdc++: Modernize <bits/random.h> helpers

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/random.h (_Shift::__value): Use constexpr.
	(_Select_uint_least_t::type): Use using-declaration.
	(_Mod): Likewise.
	* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error
	line number.
This commit is contained in:
Jonathan Wakely 2021-07-16 13:39:25 +01:00
parent 42167831ab
commit 95891ca020
2 changed files with 13 additions and 10 deletions

View File

@ -68,11 +68,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool = __w < static_cast<size_t>
(std::numeric_limits<_UIntType>::digits)>
struct _Shift
{ static const _UIntType __value = 0; };
{ static constexpr _UIntType __value = 0; };
template<typename _UIntType, size_t __w>
struct _Shift<_UIntType, __w, true>
{ static const _UIntType __value = _UIntType(1) << __w; };
{ static constexpr _UIntType __value = _UIntType(1) << __w; };
template<int __s,
int __which = ((__s <= __CHAR_BIT__ * sizeof (int))
@ -88,20 +88,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<int __s>
struct _Select_uint_least_t<__s, 4>
{ typedef unsigned int type; };
{ using type = unsigned int; };
template<int __s>
struct _Select_uint_least_t<__s, 3>
{ typedef unsigned long type; };
{ using type = unsigned long; };
template<int __s>
struct _Select_uint_least_t<__s, 2>
{ typedef unsigned long long type; };
{ using type = unsigned long long; };
#if __SIZEOF_INT128__ > __SIZEOF_LONG_LONG__
template<int __s>
struct _Select_uint_least_t<__s, 1>
{ __extension__ typedef unsigned __int128 type; };
{ __extension__ using type = unsigned __int128; };
#endif
// Assume a != 0, a < m, c < m, x < m.
@ -111,11 +111,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool __schrage_ok = __m % __a < __m / __a>
struct _Mod
{
typedef typename _Select_uint_least_t<std::__lg(__a)
+ std::__lg(__m) + 2>::type _Tp2;
static _Tp
__calc(_Tp __x)
{ return static_cast<_Tp>((_Tp2(__a) * __x + __c) % __m); }
{
using _Tp2
= typename _Select_uint_least_t<std::__lg(__a)
+ std::__lg(__m) + 2>::type;
return static_cast<_Tp>((_Tp2(__a) * __x + __c) % __m);
}
};
// Schrage.

View File

@ -10,6 +10,6 @@ std::__detail::_Adaptor<std::mt19937, unsigned long> aurng(urng);
auto x = std::generate_canonical<std::size_t,
std::numeric_limits<std::size_t>::digits>(urng);
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 166 }
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 169 }
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3350 }