//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // template class tuple; // template // tuple& operator=(const tuple& u); // UNSUPPORTED: c++98, 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(42, 101); t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); } reset(); { DerivedFromTup> d(42, 101); t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); } reset(); { DerivedFromTup> d; d[0] = 42; d[1] = 101; t = ValueCategoryCast(d); assert(std::get<0>(t) == 42); assert(std::get<1>(t).checkAssign(101, VC)); } } int main() { do_derived_assign_test(); do_derived_assign_test(); #if defined(_LIBCPP_VERSION) // Non-const copy assign and const move assign are libc++ extensions. do_derived_assign_test(); do_derived_assign_test(); #endif }