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
22template <class T>
23concept HasArrow = requires(T t) { t.operator->(); };
24
25struct 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};
42static_assert( std::bidirectional_iterator<simple_bidirectional_iterator>);
43static_assert(!std::random_access_iterator<simple_bidirectional_iterator>);
44
45using PtrRI = std::reverse_iterator<int*>;
46static_assert( HasArrow<PtrRI>);
47
48using PtrLikeRI = std::reverse_iterator<simple_bidirectional_iterator>;
49static_assert( HasArrow<PtrLikeRI>);
50
51// `bidirectional_iterator` from `test_iterators.h` doesn't define `operator->`.
52using NonPtrRI = std::reverse_iterator<bidirectional_iterator<int*>>;
53static_assert(!HasArrow<NonPtrRI>);
54

source code of libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.sfinae.compile.pass.cpp