17175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//===----------------------------------------------------------------------===//
27175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
37175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//                     The LLVM Compiler Infrastructure
47175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
57175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
67175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// Source Licenses. See LICENSE.TXT for details.
77175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
87175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//===----------------------------------------------------------------------===//
97175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
107175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// UNSUPPORTED: c++98, c++03, c++11
117175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
127175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// <experimental/any>
137175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
147175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// any& operator=(any const &);
157175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
167175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// Test copy assignment
177175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
187175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include <experimental/any>
197175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include <cassert>
207175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
21e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include "experimental_any_helpers.h"
227175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include "count_new.hpp"
237175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include "test_macros.h"
247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
257175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierusing std::experimental::any;
267175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierusing std::experimental::any_cast;
277175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
287175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliertemplate <class LHS, class RHS>
297175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliervoid test_copy_assign() {
307175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(LHS::count == 0);
317175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(RHS::count == 0);
327175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    LHS::reset();
337175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    RHS::reset();
347175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
357175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs(LHS(1));
367175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs(RHS(2));
377175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
387175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 1);
397175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(RHS::count == 1);
407175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(RHS::copied == 0);
417175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
427175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        lhs = rhs;
437175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
447175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(RHS::copied == 1);
457175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 0);
467175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(RHS::count == 2);
477175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
487175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<RHS>(lhs, 2);
497175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<RHS>(rhs, 2);
507175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
517175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(LHS::count == 0);
527175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(RHS::count == 0);
537175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
547175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
557175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliertemplate <class LHS>
567175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliervoid test_copy_assign_empty() {
577175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(LHS::count == 0);
587175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    LHS::reset();
597175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
607175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs;
617175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs(LHS(42));
627175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
637175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 1);
647175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::copied == 0);
657175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
667175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        lhs = rhs;
677175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
687175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::copied == 1);
697175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 2);
707175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
717175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<LHS>(lhs, 42);
727175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<LHS>(rhs, 42);
737175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
747175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(LHS::count == 0);
757175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    LHS::reset();
767175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
777175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs(LHS(1));
787175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs;
797175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
807175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 1);
817175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::copied == 0);
827175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
837175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        lhs = rhs;
847175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
857175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::copied == 0);
867175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(LHS::count == 0);
877175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
887175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertEmpty<LHS>(lhs);
897175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertEmpty(rhs);
907175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
917175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(LHS::count == 0);
927175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
937175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
947175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliervoid test_copy_assign_self() {
957175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    // empty
967175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
977175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any a;
987175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        a = a;
997175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertEmpty(a);
1007175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(globalMemCounter.checkOutstandingNewEq(0));
1017175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1027175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
1037175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    // small
1047175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
1057175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any a((small(1)));
1067175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(small::count == 1);
1077175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1087175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        a = a;
1097175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1107175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(small::count == 1);
1117175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<small>(a, 1);
1127175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(globalMemCounter.checkOutstandingNewEq(0));
1137175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1147175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(small::count == 0);
1157175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
1167175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    // large
1177175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
1187175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any a(large(1));
1197175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(large::count == 1);
1207175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1217175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        a = a;
1227175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1237175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(large::count == 1);
1247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<large>(a, 1);
1257175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(globalMemCounter.checkOutstandingNewEq(1));
1267175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1277175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(large::count == 0);
1287175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    assert(globalMemCounter.checkOutstandingNewEq(0));
1297175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
1307175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1317175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliertemplate <class Tp>
1327175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiseliervoid test_copy_assign_throws()
1337175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier{
1347175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#if !defined(TEST_HAS_NO_EXCEPTIONS)
1357175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    auto try_throw =
1367175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    [](any& lhs, any const& rhs) {
1377175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        try {
1387175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier            lhs = rhs;
1397175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier            assert(false);
1407175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        } catch (my_any_exception const &) {
1417175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier            // do nothing
1427175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        } catch (...) {
1437175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier            assert(false);
1447175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        }
1457175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    };
1467175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    // const lvalue to empty
1477175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
1487175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs;
1497175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs((Tp(1)));
1507175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1517175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1527175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        try_throw(lhs, rhs);
1537175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1547175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1557175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertEmpty<Tp>(lhs);
1567175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<Tp>(rhs);
1577175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1587175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
1597175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs((small(2)));
1607175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs((Tp(1)));
1617175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(small::count == 1);
1627175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1637175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1647175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        try_throw(lhs, rhs);
1657175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1667175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(small::count == 1);
1677175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1687175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<small>(lhs, 2);
1697175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<Tp>(rhs);
1707175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1717175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    {
1727175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any lhs((large(2)));
1737175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        any const rhs((Tp(1)));
1747175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(large::count == 1);
1757175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1767175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1777175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        try_throw(lhs, rhs);
1787175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1797175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(large::count == 1);
1807175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assert(Tp::count == 1);
1817175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<large>(lhs, 2);
1827175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier        assertContains<Tp>(rhs);
1837175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    }
1847175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#endif
1857175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
1867175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
1877175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierint main() {
1887175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign<small1, small2>();
1897175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign<large1, large2>();
1907175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign<small, large>();
1917175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign<large, small>();
1927175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign_empty<small>();
1937175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign_empty<large>();
1947175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign_self();
1957175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign_throws<small_throws_on_copy>();
1967175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    test_copy_assign_throws<large_throws_on_copy>();
1977175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
198