1ee226c05af9e0187098f43fb71465a581487af9bDan Austin//===----------------------------------------------------------------------===//
2ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
3ee226c05af9e0187098f43fb71465a581487af9bDan Austin//                     The LLVM Compiler Infrastructure
4ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
5ee226c05af9e0187098f43fb71465a581487af9bDan Austin// This file is dual licensed under the MIT and the University of Illinois Open
6ee226c05af9e0187098f43fb71465a581487af9bDan Austin// Source Licenses. See LICENSE.TXT for details.
7ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
8ee226c05af9e0187098f43fb71465a581487af9bDan Austin//===----------------------------------------------------------------------===//
9ee226c05af9e0187098f43fb71465a581487af9bDan Austin
10ee226c05af9e0187098f43fb71465a581487af9bDan Austin// UNSUPPORTED: c++98, c++03
11ee226c05af9e0187098f43fb71465a581487af9bDan Austin
12ee226c05af9e0187098f43fb71465a581487af9bDan Austin// <experimental/memory_resource>
13ee226c05af9e0187098f43fb71465a581487af9bDan Austin
14ee226c05af9e0187098f43fb71465a581487af9bDan Austin// template <class T> class polymorphic_allocator
15ee226c05af9e0187098f43fb71465a581487af9bDan Austin
16ee226c05af9e0187098f43fb71465a581487af9bDan Austin// polymorphic_allocator<T>::polymorphic_allocator(polymorphic_allocator const &);
17ee226c05af9e0187098f43fb71465a581487af9bDan Austin
18ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include <experimental/memory_resource>
19ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include <type_traits>
20ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include <cassert>
21ee226c05af9e0187098f43fb71465a581487af9bDan Austin
22ee226c05af9e0187098f43fb71465a581487af9bDan Austinnamespace ex = std::experimental::pmr;
23ee226c05af9e0187098f43fb71465a581487af9bDan Austin
24ee226c05af9e0187098f43fb71465a581487af9bDan Austinint main()
25ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
26ee226c05af9e0187098f43fb71465a581487af9bDan Austin    typedef ex::polymorphic_allocator<void> A1;
27ee226c05af9e0187098f43fb71465a581487af9bDan Austin    {
28ee226c05af9e0187098f43fb71465a581487af9bDan Austin        static_assert(
29ee226c05af9e0187098f43fb71465a581487af9bDan Austin            std::is_copy_constructible<A1>::value, ""
30ee226c05af9e0187098f43fb71465a581487af9bDan Austin          );
31ee226c05af9e0187098f43fb71465a581487af9bDan Austin        static_assert(
32ee226c05af9e0187098f43fb71465a581487af9bDan Austin            std::is_move_constructible<A1>::value, ""
33ee226c05af9e0187098f43fb71465a581487af9bDan Austin          );
34ee226c05af9e0187098f43fb71465a581487af9bDan Austin    }
35ee226c05af9e0187098f43fb71465a581487af9bDan Austin    // copy
36ee226c05af9e0187098f43fb71465a581487af9bDan Austin    {
37ee226c05af9e0187098f43fb71465a581487af9bDan Austin        A1 const a((ex::memory_resource*)42);
38ee226c05af9e0187098f43fb71465a581487af9bDan Austin        A1 const a2(a);
39ee226c05af9e0187098f43fb71465a581487af9bDan Austin        assert(a.resource() == a2.resource());
40ee226c05af9e0187098f43fb71465a581487af9bDan Austin    }
41ee226c05af9e0187098f43fb71465a581487af9bDan Austin    // move
42ee226c05af9e0187098f43fb71465a581487af9bDan Austin    {
43ee226c05af9e0187098f43fb71465a581487af9bDan Austin        A1 a((ex::memory_resource*)42);
44ee226c05af9e0187098f43fb71465a581487af9bDan Austin        A1 a2(std::move(a));
45ee226c05af9e0187098f43fb71465a581487af9bDan Austin        assert(a.resource() == a2.resource());
46ee226c05af9e0187098f43fb71465a581487af9bDan Austin        assert(a2.resource() == (ex::memory_resource*)42);
47ee226c05af9e0187098f43fb71465a581487af9bDan Austin    }
48ee226c05af9e0187098f43fb71465a581487af9bDan Austin}
49