//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // constexpr const tuple& operator=(tuple&&) const; // // Constraints: (is_assignable_v && ...) is true. // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 // test constraints #include #include #include #include "test_macros.h" #include "copy_move_types.h" static_assert(!std::is_assignable_v&, std::tuple&&>); static_assert(std::is_assignable_v&, std::tuple&&>); static_assert(std::is_assignable_v&, std::tuple&&>); static_assert(!std::is_assignable_v&, std::tuple&&>); // this is fallback to tuple's const copy assignment static_assert(std::is_assignable_v&, std::tuple&&>); static_assert(!std::is_assignable_v&, std::tuple&&>); static_assert(std::is_assignable_v&, std::tuple&&>); static_assert(!std::is_assignable_v&, std::tuple&&>); constexpr bool test() { // reference types { int i1 = 1; int i2 = 2; double d1 = 3.0; double d2 = 5.0; std::tuple t1{i1, d1}; const std::tuple t2{i2, d2}; t2 = std::move(t1); assert(std::get<0>(t2) == 1); assert(std::get<1>(t2) == 3.0); } // user defined const move assignment { std::tuple t1{1}; const std::tuple t2{2}; t2 = std::move(t1); assert(std::get<0>(t2).val == 1); } // make sure the right assignment operator of the type in the tuple is used { std::tuple t1{}; const std::tuple t2{}; t2 = std::move(t1); assert(std::get<0>(t2).constMoveAssign == 1); assert(std::get<1>(t2).constCopyAssign == 1); } return true; } int main(int, char**) { test(); // gcc cannot have mutable member in constant expression #if !defined(TEST_COMPILER_GCC) static_assert(test()); #endif return 0; }