1 //===----------------------------------------------------------------------===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 11 // <iterator> 12 // 13 // reverse_iterator 14 // 15 // pointer operator->() const; 16 17 #include <iterator> 18 19 #include <type_traits> 20 #include "test_iterators.h" 21 22 template <class T> 23 concept HasArrow = requires(T t) { t.operator->(); }; 24 25 struct simple_bidirectional_iterator { 26 using iterator_category = std::bidirectional_iterator_tag; 27 using value_type = int; 28 using difference_type = int; 29 using pointer = int*; 30 using reference = int&; 31 32 reference operator*() const; 33 pointer operator->() const; 34 35 simple_bidirectional_iterator& operator++(); 36 simple_bidirectional_iterator& operator--(); 37 simple_bidirectional_iterator operator++(int); 38 simple_bidirectional_iterator operator--(int); 39 40 friend bool operator==(const simple_bidirectional_iterator&, const simple_bidirectional_iterator&); 41 }; 42 static_assert( std::bidirectional_iterator<simple_bidirectional_iterator>); 43 static_assert(!std::random_access_iterator<simple_bidirectional_iterator>); 44 45 using PtrRI = std::reverse_iterator<int*>; 46 static_assert( HasArrow<PtrRI>); 47 48 using PtrLikeRI = std::reverse_iterator<simple_bidirectional_iterator>; 49 static_assert( HasArrow<PtrLikeRI>); 50 51 // `bidirectional_iterator` from `test_iterators.h` doesn't define `operator->`. 52 using NonPtrRI = std::reverse_iterator<bidirectional_iterator<int*>>; 53 static_assert(!HasArrow<NonPtrRI>); 54