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++03, c++11, c++1410 11// <any>12 13// any& operator=(any &&);14 15// Test move assignment.16 17#include <any>18#include <cassert>19 20#include "any_helpers.h"21#include "test_macros.h"22 23template <class LHS, class RHS>24void test_move_assign() {25 assert(LHS::count == 0);26 assert(RHS::count == 0);27 {28 LHS const s1(1);29 std::any a = s1;30 RHS const s2(2);31 std::any a2 = s2;32 33 assert(LHS::count == 2);34 assert(RHS::count == 2);35 36 a = std::move(a2);37 38 assert(LHS::count == 1);39 assert(RHS::count == 2 + a2.has_value());40 LIBCPP_ASSERT(RHS::count == 2); // libc++ leaves the object empty41 42 assertContains<RHS>(a, 2);43 if (a2.has_value())44 assertContains<RHS>(a2, 0);45 LIBCPP_ASSERT(!a2.has_value());46 }47 assert(LHS::count == 0);48 assert(RHS::count == 0);49}50 51template <class LHS>52void test_move_assign_empty() {53 assert(LHS::count == 0);54 {55 std::any a;56 std::any a2 = LHS(1);57 58 assert(LHS::count == 1);59 60 a = std::move(a2);61 62 assert(LHS::count == 1 + a2.has_value());63 LIBCPP_ASSERT(LHS::count == 1);64 65 assertContains<LHS>(a, 1);66 if (a2.has_value())67 assertContains<LHS>(a2, 0);68 LIBCPP_ASSERT(!a2.has_value());69 }70 assert(LHS::count == 0);71 {72 std::any a = LHS(1);73 std::any a2;74 75 assert(LHS::count == 1);76 77 a = std::move(a2);78 79 assert(LHS::count == 0);80 81 assertEmpty<LHS>(a);82 assertEmpty(a2);83 }84 assert(LHS::count == 0);85}86 87void test_move_assign_noexcept() {88 std::any a1;89 std::any a2;90 ASSERT_NOEXCEPT(a1 = std::move(a2));91}92 93int main(int, char**) {94 test_move_assign_noexcept();95 test_move_assign<small1, small2>();96 test_move_assign<large1, large2>();97 test_move_assign<small, large>();98 test_move_assign<large, small>();99 test_move_assign_empty<small>();100 test_move_assign_empty<large>();101 102 return 0;103}104