blob: 930da0b79b88f4d3e10720f71ad35126ef927649 [file] [log] [blame]
Howard Hinnantc52f43e2010-08-22 00:59:46 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc52f43e2010-08-22 00:59:46 +00007//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// allocator:
13// pointer allocate(size_type n, allocator<void>::const_pointer hint=0);
14
15#include <memory>
Howard Hinnantc52f43e2010-08-22 00:59:46 +000016#include <cassert>
17
Eric Fiseliera8312872018-03-22 04:42:56 +000018#include "test_macros.h"
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000019#include "count_new.hpp"
Howard Hinnantc52f43e2010-08-22 00:59:46 +000020
Howard Hinnantc52f43e2010-08-22 00:59:46 +000021
Eric Fiseliera8312872018-03-22 04:42:56 +000022#ifdef TEST_HAS_NO_ALIGNED_ALLOCATION
23static const bool UsingAlignedNew = false;
24#else
25static const bool UsingAlignedNew = true;
26#endif
27
28#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
29static const size_t MaxAligned = __STDCPP_DEFAULT_NEW_ALIGNMENT__;
30#else
31static const size_t MaxAligned = std::alignment_of<std::max_align_t>::value;
32#endif
33
34static const size_t OverAligned = MaxAligned * 2;
35
36
37template <size_t Align>
38struct TEST_ALIGNAS(Align) AlignedType {
39 char data;
40 static int constructed;
41 AlignedType() { ++constructed; }
42 AlignedType(AlignedType const&) { ++constructed; }
43 ~AlignedType() { --constructed; }
Howard Hinnantc52f43e2010-08-22 00:59:46 +000044};
Eric Fiseliera8312872018-03-22 04:42:56 +000045template <size_t Align>
46int AlignedType<Align>::constructed = 0;
Howard Hinnantc52f43e2010-08-22 00:59:46 +000047
Eric Fiseliera8312872018-03-22 04:42:56 +000048
49template <size_t Align>
50void test_aligned() {
51 typedef AlignedType<Align> T;
52 T::constructed = 0;
53 globalMemCounter.reset();
54 std::allocator<T> a;
55 const bool IsOverAlignedType = Align > MaxAligned;
56 const bool ExpectAligned = IsOverAlignedType && UsingAlignedNew;
57 {
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000058 assert(globalMemCounter.checkOutstandingNewEq(0));
Eric Fiseliera8312872018-03-22 04:42:56 +000059 assert(T::constructed == 0);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000060 globalMemCounter.last_new_size = 0;
Eric Fiseliera8312872018-03-22 04:42:56 +000061 globalMemCounter.last_new_align = 0;
62 T* volatile ap = a.allocate(3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000063 assert(globalMemCounter.checkOutstandingNewEq(1));
Eric Fiseliera8312872018-03-22 04:42:56 +000064 assert(globalMemCounter.checkNewCalledEq(1));
65 assert(globalMemCounter.checkAlignedNewCalledEq(ExpectAligned));
66 assert(globalMemCounter.checkLastNewSizeEq(3 * sizeof(T)));
67 assert(globalMemCounter.checkLastNewAlignEq(ExpectAligned ? Align : 0));
68 assert(T::constructed == 0);
69 globalMemCounter.last_delete_align = 0;
Howard Hinnantc52f43e2010-08-22 00:59:46 +000070 a.deallocate(ap, 3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000071 assert(globalMemCounter.checkOutstandingNewEq(0));
Eric Fiseliera8312872018-03-22 04:42:56 +000072 assert(globalMemCounter.checkDeleteCalledEq(1));
73 assert(globalMemCounter.checkAlignedDeleteCalledEq(ExpectAligned));
74 assert(globalMemCounter.checkLastDeleteAlignEq(ExpectAligned ? Align : 0));
75 assert(T::constructed == 0);
76 }
77 globalMemCounter.reset();
78 {
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000079 globalMemCounter.last_new_size = 0;
Eric Fiseliera8312872018-03-22 04:42:56 +000080 globalMemCounter.last_new_align = 0;
81 T* volatile ap2 = a.allocate(11, (const void*)5);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000082 assert(globalMemCounter.checkOutstandingNewEq(1));
Eric Fiseliera8312872018-03-22 04:42:56 +000083 assert(globalMemCounter.checkNewCalledEq(1));
84 assert(globalMemCounter.checkAlignedNewCalledEq(ExpectAligned));
85 assert(globalMemCounter.checkLastNewSizeEq(11 * sizeof(T)));
86 assert(globalMemCounter.checkLastNewAlignEq(ExpectAligned ? Align : 0));
87 assert(T::constructed == 0);
88 globalMemCounter.last_delete_align = 0;
89 a.deallocate(ap2, 11);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000090 assert(globalMemCounter.checkOutstandingNewEq(0));
Eric Fiseliera8312872018-03-22 04:42:56 +000091 assert(globalMemCounter.checkDeleteCalledEq(1));
92 assert(globalMemCounter.checkAlignedDeleteCalledEq(ExpectAligned));
93 assert(globalMemCounter.checkLastDeleteAlignEq(ExpectAligned ? Align : 0));
94 assert(T::constructed == 0);
95 }
96}
97
98int main() {
99 test_aligned<1>();
100 test_aligned<2>();
101 test_aligned<4>();
102 test_aligned<8>();
103 test_aligned<16>();
104 test_aligned<MaxAligned>();
105 test_aligned<OverAligned>();
106 test_aligned<OverAligned * 2>();
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000107}