mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-22 16:37:40 +08:00

Some tests are marked as failing on platforms where the dylib does not provide the required exception classes. However, when testing with exceptions disabled, those tests shouldn't be marked as failing. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@353210 91177308-0d34-0410-b5e6-96231b3b80d8
112 lines
2.5 KiB
C++
112 lines
2.5 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: c++98, c++03, c++11, c++14
|
|
|
|
// XFAIL: dylib-has-no-bad_any_cast && !libcpp-no-exceptions
|
|
|
|
// <any>
|
|
|
|
// any& operator=(any &&);
|
|
|
|
// Test move assignment.
|
|
|
|
#include <any>
|
|
#include <cassert>
|
|
|
|
#include "any_helpers.h"
|
|
#include "test_macros.h"
|
|
|
|
using std::any;
|
|
using std::any_cast;
|
|
|
|
template <class LHS, class RHS>
|
|
void test_move_assign() {
|
|
assert(LHS::count == 0);
|
|
assert(RHS::count == 0);
|
|
{
|
|
LHS const s1(1);
|
|
any a(s1);
|
|
RHS const s2(2);
|
|
any a2(s2);
|
|
|
|
assert(LHS::count == 2);
|
|
assert(RHS::count == 2);
|
|
|
|
a = std::move(a2);
|
|
|
|
assert(LHS::count == 1);
|
|
assert(RHS::count == 2 + a2.has_value());
|
|
LIBCPP_ASSERT(RHS::count == 2); // libc++ leaves the object empty
|
|
|
|
assertContains<RHS>(a, 2);
|
|
if (a2.has_value())
|
|
assertContains<RHS>(a2, 0);
|
|
LIBCPP_ASSERT(!a2.has_value());
|
|
}
|
|
assert(LHS::count == 0);
|
|
assert(RHS::count == 0);
|
|
}
|
|
|
|
template <class LHS>
|
|
void test_move_assign_empty() {
|
|
assert(LHS::count == 0);
|
|
{
|
|
any a;
|
|
any a2((LHS(1)));
|
|
|
|
assert(LHS::count == 1);
|
|
|
|
a = std::move(a2);
|
|
|
|
assert(LHS::count == 1 + a2.has_value());
|
|
LIBCPP_ASSERT(LHS::count == 1);
|
|
|
|
assertContains<LHS>(a, 1);
|
|
if (a2.has_value())
|
|
assertContains<LHS>(a2, 0);
|
|
LIBCPP_ASSERT(!a2.has_value());
|
|
}
|
|
assert(LHS::count == 0);
|
|
{
|
|
any a((LHS(1)));
|
|
any a2;
|
|
|
|
assert(LHS::count == 1);
|
|
|
|
a = std::move(a2);
|
|
|
|
assert(LHS::count == 0);
|
|
|
|
assertEmpty<LHS>(a);
|
|
assertEmpty(a2);
|
|
}
|
|
assert(LHS::count == 0);
|
|
}
|
|
|
|
void test_move_assign_noexcept() {
|
|
any a1;
|
|
any a2;
|
|
static_assert(
|
|
noexcept(a1 = std::move(a2))
|
|
, "any & operator=(any &&) must be noexcept"
|
|
);
|
|
}
|
|
|
|
int main(int, char**) {
|
|
test_move_assign_noexcept();
|
|
test_move_assign<small1, small2>();
|
|
test_move_assign<large1, large2>();
|
|
test_move_assign<small, large>();
|
|
test_move_assign<large, small>();
|
|
test_move_assign_empty<small>();
|
|
test_move_assign_empty<large>();
|
|
|
|
return 0;
|
|
}
|