PR libstdc++/60037 - SIGFPE in std::generate_canonical<unsigned int...>
2014-07-29 Ed Smith-Rowland <3dw4rd@verizon.net> PR libstdc++/60037 - SIGFPE in std::generate_canonical<unsigned int...> * include/bits/random.h (_Adaptor): static_assert for non floating-point result type. * include/bits/random.tcc (generate_canonical): Ditto. * include/ext/random.tcc (hypergeometric_distribution::operator()): Use double as a rng result type. * testsuite/26_numerics/random/pr60037-neg.cc: New. * testsuite/ext/random/hypergeometric_distribution/pr60037.cc: New. From-SVN: r213207
This commit is contained in:
parent
f3691f465e
commit
1c4ff014fe
6 changed files with 55 additions and 1 deletions
|
@ -1,3 +1,14 @@
|
|||
2014-07-29 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR libstdc++/60037 - SIGFPE in std::generate_canonical<unsigned int...>
|
||||
* include/bits/random.h (_Adaptor): static_assert for non floating-point
|
||||
result type.
|
||||
* include/bits/random.tcc (generate_canonical): Ditto.
|
||||
* include/ext/random.tcc (hypergeometric_distribution::operator()):
|
||||
Use double as a rng result type.
|
||||
* testsuite/26_numerics/random/pr60037-neg.cc: New.
|
||||
* testsuite/ext/random/hypergeometric_distribution/pr60037.cc: New.
|
||||
|
||||
2014-07-25 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* config/abi/post/alpha-linux-gnu/baseline_symbols.txt: Update.
|
||||
|
|
|
@ -164,6 +164,8 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
|||
template<typename _Engine, typename _DInputType>
|
||||
struct _Adaptor
|
||||
{
|
||||
static_assert(std::is_floating_point<_DInputType>::value,
|
||||
"template argument not a floating point type");
|
||||
|
||||
public:
|
||||
_Adaptor(_Engine& __g)
|
||||
|
|
|
@ -3463,6 +3463,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
_RealType
|
||||
generate_canonical(_UniformRandomNumberGenerator& __urng)
|
||||
{
|
||||
static_assert(std::is_floating_point<_RealType>::value,
|
||||
"template argument not a floating point type");
|
||||
|
||||
const size_t __b
|
||||
= std::min(static_cast<size_t>(std::numeric_limits<_RealType>::digits),
|
||||
__bits);
|
||||
|
|
|
@ -1355,7 +1355,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
operator()(_UniformRandomNumberGenerator& __urng,
|
||||
const param_type& __param)
|
||||
{
|
||||
std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
|
||||
std::__detail::_Adaptor<_UniformRandomNumberGenerator, double>
|
||||
__aurng(__urng);
|
||||
|
||||
result_type __a = __param.successful_size();
|
||||
|
|
15
libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
Normal file
15
libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
Normal file
|
@ -0,0 +1,15 @@
|
|||
// { dg-do compile }
|
||||
// { dg-options "-std=gnu++11" }
|
||||
|
||||
#include <random>
|
||||
|
||||
std::mt19937 urng;
|
||||
|
||||
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 not a floating point type" "" { target *-*-* } 167 }
|
||||
|
||||
// { dg-error "static assertion failed: template argument not a floating point type" "" { target *-*-* } 3466 }
|
|
@ -0,0 +1,23 @@
|
|||
// { dg-options "-std=gnu++11 -O0" }
|
||||
// { dg-require-cstdint "" }
|
||||
// { dg-require-cmath "" }
|
||||
|
||||
#include <ext/random>
|
||||
#include <functional>
|
||||
|
||||
void
|
||||
hyperplot(unsigned int N, unsigned int K, unsigned int n)
|
||||
{
|
||||
std::mt19937 re; // the default engine
|
||||
__gnu_cxx::hypergeometric_distribution<> hd(N, K, n);
|
||||
auto gen = std::bind(hd, re);
|
||||
gen();
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
hyperplot(15, 3, 2);
|
||||
hyperplot(500, 50, 30);
|
||||
hyperplot(100, 20, 5);
|
||||
}
|
Loading…
Add table
Reference in a new issue