1198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//===----------------------------------------------------------------------===//
2198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//
3198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//                     The LLVM Compiler Infrastructure
4198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//
5198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
6198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow// Source Licenses. See LICENSE.TXT for details.
7198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//
8198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//===----------------------------------------------------------------------===//
9198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow
10a3eac518e64aa0230894e4dde26c3f9714609e64Asiri Rathnayake// UNSUPPORTED: c++98, c++03, c++11
11198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow// <vector>
12198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow//  vector.bool
13198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow
143816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier// template <class... Args> reference emplace_back(Args&&... args);
154e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow// return type is 'reference' in C++17; 'void' before
16198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow
17198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow#include <vector>
18198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow#include <cassert>
194e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#include "test_macros.h"
20061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
21198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow
22198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clowint main()
23198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow{
24198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow    {
25198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        typedef std::vector<bool> C;
26198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        C c;
274e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#if TEST_STD_VER > 14
284e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        typedef C::reference Ref;
293816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        Ref r1 = c.emplace_back();
30198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 1);
31198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
323816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r1 = true;
333816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        assert(c.front() == true);
343816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r1 = false;
353816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        Ref r2 = c.emplace_back(true);
36198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 2);
37198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
38198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.back() == true);
393816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r2 = false;
403816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        assert(c.back() == false);
413816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r2 = true;
424e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#else
434e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        c.emplace_back();
444e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.size() == 1);
454e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.front() == false);
464e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        c.emplace_back(true);
474e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.size() == 2);
484e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.front() == false);
494e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.back() == true);
504e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#endif
51c79549b70e66c251c15dd145c964edb70fa2e2b3Dan Albert        c.emplace_back(true);
52198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 3);
53198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
54198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c[1] == true);
55198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.back() == true);
56198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow    }
57198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow    {
58198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        typedef std::vector<bool, min_allocator<bool>> C;
59198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        C c;
6084acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier
614e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#if TEST_STD_VER > 14
624e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        typedef C::reference Ref;
633816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        Ref r1 = c.emplace_back();
64198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 1);
65198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
663816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r1 = true;
673816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        assert(c.front() == true);
683816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r1 = false;
693816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        Ref r2 = c.emplace_back(true);
70198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 2);
71198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
72198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.back() == true);
733816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r2 = false;
743816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        assert(c.back() == false);
753816ef98b1665320bd5eba590c4906e9dbd070ccEric Fiselier        r2 = true;
764e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#else
774e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        c.emplace_back();
784e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.size() == 1);
794e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.front() == false);
804e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        c.emplace_back(true);
814e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.size() == 2);
824e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.front() == false);
834e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow        assert(c.back() == true);
844e42dc97f3cf3e63ef3e6a23cada1970259eb7eaMarshall Clow#endif
85c79549b70e66c251c15dd145c964edb70fa2e2b3Dan Albert        c.emplace_back(true);
86198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.size() == 3);
87198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.front() == false);
88198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c[1] == true);
89198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow        assert(c.back() == true);
90198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow    }
91198a2a59ee8e99365c8d4ef6d5346e6743f58cb1Marshall Clow}
92