17686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant//===----------------------------------------------------------------------===// 27686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// 37686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// The LLVM Compiler Infrastructure 47686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// 57686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 67686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 77686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// 87686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant//===----------------------------------------------------------------------===// 97686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 107686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// <map> 117686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 127686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// void swap(map& c) 137686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// noexcept(!allocator_type::propagate_on_container_swap::value || 147686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// __is_nothrow_swappable<allocator_type>::value); 157686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 167686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// This tests a conforming extension 177686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 187686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#include <map> 197686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#include <cassert> 207686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 217686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#include "../../../MoveOnly.h" 221b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h" 237686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 247686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnanttemplate <class T> 257686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnantstruct some_comp 267686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant{ 277686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant typedef T value_type; 287686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 297686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant some_comp() {} 307686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant some_comp(const some_comp&) {} 317686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant void deallocate(void*, unsigned) {} 327686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 337686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant typedef std::true_type propagate_on_container_swap; 347686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant}; 357686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant 367686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnantint main() 377686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant{ 387686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#if __has_feature(cxx_noexcept) 397686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant { 407686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant typedef std::map<MoveOnly, MoveOnly> C; 417686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant C c1, c2; 427686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant static_assert(noexcept(swap(c1, c2)), ""); 437686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant } 447686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant { 457686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; 467686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant C c1, c2; 477686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant static_assert(noexcept(swap(c1, c2)), ""); 487686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant } 497686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant { 50b2e2a8f6f3a1c47ea942bac99dd75c53be967954Howard Hinnant typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; 517686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant C c1, c2; 527686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant static_assert(noexcept(swap(c1, c2)), ""); 537686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant } 547686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant { 557686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C; 567686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant C c1, c2; 577686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant static_assert(!noexcept(swap(c1, c2)), ""); 587686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant } 597686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#endif 607686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant} 61