111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// UNSUPPORTED: c++98, c++03
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <list>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// void swap(list& c)
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//     noexcept(!allocator_type::propagate_on_container_swap::value ||
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//              __is_nothrow_swappable<allocator_type>::value);
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//  In C++17, the standard says that swap shall have:
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//     noexcept(allocator_traits<Allocator>::is_always_equal::value);
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This tests a conforming extension
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <list>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_macros.h"
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "MoveOnly.h"
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_allocator.h"
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_alloc
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc() {}
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc(const some_alloc&);
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::true_type propagate_on_container_swap;
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_alloc2
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc2() {}
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc2(const some_alloc2&);
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::false_type propagate_on_container_swap;
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::true_type is_always_equal;
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::list<MoveOnly> C;
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::list<MoveOnly, test_allocator<MoveOnly>> C;
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::list<MoveOnly, other_allocator<MoveOnly>> C;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::list<MoveOnly, some_alloc<MoveOnly>> C;
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 14
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //  In c++14, if POCS is set, swapping the allocator is required not to throw
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert( noexcept(swap(c1, c2)), "");
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(!noexcept(swap(c1, c2)), "");
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 14
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::list<MoveOnly, some_alloc2<MoveOnly>> C;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //  if the allocators are always equal, then the swap can be noexcept
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert( noexcept(swap(c1, c2)), "");
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
92