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, c++11
11// <vector>
12//  vector.bool
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 "min_allocator.h"
21
22int main()
23{
24    {
25        typedef std::vector<bool> C;
26        C c;
27#if TEST_STD_VER > 14
28        typedef C::reference Ref;
29        Ref r1 = c.emplace_back();
30        assert(c.size() == 1);
31        assert(c.front() == false);
32        r1 = true;
33        assert(c.front() == true);
34        r1 = false;
35        Ref r2 = c.emplace_back(true);
36        assert(c.size() == 2);
37        assert(c.front() == false);
38        assert(c.back() == true);
39        r2 = false;
40        assert(c.back() == false);
41        r2 = true;
42#else
43        c.emplace_back();
44        assert(c.size() == 1);
45        assert(c.front() == false);
46        c.emplace_back(true);
47        assert(c.size() == 2);
48        assert(c.front() == false);
49        assert(c.back() == true);
50#endif
51        c.emplace_back(true);
52        assert(c.size() == 3);
53        assert(c.front() == false);
54        assert(c[1] == true);
55        assert(c.back() == true);
56    }
57    {
58        typedef std::vector<bool, min_allocator<bool>> C;
59        C c;
60
61#if TEST_STD_VER > 14
62        typedef C::reference Ref;
63        Ref r1 = c.emplace_back();
64        assert(c.size() == 1);
65        assert(c.front() == false);
66        r1 = true;
67        assert(c.front() == true);
68        r1 = false;
69        Ref r2 = c.emplace_back(true);
70        assert(c.size() == 2);
71        assert(c.front() == false);
72        assert(c.back() == true);
73        r2 = false;
74        assert(c.back() == false);
75        r2 = true;
76#else
77        c.emplace_back();
78        assert(c.size() == 1);
79        assert(c.front() == false);
80        c.emplace_back(true);
81        assert(c.size() == 2);
82        assert(c.front() == false);
83        assert(c.back() == true);
84#endif
85        c.emplace_back(true);
86        assert(c.size() == 3);
87        assert(c.front() == false);
88        assert(c[1] == true);
89        assert(c.back() == true);
90    }
91}
92