1e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier//===----------------------------------------------------------------------===// 2e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// 3e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// The LLVM Compiler Infrastructure 4e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// 5e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open 6e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// Source Licenses. See LICENSE.TXT for details. 7e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// 8e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier//===----------------------------------------------------------------------===// 9e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 10e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// UNSUPPORTED: c++98, c++03, c++11, c++14 11e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 12e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// <any> 13e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 14e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier// any(any const &); 15e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 16e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include <any> 17e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include <cassert> 18e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 19e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include "any_helpers.h" 20e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include "count_new.hpp" 21e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#include "test_macros.h" 22e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 23e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselierusing std::any; 24e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselierusing std::any_cast; 25e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 26e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiseliertemplate <class Type> 27e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiseliervoid test_copy_throws() { 28e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#if !defined(TEST_HAS_NO_EXCEPTIONS) 29e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 0); 30e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier { 31e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any const a((Type(42))); 32e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 1); 33e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier try { 34e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any const a2(a); 35e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(false); 36e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier } catch (my_any_exception const &) { 37e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier // do nothing 38e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier } catch (...) { 39e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(false); 40e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier } 41e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 1); 42e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a, 42); 43e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier } 44e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 0); 45e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier#endif 46e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier} 47e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 48e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiseliervoid test_copy_empty() { 49e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier DisableAllocationGuard g; ((void)g); // No allocations should occur. 50e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any a1; 51e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any a2(a1); 52e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 53e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertEmpty(a1); 54e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertEmpty(a2); 55e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier} 56e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 57e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiseliertemplate <class Type> 58e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiseliervoid test_copy() 59e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier{ 60e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier // Copying small types should not perform any allocations. 61e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier DisableAllocationGuard g(isSmallType<Type>()); ((void)g); 62e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 0); 63e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier Type::reset(); 64e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier { 65e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any a((Type(42))); 66e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 1); 67e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::copied == 0); 68e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 69e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier any a2(a); 70e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 71e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::copied == 1); 72e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 2); 73e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a, 42); 742c429bee79204b77cff067695798dfac5605820dEric Fiselier assertContains<Type>(a2, 42); 75e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 76e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier // Modify a and check that a2 is unchanged 77e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier modifyValue<Type>(a, -1); 78e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a, -1); 79e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a2, 42); 80e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 81e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier // modify a2 and check that a is unchanged 82e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier modifyValue<Type>(a2, 999); 83e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a, -1); 84e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a2, 999); 85e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 86e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier // clear a and check that a2 is unchanged 87e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier a.reset(); 88e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertEmpty(a); 89e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assertContains<Type>(a2, 999); 90e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier } 91e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier assert(Type::count == 0); 92e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier} 93e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier 94e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselierint main() { 95e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier test_copy<small>(); 96e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier test_copy<large>(); 97e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier test_copy_empty(); 98e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier test_copy_throws<small_throws_on_copy>(); 99e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier test_copy_throws<large_throws_on_copy>(); 100e739d54f86e3a7f0b051f7190ffd8d40ed05ca44Eric Fiselier} 101