diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-06-22 18:05:11 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-06-22 20:58:25 +0100 |
commit | 6c63cb231e4cf99552bb7904ebe402f7adcafda4 (patch) | |
tree | caa99974afc147960eb93fb72f265f43941e2d33 | |
parent | f61e5d4d8b6d4cfa96863187fa61b8c6b057a491 (diff) |
libstdc++: Implement LWG 3422 for std::seed_seq
This ensures that the std::seed_seq initializer-list constructor will
not be used for list-initialization unless the initializers in the list
are integers. This allows list-initialization syntax to be used with a
pair of pointers and for that to use the appropriate constructor.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/random.h (seed_seq): Constrain initializer-list
constructor.
* include/bits/random.tcc (seed_seq): Add template parameter.
* testsuite/26_numerics/random/seed_seq/cons/default.cc: Check
for noexcept.
* testsuite/26_numerics/random/seed_seq/cons/initlist.cc: Check
constraints.
4 files changed, 12 insertions, 3 deletions
diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index 0da013c5f45..ed0d7a832f1 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -6073,7 +6073,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _M_v() { } - template<typename _IntType> + template<typename _IntType, typename = _Require<is_integral<_IntType>>> seed_seq(std::initializer_list<_IntType> __il); template<typename _InputIterator> diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 1357e181874..8e2b702b0be 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -3231,7 +3231,7 @@ namespace __detail } - template<typename _IntType> + template<typename _IntType, typename> seed_seq::seed_seq(std::initializer_list<_IntType> __il) { for (auto __iter = __il.begin(); __iter != __il.end(); ++__iter) diff --git a/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/default.cc b/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/default.cc index 18f55e723f0..62434a66591 100644 --- a/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/default.cc +++ b/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/default.cc @@ -25,6 +25,9 @@ #include <random> #include <testsuite_hooks.h> +static_assert( std::is_nothrow_default_constructible<std::seed_seq>::value, + "LWG 3422" ); + void test01() { @@ -34,7 +37,6 @@ test01() seq.generate(foo.begin(), foo.end()); VERIFY( seq.size() == 0 ); - //VERIFY(); } int diff --git a/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/initlist.cc b/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/initlist.cc index 44b855e5627..1ed9eb784c3 100644 --- a/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/initlist.cc +++ b/libstdc++-v3/testsuite/26_numerics/random/seed_seq/cons/initlist.cc @@ -36,6 +36,13 @@ test01() VERIFY( seq.size() == 10 ); } +void +lwg3422() +{ + int i[32] = { }; + std::seed_seq ss{i, i+32}; // LWG 3422 +} + int main() { test01(); |