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