1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <experimental/memory_resource>
11
12// UNSUPPORTED: c++98, c++03
13
14//------------------------------------------------------------------------------
15// TESTING void * memory_resource::allocate(size_t, size_t = max_align)
16//
17// Concerns:
18//  A) 'memory_resource' contains a member 'allocate' with the required
19//     signature, including the default alignment parameter.
20//  B) The return type of 'allocate' is 'void*'.
21//  C) 'allocate' is not marked as 'noexcept'.
22//  D) Invoking 'allocate' invokes 'do_allocate' with the same arguments.
23//  E) If 'do_allocate' throws then 'allocate' propagates that exception.
24
25#include <experimental/memory_resource>
26#include <type_traits>
27#include <cstddef>
28#include <cassert>
29
30#include "test_macros.h"
31#include "test_memory_resource.hpp"
32
33using std::experimental::pmr::memory_resource;
34
35int main()
36{
37    TestResource R(42);
38    auto& P = R.getController();
39    memory_resource& M = R;
40    {
41        static_assert(
42            std::is_same<decltype(M.allocate(0, 0)), void*>::value
43          , "Must be void*"
44          );
45        static_assert(
46            std::is_same<decltype(M.allocate(0)), void*>::value
47          , "Must be void*"
48          );
49    }
50    {
51        static_assert(
52            ! noexcept(M.allocate(0, 0))
53          , "Must not be noexcept."
54          );
55        static_assert(
56            ! noexcept(M.allocate(0))
57          , "Must not be noexcept."
58          );
59    }
60    {
61        int s = 42;
62        int a = 64;
63        void* p = M.allocate(s, a);
64        assert(P.alloc_count == 1);
65        assert(P.checkAlloc(p, s, a));
66
67        s = 128;
68        a = MaxAlignV;
69        p = M.allocate(s);
70        assert(P.alloc_count == 2);
71        assert(P.checkAlloc(p, s, a));
72    }
73#ifndef TEST_HAS_NO_EXCEPTIONS
74    {
75        TestResource R2;
76        auto& P2 = R2.getController();
77        P2.throw_on_alloc = true;
78        memory_resource& M2 = R2;
79        try {
80            M2.allocate(42);
81            assert(false);
82        } catch (TestException const&) {
83            // do nothing.
84        } catch (...) {
85            assert(false);
86        }
87    }
88#endif
89}
90