xref: /llvm-project/libcxx/test/std/containers/sequences/vector.bool/reference/assign_copy.pass.cpp (revision 5d2b8fa155a57cf863ec2e3e367c663431ee8c31)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <vector>
10 
11 // reference& operator=(const reference&)
12 
13 #include <cassert>
14 #include <vector>
15 
16 bool test() {
17   std::vector<bool> vec;
18   typedef std::vector<bool>::reference Ref;
19   vec.push_back(true);
20   vec.push_back(false);
21   Ref ref1 = vec[0];
22   Ref ref2 = vec[1];
23   ref2 = ref1;
24   // Ref&
25   {
26     vec[0] = false;
27     vec[1] = true;
28     ref1 = ref2;
29     assert(vec[0]);
30     assert(vec[1]);
31   }
32   {
33     vec[0] = true;
34     vec[1] = false;
35     ref1 = ref2;
36     assert(!vec[0]);
37     assert(!vec[1]);
38   }
39   // Ref&&
40   {
41     vec[0] = false;
42     vec[1] = true;
43     ref1 = std::move(ref2);
44     assert(vec[0]);
45     assert(vec[1]);
46   }
47   {
48     vec[0] = true;
49     vec[1] = false;
50     ref1 = std::move(ref2);
51     assert(!vec[0]);
52     assert(!vec[1]);
53   }
54   // const Ref&
55   {
56     vec[0] = false;
57     vec[1] = true;
58     ref1 = static_cast<const Ref&>(ref2);
59     assert(vec[0]);
60     assert(vec[1]);
61   }
62   {
63     vec[0] = true;
64     vec[1] = false;
65     ref1 = static_cast<const Ref&>(ref2);
66     assert(!vec[0]);
67     assert(!vec[1]);
68   }
69   return true;
70 }
71 
72 int main(int, char**) {
73   test();
74 
75   return 0;
76 }
77