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
131 lines
3.6 KiB
C++
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;
|
|
}
|