construct.pass.cpp revision 73d21a4f0774d3fadab98e690619a359cfb160a3
130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//===----------------------------------------------------------------------===// 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// The LLVM Compiler Infrastructure 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// This file is distributed under the University of Illinois Open Source 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// License. See LICENSE.TXT for details. 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//===----------------------------------------------------------------------===// 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// <memory> 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// allocator: 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// template <class... Args> void construct(pointer p, Args&&... args); 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <memory> 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <new> 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <cstdlib> 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <cassert> 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint new_called = 0; 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid* operator new(std::size_t s) throw(std::bad_alloc) 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ++new_called; 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun assert(s == 3 * sizeof(int)); 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return std::malloc(s); 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid operator delete(void* p) throw() 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun --new_called; 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun std::free(p); 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint A_constructed = 0; 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct A 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int data; 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A() {++A_constructed;} 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A(const A&) {++A_constructed;} 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun explicit A(int) {++A_constructed;} 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A(int, int*) {++A_constructed;} 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ~A() {--A_constructed;} 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint move_only_constructed = 0; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass move_only 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int data; 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only(const move_only&); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only& operator=(const move_only&); 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only(move_only&); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only& operator=(move_only&); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only(move_only&&) {++move_only_constructed;} 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only& operator=(move_only&&) {} 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun operator std::__rv<move_only> () {return std::__rv<move_only>(*this);} 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun move_only(std::__rv<move_only>) {++move_only_constructed;} 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 73 move_only() {++move_only_constructed;} 74 ~move_only() {--move_only_constructed;} 75}; 76 77int main() 78{ 79 { 80 std::allocator<A> a; 81 assert(new_called == 0); 82 assert(A_constructed == 0); 83 84 A* ap = a.allocate(3); 85 assert(new_called == 1); 86 assert(A_constructed == 0); 87 88 a.construct(ap); 89 assert(new_called == 1); 90 assert(A_constructed == 1); 91 92 a.destroy(ap); 93 assert(new_called == 1); 94 assert(A_constructed == 0); 95 96 a.construct(ap, A()); 97 assert(new_called == 1); 98 assert(A_constructed == 1); 99 100 a.destroy(ap); 101 assert(new_called == 1); 102 assert(A_constructed == 0); 103 104 a.construct(ap, 5); 105 assert(new_called == 1); 106 assert(A_constructed == 1); 107 108 a.destroy(ap); 109 assert(new_called == 1); 110 assert(A_constructed == 0); 111 112 a.construct(ap, 5, (int*)0); 113 assert(new_called == 1); 114 assert(A_constructed == 1); 115 116 a.destroy(ap); 117 assert(new_called == 1); 118 assert(A_constructed == 0); 119 120 a.deallocate(ap, 3); 121 assert(new_called == 0); 122 assert(A_constructed == 0); 123 } 124 { 125 std::allocator<move_only> a; 126 assert(new_called == 0); 127 assert(move_only_constructed == 0); 128 129 move_only* ap = a.allocate(3); 130 assert(new_called == 1); 131 assert(move_only_constructed == 0); 132 133 a.construct(ap); 134 assert(new_called == 1); 135 assert(move_only_constructed == 1); 136 137 a.destroy(ap); 138 assert(new_called == 1); 139 assert(move_only_constructed == 0); 140 141 a.construct(ap, move_only()); 142 assert(new_called == 1); 143 assert(move_only_constructed == 1); 144 145 a.destroy(ap); 146 assert(new_called == 1); 147 assert(move_only_constructed == 0); 148 149 a.deallocate(ap, 3); 150 assert(new_called == 0); 151 assert(move_only_constructed == 0); 152 } 153} 154