77 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// <list>12 13// list(list&& c); // constexpr since C++2614 15#include <list>16#include <cassert>17#include "test_macros.h"18#include "MoveOnly.h"19#include "test_allocator.h"20#include "min_allocator.h"21 22TEST_CONSTEXPR_CXX26 bool test() {23 {24 std::list<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));25 std::list<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));26 for (int i = 1; i <= 3; ++i) {27 l.push_back(i);28 lo.push_back(i);29 }30 std::list<MoveOnly, test_allocator<MoveOnly> >::iterator it = l.begin();31 std::list<MoveOnly, test_allocator<MoveOnly> > l2 = std::move(l);32 assert(l2 == lo);33 assert(l.empty());34 assert(l2.get_allocator() == lo.get_allocator());35 assert(it == l2.begin()); // Iterators remain valid36 }37 {38 std::list<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));39 std::list<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));40 for (int i = 1; i <= 3; ++i) {41 l.push_back(i);42 lo.push_back(i);43 }44 std::list<MoveOnly, other_allocator<MoveOnly> >::iterator it = l.begin();45 std::list<MoveOnly, other_allocator<MoveOnly> > l2 = std::move(l);46 assert(l2 == lo);47 assert(l.empty());48 assert(l2.get_allocator() == lo.get_allocator());49 assert(it == l2.begin()); // Iterators remain valid50 }51 {52 std::list<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});53 std::list<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});54 for (int i = 1; i <= 3; ++i) {55 l.push_back(i);56 lo.push_back(i);57 }58 std::list<MoveOnly, min_allocator<MoveOnly> >::iterator it = l.begin();59 std::list<MoveOnly, min_allocator<MoveOnly> > l2 = std::move(l);60 assert(l2 == lo);61 assert(l.empty());62 assert(l2.get_allocator() == lo.get_allocator());63 assert(it == l2.begin()); // Iterators remain valid64 }65 66 return true;67}68 69int main(int, char**) {70 assert(test());71#if TEST_STD_VER >= 2672 static_assert(test());73#endif74 75 return 0;76}77