brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · ce5b425 Raw
117 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// <vector>10 11// vector(const vector& v);12 13#include <vector>14#include <cassert>15 16#include "test_macros.h"17#include "test_allocator.h"18#include "min_allocator.h"19#include "asan_testing.h"20 21template <class C>22TEST_CONSTEXPR_CXX20 void test(const C& x) {23  typename C::size_type s = x.size();24  C c(x);25  LIBCPP_ASSERT(c.__invariants());26  assert(c.size() == s);27  assert(c == x);28  LIBCPP_ASSERT(is_contiguous_container_asan_correct(c));29}30 31TEST_CONSTEXPR_CXX20 bool tests() {32  {33    int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};34    int* an = a + sizeof(a) / sizeof(a[0]);35    test(std::vector<int>(a, an));36  }37  {38    std::vector<int, test_allocator<int> > v(3, 2, test_allocator<int>(5));39    std::vector<int, test_allocator<int> > v2 = v;40    assert(is_contiguous_container_asan_correct(v));41    assert(is_contiguous_container_asan_correct(v2));42    assert(v2 == v);43    assert(v2.get_allocator() == v.get_allocator());44    assert(is_contiguous_container_asan_correct(v));45    assert(is_contiguous_container_asan_correct(v2));46  }47  {48    // Test copy ctor with empty source49    std::vector<int, test_allocator<int> > v(test_allocator<int>(5));50    std::vector<int, test_allocator<int> > v2 = v;51    assert(is_contiguous_container_asan_correct(v));52    assert(is_contiguous_container_asan_correct(v2));53    assert(v2 == v);54    assert(v2.get_allocator() == v.get_allocator());55    assert(is_contiguous_container_asan_correct(v));56    assert(is_contiguous_container_asan_correct(v2));57    assert(v2.empty());58  }59#if TEST_STD_VER >= 1160  {61    std::vector<int, other_allocator<int> > v(3, 2, other_allocator<int>(5));62    std::vector<int, other_allocator<int> > v2 = v;63    assert(is_contiguous_container_asan_correct(v));64    assert(is_contiguous_container_asan_correct(v2));65    assert(v2 == v);66    assert(v2.get_allocator() == other_allocator<int>(-2));67    assert(is_contiguous_container_asan_correct(v));68    assert(is_contiguous_container_asan_correct(v2));69  }70  {71    int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};72    int* an = a + sizeof(a) / sizeof(a[0]);73    test(std::vector<int, min_allocator<int>>(a, an));74    test(std::vector<int, safe_allocator<int>>(a, an));75  }76  {77    std::vector<int, min_allocator<int> > v(3, 2, min_allocator<int>());78    std::vector<int, min_allocator<int> > v2 = v;79    assert(is_contiguous_container_asan_correct(v));80    assert(is_contiguous_container_asan_correct(v2));81    assert(v2 == v);82    assert(v2.get_allocator() == v.get_allocator());83    assert(is_contiguous_container_asan_correct(v));84    assert(is_contiguous_container_asan_correct(v2));85  }86  {87    std::vector<int, safe_allocator<int> > v(3, 2, safe_allocator<int>());88    std::vector<int, safe_allocator<int> > v2 = v;89    assert(is_contiguous_container_asan_correct(v));90    assert(is_contiguous_container_asan_correct(v2));91    assert(v2 == v);92    assert(v2.get_allocator() == v.get_allocator());93    assert(is_contiguous_container_asan_correct(v));94    assert(is_contiguous_container_asan_correct(v2));95  }96#endif97 98  return true;99}100 101void test_copy_from_volatile_src() {102  volatile int src[] = {1, 2, 3};103  std::vector<int> v(src, src + 3);104  assert(v[0] == 1);105  assert(v[1] == 2);106  assert(v[2] == 3);107}108 109int main(int, char**) {110  tests();111#if TEST_STD_VER > 17112  static_assert(tests());113#endif114  test_copy_from_volatile_src();115  return 0;116}117