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` exposition-only concepts are easily confused with the Cpp17*Iterator tables, +// so they've been banished to a namespace that makes it obvious they have a niche use-case. +namespace __iterator_traits_detail { +template +concept __cpp17_iterator = + requires(_Ip __i) { + { *__i } -> __referenceable; + { ++__i } -> same_as<_Ip&>; + { *__i++ } -> __referenceable; + } && + copyable<_Ip>; + +template +concept __cpp17_input_iterator = + __cpp17_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 __cpp17_forward_iterator = + __cpp17_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 __cpp17_bidirectional_iterator = + __cpp17_forward_iterator<_Ip> && + requires(_Ip __i) { + { --__i } -> same_as<_Ip&>; + { __i-- } -> convertible_to<_Ip const&>; + { *__i-- } -> same_as>; + }; + +template +concept __cpp17_random_access_iterator = + __cpp17_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>; + }; +} // namespace __iterator_traits_detail +#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/iterator_traits_cpp17_iterators.h b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/iterator_traits_cpp17_iterators.h new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.assoc.types/iterator.traits/iterator_traits_cpp17_iterators.h @@ -0,0 +1,104 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS +#define TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS + +struct iterator_traits_cpp17_iterator { + int& operator*(); + iterator_traits_cpp17_iterator& operator++(); + iterator_traits_cpp17_iterator operator++(int); +}; + +struct iterator_traits_cpp17_proxy_iterator { + int operator*(); + iterator_traits_cpp17_proxy_iterator& operator++(); + + // this returns legcay_iterator, not iterator_traits_cpp17_proxy_iterator + iterator_traits_cpp17_iterator operator++(int); +}; + +struct iterator_traits_cpp17_input_iterator { + using difference_type = int; + using value_type = long; + + int& operator*(); + iterator_traits_cpp17_input_iterator& operator++(); + iterator_traits_cpp17_input_iterator operator++(int); + + bool operator==(iterator_traits_cpp17_input_iterator const&) const; +}; + +struct iterator_traits_cpp17_proxy_input_iterator { + using difference_type = int; + using value_type = long; + + int operator*(); + iterator_traits_cpp17_proxy_input_iterator& operator++(); + + // this returns legcay_input_iterator, not iterator_traits_cpp17_proxy_input_iterator + iterator_traits_cpp17_input_iterator operator++(int); + + bool operator==(iterator_traits_cpp17_proxy_input_iterator const&) const; +}; + +struct iterator_traits_cpp17_forward_iterator { + using difference_type = int; + using value_type = int; + + int& operator*(); + iterator_traits_cpp17_forward_iterator& operator++(); + iterator_traits_cpp17_forward_iterator operator++(int); + + bool operator==(iterator_traits_cpp17_forward_iterator const&) const; +}; + +struct iterator_traits_cpp17_bidirectional_iterator { + using difference_type = int; + using value_type = int; + + int& operator*(); + iterator_traits_cpp17_bidirectional_iterator& operator++(); + iterator_traits_cpp17_bidirectional_iterator operator++(int); + iterator_traits_cpp17_bidirectional_iterator& operator--(); + iterator_traits_cpp17_bidirectional_iterator operator--(int); + + bool operator==(iterator_traits_cpp17_bidirectional_iterator const&) const; +}; + +struct iterator_traits_cpp17_random_access_iterator { + using difference_type = int; + using value_type = int; + + int& operator*(); + int& operator[](difference_type); + iterator_traits_cpp17_random_access_iterator& operator++(); + iterator_traits_cpp17_random_access_iterator operator++(int); + iterator_traits_cpp17_random_access_iterator& operator--(); + iterator_traits_cpp17_random_access_iterator operator--(int); + + bool operator==(iterator_traits_cpp17_random_access_iterator const&) const; + bool operator<(iterator_traits_cpp17_random_access_iterator const&) const; + bool operator>(iterator_traits_cpp17_random_access_iterator const&) const; + bool operator<=(iterator_traits_cpp17_random_access_iterator const&) const; + bool operator>=(iterator_traits_cpp17_random_access_iterator const&) const; + + iterator_traits_cpp17_random_access_iterator& operator+=(difference_type); + iterator_traits_cpp17_random_access_iterator& operator-=(difference_type); + + friend iterator_traits_cpp17_random_access_iterator operator+(iterator_traits_cpp17_random_access_iterator, + difference_type); + friend iterator_traits_cpp17_random_access_iterator operator+(difference_type, + iterator_traits_cpp17_random_access_iterator); + friend iterator_traits_cpp17_random_access_iterator operator-(iterator_traits_cpp17_random_access_iterator, + difference_type); + friend difference_type operator-(iterator_traits_cpp17_random_access_iterator, + iterator_traits_cpp17_random_access_iterator); +}; + +#endif // TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS 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,183 @@ +//===----------------------------------------------------------------------===// +// +// 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 __iterator_traits_detail::__cpp17_bidirectional_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iterator_traits_cpp17_iterators.h" + +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator); + +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +#endif + +// +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); + +// +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator > >); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator > >); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator> >); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_local_iterator>); + +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::local_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator< + std::unordered_multimap::const_local_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_local_iterator>); + +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_bidirectional_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator volatile>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator&>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator::iterator&&>); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); + +struct S {}; +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_bidirectional_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_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,167 @@ +//===----------------------------------------------------------------------===// +// +// 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 __iterator_traits_detail::__cpp17_forward_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iterator_traits_cpp17_iterators.h" + +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); + +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +#endif + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator > >); +static_assert( + !std::__iterator_traits_detail::__cpp17_forward_iterator::iterator> >); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_forward_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_forward_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_forward_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_forward_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator::iterator volatile>); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator::iterator&>); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator::iterator&&>); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); + +struct S {}; +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_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,164 @@ +//===----------------------------------------------------------------------===// +// +// 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 __iterator_traits_detail::__cpp17_input_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iterator_traits_cpp17_iterators.h" + +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +#endif + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator > >); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator> >); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_input_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_input_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::local_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_input_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator::iterator volatile>); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator::iterator&>); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator::iterator&&>); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); + +struct S {}; +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_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,161 @@ +//===----------------------------------------------------------------------===// +// +// 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 __iterator_traits_detail::__cpp17_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iterator_traits_cpp17_iterators.h" + +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); + +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +#endif + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator > >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator > >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator > >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator> >); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_local_iterator>); + +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::local_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator::iterator volatile>); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator::iterator&>); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator::iterator&&>); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); + +struct S {}; +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_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,184 @@ +//===----------------------------------------------------------------------===// +// +// 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 __iterator_traits_detail::__cpp17_random_access_iterator; + +#include + +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iterator_traits_cpp17_iterators.h" + +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert( + std::__iterator_traits_detail::__cpp17_random_access_iterator); + +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert( + std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator); +#endif + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); + +// +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator > >); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator > >); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator > >); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator> >); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); + +// +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_local_iterator>); + +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::local_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator< + std::unordered_multimap::const_local_iterator>); + +// +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_local_iterator>); + +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::local_iterator>); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator::const_local_iterator>); + +// +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::const_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::reverse_iterator>); +static_assert(std::__iterator_traits_detail::__cpp17_random_access_iterator::const_reverse_iterator>); + +// Not iterators +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator volatile>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator&>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator::iterator&&>); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); + +struct S {}; +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_random_access_iterator); +static_assert(!std::__iterator_traits_detail::__cpp17_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,53 @@ +//===----------------------------------------------------------------------===// +// +// 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::__iterator_traits_detail::__cpp17_iterator >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator >); +static_assert(std::__iterator_traits_detail::__cpp17_iterator >); + +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator >); +static_assert(std::__iterator_traits_detail::__cpp17_input_iterator >); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator >); +static_assert(!std::__iterator_traits_detail::__cpp17_input_iterator >); + +// This is because the legacy iterator concepts don't care about iterator_category +static_assert(std::__iterator_traits_detail::__cpp17_forward_iterator >); + +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator >); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator >); +static_assert(!std::__iterator_traits_detail::__cpp17_forward_iterator >); + +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_bidirectional_iterator >); + +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_random_access_iterator >); +static_assert( + !std::__iterator_traits_detail::__cpp17_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&>);