1 // { dg-options "-std=gnu++20" }
2 // { dg-do compile { target c++20 } }
3 // { dg-xfail-if "not supported" { debug_mode } }
4
5 #include <vector>
6 #include <testsuite_hooks.h>
7
8 constexpr bool
test_iterators()9 test_iterators()
10 {
11 std::vector<bool> v;
12 VERIFY( v.begin() == v.end() );
13 v.reserve(1);
14 VERIFY( v.begin() == v.end() );
15 v.resize(2);
16 VERIFY( v.begin() != v.end() );
17 VERIFY( v.cbegin() == v.begin() );
18 VERIFY( v.crbegin() == v.rbegin() );
19 VERIFY( v.cend() == v.end() );
20 VERIFY( v.crend() == v.rend() );
21
22 auto it = v.begin();
23 VERIFY( *it == v.front() );
24 VERIFY( it++ == v.begin() );
25 VERIFY( ++it == v.end() );
26 VERIFY( (it - 2) == v.begin() );
27 it -= 2;
28 it += 1;
29 VERIFY( (it + 1) == v.end() );
30
31 auto rit = v.rbegin();
32 VERIFY( *rit == v.back() );
33 VERIFY( rit++ == v.rbegin() );
34 VERIFY( ++rit == v.rend() );
35 VERIFY( (rit - 2) == v.rbegin() );
36 rit -= 2;
37 rit += 1;
38 VERIFY( (rit + 1) == v.rend() );
39
40 return true;
41 }
42
43 static_assert(test_iterators());
44
45 constexpr bool
test_access()46 test_access()
47 {
48 std::vector<bool> v{1, 1, 0, 0, 1, 0, 1, 0, 1};
49 std::vector<bool>::reference r1 = v.at(1);
50 VERIFY( r1 );
51 std::vector<bool>::reference r2 = v[2];
52 VERIFY( ! r2 );
53 r1 = r2;
54 VERIFY( ! r1 );
55 VERIFY( ! v[1] );
56 r2 = true;
57 VERIFY( r2 );
58 VERIFY( v[2] );
59
60 const auto& vc = v;
61 VERIFY( vc.at(1) == false );
62 VERIFY( vc.at(1) == v.at(1) );
63 VERIFY( vc.at(1) == vc[1] );
64 VERIFY( vc.front() == vc[0] );
65 VERIFY( vc.back() == vc[2] );
66
67 return true;
68 }
69
70 static_assert(test_access());
71
72 template<typename T = bool>
73 constexpr std::false_type
access_empty()74 access_empty() { return {}; }
75
76 template<typename T = bool>
77 requires (std::bool_constant<(std::vector<T>().at(0), true)>::value)
78 constexpr std::true_type
access_empty()79 access_empty() { return {}; }
80
81 template<typename T = bool>
82 requires (std::bool_constant<(std::vector<T>().back(), true)>::value)
83 constexpr std::true_type
access_empty()84 access_empty() { return {}; }
85
86 static_assert( ! access_empty() );
87
88 template<typename T = bool>
89 constexpr std::false_type
access_empty_front()90 access_empty_front() { return {}; }
91
92 template<typename T = bool>
93 requires (std::bool_constant<(std::vector<T>()[0], true)>::value)
94 constexpr std::true_type
access_empty_front()95 access_empty_front() { return {}; }
96
97 template<typename T = bool>
98 requires (std::bool_constant<(std::vector<T>().front(), true)>::value)
99 constexpr std::true_type
access_empty_front()100 access_empty_front() { return {}; }
101
102 static_assert( ! access_empty_front() ); // { dg-error "ambiguous" "PR 103191" { target { ! debug_mode } } }
103