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