brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 2cfc3f6 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++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