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> 155d2b8fa1SNikolas Klauser 16*c74059c5SNikolas Klauser #include "test_macros.h" 17*c74059c5SNikolas Klauser test()18*c74059c5SNikolas KlauserTEST_CONSTEXPR_CXX20 bool test() { 195d2b8fa1SNikolas Klauser std::vector<bool> vec; 205d2b8fa1SNikolas Klauser typedef std::vector<bool>::reference Ref; 215d2b8fa1SNikolas Klauser vec.push_back(true); 225d2b8fa1SNikolas Klauser vec.push_back(false); 235d2b8fa1SNikolas Klauser Ref ref1 = vec[0]; 245d2b8fa1SNikolas Klauser Ref ref2 = vec[1]; 255d2b8fa1SNikolas Klauser ref2 = ref1; 265d2b8fa1SNikolas Klauser // Ref& 275d2b8fa1SNikolas Klauser { 285d2b8fa1SNikolas Klauser vec[0] = false; 295d2b8fa1SNikolas Klauser vec[1] = true; 305d2b8fa1SNikolas Klauser ref1 = ref2; 315d2b8fa1SNikolas Klauser assert(vec[0]); 325d2b8fa1SNikolas Klauser assert(vec[1]); 335d2b8fa1SNikolas Klauser } 345d2b8fa1SNikolas Klauser { 355d2b8fa1SNikolas Klauser vec[0] = true; 365d2b8fa1SNikolas Klauser vec[1] = false; 375d2b8fa1SNikolas Klauser ref1 = ref2; 385d2b8fa1SNikolas Klauser assert(!vec[0]); 395d2b8fa1SNikolas Klauser assert(!vec[1]); 405d2b8fa1SNikolas Klauser } 415d2b8fa1SNikolas Klauser // Ref&& 425d2b8fa1SNikolas Klauser { 435d2b8fa1SNikolas Klauser vec[0] = false; 445d2b8fa1SNikolas Klauser vec[1] = true; 455d2b8fa1SNikolas Klauser ref1 = std::move(ref2); 465d2b8fa1SNikolas Klauser assert(vec[0]); 475d2b8fa1SNikolas Klauser assert(vec[1]); 485d2b8fa1SNikolas Klauser } 495d2b8fa1SNikolas Klauser { 505d2b8fa1SNikolas Klauser vec[0] = true; 515d2b8fa1SNikolas Klauser vec[1] = false; 525d2b8fa1SNikolas Klauser ref1 = std::move(ref2); 535d2b8fa1SNikolas Klauser assert(!vec[0]); 545d2b8fa1SNikolas Klauser assert(!vec[1]); 555d2b8fa1SNikolas Klauser } 565d2b8fa1SNikolas Klauser // const Ref& 575d2b8fa1SNikolas Klauser { 585d2b8fa1SNikolas Klauser vec[0] = false; 595d2b8fa1SNikolas Klauser vec[1] = true; 605d2b8fa1SNikolas Klauser ref1 = static_cast<const Ref&>(ref2); 615d2b8fa1SNikolas Klauser assert(vec[0]); 625d2b8fa1SNikolas Klauser assert(vec[1]); 635d2b8fa1SNikolas Klauser } 645d2b8fa1SNikolas Klauser { 655d2b8fa1SNikolas Klauser vec[0] = true; 665d2b8fa1SNikolas Klauser vec[1] = false; 675d2b8fa1SNikolas Klauser ref1 = static_cast<const Ref&>(ref2); 685d2b8fa1SNikolas Klauser assert(!vec[0]); 695d2b8fa1SNikolas Klauser assert(!vec[1]); 705d2b8fa1SNikolas Klauser } 715d2b8fa1SNikolas Klauser return true; 725d2b8fa1SNikolas Klauser } 735d2b8fa1SNikolas Klauser main(int,char **)745d2b8fa1SNikolas Klauserint main(int, char**) { 755d2b8fa1SNikolas Klauser test(); 76*c74059c5SNikolas Klauser #if TEST_STD_VER > 17 77*c74059c5SNikolas Klauser static_assert(test()); 78*c74059c5SNikolas Klauser #endif 795d2b8fa1SNikolas Klauser 805d2b8fa1SNikolas Klauser return 0; 815d2b8fa1SNikolas Klauser } 82