223 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <array>10 11// iterator begin() noexcept; // constexpr in C++1712// const_iterator begin() const noexcept; // constexpr in C++1713// iterator end() noexcept; // constexpr in C++1714// const_iterator end() const noexcept; // constexpr in C++1715//16// reverse_iterator rbegin() noexcept; // constexpr in C++1717// const_reverse_iterator rbegin() const noexcept; // constexpr in C++1718// reverse_iterator rend() noexcept; // constexpr in C++1719// const_reverse_iterator rend() const noexcept; // constexpr in C++1720//21// const_iterator cbegin() const noexcept; // constexpr in C++1722// const_iterator cend() const noexcept; // constexpr in C++1723// const_reverse_iterator crbegin() const noexcept; // constexpr in C++1724// const_reverse_iterator crend() const noexcept; // constexpr in C++1725 26#include <array>27#include <iterator>28#include <cassert>29 30#include "test_macros.h"31 32struct NoDefault {33 TEST_CONSTEXPR NoDefault(int) {}34};35 36template <class T>37TEST_CONSTEXPR_CXX17 void check_noexcept(T& c) {38 ASSERT_NOEXCEPT(c.begin());39 ASSERT_NOEXCEPT(c.end());40 ASSERT_NOEXCEPT(c.cbegin());41 ASSERT_NOEXCEPT(c.cend());42 ASSERT_NOEXCEPT(c.rbegin());43 ASSERT_NOEXCEPT(c.rend());44 ASSERT_NOEXCEPT(c.crbegin());45 ASSERT_NOEXCEPT(c.crend());46 47 const T& cc = c;48 (void)cc;49 ASSERT_NOEXCEPT(cc.begin());50 ASSERT_NOEXCEPT(cc.end());51 ASSERT_NOEXCEPT(cc.rbegin());52 ASSERT_NOEXCEPT(cc.rend());53}54 55TEST_CONSTEXPR_CXX17 bool tests() {56 {57 typedef std::array<int, 5> C;58 C array = {};59 check_noexcept(array);60 typename C::iterator i = array.begin();61 typename C::const_iterator j = array.cbegin();62 assert(i == j);63 }64 {65 typedef std::array<int, 0> C;66 C array = {};67 check_noexcept(array);68 typename C::iterator i = array.begin();69 typename C::const_iterator j = array.cbegin();70 assert(i == j);71 }72 73 {74 typedef std::array<int, 0> C;75 C array = {};76 check_noexcept(array);77 typename C::iterator i = array.begin();78 typename C::const_iterator j = array.cbegin();79 assert(i == array.end());80 assert(j == array.cend());81 }82 {83 typedef std::array<int, 1> C;84 C array = {1};85 check_noexcept(array);86 typename C::iterator i = array.begin();87 assert(*i == 1);88 assert(&*i == array.data());89 *i = 99;90 assert(array[0] == 99);91 }92 {93 typedef std::array<int, 2> C;94 C array = {1, 2};95 check_noexcept(array);96 typename C::iterator i = array.begin();97 assert(*i == 1);98 assert(&*i == array.data());99 *i = 99;100 assert(array[0] == 99);101 assert(array[1] == 2);102 }103 {104 typedef std::array<double, 3> C;105 C array = {1, 2, 3.5};106 check_noexcept(array);107 typename C::iterator i = array.begin();108 assert(*i == 1);109 assert(&*i == array.data());110 *i = 5.5;111 assert(array[0] == 5.5);112 assert(array[1] == 2.0);113 }114 {115 typedef std::array<NoDefault, 0> C;116 C array = {};117 typename C::iterator ib = array.begin();118 typename C::iterator ie = array.end();119 assert(ib == ie);120 }121 122#if TEST_STD_VER >= 14123 { // N3644 testing124 {125 typedef std::array<int, 5> C;126 C::iterator ii1{}, ii2{};127 C::iterator ii4 = ii1;128 C::const_iterator cii{};129 assert(ii1 == ii2);130 assert(ii1 == ii4);131 assert(ii1 == cii);132 133 assert(!(ii1 != ii2));134 assert(!(ii1 != cii));135 136 C c = {};137 check_noexcept(c);138 assert(c.begin() == std::begin(c));139 assert(c.cbegin() == std::cbegin(c));140 assert(c.rbegin() == std::rbegin(c));141 assert(c.crbegin() == std::crbegin(c));142 assert(c.end() == std::end(c));143 assert(c.cend() == std::cend(c));144 assert(c.rend() == std::rend(c));145 assert(c.crend() == std::crend(c));146 147 assert(std::begin(c) != std::end(c));148 assert(std::rbegin(c) != std::rend(c));149 assert(std::cbegin(c) != std::cend(c));150 assert(std::crbegin(c) != std::crend(c));151 152# if TEST_STD_VER >= 20153 // P1614 + LWG3352154 std::same_as<std::strong_ordering> decltype(auto) r1 = ii1 <=> ii2;155 assert(r1 == std::strong_ordering::equal);156 157 std::same_as<std::strong_ordering> decltype(auto) r2 = cii <=> ii2;158 assert(r2 == std::strong_ordering::equal);159# endif160 }161 {162 typedef std::array<int, 0> C;163 C::iterator ii1{}, ii2{};164 C::iterator ii4 = ii1;165 C::const_iterator cii{};166 assert(ii1 == ii2);167 assert(ii1 == ii4);168 169 assert(!(ii1 != ii2));170 171 assert((ii1 == cii));172 assert((cii == ii1));173 assert(!(ii1 != cii));174 assert(!(cii != ii1));175 assert(!(ii1 < cii));176 assert(!(cii < ii1));177 assert((ii1 <= cii));178 assert((cii <= ii1));179 assert(!(ii1 > cii));180 assert(!(cii > ii1));181 assert((ii1 >= cii));182 assert((cii >= ii1));183 assert(cii - ii1 == 0);184 assert(ii1 - cii == 0);185 186 C c = {};187 check_noexcept(c);188 assert(c.begin() == std::begin(c));189 assert(c.cbegin() == std::cbegin(c));190 assert(c.rbegin() == std::rbegin(c));191 assert(c.crbegin() == std::crbegin(c));192 assert(c.end() == std::end(c));193 assert(c.cend() == std::cend(c));194 assert(c.rend() == std::rend(c));195 assert(c.crend() == std::crend(c));196 197 assert(std::begin(c) == std::end(c));198 assert(std::rbegin(c) == std::rend(c));199 assert(std::cbegin(c) == std::cend(c));200 assert(std::crbegin(c) == std::crend(c));201 202# if TEST_STD_VER >= 20203 // P1614 + LWG3352204 std::same_as<std::strong_ordering> decltype(auto) r1 = ii1 <=> ii2;205 assert(r1 == std::strong_ordering::equal);206 207 std::same_as<std::strong_ordering> decltype(auto) r2 = cii <=> ii2;208 assert(r2 == std::strong_ordering::equal);209# endif210 }211 }212#endif213 return true;214}215 216int main(int, char**) {217 tests();218#if TEST_STD_VER >= 17219 static_assert(tests(), "");220#endif221 return 0;222}223