]> gcc.gnu.org Git - gcc.git/commitdiff
PR libstdc++/60037 - SIGFPE in std::generate_canonical<unsigned int...>
authorEd Smith-Rowland <3dw4rd@verizon.net>
Tue, 29 Jul 2014 14:56:45 +0000 (14:56 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Tue, 29 Jul 2014 14:56:45 +0000 (14:56 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/random.h
libstdc++-v3/include/bits/random.tcc
libstdc++-v3/include/ext/random.tcc
libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/pr60037.cc [new file with mode: 0644]

index 58febfb42233e8203263ef40d1a0b7593e360d10..4a7ee072d25d5397f10979f81b1b2a64e6eefb3c 100644 (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.
index a466a45ba4d227d11558e47de75a90f1512d107e..774f726d0a6410db71f3c75936f3aebf22042c3c 100644 (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)
index 0eda287f4814c00899a411e991d0656d53cf6f5a..8849ee90d644c9eda51dcc8fb1e41bd7219e7fd1 100644 (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);
index 432865cb548653a208251758aa2a68f0fd42c007..05361d8f49169a8e5b46ffe2d39eb30798ac65fd 100644 (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();
diff --git a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
new file mode 100644 (file)
index 0000000..11d5539
--- /dev/null
@@ -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 }
diff --git a/libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/pr60037.cc b/libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/pr60037.cc
new file mode 100644 (file)
index 0000000..d3088a6
--- /dev/null
@@ -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);
+}
This page took 0.082717 seconds and 5 git commands to generate.