xref: /llvm-project/libcxx/test/std/containers/sequences/vector.bool/reference/assign_copy.pass.cpp (revision d6cd4257e510ef54d2945cb2119e84cc5525438a)
15d2b8fa1SNikolas Klauser //===----------------------------------------------------------------------===//
25d2b8fa1SNikolas Klauser //
35d2b8fa1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45d2b8fa1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
55d2b8fa1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65d2b8fa1SNikolas Klauser //
75d2b8fa1SNikolas Klauser //===----------------------------------------------------------------------===//
85d2b8fa1SNikolas Klauser 
95d2b8fa1SNikolas Klauser // <vector>
105d2b8fa1SNikolas Klauser 
115d2b8fa1SNikolas Klauser // reference& operator=(const reference&)
125d2b8fa1SNikolas Klauser 
135d2b8fa1SNikolas Klauser #include <cassert>
145d2b8fa1SNikolas Klauser #include <vector>
15*d6cd4257SMark de Wever #include <utility>
165d2b8fa1SNikolas Klauser 
1798d3d5b5SNikolas Klauser #include "test_macros.h"
1898d3d5b5SNikolas Klauser 
test()1998d3d5b5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
205d2b8fa1SNikolas Klauser   std::vector<bool> vec;
215d2b8fa1SNikolas Klauser   typedef std::vector<bool>::reference Ref;
225d2b8fa1SNikolas Klauser   vec.push_back(true);
235d2b8fa1SNikolas Klauser   vec.push_back(false);
245d2b8fa1SNikolas Klauser   Ref ref1 = vec[0];
255d2b8fa1SNikolas Klauser   Ref ref2 = vec[1];
265d2b8fa1SNikolas Klauser   ref2 = ref1;
275d2b8fa1SNikolas Klauser   // Ref&
285d2b8fa1SNikolas Klauser   {
295d2b8fa1SNikolas Klauser     vec[0] = false;
305d2b8fa1SNikolas Klauser     vec[1] = true;
315d2b8fa1SNikolas Klauser     ref1 = ref2;
325d2b8fa1SNikolas Klauser     assert(vec[0]);
335d2b8fa1SNikolas Klauser     assert(vec[1]);
345d2b8fa1SNikolas Klauser   }
355d2b8fa1SNikolas Klauser   {
365d2b8fa1SNikolas Klauser     vec[0] = true;
375d2b8fa1SNikolas Klauser     vec[1] = false;
385d2b8fa1SNikolas Klauser     ref1 = ref2;
395d2b8fa1SNikolas Klauser     assert(!vec[0]);
405d2b8fa1SNikolas Klauser     assert(!vec[1]);
415d2b8fa1SNikolas Klauser   }
425d2b8fa1SNikolas Klauser   // Ref&&
435d2b8fa1SNikolas Klauser   {
445d2b8fa1SNikolas Klauser     vec[0] = false;
455d2b8fa1SNikolas Klauser     vec[1] = true;
465d2b8fa1SNikolas Klauser     ref1 = std::move(ref2);
475d2b8fa1SNikolas Klauser     assert(vec[0]);
485d2b8fa1SNikolas Klauser     assert(vec[1]);
495d2b8fa1SNikolas Klauser   }
505d2b8fa1SNikolas Klauser   {
515d2b8fa1SNikolas Klauser     vec[0] = true;
525d2b8fa1SNikolas Klauser     vec[1] = false;
535d2b8fa1SNikolas Klauser     ref1 = std::move(ref2);
545d2b8fa1SNikolas Klauser     assert(!vec[0]);
555d2b8fa1SNikolas Klauser     assert(!vec[1]);
565d2b8fa1SNikolas Klauser   }
575d2b8fa1SNikolas Klauser   // const Ref&
585d2b8fa1SNikolas Klauser   {
595d2b8fa1SNikolas Klauser     vec[0] = false;
605d2b8fa1SNikolas Klauser     vec[1] = true;
615d2b8fa1SNikolas Klauser     ref1 = static_cast<const Ref&>(ref2);
625d2b8fa1SNikolas Klauser     assert(vec[0]);
635d2b8fa1SNikolas Klauser     assert(vec[1]);
645d2b8fa1SNikolas Klauser   }
655d2b8fa1SNikolas Klauser   {
665d2b8fa1SNikolas Klauser     vec[0] = true;
675d2b8fa1SNikolas Klauser     vec[1] = false;
685d2b8fa1SNikolas Klauser     ref1 = static_cast<const Ref&>(ref2);
695d2b8fa1SNikolas Klauser     assert(!vec[0]);
705d2b8fa1SNikolas Klauser     assert(!vec[1]);
715d2b8fa1SNikolas Klauser   }
725d2b8fa1SNikolas Klauser   return true;
735d2b8fa1SNikolas Klauser }
745d2b8fa1SNikolas Klauser 
main(int,char **)755d2b8fa1SNikolas Klauser int main(int, char**) {
765d2b8fa1SNikolas Klauser   test();
7798d3d5b5SNikolas Klauser #if TEST_STD_VER > 17
7898d3d5b5SNikolas Klauser     static_assert(test());
7998d3d5b5SNikolas Klauser #endif
805d2b8fa1SNikolas Klauser 
815d2b8fa1SNikolas Klauser   return 0;
825d2b8fa1SNikolas Klauser }
83