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 // <vector> 11 12 // template <class... Args> void emplace_back(Args&&... args); 13 14 #include <vector> 15 #include <cassert> 16 #include "../../../stack_allocator.h" 17 #include "min_allocator.h" 18 #include "asan_testing.h" 19 20 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 21 22 class A 23 { 24 int i_; 25 double d_; 26 27 A(const A&); 28 A& operator=(const A&); 29 public: 30 A(int i, double d) 31 : i_(i), d_(d) {} 32 33 A(A&& a) 34 : i_(a.i_), 35 d_(a.d_) 36 { 37 a.i_ = 0; 38 a.d_ = 0; 39 } 40 41 A& operator=(A&& a) 42 { 43 i_ = a.i_; 44 d_ = a.d_; 45 a.i_ = 0; 46 a.d_ = 0; 47 return *this; 48 } 49 50 int geti() const {return i_;} 51 double getd() const {return d_;} 52 }; 53 54 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 55 56 int main() 57 { 58 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 59 { 60 std::vector<A> c; 61 c.emplace_back(2, 3.5); 62 assert(c.size() == 1); 63 assert(c.front().geti() == 2); 64 assert(c.front().getd() == 3.5); 65 assert(is_contiguous_container_asan_correct(c)); 66 c.emplace_back(3, 4.5); 67 assert(c.size() == 2); 68 assert(c.front().geti() == 2); 69 assert(c.front().getd() == 3.5); 70 assert(c.back().geti() == 3); 71 assert(c.back().getd() == 4.5); 72 assert(is_contiguous_container_asan_correct(c)); 73 } 74 { 75 std::vector<A, stack_allocator<A, 4> > c; 76 c.emplace_back(2, 3.5); 77 assert(c.size() == 1); 78 assert(c.front().geti() == 2); 79 assert(c.front().getd() == 3.5); 80 assert(is_contiguous_container_asan_correct(c)); 81 c.emplace_back(3, 4.5); 82 assert(c.size() == 2); 83 assert(c.front().geti() == 2); 84 assert(c.front().getd() == 3.5); 85 assert(c.back().geti() == 3); 86 assert(c.back().getd() == 4.5); 87 assert(is_contiguous_container_asan_correct(c)); 88 } 89 #if __cplusplus >= 201103L 90 { 91 std::vector<A, min_allocator<A>> c; 92 c.emplace_back(2, 3.5); 93 assert(c.size() == 1); 94 assert(c.front().geti() == 2); 95 assert(c.front().getd() == 3.5); 96 assert(is_contiguous_container_asan_correct(c)); 97 c.emplace_back(3, 4.5); 98 assert(c.size() == 2); 99 assert(c.front().geti() == 2); 100 assert(c.front().getd() == 3.5); 101 assert(c.back().geti() == 3); 102 assert(c.back().getd() == 4.5); 103 assert(is_contiguous_container_asan_correct(c)); 104 } 105 #endif 106 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 107 } 108