//===----------------------------------------------------------------------===// // // 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 class tuple; // template // tuple& operator=(const tuple& u); // UNSUPPORTED: c++03 #include #include #include #include #include #include "propagate_value_category.hpp" struct TracksIntQuals { TracksIntQuals() : value(-1), value_category(VC_None), assigned(false) {} template ::type, TracksIntQuals>::value>::type> TracksIntQuals(Tp &&x) : value(x), value_category(getValueCategory()), assigned(false) { static_assert(std::is_same, int>::value, ""); } template ::type, TracksIntQuals>::value>::type> TracksIntQuals &operator=(Tp &&x) { static_assert(std::is_same, int>::value, ""); value = x; value_category = getValueCategory(); assigned = true; return *this; } void reset() { value = -1; value_category = VC_None; assigned = false; } bool checkConstruct(int expect, ValueCategory expect_vc) const { return value != 1 && value == expect && value_category == expect_vc && assigned == false; } bool checkAssign(int expect, ValueCategory expect_vc) const { return value != 1 && value == expect && value_category == expect_vc && assigned == true; } int value; ValueCategory value_category; bool assigned; }; template struct DerivedFromTup : Tup { using Tup::Tup; }; template void do_derived_assign_test() { using Tup1 = std::tuple; Tup1 t; auto reset = [&]() { std::get<0>(t) = -1; std::get<1>(t).reset(); }; { DerivedFromTup> d; std::get<0>(d) = 42; std::get<1>(d) = 101; t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); } reset(); { DerivedFromTup> d; std::get<0>(d) = 42; std::get<1>(d) = 101; t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); } reset(); { #ifdef _LIBCPP_VERSION // assignment from std::array is a libc++ extension DerivedFromTup> d; std::get<0>(d) = 42; std::get<1>(d) = 101; t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); #endif } } int main(int, char**) { do_derived_assign_test(); do_derived_assign_test(); return 0; }