brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · a3c43de Raw
197 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=(const any&);14 15// Test copy assignment16 17#include <any>18#include <cassert>19 20#include "any_helpers.h"21#include "count_new.h"22#include "test_macros.h"23 24template <class LHS, class RHS>25void test_copy_assign() {26    assert(LHS::count == 0);27    assert(RHS::count == 0);28    LHS::reset();29    RHS::reset();30    {31        std::any lhs = LHS(1);32        const std::any rhs = RHS(2);33 34        assert(LHS::count == 1);35        assert(RHS::count == 1);36        assert(RHS::copied == 0);37 38        lhs = rhs;39 40        assert(RHS::copied == 1);41        assert(LHS::count == 0);42        assert(RHS::count == 2);43 44        assertContains<RHS>(lhs, 2);45        assertContains<RHS>(rhs, 2);46    }47    assert(LHS::count == 0);48    assert(RHS::count == 0);49}50 51template <class LHS>52void test_copy_assign_empty() {53    assert(LHS::count == 0);54    LHS::reset();55    {56        std::any lhs;57        const std::any rhs = LHS(42);58 59        assert(LHS::count == 1);60        assert(LHS::copied == 0);61 62        lhs = rhs;63 64        assert(LHS::copied == 1);65        assert(LHS::count == 2);66 67        assertContains<LHS>(lhs, 42);68        assertContains<LHS>(rhs, 42);69    }70    assert(LHS::count == 0);71    LHS::reset();72    {73        std::any lhs = LHS(1);74        const std::any rhs;75 76        assert(LHS::count == 1);77        assert(LHS::copied == 0);78 79        lhs = rhs;80 81        assert(LHS::copied == 0);82        assert(LHS::count == 0);83 84        assertEmpty<LHS>(lhs);85        assertEmpty(rhs);86    }87    assert(LHS::count == 0);88}89 90void test_copy_assign_self() {91    // empty92    {93        std::any a;94        a = (std::any&)a;95        assertEmpty(a);96        assert(globalMemCounter.checkOutstandingNewEq(0));97    }98    assert(globalMemCounter.checkOutstandingNewEq(0));99    // small100    {101        std::any a = small(1);102        assert(small::count == 1);103 104        a = (std::any&)a;105 106        assert(small::count == 1);107        assertContains<small>(a, 1);108        assert(globalMemCounter.checkOutstandingNewEq(0));109    }110    assert(small::count == 0);111    assert(globalMemCounter.checkOutstandingNewEq(0));112    // large113    {114        std::any a = large(1);115        assert(large::count == 1);116 117        a = (std::any&)a;118 119        assert(large::count == 1);120        assertContains<large>(a, 1);121        assert(globalMemCounter.checkOutstandingNewEq(1));122    }123    assert(large::count == 0);124    assert(globalMemCounter.checkOutstandingNewEq(0));125}126 127template <class Tp>128void test_copy_assign_throws()129{130#if !defined(TEST_HAS_NO_EXCEPTIONS)131    auto try_throw =132    [](std::any& lhs, const std::any& rhs) {133        try {134            lhs = rhs;135            assert(false);136        } catch (const my_any_exception&) {137            // do nothing138        } catch (...) {139            assert(false);140        }141    };142    // const lvalue to empty143    {144        std::any lhs;145        const std::any rhs = Tp(1);146        assert(Tp::count == 1);147 148        try_throw(lhs, rhs);149 150        assert(Tp::count == 1);151        assertEmpty<Tp>(lhs);152        assertContains<Tp>(rhs, 1);153    }154    {155        std::any lhs = small(2);156        const std::any rhs = Tp(1);157        assert(small::count == 1);158        assert(Tp::count == 1);159 160        try_throw(lhs, rhs);161 162        assert(small::count == 1);163        assert(Tp::count == 1);164        assertContains<small>(lhs, 2);165        assertContains<Tp>(rhs, 1);166    }167    {168        std::any lhs = large(2);169        const std::any rhs = Tp(1);170        assert(large::count == 1);171        assert(Tp::count == 1);172 173        try_throw(lhs, rhs);174 175        assert(large::count == 1);176        assert(Tp::count == 1);177        assertContains<large>(lhs, 2);178        assertContains<Tp>(rhs, 1);179    }180#endif181}182 183int main(int, char**) {184    globalMemCounter.reset();185    test_copy_assign<small1, small2>();186    test_copy_assign<large1, large2>();187    test_copy_assign<small, large>();188    test_copy_assign<large, small>();189    test_copy_assign_empty<small>();190    test_copy_assign_empty<large>();191    test_copy_assign_self();192    test_copy_assign_throws<small_throws_on_copy>();193    test_copy_assign_throws<large_throws_on_copy>();194 195  return 0;196}197