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