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
11
12 // <experimental/any>
13
14 // any(any const &);
15
16 #include <experimental/any>
17 #include <cassert>
18
19 #include "any_helpers.h"
20 #include "count_new.hpp"
21 #include "test_macros.h"
22
23 using std::experimental::any;
24 using std::experimental::any_cast;
25
26 template <class Type>
test_copy_throws()27 void 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
test_copy_empty()48 void 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
57 template <class Type>
test_copy()58 void 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>(a, 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.clear();
88 assertEmpty(a);
89 assertContains<Type>(a2, 999);
90 }
91 assert(Type::count == 0);
92 }
93
main()94 int 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