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:
Ed Smith-Rowland 2014-07-29 14:56:45 +00:00 committed by Edward Smith-Rowland
parent f3691f465e
commit 1c4ff014fe
6 changed files with 55 additions and 1 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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);

View File

@ -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();

View 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 }

View File

@ -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);
}