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// vector(vector&&)
13d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant//        noexcept(is_nothrow_move_constructible<allocator_type>::value);
14d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
15d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant// This tests a conforming extension
16d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
17d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier// UNSUPPORTED: c++98, c++03
18d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier
19d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <vector>
20d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant#include <cassert>
21d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
22a29e0e5ba2ad9a130fc712591da374e80cc7153eEric Fiselier#include "test_macros.h"
231b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow#include "test_allocator.h"
24d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
25d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnanttemplate <class T>
26d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantstruct some_alloc
27d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{
28d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    typedef T value_type;
29d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    some_alloc(const some_alloc&);
30d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant};
31d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant
32d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnantint main()
33d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant{
345597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#if defined(_LIBCPP_VERSION)
35d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
36d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool> C;
375597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
38d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
39d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
40d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool, test_allocator<bool>> C;
415597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
42d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
43d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
44d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        typedef std::vector<bool, other_allocator<bool>> C;
455597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert(std::is_nothrow_move_constructible<C>::value, "");
46d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
475597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#endif // _LIBCPP_VERSION
48d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    {
49119ed479997f73f39aa0dc4ea5b5ca5ae36300fbMarshall Clow    //  In C++17, move constructors for allocators are not allowed to throw
50119ed479997f73f39aa0dc4ea5b5ca5ae36300fbMarshall Clow#if TEST_STD_VER > 14
515597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#if defined(_LIBCPP_VERSION)
525597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        typedef std::vector<bool, some_alloc<bool>> C;
535597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        static_assert( std::is_nothrow_move_constructible<C>::value, "");
545597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej#endif // _LIBCPP_VERSION
55119ed479997f73f39aa0dc4ea5b5ca5ae36300fbMarshall Clow#else
565597800045d2053774514354adf7fbd8bd36cc3dStephan T. Lavavej        typedef std::vector<bool, some_alloc<bool>> C;
57d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant        static_assert(!std::is_nothrow_move_constructible<C>::value, "");
58119ed479997f73f39aa0dc4ea5b5ca5ae36300fbMarshall Clow#endif
59d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant    }
60d1d27a4afaba2e3b708afd73f1533b7f8530008bHoward Hinnant}
61