diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2019-03-15 00:29:35 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2019-03-15 00:29:35 +0000 |
| commit | 5bcca9ffd167a50dafa2c3958b36e498ee71ad68 (patch) | |
| tree | acd2ea0df1089cbfada6511793b6280ce95c031f /libcxx/test | |
| parent | f2192b204ff49561cc73fe06a76216f3cab39d84 (diff) | |
| download | bcm5719-llvm-5bcca9ffd167a50dafa2c3958b36e498ee71ad68.tar.gz bcm5719-llvm-5bcca9ffd167a50dafa2c3958b36e498ee71ad68.zip | |
Mark vector::operator[] and front/back as noexcept. We already do this for string and string_view. This should give better codegen inside of noexcept functions. Add tests for op[]/front/back/at, because apparently we had none.
llvm-svn: 356224
Diffstat (limited to 'libcxx/test')
| -rw-r--r-- | libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp | 1 | ||||
| -rw-r--r-- | libcxx/test/std/containers/sequences/vector/access.pass.cpp | 121 |
2 files changed, 122 insertions, 0 deletions
diff --git a/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp index 2de4c023f1e..d34c864ba99 100644 --- a/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp +++ b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +// XFAIL: * // UNSUPPORTED: c++98, c++03, c++11, c++14 // UNSUPPORTED: libcpp-no-exceptions, libcpp-no-if-constexpr // MODULES_DEFINES: _LIBCPP_DEBUG=1 diff --git a/libcxx/test/std/containers/sequences/vector/access.pass.cpp b/libcxx/test/std/containers/sequences/vector/access.pass.cpp new file mode 100644 index 00000000000..4ac19ff7189 --- /dev/null +++ b/libcxx/test/std/containers/sequences/vector/access.pass.cpp @@ -0,0 +1,121 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// <vector> + +// reference operator[](size_type __i); +// const_reference operator[](size_type __i) const; +// +// reference at(size_type __i); +// const_reference at(size_type __i) const; +// +// reference front(); +// const_reference front() const; +// +// reference back(); +// const_reference back() const; +// libc++ marks these as 'noexcept' (except 'at') + +#include <vector> +#include <cassert> + +#include "min_allocator.h" +#include "test_macros.h" + +template <class C> +C +make(int size, int start = 0) +{ + C c; + for (int i = 0; i < size; ++i) + c.push_back(start + i); + return c; +} + +int main(int, char**) +{ + { + typedef std::vector<int> C; + C c = make<C>(10); + LIBCPP_ASSERT_NOEXCEPT(c[0]); + LIBCPP_ASSERT_NOEXCEPT(c.front()); + LIBCPP_ASSERT_NOEXCEPT(c.back()); + // at() is NOT noexcept + ASSERT_SAME_TYPE(C::reference, decltype(c[0])); + ASSERT_SAME_TYPE(C::reference, decltype(c.at(0))); + ASSERT_SAME_TYPE(C::reference, decltype(c.front())); + ASSERT_SAME_TYPE(C::reference, decltype(c.back())); + for (int i = 0; i < 10; ++i) + assert(c[i] == i); + for (int i = 0; i < 10; ++i) + assert(c.at(i) == i); + assert(c.front() == 0); + assert(c.back() == 9); + } + { + typedef std::vector<int> C; + const int N = 5; + const C c = make<C>(10, N); + LIBCPP_ASSERT_NOEXCEPT(c[0]); + LIBCPP_ASSERT_NOEXCEPT(c.front()); + LIBCPP_ASSERT_NOEXCEPT(c.back()); + // at() is NOT noexcept + ASSERT_SAME_TYPE(C::const_reference, decltype(c[0])); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.at(0))); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.front())); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.back())); + for (int i = 0; i < 10; ++i) + assert(c[i] == N + i); + for (int i = 0; i < 10; ++i) + assert(c.at(i) == N + i); + assert(c.front() == N); + assert(c.back() == N + 9); + } +#if TEST_STD_VER >= 11 + { + typedef std::vector<int, min_allocator<int>> C; + const int N = 34; + C c = make<C>(10, N); + LIBCPP_ASSERT_NOEXCEPT(c[0]); + LIBCPP_ASSERT_NOEXCEPT(c.front()); + LIBCPP_ASSERT_NOEXCEPT(c.back()); + // at() is NOT noexcept + ASSERT_SAME_TYPE(C::reference, decltype(c[0])); + ASSERT_SAME_TYPE(C::reference, decltype(c.at(0))); + ASSERT_SAME_TYPE(C::reference, decltype(c.front())); + ASSERT_SAME_TYPE(C::reference, decltype(c.back())); + for (int i = 0; i < 10; ++i) + assert(c[i] == N + i); + for (int i = 0; i < 10; ++i) + assert(c.at(i) == N + i); + assert(c.front() == N); + assert(c.back() == N + 9); + } + { + typedef std::vector<int, min_allocator<int>> C; + const int N = 23; + const C c = make<C>(10, N); + LIBCPP_ASSERT_NOEXCEPT(c[0]); + LIBCPP_ASSERT_NOEXCEPT(c.front()); + LIBCPP_ASSERT_NOEXCEPT(c.back()); + // at() is NOT noexcept + ASSERT_SAME_TYPE(C::const_reference, decltype(c[0])); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.at(0))); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.front())); + ASSERT_SAME_TYPE(C::const_reference, decltype(c.back())); + for (int i = 0; i < 10; ++i) + assert(c[i] == N + i); + for (int i = 0; i < 10; ++i) + assert(c.at(i) == N + i); + assert(c.front() == N); + assert(c.back() == N + 9); + } +#endif + + return 0; +} |

