brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 426dea0 Raw
104 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& operator=(deque&& c);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    int* an  = ab + sizeof(ab) / sizeof(ab[0]);28    typedef test_allocator<MoveOnly> A;29    std::deque<MoveOnly, A> c1(A(5));30    for (int* p = ab; p < an; ++p)31      c1.push_back(MoveOnly(*p));32    std::deque<MoveOnly, A> c2(A(5));33    for (int* p = ab; p < an; ++p)34      c2.push_back(MoveOnly(*p));35    std::deque<MoveOnly, A> c3(A(5));36    c3 = std::move(c1);37    assert(c2 == c3);38    assert(c1.size() == 0);39    assert(c3.get_allocator() == A(5));40    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));41    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));42    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));43  }44  {45    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};46    int* an  = ab + sizeof(ab) / sizeof(ab[0]);47    typedef test_allocator<MoveOnly> A;48    std::deque<MoveOnly, A> c1(A(5));49    for (int* p = ab; p < an; ++p)50      c1.push_back(MoveOnly(*p));51    std::deque<MoveOnly, A> c2(A(5));52    for (int* p = ab; p < an; ++p)53      c2.push_back(MoveOnly(*p));54    std::deque<MoveOnly, A> c3(A(6));55    c3 = std::move(c1);56    assert(c2 == c3);57    assert(c1.size() != 0);58    assert(c3.get_allocator() == A(6));59    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));60    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));61    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));62  }63  {64    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};65    int* an  = ab + sizeof(ab) / sizeof(ab[0]);66    typedef other_allocator<MoveOnly> A;67    std::deque<MoveOnly, A> c1(A(5));68    for (int* p = ab; p < an; ++p)69      c1.push_back(MoveOnly(*p));70    std::deque<MoveOnly, A> c2(A(5));71    for (int* p = ab; p < an; ++p)72      c2.push_back(MoveOnly(*p));73    std::deque<MoveOnly, A> c3(A(6));74    c3 = std::move(c1);75    assert(c2 == c3);76    assert(c1.size() == 0);77    assert(c3.get_allocator() == A(5));78    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));79    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));80    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));81  }82  {83    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};84    int* an  = ab + sizeof(ab) / sizeof(ab[0]);85    typedef min_allocator<MoveOnly> A;86    std::deque<MoveOnly, A> c1(A{});87    for (int* p = ab; p < an; ++p)88      c1.push_back(MoveOnly(*p));89    std::deque<MoveOnly, A> c2(A{});90    for (int* p = ab; p < an; ++p)91      c2.push_back(MoveOnly(*p));92    std::deque<MoveOnly, A> c3(A{});93    c3 = std::move(c1);94    assert(c2 == c3);95    assert(c1.size() == 0);96    assert(c3.get_allocator() == A());97    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));98    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));99    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));100  }101 102  return 0;103}104