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