implement more of N4258 - Cleaning up noexcept in the standard library. Specifically add new noexcept stuff to vector and string's move-assignment operations
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@245330 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -11,14 +11,18 @@
|
||||
|
||||
// basic_string& operator=(basic_string&& c)
|
||||
// noexcept(
|
||||
// allocator_type::propagate_on_container_move_assignment::value &&
|
||||
// is_nothrow_move_assignable<allocator_type>::value);
|
||||
|
||||
// This tests a conforming extension
|
||||
// allocator_traits<allocator_type>::propagate_on_container_move_assignment::value ||
|
||||
// allocator_traits<allocator_type>::is_always_equal::value); // C++17
|
||||
//
|
||||
// before C++17, we use the conforming extension
|
||||
// noexcept(
|
||||
// allocator_type::propagate_on_container_move_assignment::value &&
|
||||
// is_nothrow_move_assignable<allocator_type>::value);
|
||||
|
||||
#include <string>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_macros.h"
|
||||
#include "test_allocator.h"
|
||||
|
||||
template <class T>
|
||||
@@ -28,6 +32,32 @@ struct some_alloc
|
||||
some_alloc(const some_alloc&);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct some_alloc2
|
||||
{
|
||||
typedef T value_type;
|
||||
|
||||
some_alloc2() {}
|
||||
some_alloc2(const some_alloc2&);
|
||||
void deallocate(void*, unsigned) {}
|
||||
|
||||
typedef std::false_type propagate_on_container_move_assignment;
|
||||
typedef std::true_type is_always_equal;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct some_alloc3
|
||||
{
|
||||
typedef T value_type;
|
||||
|
||||
some_alloc3() {}
|
||||
some_alloc3(const some_alloc3&);
|
||||
void deallocate(void*, unsigned) {}
|
||||
|
||||
typedef std::false_type propagate_on_container_move_assignment;
|
||||
typedef std::false_type is_always_equal;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
#if __has_feature(cxx_noexcept)
|
||||
@@ -41,7 +71,25 @@ int main()
|
||||
}
|
||||
{
|
||||
typedef std::basic_string<char, std::char_traits<char>, some_alloc<char>> C;
|
||||
#if TEST_STD_VER > 14
|
||||
// if the allocators are always equal, then the move assignment can be noexcept
|
||||
static_assert( std::is_nothrow_move_assignable<C>::value, "");
|
||||
#else
|
||||
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
|
||||
#endif
|
||||
}
|
||||
#if TEST_STD_VER > 14
|
||||
{
|
||||
// POCMA is false, always equal
|
||||
typedef std::basic_string<char, std::char_traits<char>, some_alloc2<char>> C;
|
||||
static_assert( std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
{
|
||||
// POCMA is false, not always equal
|
||||
typedef std::basic_string<char, std::char_traits<char>, some_alloc3<char>> C;
|
||||
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user