Files
clang-p2996/libcxx/test/std/containers/sequences/vector/access.pass.cpp
Advenam Tacet e3dd9f7e66 [libc++] Safe allocator tests
This revision adds:
- New test allocator, which cleans memory during allocation and deallocation,
- tests using that allocator to vector.

This patch is part of our efforts to add support for ASan annotations with every
allocator.

This commit adds a new allocator for testing purposes only. The safe allocator
ensures that memory is cleand (zeroed) during allocation and deallocation, and
is intendted to test ASan annotations for every allocator in std::vector.
Check: D136765

Those tests should work correctly, even if support for every allocator in std::vector
is not yet available.

Support in ASan API was added here: rGdd1b7b797a116eed588fd752fbe61d34deeb24e4

Reviewed By: philnik, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D145597
2023-03-09 13:21:38 +01:00

131 lines
3.6 KiB
C++

//===----------------------------------------------------------------------===//
//
// 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 <stdexcept>
#include "min_allocator.h"
#include "test_macros.h"
template <class C>
TEST_CONSTEXPR_CXX20 C make(int size, int start) {
C c;
for (int i = 0; i < size; ++i)
c.push_back(start + i);
return c;
}
template <class Vector>
TEST_CONSTEXPR_CXX20 void test_get_basic(Vector& c, int start_value) {
const int n = static_cast<int>(c.size());
for (int i = 0; i < n; ++i)
assert(c[i] == start_value + i);
for (int i = 0; i < n; ++i)
assert(c.at(i) == start_value + i);
#ifndef TEST_HAS_NO_EXCEPTIONS
if (!TEST_IS_CONSTANT_EVALUATED) {
try {
TEST_IGNORE_NODISCARD c.at(n);
assert(false);
} catch (const std::out_of_range&) {}
}
#endif
assert(c.front() == start_value);
assert(c.back() == start_value + n - 1);
}
template <class Vector>
TEST_CONSTEXPR_CXX20 void test_get() {
int start_value = 35;
Vector c = make<Vector>(10, start_value);
const Vector& cc = c;
test_get_basic(c, start_value);
test_get_basic(cc, start_value);
}
template <class Vector>
TEST_CONSTEXPR_CXX20 void test_set() {
int start_value = 35;
const int n = 10;
Vector c = make<Vector>(n, start_value);
for (int i = 0; i < n; ++i) {
assert(c[i] == start_value + i);
c[i] = start_value + i + 1;
assert(c[i] == start_value + i + 1);
}
for (int i = 0; i < n; ++i) {
assert(c.at(i) == start_value + i + 1);
c.at(i) = start_value + i + 2;
assert(c.at(i) == start_value + i + 2);
}
assert(c.front() == start_value + 2);
c.front() = start_value + 3;
assert(c.front() == start_value + 3);
assert(c.back() == start_value + n + 1);
c.back() = start_value + n + 2;
assert(c.back() == start_value + n + 2);
}
template <class Vector>
TEST_CONSTEXPR_CXX20 void test() {
test_get<Vector>();
test_set<Vector>();
Vector c;
const Vector& cc = c;
ASSERT_SAME_TYPE(typename Vector::reference, decltype(c[0]));
ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc[0]));
ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.at(0)));
ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.at(0)));
ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.front()));
ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.front()));
ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.back()));
ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.back()));
}
TEST_CONSTEXPR_CXX20 bool tests() {
test<std::vector<int> >();
#if TEST_STD_VER >= 11
test<std::vector<int, min_allocator<int> > >();
test<std::vector<int, safe_allocator<int> > >();
#endif
return true;
}
int main(int, char**) {
tests();
#if TEST_STD_VER > 17
static_assert(tests());
#endif
return 0;
}