//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // template // constexpr const tuple& operator=(pair&& u) const; // // - sizeof...(Types) is 2, // - is_assignable_v is true, and // - is_assignable_v is true // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 #include #include #include #include #include "test_macros.h" #include "copy_move_types.h" // test constraints // sizeof...(Types) != 2, static_assert(std::is_assignable_v&, std::pair&&>); static_assert(!std::is_assignable_v&, std::pair&&>); static_assert(!std::is_assignable_v&, std::pair&&>); static_assert(std::is_assignable_v, ConstMoveAssign>&, std::pair&&>); // is_assignable_v is false static_assert(!std::is_assignable_v, ConstMoveAssign>&, std::pair&&>); // is_assignable_v is false static_assert(!std::is_assignable_v, AssignableFrom>&, std::tuple&&>); constexpr bool test() { // reference types { int i1 = 1; int i2 = 2; long j1 = 3; long j2 = 4; std::pair t1{i1, i2}; const std::tuple t2{j1, j2}; t2 = std::move(t1); assert(std::get<0>(t2) == 1); assert(std::get<1>(t2) == 2); } // user defined const copy assignment { std::pair t1{1, 2}; const std::tuple, ConstMoveAssign> t2{3, 4}; t2 = std::move(t1); assert(std::get<0>(t2).v.val == 1); assert(std::get<1>(t2).val == 2); } // make sure the right assignment operator of the type in the tuple is used { std::pair t1{}; const std::tuple, AssignableFrom> t2{}; t2 = std::move(t1); assert(std::get<0>(t2).v.constMoveAssign == 1); assert(std::get<1>(t2).v.constMoveAssign == 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; }