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