Recommit r276548 - Make pair/tuples assignment operators SFINAE properly.

I think I've solved issues with is_assignable and references to incomplete
types. The updated patch adds tests for this case.



git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2016-07-25 02:36:42 +00:00
parent 602fe15f55
commit 4be71c6619
7 changed files with 386 additions and 14 deletions

View File

@@ -19,6 +19,22 @@
#include <string>
#include <cassert>
#include "test_macros.h"
struct NonAssignable {
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable&&) = delete;
};
struct CopyAssignable {
CopyAssignable& operator=(CopyAssignable const&) = default;
CopyAssignable& operator=(CopyAssignable &&) = delete;
};
static_assert(std::is_copy_assignable<CopyAssignable>::value, "");
struct MoveAssignable {
MoveAssignable& operator=(MoveAssignable const&) = delete;
MoveAssignable& operator=(MoveAssignable&&) = default;
};
int main()
{
{
@@ -51,4 +67,37 @@ int main()
assert(std::get<1>(t) == 'a');
assert(std::get<2>(t) == "some text");
}
{
// test reference assignment.
using T = std::tuple<int&, int&&>;
int x = 42;
int y = 100;
int x2 = -1;
int y2 = 500;
T t(x, std::move(y));
T t2(x2, std::move(y2));
t = t2;
assert(std::get<0>(t) == x2);
assert(&std::get<0>(t) == &x);
assert(std::get<1>(t) == y2);
assert(&std::get<1>(t) == &y);
}
{
// test that the implicitly generated copy assignment operator
// is properly deleted
using T = std::tuple<std::unique_ptr<int>>;
static_assert(!std::is_copy_assignable<T>::value, "");
}
{
using T = std::tuple<int, NonAssignable>;
static_assert(!std::is_copy_assignable<T>::value, "");
}
{
using T = std::tuple<int, CopyAssignable>;
static_assert(std::is_copy_assignable<T>::value, "");
}
{
using T = std::tuple<int, MoveAssignable>;
static_assert(!std::is_copy_assignable<T>::value, "");
}
}