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