text: //===----------------------------------------------------------------------===//
  //
  //                     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
  
  // XFAIL: availability=macosx
  
  // <experimental/any>
  
  // any(any const &);
  
  #include <experimental/any>
  #include <cassert>
  
  #include "experimental_any_helpers.h"
  #include "count_new.hpp"
  #include "test_macros.h"
  
  using std::experimental::any;
  using std::experimental::any_cast;
  
  template <class Type>
  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<Type>(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 <class Type>
  void test_copy()
  {
      // Copying small types should not perform any allocations.
      DisableAllocationGuard g(isSmallType<Type>()); ((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<Type>(a, 42);
          assertContains<Type>(a, 42);
  
          // Modify a and check that a2 is unchanged
          modifyValue<Type>(a, -1);
          assertContains<Type>(a, -1);
          assertContains<Type>(a2, 42);
  
          // modify a2 and check that a is unchanged
          modifyValue<Type>(a2, 999);
          assertContains<Type>(a, -1);
          assertContains<Type>(a2, 999);
  
          // clear a and check that a2 is unchanged
          a.clear();
          assertEmpty(a);
          assertContains<Type>(a2, 999);
      }
      assert(Type::count == 0);
  }
  
  int main() {
      test_copy<small>();
      test_copy<large>();
      test_copy_empty();
      test_copy_throws<small_throws_on_copy>();
      test_copy_throws<large_throws_on_copy>();
  }
  