diff options
| author | Eric Fiselier <eric@efcs.ca> | 2016-11-23 01:02:51 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2016-11-23 01:02:51 +0000 |
| commit | 80e66ac1d3cdb67a35ca0c57f8e4a00cacd0f019 (patch) | |
| tree | 370e5d119c4f7c459428f538bfdeb677ac1caaa7 /libcxx/test/support | |
| parent | be6c2f1a36d8e7a720653bbb79ae494b6b68e99c (diff) | |
| download | bcm5719-llvm-80e66ac1d3cdb67a35ca0c57f8e4a00cacd0f019.tar.gz bcm5719-llvm-80e66ac1d3cdb67a35ca0c57f8e4a00cacd0f019.zip | |
Add <variant> tests but disable them for libc++
llvm-svn: 287728
Diffstat (limited to 'libcxx/test/support')
| -rw-r--r-- | libcxx/test/support/archetypes.ipp | 1 | ||||
| -rw-r--r-- | libcxx/test/support/variant_test_helpers.hpp | 81 |
2 files changed, 81 insertions, 1 deletions
diff --git a/libcxx/test/support/archetypes.ipp b/libcxx/test/support/archetypes.ipp index a86e584af0a..d8d1e5a9330 100644 --- a/libcxx/test/support/archetypes.ipp +++ b/libcxx/test/support/archetypes.ipp @@ -42,7 +42,6 @@ struct AllCtors : DEFINE_BASE(AllCtors) { struct NoCtors : DEFINE_BASE(NoCtors) { using Base = DEFINE_BASE(NoCtors); - using Base::Base; DEFINE_EXPLICIT NoCtors() = delete; DEFINE_EXPLICIT NoCtors(NoCtors const&) = delete; NoCtors& operator=(NoCtors const&) = delete; diff --git a/libcxx/test/support/variant_test_helpers.hpp b/libcxx/test/support/variant_test_helpers.hpp new file mode 100644 index 00000000000..27716723371 --- /dev/null +++ b/libcxx/test/support/variant_test_helpers.hpp @@ -0,0 +1,81 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#ifndef SUPPORT_VARIANT_TEST_HELPERS_HPP +#define SUPPORT_VARIANT_TEST_HELPERS_HPP + +#include <type_traits> +#include <utility> +#include <cassert> + +#include "test_macros.h" + +#if TEST_STD_VER <= 14 +#error This file requires C++17 +#endif + +// FIXME: Currently the variant<T&> tests are disabled using this macro. +#define TEST_VARIANT_HAS_NO_REFERENCES + +#ifndef TEST_HAS_NO_EXCEPTIONS +struct CopyThrows { + CopyThrows() = default; + CopyThrows(CopyThrows const&) { throw 42; } + CopyThrows& operator=(CopyThrows const&) { throw 42; } +}; + +struct MoveThrows { + static int alive; + MoveThrows() { ++alive; } + MoveThrows(MoveThrows const&) {++alive;} + MoveThrows(MoveThrows&&) { throw 42; } + MoveThrows& operator=(MoveThrows const&) { return *this; } + MoveThrows& operator=(MoveThrows&&) { throw 42; } + ~MoveThrows() { --alive; } +}; + +int MoveThrows::alive = 0; + +struct MakeEmptyT { + static int alive; + MakeEmptyT() { ++alive; } + MakeEmptyT(MakeEmptyT const&) { + ++alive; + // Don't throw from the copy constructor since variant's assignment + // operator performs a copy before committing to the assignment. + } + MakeEmptyT(MakeEmptyT &&) { + throw 42; + } + MakeEmptyT& operator=(MakeEmptyT const&) { + throw 42; + } + MakeEmptyT& operator=(MakeEmptyT&&) { + throw 42; + } + ~MakeEmptyT() { --alive; } +}; +static_assert(std::is_swappable_v<MakeEmptyT>, ""); // required for test + +int MakeEmptyT::alive = 0; + +template <class Variant> +void makeEmpty(Variant& v) { + Variant v2(std::in_place_type<MakeEmptyT>); + try { + v = v2; + assert(false); + } catch (...) { + assert(v.valueless_by_exception()); + } +} +#endif // TEST_HAS_NO_EXCEPTIONS + + +#endif // SUPPORT_VARIANT_TEST_HELPERS_HPP |

