//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // // any(any const &); #include #include #include "any_helpers.h" #include "count_new.hpp" #include "test_macros.h" using std::any; using std::any_cast; template void test_copy_throws() { #if !defined(TEST_HAS_NO_EXCEPTIONS) assert(Type::count == 0); { any const a((Type(42))); assert(Type::count == 1); try { any const a2(a); assert(false); } catch (my_any_exception const &) { // do nothing } catch (...) { assert(false); } assert(Type::count == 1); assertContains(a, 42); } assert(Type::count == 0); #endif } void test_copy_empty() { DisableAllocationGuard g; ((void)g); // No allocations should occur. any a1; any a2(a1); assertEmpty(a1); assertEmpty(a2); } template void test_copy() { // Copying small types should not perform any allocations. DisableAllocationGuard g(isSmallType()); ((void)g); assert(Type::count == 0); Type::reset(); { any a((Type(42))); assert(Type::count == 1); assert(Type::copied == 0); any a2(a); assert(Type::copied == 1); assert(Type::count == 2); assertContains(a, 42); assertContains(a2, 42); // Modify a and check that a2 is unchanged modifyValue(a, -1); assertContains(a, -1); assertContains(a2, 42); // modify a2 and check that a is unchanged modifyValue(a2, 999); assertContains(a, -1); assertContains(a2, 999); // clear a and check that a2 is unchanged a.reset(); assertEmpty(a); assertContains(a2, 999); } assert(Type::count == 0); } int main() { test_copy(); test_copy(); test_copy_empty(); test_copy_throws(); test_copy_throws(); }