emplace_back.pass.cpp (4143B)
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 // UNSUPPORTED: c++98, c++03 11 12 // <vector> 13 14 // template <class... Args> reference emplace_back(Args&&... args); 15 // return type is 'reference' in C++17; 'void' before 16 17 #include <vector> 18 #include <cassert> 19 #include "test_macros.h" 20 #include "test_allocator.h" 21 #include "min_allocator.h" 22 #include "test_allocator.h" 23 #include "asan_testing.h" 24 25 class A 26 { 27 int i_; 28 double d_; 29 30 A(const A&); 31 A& operator=(const A&); 32 public: 33 A(int i, double d) 34 : i_(i), d_(d) {} 35 36 A(A&& a) 37 : i_(a.i_), 38 d_(a.d_) 39 { 40 a.i_ = 0; 41 a.d_ = 0; 42 } 43 44 A& operator=(A&& a) 45 { 46 i_ = a.i_; 47 d_ = a.d_; 48 a.i_ = 0; 49 a.d_ = 0; 50 return *this; 51 } 52 53 int geti() const {return i_;} 54 double getd() const {return d_;} 55 }; 56 57 int main() 58 { 59 { 60 std::vector<A> c; 61 #if TEST_STD_VER > 14 62 A& r1 = c.emplace_back(2, 3.5); 63 assert(c.size() == 1); 64 assert(&r1 == &c.back()); 65 assert(c.front().geti() == 2); 66 assert(c.front().getd() == 3.5); 67 assert(is_contiguous_container_asan_correct(c)); 68 A& r2 = c.emplace_back(3, 4.5); 69 assert(c.size() == 2); 70 assert(&r2 == &c.back()); 71 #else 72 c.emplace_back(2, 3.5); 73 assert(c.size() == 1); 74 assert(c.front().geti() == 2); 75 assert(c.front().getd() == 3.5); 76 assert(is_contiguous_container_asan_correct(c)); 77 c.emplace_back(3, 4.5); 78 assert(c.size() == 2); 79 #endif 80 assert(c.front().geti() == 2); 81 assert(c.front().getd() == 3.5); 82 assert(c.back().geti() == 3); 83 assert(c.back().getd() == 4.5); 84 assert(is_contiguous_container_asan_correct(c)); 85 } 86 { 87 std::vector<A, limited_allocator<A, 4> > c; 88 #if TEST_STD_VER > 14 89 A& r1 = c.emplace_back(2, 3.5); 90 assert(c.size() == 1); 91 assert(&r1 == &c.back()); 92 assert(c.front().geti() == 2); 93 assert(c.front().getd() == 3.5); 94 assert(is_contiguous_container_asan_correct(c)); 95 A& r2 = c.emplace_back(3, 4.5); 96 assert(c.size() == 2); 97 assert(&r2 == &c.back()); 98 #else 99 c.emplace_back(2, 3.5); 100 assert(c.size() == 1); 101 assert(c.front().geti() == 2); 102 assert(c.front().getd() == 3.5); 103 assert(is_contiguous_container_asan_correct(c)); 104 c.emplace_back(3, 4.5); 105 assert(c.size() == 2); 106 #endif 107 assert(c.front().geti() == 2); 108 assert(c.front().getd() == 3.5); 109 assert(c.back().geti() == 3); 110 assert(c.back().getd() == 4.5); 111 assert(is_contiguous_container_asan_correct(c)); 112 } 113 { 114 std::vector<A, min_allocator<A>> c; 115 #if TEST_STD_VER > 14 116 A& r1 = c.emplace_back(2, 3.5); 117 assert(c.size() == 1); 118 assert(&r1 == &c.back()); 119 assert(c.front().geti() == 2); 120 assert(c.front().getd() == 3.5); 121 assert(is_contiguous_container_asan_correct(c)); 122 A& r2 = c.emplace_back(3, 4.5); 123 assert(c.size() == 2); 124 assert(&r2 == &c.back()); 125 #else 126 c.emplace_back(2, 3.5); 127 assert(c.size() == 1); 128 assert(c.front().geti() == 2); 129 assert(c.front().getd() == 3.5); 130 assert(is_contiguous_container_asan_correct(c)); 131 c.emplace_back(3, 4.5); 132 assert(c.size() == 2); 133 #endif 134 assert(c.front().geti() == 2); 135 assert(c.front().getd() == 3.5); 136 assert(c.back().geti() == 3); 137 assert(c.back().getd() == 4.5); 138 assert(is_contiguous_container_asan_correct(c)); 139 } 140 { 141 std::vector<Tag_X, TaggingAllocator<Tag_X>> c; 142 c.emplace_back(); 143 assert(c.size() == 1); 144 c.emplace_back(1, 2, 3); 145 assert(c.size() == 2); 146 assert(is_contiguous_container_asan_correct(c)); 147 } 148 }