From: Jonathan Wakely Date: Mon, 24 Feb 2020 14:22:21 +0000 (+0000) Subject: libstdc++: Fix noexcept-specifier for istream_iterator X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8566286eaeb9a977339df88212826150767f1203;p=gcc.git 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. --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e18f9d07360..eefb2a5bd42 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2020-02-24 Jonathan Wakely + * 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. diff --git a/libstdc++-v3/include/bits/stream_iterator.h b/libstdc++-v3/include/bits/stream_iterator.h index 1ddf647f729..9d8ead092b8 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 77a19498817..b890f04f8e9 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 @@ // . #include +#include // C++20 doesn't require this to be non-throwing. static_assert( std::is_nothrow_constructible_v, std::default_sentinel_t> ); constexpr std::istream_iterator i = std::default_sentinel; + +struct X { X() noexcept(false); }; +std::istream& operator<<(std::istream&, X&); + +static_assert( std::is_constructible_v, + std::default_sentinel_t> ); +static_assert( ! std::is_nothrow_constructible_v, + std::default_sentinel_t> );