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