From 8566286eaeb9a977339df88212826150767f1203 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 24 Feb 2020 14:22:21 +0000 Subject: [PATCH] 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. --- libstdc++-v3/ChangeLog | 5 +++++ libstdc++-v3/include/bits/stream_iterator.h | 3 ++- .../testsuite/24_iterators/istream_iterator/cons/sentinel.cc | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) 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> ); -- 2.7.4