value.pass.cpp revision 7175a079211ec78c8232d9d55fa4c1f9eeae803d
11b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//===----------------------------------------------------------------------===// 21b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// 31b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// The LLVM Compiler Infrastructure 41b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// 51b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// This file is dual licensed under the MIT and the University of Illinois Open 61b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// Source Licenses. See LICENSE.TXT for details. 71b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// 81b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//===----------------------------------------------------------------------===// 91b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 101b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// UNSUPPORTED: c++98, c++03, c++11 111b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 121b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// <experimental/any> 137d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk 147d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// template <class Value> any(Value &&) 157d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk 167d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// Test construction from a value. 177d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// Concerns: 187d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// --------- 197d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// 1. The value is properly move/copied depending on the value category. 207d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// 2. Both small and large values are properly handled. 211b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 221b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 231b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include <experimental/any> 241b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include <cassert> 251b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 261b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include "any_helpers.h" 277d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#include "count_new.hpp" 287d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#include "test_macros.h" 297d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk 307d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burkusing std::experimental::any; 317d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burkusing std::experimental::any_cast; 327d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk 337d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burktemplate <class Type> 343cc1bdbc6efdb268be16e7184709eeb4ecf9b944Phil Burkvoid test_copy_value_throws() 351b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk{ 361b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#if !defined(TEST_HAS_NO_EXCEPTIONS) 371b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 0); 381b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk { 391b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk Type const t(42); 407eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood assert(Type::count == 1); 411b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk try { 421b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk any const a2(t); 431b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(false); 441b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } catch (my_any_exception const &) { 451b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk // do nothing 461b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } catch (...) { 471b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(false); 481b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } 491b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 1); 501b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(t.value == 42); 511b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } 521b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 0); 531b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#endif 541b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk} 551b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 561b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burkvoid test_move_value_throws() 571b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk{ 581b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#if !defined(TEST_HAS_NO_EXCEPTIONS) 591b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(throws_on_move::count == 0); 601b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk { 611b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk throws_on_move v; 621b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(throws_on_move::count == 1); 631b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk try { 641b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk any const a(std::move(v)); 651b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(false); 661b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } catch (my_any_exception const &) { 671b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk // do nothing 681b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } catch (...) { 697d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk assert(false); 707d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk } 717d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk assert(throws_on_move::count == 1); 727d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk } 737d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk assert(throws_on_move::count == 0); 747d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#endif 757d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk} 767d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk 771b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burktemplate <class Type> 7844d535aaf2a06115de5255f2787c4f7a4db949cePhil Burkvoid test_copy_move_value() { 7944d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk // constructing from a small type should perform no allocations. 8044d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk DisableAllocationGuard g(isSmallType<Type>()); ((void)g); 8144d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk assert(Type::count == 0); 8244d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk Type::reset(); 8344d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk { 8444d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk Type t(42); 8544d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk assert(Type::count == 1); 8644d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk 8744d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk any a(t); 8844d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk 8944d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk assert(Type::count == 2); 901b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::copied == 1); 911b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::moved == 0); 921b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assertContains<Type>(a, 42); 931b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } 941b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 0); 951b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk Type::reset(); 961b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk { 971b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk Type t(42); 981b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 1); 991b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 1001b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk any a(std::move(t)); 1011b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 1021b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::count == 2); 1031b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::copied == 0); 1041b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assert(Type::moved == 1); 1051b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk assertContains<Type>(a, 42); 1061b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk } 1077eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood} 1081b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 1091b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk 1101b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burkint main() { 1111b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk test_copy_move_value<small>(); 1121b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk test_copy_move_value<large>(); 1131b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk test_copy_value_throws<small_throws_on_copy>(); 1141b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk test_copy_value_throws<large_throws_on_copy>(); 1151b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk test_move_value_throws(); 1161b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk}