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// map(map&&)
137686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant//        noexcept(is_nothrow_move_constructible<allocator_type>::value &&
147686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant//                 is_nothrow_move_constructible<key_compare>::value);
157686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant
167686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant// This tests a conforming extension
177686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant
18d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier// UNSUPPORTED: c++98, c++03
19d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier
207686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#include <map>
217686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant#include <cassert>
227686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant
23a29e0e5ba2ad9a130fc712591da374e80cc7153eEric Fiselier#include "test_macros.h"
24df00d5e5ad672aa275a29c5a446072959134adddMarshall Clow#include "MoveOnly.h"
251b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h"
267686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant
277686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnanttemplate <class T>
287686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnantstruct some_comp
297686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant{
307686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    typedef T value_type;
317686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    some_comp(const some_comp&);
324241df3ef46df4bc3d6fc729a39dd6e7c13fc6eeMarshall Clow    bool operator()(const T&, const T&) const { return false; }
337686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant};
347686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant
357686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnantint main()
367686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant{
375597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#if defined(_LIBCPP_VERSION)
38eefcf8206eaed1ef26d996f97377017664c38d91Marshall Clow    typedef std::pair<const MoveOnly, MoveOnly> V;
397686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    {
407686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant        typedef std::map<MoveOnly, MoveOnly> C;
415597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
427686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    }
437686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    {
44eefcf8206eaed1ef26d996f97377017664c38d91Marshall Clow        typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<V>> C;
455597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
467686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    }
477686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    {
48eefcf8206eaed1ef26d996f97377017664c38d91Marshall Clow        typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<V>> C;
495597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
507686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    }
515597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#endif // _LIBCPP_VERSION
527686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    {
537686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant        typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
547686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant        static_assert(!std::is_nothrow_move_constructible<C>::value, "");
557686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant    }
567686add61e0a6c8e5abe28fb943cf2d698cd1266Howard Hinnant}
57