From: Jonathan Wakely Date: Mon, 24 Feb 2020 14:22:21 +0000 (+0000) Subject: libstdc++: Fix noexcept-specifier for istream_iterator X-Git-Tag: upstream/12.2.0~18218 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8566286eaeb9a977339df88212826150767f1203;p=platform%2Fupstream%2Fgcc.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 e18f9d0..eefb2a5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,6 +1,11 @@ 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. (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 @@ // . #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> );