Add tests to ensure that reference_wrapper<T> is trivially copyable. This was added to C++1z with the adoption of N4277, but libc++ already implemented it as a conforming extension. No code changes were needed, just more tests.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@222132 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -16,12 +16,43 @@
|
|||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
class MoveOnly
|
||||||
|
{
|
||||||
|
MoveOnly(const MoveOnly&);
|
||||||
|
MoveOnly& operator=(const MoveOnly&);
|
||||||
|
|
||||||
|
int data_;
|
||||||
|
public:
|
||||||
|
MoveOnly(int data = 1) : data_(data) {}
|
||||||
|
MoveOnly(MoveOnly&& x)
|
||||||
|
: data_(x.data_) {x.data_ = 0;}
|
||||||
|
MoveOnly& operator=(MoveOnly&& x)
|
||||||
|
{data_ = x.data_; x.data_ = 0; return *this;}
|
||||||
|
|
||||||
|
int get() const {return data_;}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void test()
|
||||||
|
{
|
||||||
|
typedef std::reference_wrapper<T> Wrap;
|
||||||
|
static_assert(std::is_copy_constructible<Wrap>::value, "");
|
||||||
|
static_assert(std::is_copy_assignable<Wrap>::value, "");
|
||||||
|
// Extension up for standardization: See N4151.
|
||||||
|
static_assert(std::is_trivially_copyable<Wrap>::value, "");
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
typedef std::reference_wrapper<int> T;
|
test<int>();
|
||||||
static_assert(std::is_copy_constructible<T>::value, "");
|
test<double>();
|
||||||
static_assert(std::is_copy_assignable<T>::value, "");
|
test<std::string>();
|
||||||
// Extension up for standardization: See N4151.
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
static_assert(std::is_trivially_copyable<T>::value, "");
|
test<MoveOnly>();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user