aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext/random
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-05-15 16:36:46 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-05-15 16:36:46 +0100
commit5a7960da41fec497eb4203d71215bcb1077207a9 (patch)
tree459507cfc4f9ff9bc0b70712e1db9fd0ce037432 /libstdc++-v3/include/ext/random
parentc3b61fdadd7ffc9ef5c613c2df0ff4edf83ad0fc (diff)
downloadgcc-5a7960da41fec497eb4203d71215bcb1077207a9.zip
gcc-5a7960da41fec497eb4203d71215bcb1077207a9.tar.gz
gcc-5a7960da41fec497eb4203d71215bcb1077207a9.tar.bz2
PR libstdc++/85749 constrain seed sequences for random number engines
Constrain constructors and member functions of random number engines so that functions taking seed sequences can only be called with types that meet the seed sequence requirements. PR libstdc++/85749 * include/bits/random.h (__detail::__is_seed_seq): New SFINAE helper. (linear_congruential_engine, mersenne_twister_engine) (subtract_with_carry_engine, discard_block_engine) (independent_bits_engine, shuffle_order_engine): Use __is_seed_seq to constrain function templates taking seed sequences. * include/bits/random.tcc (linear_congruential_engine::seed(_Sseq&)) (mersenne_twister_engine::seed(_Sseq&)) (subtract_with_carry_engine::seed(_Sseq&)): Change return types to match declarations. * include/ext/random (simd_fast_mersenne_twister_engine): Use __is_seed_seq to constrain function templates taking seed sequences. * include/ext/random.tcc (simd_fast_mersenne_twister_engine::seed): Change return type to match declaration. * testsuite/26_numerics/random/discard_block_engine/cons/seed_seq2.cc: New. * testsuite/26_numerics/random/independent_bits_engine/cons/ seed_seq2.cc: New. * testsuite/26_numerics/random/linear_congruential_engine/cons/ seed_seq2.cc: New. * testsuite/26_numerics/random/mersenne_twister_engine/cons/ seed_seq2.cc: New. * testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error lineno. * testsuite/26_numerics/random/shuffle_order_engine/cons/seed_seq2.cc: New. * testsuite/26_numerics/random/subtract_with_carry_engine/cons/ seed_seq2.cc: New. * testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/ seed_seq2.cc: New. From-SVN: r260263
Diffstat (limited to 'libstdc++-v3/include/ext/random')
-rw-r--r--libstdc++-v3/include/ext/random13
1 files changed, 8 insertions, 5 deletions
diff --git a/libstdc++-v3/include/ext/random b/libstdc++-v3/include/ext/random
index 0a98b35..7e93186 100644
--- a/libstdc++-v3/include/ext/random
+++ b/libstdc++-v3/include/ext/random
@@ -85,6 +85,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_assert(16 % sizeof(_UIntType) == 0,
"UIntType size must divide 16");
+ template<typename _Sseq>
+ using _If_seed_seq
+ = typename std::enable_if<std::__detail::__is_seed_seq<
+ _Sseq, simd_fast_mersenne_twister_engine, result_type>::value
+ >::type;
+
public:
static constexpr size_t state_size = _M_nstate * (16
/ sizeof(result_type));
@@ -95,10 +101,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
simd_fast_mersenne_twister_engine(result_type __sd = default_seed)
{ seed(__sd); }
- template<typename _Sseq, typename = typename
- std::enable_if<!std::is_same<_Sseq,
- simd_fast_mersenne_twister_engine>::value>
- ::type>
+ template<typename _Sseq, typename = _If_seed_seq<_Sseq>>
explicit
simd_fast_mersenne_twister_engine(_Sseq& __q)
{ seed(__q); }
@@ -107,7 +110,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
seed(result_type __sd = default_seed);
template<typename _Sseq>
- typename std::enable_if<std::is_class<_Sseq>::value>::type
+ _If_seed_seq<_Sseq>
seed(_Sseq& __q);
static constexpr result_type