diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-24 14:22:21 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-24 14:22:21 +0000 |
commit | 8566286eaeb9a977339df88212826150767f1203 (patch) | |
tree | d11efa9029570f584224de11a20ce5de2b31a7eb | |
parent | 32b8f5df9f05426c82c6de1acaf9ca4aec68039d (diff) | |
download | gcc-8566286eaeb9a977339df88212826150767f1203.zip gcc-8566286eaeb9a977339df88212826150767f1203.tar.gz gcc-8566286eaeb9a977339df88212826150767f1203.tar.bz2 |
libstdc++: Fix noexcept-specifier for istream_iterator
Somehow I missed that the _M_value member can throw on construction.
* include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)):
Make noexcept-specifier conditional.
* testsuite/24_iterators/istream_iterator/cons/sentinel.cc: Check
noexcept-specifier.
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stream_iterator.h | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/24_iterators/istream_iterator/cons/sentinel.cc | 9 |
3 files changed, 16 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e18f9d0..eefb2a5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,6 +1,11 @@ 2020-02-24 Jonathan Wakely <jwakely@redhat.com> * include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)): + Make noexcept-specifier conditional. + * testsuite/24_iterators/istream_iterator/cons/sentinel.cc: Check + noexcept-specifier. + + * include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)): Add constructor. (operator==(istream_iterator, default_sentinel_t)): Add operator. (ostream_iterator::difference_type): Define to ptrdiff_t for C++20. diff --git a/libstdc++-v3/include/bits/stream_iterator.h b/libstdc++-v3/include/bits/stream_iterator.h index 1ddf647..9d8ead0 100644 --- a/libstdc++-v3/include/bits/stream_iterator.h +++ b/libstdc++-v3/include/bits/stream_iterator.h @@ -79,7 +79,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus > 201703L constexpr - istream_iterator(default_sentinel_t) noexcept + istream_iterator(default_sentinel_t) + noexcept(is_nothrow_default_constructible_v<_Tp>) : istream_iterator() { } #endif diff --git a/libstdc++-v3/testsuite/24_iterators/istream_iterator/cons/sentinel.cc b/libstdc++-v3/testsuite/24_iterators/istream_iterator/cons/sentinel.cc index 77a1949..b890f04 100644 --- a/libstdc++-v3/testsuite/24_iterators/istream_iterator/cons/sentinel.cc +++ b/libstdc++-v3/testsuite/24_iterators/istream_iterator/cons/sentinel.cc @@ -19,9 +19,18 @@ // <http://www.gnu.org/licenses/>. #include <iterator> +#include <istream> // C++20 doesn't require this to be non-throwing. static_assert( std::is_nothrow_constructible_v<std::istream_iterator<int>, std::default_sentinel_t> ); constexpr std::istream_iterator<int> i = std::default_sentinel; + +struct X { X() noexcept(false); }; +std::istream& operator<<(std::istream&, X&); + +static_assert( std::is_constructible_v<std::istream_iterator<X>, + std::default_sentinel_t> ); +static_assert( ! std::is_nothrow_constructible_v<std::istream_iterator<X>, + std::default_sentinel_t> ); |