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