brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · bf98896 Raw
138 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <any>12 13// template <class T, class ...Args> any make_any(Args&&...);14// template <class T, class U, class ...Args>15// any make_any(initializer_list<U>, Args&&...);16 17#include <any>18#include <cassert>19 20#include "any_helpers.h"21#include "count_new.h"22#include "test_macros.h"23 24template <class Type>25void test_make_any_type() {26    // constructing from a small type should perform no allocations.27    DisableAllocationGuard g(isSmallType<Type>()); ((void)g);28    assert(Type::count == 0);29    Type::reset();30    {31        std::any a = std::make_any<Type>();32 33        assert(Type::count == 1);34        assert(Type::copied == 0);35        assert(Type::moved == 0);36        assertContains<Type>(a, 0);37    }38    assert(Type::count == 0);39    Type::reset();40    {41        std::any a = std::make_any<Type>(101);42 43        assert(Type::count == 1);44        assert(Type::copied == 0);45        assert(Type::moved == 0);46        assertContains<Type>(a, 101);47    }48    assert(Type::count == 0);49    Type::reset();50    {51        std::any a = std::make_any<Type>(-1, 42, -1);52 53        assert(Type::count == 1);54        assert(Type::copied == 0);55        assert(Type::moved == 0);56        assertContains<Type>(a, 42);57    }58    assert(Type::count == 0);59    Type::reset();60}61 62template <class Type>63void test_make_any_type_tracked() {64    // constructing from a small type should perform no allocations.65    DisableAllocationGuard g(isSmallType<Type>()); ((void)g);66    {67        std::any a = std::make_any<Type>();68        assertArgsMatch<Type>(a);69    }70    {71        std::any a = std::make_any<Type>(-1, 42, -1);72        assertArgsMatch<Type, int, int, int>(a);73    }74    // initializer_list constructor tests75    {76        std::any a = std::make_any<Type>({-1, 42, -1});77        assertArgsMatch<Type, std::initializer_list<int>>(a);78    }79    {80        int x = 42;81        std::any a  = std::make_any<Type>({-1, 42, -1}, x);82        assertArgsMatch<Type, std::initializer_list<int>, int&>(a);83    }84}85 86#ifndef TEST_HAS_NO_EXCEPTIONS87 88struct SmallThrows {89  SmallThrows(int) { throw 42; }90  SmallThrows(std::initializer_list<int>, int) { throw 42; }91};92static_assert(IsSmallObject<SmallThrows>::value, "");93 94struct LargeThrows {95  LargeThrows(int) { throw 42; }96  LargeThrows(std::initializer_list<int>, int) { throw 42; }97  int data[sizeof(std::any)];98};99static_assert(!IsSmallObject<LargeThrows>::value, "");100 101template <class Type>102void test_make_any_throws()103{104    {105        try {106            TEST_IGNORE_NODISCARD std::make_any<Type>(101);107            assert(false);108        } catch (int const&) {109        }110    }111    {112        try {113            TEST_IGNORE_NODISCARD std::make_any<Type>({1, 2, 3}, 101);114            assert(false);115        } catch (int const&) {116        }117    }118}119 120#endif121 122int main(int, char**) {123    test_make_any_type<small>();124    test_make_any_type<large>();125    test_make_any_type<small_throws_on_copy>();126    test_make_any_type<large_throws_on_copy>();127    test_make_any_type<throws_on_move>();128    test_make_any_type_tracked<small_tracked_t>();129    test_make_any_type_tracked<large_tracked_t>();130#ifndef TEST_HAS_NO_EXCEPTIONS131    test_make_any_throws<SmallThrows>();132    test_make_any_throws<LargeThrows>();133 134#endif135 136  return 0;137}138