• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
A(int i,double d)30     A(int i, double d)
31         : i_(i), d_(d) {}
32 
A(A && a)33     A(A&& a)
34         : i_(a.i_),
35           d_(a.d_)
36     {
37         a.i_ = 0;
38         a.d_ = 0;
39     }
40 
operator =(A && a)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 
geti() const50     int geti() const {return i_;}
getd() const51     double getd() const {return d_;}
52 };
53 
54 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
55 
main()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