blob: 26cf903fe0d8ecdc6c96cff27ae32470178c2b4a [file] [log] [blame]
Eric Fiselier257fd692016-05-07 01:04:55 +00001//===----------------------------------------------------------------------===//
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& P = R2.getController();
77 P.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}