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 KlauserTEST_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 Klauserint 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