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