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 // <iterator>
10 
11 //   All of these became constexpr in C++17
12 //
13 // template <InputIterator Iter>
14 //   constexpr void advance(Iter& i, Iter::difference_type n);
15 //
16 // template <BidirectionalIterator Iter>
17 //   constexpr void advance(Iter& i, Iter::difference_type n);
18 //
19 // template <RandomAccessIterator Iter>
20 //   constexpr void advance(Iter& i, Iter::difference_type n);
21 
22 #include <iterator>
23 #include <cassert>
24 
25 #include "test_iterators.h"
26 
27 template <class It>
28 void
29 test(It i, typename std::iterator_traits<It>::difference_type n, It x)
30 {
31     std::advance(i, n);
32     assert(i == x);
33 }
34 
35 #if TEST_STD_VER > 14
36 template <class It>
37 constexpr bool
38 constepxr_test(It i, typename std::iterator_traits<It>::difference_type n, It x)
39 {
40     std::advance(i, n);
41     return i == x;
42 }
43 #endif
44 
45 int main(int, char**)
46 {
47     {
48     const char* s = "1234567890";
49     test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10));
50     test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
51     test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
52     test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
53     test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
54     test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
55     test(s+5, 5, s+10);
56     test(s+5, -5, s);
57     }
58 #if TEST_STD_VER > 14
59     {
60     constexpr const char* s = "1234567890";
61     static_assert( constepxr_test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)), "" );
62     static_assert( constepxr_test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)), "" );
63     static_assert( constepxr_test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)), "" );
64     static_assert( constepxr_test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)), "" );
65     static_assert( constepxr_test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)), "" );
66     static_assert( constepxr_test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)), "" );
67     static_assert( constepxr_test(s+5, 5, s+10), "" );
68     static_assert( constepxr_test(s+5, -5, s), "" );
69     }
70 #endif
71 
72   return 0;
73 }
74