https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85466

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #5)
> I see sth like
> 
>   template<typename _RealType, size_t __bits,
>     typename _UniformRandomNumberGenerator>
>     _RealType
>     generate_canonical(_UniformRandomNumberGenerator& __urng)
>     {
> ...
>    __ret = std::nextafter(_RealType(1), _RealType(0));
> 
> instantiated as
> 
> _RealType std::generate_canonical(_UniformRandomNumberGenerator&) [with
> _RealType = double; long unsigned int __bits = 53;
> _UniformRandomNumberGenerator = std::mersenne_twister_engine<long unsigned
> int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15,
> 4022730752, 18, 1812433253>] (struct mersenne_twister_engine & __urng)
> {
> ...
>   const long double __r;
> ^^^
> (but that's unused it seems)

It's used to calculate __log2r which is the maximum range of the random bit
generator __urng.

> ...
>   __ret = nextafter (1.0e+0, 0.0);
> 
> and cmath containing
> 
>   constexpr float
>   nextafter(float __x, float __y)
>   { return __builtin_nextafterf(__x, __y); }
> 
>   constexpr long double
>   nextafter(long double __x, long double __y)
>   { return __builtin_nextafterl(__x, __y); }
> 
> 
> 
>   template<typename _Tp, typename _Up>
>     constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
>     nextafter(_Tp __x, _Up __y)
>     {
>       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
>       return nextafter(__type(__x), __type(__y));
>     }

And also:

  using ::nextafter;

> which means std::nextafter will use the long double variant?

No, in the instantiation of generate_canonical<double, ...> it uses the
nextafter(double, double) from libc that's added to namespace std by "using
::nextafter".

Reply via email to