libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

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 }