1d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//===----------------------------------------------------------------------===// 2d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// 3d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// The LLVM Compiler Infrastructure 4d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// 5d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 7d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// 8d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//===----------------------------------------------------------------------===// 9d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 10d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// <vector> 11d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 12d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// void swap(vector& c) 13d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// noexcept(!allocator_type::propagate_on_container_swap::value || 14d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// __is_nothrow_swappable<allocator_type>::value); 157d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow// 167d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow// In C++17, the standard says that swap shall have: 177d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow// noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value || 187d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow// allocator_traits<Allocator>::is_always_equal::value); 19d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 20d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// This tests a conforming extension 21d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 22d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <vector> 23d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <cassert> 24d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 251b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h" 26d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 27d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnanttemplate <class T> 28d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantstruct some_alloc 29d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{ 30d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef T value_type; 31d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 32d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant some_alloc() {} 33d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant some_alloc(const some_alloc&); 34d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant void deallocate(void*, unsigned) {} 35d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 36d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef std::true_type propagate_on_container_swap; 37d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant}; 38d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant 397d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clowtemplate <class T> 407d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clowstruct some_alloc2 417d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow{ 427d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow typedef T value_type; 437d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow 447d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow some_alloc2() {} 457d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow some_alloc2(const some_alloc2&); 467d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow void deallocate(void*, unsigned) {} 477d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow 487d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow typedef std::false_type propagate_on_container_swap; 497d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow typedef std::true_type is_always_equal; 507d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow}; 517d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow 52d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantint main() 53d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{ 54d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#if __has_feature(cxx_noexcept) 55d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant { 56d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef std::vector<bool> C; 57d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant C c1, c2; 58d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant static_assert(noexcept(swap(c1, c2)), ""); 59d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant } 60d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant { 61d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef std::vector<bool, test_allocator<bool>> C; 62d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant C c1, c2; 63d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant static_assert(noexcept(swap(c1, c2)), ""); 64d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant } 65d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant { 66d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef std::vector<bool, other_allocator<bool>> C; 67d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant C c1, c2; 68d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant static_assert(noexcept(swap(c1, c2)), ""); 69d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant } 70d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant { 71d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant typedef std::vector<bool, some_alloc<bool>> C; 72d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant C c1, c2; 737d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#if TEST_STD_VER >= 14 747d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow // In c++14, if POCS is set, swapping the allocator is required not to throw 757d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow static_assert( noexcept(swap(c1, c2)), ""); 767d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#else 77d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant static_assert(!noexcept(swap(c1, c2)), ""); 787d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#endif 79d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant } 807d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#if TEST_STD_VER >= 14 817d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow { 827d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow typedef std::vector<bool, some_alloc2<bool>> C; 837d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow C c1, c2; 847d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow // if the allocators are always equal, then the swap can be noexcept 857d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow static_assert( noexcept(swap(c1, c2)), ""); 867d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow } 877d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow#endif 887d914d1bfffac32da13a44871fc17b8ba3ade57aMarshall Clow 89d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#endif 90d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant} 91