1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // XFAIL: availability-filesystem-missing
11 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
13 // Make sure the various containers' iterators are not broken by the use of `std::rel_ops`.
15 #include <utility> // for std::rel_ops
20 #include <forward_list>
25 #include <unordered_map>
26 #include <unordered_set>
29 #include "test_macros.h"
31 #if TEST_STD_VER >= 17
32 #include <string_view>
35 #if TEST_STD_VER >= 20
39 using namespace std::rel_ops
;
41 template<class It
, class ConstIt
>
42 void test_eq(It it
, ConstIt cit
) {
53 template<class It
, class ConstIt
>
54 void test_lt(It it
, ConstIt cit
) {
72 // Test subtraction too, even though std::rel_ops shouldn't affect it.
80 template<class Container
>
82 // There is no need to distinguish "forward" from "bidirectional."
83 // libc++ already can't handle `c.rbegin() >= c.rbegin()` in the
84 // presence of std::rel_ops, and neither can Microsoft nor libstdc++.
87 typename
Container::iterator it
= c
.begin();
88 typename
Container::const_iterator cit
= c
.begin();
92 template<class Container
>
93 void test_random_access() {
95 typename
Container::iterator it
= c
.begin();
96 typename
Container::const_iterator cit
= c
.begin();
101 template void test_random_access
<std::array
<int, 10> >();
102 template void test_random_access
<std::deque
<int> >();
103 template void test_forward
<std::forward_list
<int> >();
104 template void test_forward
<std::list
<int> >();
105 template void test_forward
<std::map
<int, int> >();
106 template void test_forward
<std::multimap
<int, int> >();
107 template void test_forward
<std::multiset
<int> >();
108 template void test_forward
<std::set
<int> >();
109 template void test_random_access
<std::string
>();
110 template void test_forward
<std::unordered_map
<int, int> >();
111 template void test_forward
<std::unordered_multimap
<int, int> >();
112 template void test_forward
<std::unordered_multiset
<int> >();
113 template void test_forward
<std::unordered_set
<int> >();
114 template void test_random_access
<std::vector
<int> >();
116 #if TEST_STD_VER >= 17
117 void test_directory_iterators() {
118 #ifndef TEST_HAS_NO_FILESYSTEM
119 std::filesystem::directory_iterator it
;
122 std::filesystem::recursive_directory_iterator rdit
;
127 template void test_forward
<std::filesystem::path
>();
130 #if TEST_STD_VER >= 17
131 template void test_random_access
<std::string_view
>();
134 #if TEST_STD_VER >= 20
137 std::span
<int>::iterator it
= c
.begin(); // span has no const_iterator