diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 65039d20b9e9..95c15977796c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2020-05-21 Jonathan Wakely + PR libstdc++/93983 + * include/bits/iterator_concepts.h (__detail::__cpp17_iterator): + Reorder constraints to avoid recursion when constructors use + iterator_traits (LWG 3420). + * testsuite/24_iterators/customization_points/lwg3420.cc: New test. + * include/experimental/socket (basic_socket::is_open() (basic_socket_acceptor::is_open()): Use _GLIBCXX_NODISCARD macro. diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h index e221ec703675..31b58408fe98 100644 --- a/libstdc++-v3/include/bits/iterator_concepts.h +++ b/libstdc++-v3/include/bits/iterator_concepts.h @@ -249,14 +249,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __detail { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3420. cpp17-iterator should check [type] looks like an iterator first template - concept __cpp17_iterator = copyable<_Iter> - && requires(_Iter __it) + concept __cpp17_iterator = requires(_Iter __it) { { *__it } -> __can_reference; { ++__it } -> same_as<_Iter&>; { *__it++ } -> __can_reference; - }; + } && copyable<_Iter>; template concept __cpp17_input_iterator = __cpp17_iterator<_Iter> @@ -269,7 +270,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename indirectly_readable_traits<_Iter>::value_type&>; typename common_reference_t::value_type&>; - requires signed_integral::difference_type>; + requires signed_integral< + typename incrementable_traits<_Iter>::difference_type>; }; template diff --git a/libstdc++-v3/testsuite/24_iterators/customization_points/lwg3420.cc b/libstdc++-v3/testsuite/24_iterators/customization_points/lwg3420.cc new file mode 100644 index 000000000000..72289a995fca --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/customization_points/lwg3420.cc @@ -0,0 +1,43 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +// PR libstdc++/93983 + +// LWG 3420. +// cpp17-iterator should check that the type looks like an iterator first + +#include +#include +#include + +struct Foo +{ + Foo(const std::filesystem::path& p); +}; + +static_assert(std::copyable); + +struct X +{ + template::iterator_category> + X(const T&); +}; + +static_assert(std::copyable);