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