14118858bSArthur O'Dwyer //===----------------------------------------------------------------------===// 24118858bSArthur O'Dwyer // 34118858bSArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44118858bSArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information. 54118858bSArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64118858bSArthur O'Dwyer // 74118858bSArthur O'Dwyer //===----------------------------------------------------------------------===// 84118858bSArthur O'Dwyer 9f0fc8c48SLouis Dionne // XFAIL: availability-filesystem-missing 105024fe93SLouis Dionne 11*136737d9SMark de Wever // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS 12*136737d9SMark de Wever 134118858bSArthur O'Dwyer // Make sure the various containers' iterators are not broken by the use of `std::rel_ops`. 144118858bSArthur O'Dwyer 154118858bSArthur O'Dwyer #include <utility> // for std::rel_ops 164118858bSArthur O'Dwyer 174118858bSArthur O'Dwyer #include <array> 184118858bSArthur O'Dwyer #include <deque> 19c352fa74SLouis Dionne #include <filesystem> 204118858bSArthur O'Dwyer #include <forward_list> 214118858bSArthur O'Dwyer #include <list> 224118858bSArthur O'Dwyer #include <map> 234118858bSArthur O'Dwyer #include <set> 244118858bSArthur O'Dwyer #include <string> 254118858bSArthur O'Dwyer #include <unordered_map> 264118858bSArthur O'Dwyer #include <unordered_set> 274118858bSArthur O'Dwyer #include <vector> 284118858bSArthur O'Dwyer 294118858bSArthur O'Dwyer #include "test_macros.h" 304118858bSArthur O'Dwyer 314118858bSArthur O'Dwyer #if TEST_STD_VER >= 17 324118858bSArthur O'Dwyer #include <string_view> 334118858bSArthur O'Dwyer #endif 344118858bSArthur O'Dwyer 354118858bSArthur O'Dwyer #if TEST_STD_VER >= 20 364118858bSArthur O'Dwyer #include <span> 374118858bSArthur O'Dwyer #endif 384118858bSArthur O'Dwyer 394118858bSArthur O'Dwyer using namespace std::rel_ops; 404118858bSArthur O'Dwyer 414118858bSArthur O'Dwyer template<class It, class ConstIt> 424118858bSArthur O'Dwyer void test_eq(It it, ConstIt cit) { 434118858bSArthur O'Dwyer (void)(it == it); 444118858bSArthur O'Dwyer (void)(it != it); 454118858bSArthur O'Dwyer (void)(it == cit); 464118858bSArthur O'Dwyer (void)(it != cit); 474118858bSArthur O'Dwyer (void)(cit == it); 484118858bSArthur O'Dwyer (void)(cit != it); 494118858bSArthur O'Dwyer (void)(cit == cit); 504118858bSArthur O'Dwyer (void)(cit != cit); 514118858bSArthur O'Dwyer } 524118858bSArthur O'Dwyer 534118858bSArthur O'Dwyer template<class It, class ConstIt> 544118858bSArthur O'Dwyer void test_lt(It it, ConstIt cit) { 554118858bSArthur O'Dwyer (void)(it < it); 564118858bSArthur O'Dwyer (void)(it <= it); 574118858bSArthur O'Dwyer (void)(it > it); 584118858bSArthur O'Dwyer (void)(it >= it); 594118858bSArthur O'Dwyer (void)(it < cit); 604118858bSArthur O'Dwyer (void)(it <= cit); 614118858bSArthur O'Dwyer (void)(it > cit); 624118858bSArthur O'Dwyer (void)(it >= cit); 634118858bSArthur O'Dwyer (void)(cit < it); 644118858bSArthur O'Dwyer (void)(cit <= it); 654118858bSArthur O'Dwyer (void)(cit > it); 664118858bSArthur O'Dwyer (void)(cit >= it); 674118858bSArthur O'Dwyer (void)(cit < cit); 684118858bSArthur O'Dwyer (void)(cit <= cit); 694118858bSArthur O'Dwyer (void)(cit > cit); 704118858bSArthur O'Dwyer (void)(cit >= cit); 714118858bSArthur O'Dwyer 724118858bSArthur O'Dwyer // Test subtraction too, even though std::rel_ops shouldn't affect it. 734118858bSArthur O'Dwyer 744118858bSArthur O'Dwyer (void)(it - it); 754118858bSArthur O'Dwyer (void)(it - cit); 764118858bSArthur O'Dwyer (void)(cit - it); 774118858bSArthur O'Dwyer (void)(cit - cit); 784118858bSArthur O'Dwyer } 794118858bSArthur O'Dwyer 804118858bSArthur O'Dwyer template<class Container> 814118858bSArthur O'Dwyer void test_forward() { 824118858bSArthur O'Dwyer // There is no need to distinguish "forward" from "bidirectional." 834118858bSArthur O'Dwyer // libc++ already can't handle `c.rbegin() >= c.rbegin()` in the 844118858bSArthur O'Dwyer // presence of std::rel_ops, and neither can Microsoft nor libstdc++. 854118858bSArthur O'Dwyer 864118858bSArthur O'Dwyer Container c; 874118858bSArthur O'Dwyer typename Container::iterator it = c.begin(); 884118858bSArthur O'Dwyer typename Container::const_iterator cit = c.begin(); 894118858bSArthur O'Dwyer test_eq(it, cit); 904118858bSArthur O'Dwyer } 914118858bSArthur O'Dwyer 924118858bSArthur O'Dwyer template<class Container> 934118858bSArthur O'Dwyer void test_random_access() { 944118858bSArthur O'Dwyer Container c; 954118858bSArthur O'Dwyer typename Container::iterator it = c.begin(); 964118858bSArthur O'Dwyer typename Container::const_iterator cit = c.begin(); 974118858bSArthur O'Dwyer test_eq(it, cit); 984118858bSArthur O'Dwyer test_lt(it, cit); 994118858bSArthur O'Dwyer } 1004118858bSArthur O'Dwyer 1014118858bSArthur O'Dwyer template void test_random_access<std::array<int, 10> >(); 1024118858bSArthur O'Dwyer template void test_random_access<std::deque<int> >(); 1034118858bSArthur O'Dwyer template void test_forward<std::forward_list<int> >(); 1044118858bSArthur O'Dwyer template void test_forward<std::list<int> >(); 1054118858bSArthur O'Dwyer template void test_forward<std::map<int, int> >(); 1064118858bSArthur O'Dwyer template void test_forward<std::multimap<int, int> >(); 1074118858bSArthur O'Dwyer template void test_forward<std::multiset<int> >(); 1084118858bSArthur O'Dwyer template void test_forward<std::set<int> >(); 1094118858bSArthur O'Dwyer template void test_random_access<std::string>(); 1104118858bSArthur O'Dwyer template void test_forward<std::unordered_map<int, int> >(); 1114118858bSArthur O'Dwyer template void test_forward<std::unordered_multimap<int, int> >(); 1124118858bSArthur O'Dwyer template void test_forward<std::unordered_multiset<int> >(); 1134118858bSArthur O'Dwyer template void test_forward<std::unordered_set<int> >(); 1144118858bSArthur O'Dwyer template void test_random_access<std::vector<int> >(); 1154118858bSArthur O'Dwyer 116c352fa74SLouis Dionne #if TEST_STD_VER >= 17 1174118858bSArthur O'Dwyer void test_directory_iterators() { 118c352fa74SLouis Dionne #ifndef TEST_HAS_NO_FILESYSTEM 119c352fa74SLouis Dionne std::filesystem::directory_iterator it; 1204118858bSArthur O'Dwyer test_eq(it, it); 1214118858bSArthur O'Dwyer 122c352fa74SLouis Dionne std::filesystem::recursive_directory_iterator rdit; 1234118858bSArthur O'Dwyer test_eq(rdit, rdit); 124c352fa74SLouis Dionne #endif 1254118858bSArthur O'Dwyer } 1264118858bSArthur O'Dwyer 127c352fa74SLouis Dionne template void test_forward<std::filesystem::path>(); 1284118858bSArthur O'Dwyer #endif 1294118858bSArthur O'Dwyer 1304118858bSArthur O'Dwyer #if TEST_STD_VER >= 17 1314118858bSArthur O'Dwyer template void test_random_access<std::string_view>(); 1324118858bSArthur O'Dwyer #endif 1334118858bSArthur O'Dwyer 1344118858bSArthur O'Dwyer #if TEST_STD_VER >= 20 1354118858bSArthur O'Dwyer void test_span() { 1364118858bSArthur O'Dwyer std::span<int> c; 1374118858bSArthur O'Dwyer std::span<int>::iterator it = c.begin(); // span has no const_iterator 1384118858bSArthur O'Dwyer test_eq(it, it); 1394118858bSArthur O'Dwyer test_lt(it, it); 1404118858bSArthur O'Dwyer } 1414118858bSArthur O'Dwyer #endif 142