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