brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 985d8ad Raw
100 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// UNSUPPORTED: c++0310 11// <deque>12 13// deque(deque&& c, const allocator_type& a);14 15#include "asan_testing.h"16#include <deque>17#include <cassert>18 19#include "test_macros.h"20#include "MoveOnly.h"21#include "test_allocator.h"22#include "min_allocator.h"23 24int main(int, char**) {25  {26    int ab[]      = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};27    const int* an = ab + sizeof(ab) / sizeof(ab[0]);28    typedef test_allocator<MoveOnly> A;29    std::deque<MoveOnly, A> c1(A(1));30    for (int* p = ab; p < an; ++p)31      c1.push_back(MoveOnly(*p));32    std::deque<MoveOnly, A> c2(A(1));33    for (int* p = ab; p < an; ++p)34      c2.push_back(MoveOnly(*p));35    std::deque<MoveOnly, A> c3(std::move(c1), A(3)); // unequal allocator36    assert(c2 == c3);37    assert(c3.get_allocator() == A(3));38    LIBCPP_ASSERT(c1.size() != 0);39    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));40    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));41    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));42  }43  {44    int ab[]      = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};45    const int* an = ab + sizeof(ab) / sizeof(ab[0]);46    typedef test_allocator<MoveOnly> A;47    std::deque<MoveOnly, A> c1(A(1));48    for (int* p = ab; p < an; ++p)49      c1.push_back(MoveOnly(*p));50    std::deque<MoveOnly, A> c2(A(1));51    for (int* p = ab; p < an; ++p)52      c2.push_back(MoveOnly(*p));53    std::deque<MoveOnly, A> c3(std::move(c1), A(1)); // equal allocator54    assert(c2 == c3);55    assert(c3.get_allocator() == A(1));56    LIBCPP_ASSERT(c1.size() == 0);57    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));58    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));59    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));60  }61  {62    int ab[]      = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};63    const int* an = ab + sizeof(ab) / sizeof(ab[0]);64    typedef other_allocator<MoveOnly> A;65    std::deque<MoveOnly, A> c1(A(1));66    for (int* p = ab; p < an; ++p)67      c1.push_back(MoveOnly(*p));68    std::deque<MoveOnly, A> c2(A(1));69    for (int* p = ab; p < an; ++p)70      c2.push_back(MoveOnly(*p));71    std::deque<MoveOnly, A> c3(std::move(c1), A(3)); // unequal allocator72    assert(c2 == c3);73    assert(c3.get_allocator() == A(3));74    LIBCPP_ASSERT(c1.size() != 0);75    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));76    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));77    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));78  }79  {80    int ab[]      = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};81    const int* an = ab + sizeof(ab) / sizeof(ab[0]);82    typedef min_allocator<MoveOnly> A;83    std::deque<MoveOnly, A> c1(A{});84    for (int* p = ab; p < an; ++p)85      c1.push_back(MoveOnly(*p));86    std::deque<MoveOnly, A> c2(A{});87    for (int* p = ab; p < an; ++p)88      c2.push_back(MoveOnly(*p));89    std::deque<MoveOnly, A> c3(std::move(c1), A()); // equal allocator90    assert(c2 == c3);91    assert(c3.get_allocator() == A());92    LIBCPP_ASSERT(c1.size() == 0);93    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));94    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));95    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));96  }97 98  return 0;99}100