diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -40,6 +40,9 @@ typedef random_access_iterator_tag iterator_category; }; +template + using iter_reference_t = decltype(*declval()); + template struct iterator @@ -429,7 +432,6 @@ #include <__memory/addressof.h> #include <__memory/pointer_traits.h> #include -#include #include <__debug> @@ -440,6 +442,20 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if !defined(_LIBCPP_HAS_NO_RANGES) + +template +using __with_reference = _Tp&; + +template +concept __referenceable = requires { + typename __with_reference<_Tp>; +}; + +template +concept __dereferenceable = requires(_Tp& __t) { + { *__t } -> __referenceable; // not required to be equality-preserving +}; + // [incrementable.traits] template struct incrementable_traits {}; @@ -520,6 +536,9 @@ struct indirectly_readable_traits<_Tp> : __cond_value_type {}; +// [iterator.traits] +template<__dereferenceable _Tp> +using iter_reference_t = decltype(*declval<_Tp&>()); #endif // !defined(_LIBCPP_HAS_NO_RANGES) template @@ -630,6 +649,71 @@ typedef typename _Iter::iterator_category iterator_category; }; +#if !defined(_LIBCPP_HAS_NO_RANGES) + +// The `cpp17.*-iterator` concepts have been dubbed `__legacy.*_iterator` because the name is both +// clearer (C++98 iterators are still valid `cpp17-iterators`, for example), and because it's the +// term that C++ Reference uses (which is what most users will look to when issued diagnostics). + +template +concept __legacy_iterator = + requires(_Ip __i) { + { *__i } -> __referenceable; + { ++__i } -> same_as<_Ip&>; + { *__i++ } -> __referenceable; + } && + copyable<_Ip>; + +template +concept __legacy_input_iterator = + __legacy_iterator<_Ip> && + equality_comparable<_Ip> && + requires(_Ip __i) { + typename incrementable_traits<_Ip>::difference_type; + typename indirectly_readable_traits<_Ip>::value_type; + typename common_reference_t&&, + typename indirectly_readable_traits<_Ip>::value_type&>; + typename common_reference_t::value_type&>; + requires signed_integral::difference_type>; + }; + +template +concept __legacy_forward_iterator = + __legacy_input_iterator<_Ip> && + constructible_from<_Ip> && + is_lvalue_reference_v> && + same_as>, + typename indirectly_readable_traits<_Ip>::value_type> && + requires(_Ip __i) { + { __i++ } -> convertible_to<_Ip const&>; + { *__i++ } -> same_as>; + }; + +template +concept __legacy_bidirectional_iterator = + __legacy_forward_iterator<_Ip> && + requires(_Ip __i) { + { --__i } -> same_as<_Ip&>; + { __i-- } -> convertible_to<_Ip const&>; + { *__i-- } -> same_as>; + }; + +template +concept __legacy_random_access_iterator = + __legacy_bidirectional_iterator<_Ip> and + totally_ordered<_Ip> and + requires(_Ip __i, typename incrementable_traits<_Ip>::difference_type __n) { + { __i += __n } -> same_as<_Ip&>; + { __i -= __n } -> same_as<_Ip&>; + { __i + __n } -> same_as<_Ip>; + { __n + __i } -> same_as<_Ip>; + { __i - __n } -> same_as<_Ip>; + { __i - __i } -> same_as; + { __i[__n] } -> convertible_to>; + }; +#endif // !defined(_LIBCPP_HAS_NO_RANGES) + template struct __iterator_traits {}; template diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_bidirectional_iterator.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_bidirectional_iterator.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_bidirectional_iterator.compile.pass.cpp @@ -0,0 +1,151 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept __legacy_bidirectional_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +#endif + +// +static_assert(!std::__legacy_bidirectional_iterator::iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_iterator>); + +// +static_assert(!std::__legacy_bidirectional_iterator > >); +static_assert(!std::__legacy_bidirectional_iterator > >); +static_assert(!std::__legacy_bidirectional_iterator > >); +static_assert(!std::__legacy_bidirectional_iterator::iterator> >); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); + +// +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); +static_assert(std::__legacy_bidirectional_iterator); + +// +static_assert(!std::__legacy_bidirectional_iterator::iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::local_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_local_iterator>); + +static_assert(!std::__legacy_bidirectional_iterator::iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::local_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_local_iterator>); + +// +static_assert(!std::__legacy_bidirectional_iterator::iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::local_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_local_iterator>); + +static_assert(!std::__legacy_bidirectional_iterator::iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::local_iterator>); +static_assert(!std::__legacy_bidirectional_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_bidirectional_iterator::iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_iterator>); +static_assert(std::__legacy_bidirectional_iterator::reverse_iterator>); +static_assert(std::__legacy_bidirectional_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator::iterator volatile>); +static_assert(!std::__legacy_bidirectional_iterator::iterator&>); +static_assert(!std::__legacy_bidirectional_iterator::iterator&&>); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); + +struct S {}; +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); +static_assert(!std::__legacy_bidirectional_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_forward_iterator.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_forward_iterator.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_forward_iterator.compile.pass.cpp @@ -0,0 +1,151 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept __legacy_forward_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +#endif + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); + +// +static_assert(!std::__legacy_forward_iterator > >); +static_assert(!std::__legacy_forward_iterator > >); +static_assert(!std::__legacy_forward_iterator > >); +static_assert(!std::__legacy_forward_iterator::iterator> >); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); + +// +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); +static_assert(std::__legacy_forward_iterator); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::local_iterator>); +static_assert(std::__legacy_forward_iterator::const_local_iterator>); + +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::local_iterator>); +static_assert(std::__legacy_forward_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::local_iterator>); +static_assert(std::__legacy_forward_iterator::const_local_iterator>); + +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::local_iterator>); +static_assert(std::__legacy_forward_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_forward_iterator::iterator>); +static_assert(std::__legacy_forward_iterator::const_iterator>); +static_assert(std::__legacy_forward_iterator::reverse_iterator>); +static_assert(std::__legacy_forward_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator::iterator volatile>); +static_assert(!std::__legacy_forward_iterator::iterator&>); +static_assert(!std::__legacy_forward_iterator::iterator&&>); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); + +struct S {}; +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); +static_assert(!std::__legacy_forward_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_input_iterator.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_input_iterator.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_input_iterator.compile.pass.cpp @@ -0,0 +1,151 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept __legacy_input_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +#endif + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); + +// +static_assert(!std::__legacy_input_iterator > >); +static_assert(!std::__legacy_input_iterator > >); +static_assert(!std::__legacy_input_iterator > >); +static_assert(std::__legacy_input_iterator::iterator> >); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); + +// +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); +static_assert(std::__legacy_input_iterator); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::local_iterator>); +static_assert(std::__legacy_input_iterator::const_local_iterator>); + +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::local_iterator>); +static_assert(std::__legacy_input_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::local_iterator>); +static_assert(std::__legacy_input_iterator::const_local_iterator>); + +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::local_iterator>); +static_assert(std::__legacy_input_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_input_iterator::iterator>); +static_assert(std::__legacy_input_iterator::const_iterator>); +static_assert(std::__legacy_input_iterator::reverse_iterator>); +static_assert(std::__legacy_input_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator::iterator volatile>); +static_assert(!std::__legacy_input_iterator::iterator&>); +static_assert(!std::__legacy_input_iterator::iterator&&>); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); + +struct S {}; +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); +static_assert(!std::__legacy_input_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_iterator.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_iterator.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_iterator.compile.pass.cpp @@ -0,0 +1,151 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept __legacy_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +#endif + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); + +// +static_assert(std::__legacy_iterator > >); +static_assert(std::__legacy_iterator > >); +static_assert(std::__legacy_iterator > >); +static_assert(std::__legacy_iterator::iterator> >); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); + +// +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); +static_assert(std::__legacy_iterator); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::local_iterator>); +static_assert(std::__legacy_iterator::const_local_iterator>); + +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::local_iterator>); +static_assert(std::__legacy_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::local_iterator>); +static_assert(std::__legacy_iterator::const_local_iterator>); + +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::local_iterator>); +static_assert(std::__legacy_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_iterator::iterator>); +static_assert(std::__legacy_iterator::const_iterator>); +static_assert(std::__legacy_iterator::reverse_iterator>); +static_assert(std::__legacy_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator::iterator volatile>); +static_assert(!std::__legacy_iterator::iterator&>); +static_assert(!std::__legacy_iterator::iterator&&>); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); + +struct S {}; +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); +static_assert(!std::__legacy_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_random_access_iterator.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_random_access_iterator.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/legacy_random_access_iterator.compile.pass.cpp @@ -0,0 +1,151 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept __legacy_random_access_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); + +// +static_assert(std::__legacy_random_access_iterator::iterator>); +static_assert(std::__legacy_random_access_iterator::const_iterator>); +static_assert(std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(std::__legacy_random_access_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_random_access_iterator::iterator>); +static_assert(std::__legacy_random_access_iterator::const_iterator>); +static_assert(std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(std::__legacy_random_access_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +#endif + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); + +// +static_assert(!std::__legacy_random_access_iterator > >); +static_assert(!std::__legacy_random_access_iterator > >); +static_assert(!std::__legacy_random_access_iterator > >); +static_assert(!std::__legacy_random_access_iterator::iterator> >); + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_reverse_iterator>); + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_reverse_iterator>); + +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_reverse_iterator>); + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_reverse_iterator>); + +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_reverse_iterator>); + +// +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); + +// +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); +static_assert(std::__legacy_random_access_iterator); + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::local_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_local_iterator>); + +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::local_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_local_iterator>); + +// +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::local_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_local_iterator>); + +static_assert(!std::__legacy_random_access_iterator::iterator>); +static_assert(!std::__legacy_random_access_iterator::const_iterator>); +static_assert(!std::__legacy_random_access_iterator::local_iterator>); +static_assert(!std::__legacy_random_access_iterator::const_local_iterator>); + +// +static_assert(std::__legacy_random_access_iterator::iterator>); +static_assert(std::__legacy_random_access_iterator::const_iterator>); +static_assert(std::__legacy_random_access_iterator::reverse_iterator>); +static_assert(std::__legacy_random_access_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator::iterator volatile>); +static_assert(!std::__legacy_random_access_iterator::iterator&>); +static_assert(!std::__legacy_random_access_iterator::iterator&&>); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); + +struct S {}; +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); +static_assert(!std::__legacy_random_access_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/locale_dependent.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/locale_dependent.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/locale_dependent.compile.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// REQUIRES: locale.en_US.UTF-8 + +#include + +#include +#include + +static_assert(std::__legacy_iterator >); +static_assert(std::__legacy_iterator >); +static_assert(std::__legacy_iterator >); +static_assert(std::__legacy_iterator >); + +static_assert(std::__legacy_input_iterator >); +static_assert(std::__legacy_input_iterator >); +static_assert(!std::__legacy_input_iterator >); +static_assert(!std::__legacy_input_iterator >); + +// This is because the legacy iterator concepts don't care about iterator_category +static_assert(std::__legacy_forward_iterator >); + +static_assert(!std::__legacy_forward_iterator >); +static_assert(!std::__legacy_forward_iterator >); +static_assert(!std::__legacy_forward_iterator >); + +static_assert(!std::__legacy_bidirectional_iterator >); +static_assert(!std::__legacy_bidirectional_iterator >); +static_assert(!std::__legacy_bidirectional_iterator >); +static_assert(!std::__legacy_bidirectional_iterator >); + +static_assert(!std::__legacy_random_access_iterator >); +static_assert(!std::__legacy_random_access_iterator >); +static_assert(!std::__legacy_random_access_iterator >); +static_assert(!std::__legacy_random_access_iterator >); diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iter_reference_t.compile.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iter_reference_t.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iter_reference_t.compile.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts + +// template +// using iter_reference_t = decltype(*declval()); + +#include + +#include + +#include "test_iterators.h" + +static_assert(std::same_as >, int&>); +static_assert(std::same_as >, int&>); +static_assert(std::same_as >, int&>); +static_assert(std::same_as >, int&>);