// -*- C++ -*- //===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // // template class variant; // variant(variant const&); #include #include #include "test_macros.h" struct NTCopy { constexpr NTCopy(int v) : value(v) {} NTCopy(const NTCopy &that) : value(that.value) {} NTCopy(NTCopy &&) = delete; int value; }; static_assert(!std::is_trivially_copy_constructible::value, ""); static_assert(std::is_copy_constructible::value, ""); struct TCopy { constexpr TCopy(int v) : value(v) {} TCopy(TCopy const &) = default; TCopy(TCopy &&) = delete; int value; }; static_assert(std::is_trivially_copy_constructible::value, ""); struct TCopyNTMove { constexpr TCopyNTMove(int v) : value(v) {} TCopyNTMove(const TCopyNTMove&) = default; TCopyNTMove(TCopyNTMove&& that) : value(that.value) { that.value = -1; } int value; }; static_assert(std::is_trivially_copy_constructible::value, ""); void test_copy_ctor_sfinae() { { using V = std::variant; static_assert(std::is_trivially_copy_constructible::value, ""); } { using V = std::variant; static_assert(!std::is_trivially_copy_constructible::value, ""); static_assert(std::is_copy_constructible::value, ""); } { using V = std::variant; static_assert(std::is_trivially_copy_constructible::value, ""); } { using V = std::variant; static_assert(std::is_trivially_copy_constructible::value, ""); } } void test_copy_ctor_basic() { { constexpr std::variant v(std::in_place_index<0>, 42); static_assert(v.index() == 0); constexpr std::variant v2 = v; static_assert(v2.index() == 0); static_assert(std::get<0>(v2) == 42); } { constexpr std::variant v(std::in_place_index<1>, 42); static_assert(v.index() == 1); constexpr std::variant v2 = v; static_assert(v2.index() == 1); static_assert(std::get<1>(v2) == 42); } { constexpr std::variant v(std::in_place_index<0>, 42); static_assert(v.index() == 0); constexpr std::variant v2(v); static_assert(v2.index() == 0); static_assert(std::get<0>(v2).value == 42); } { constexpr std::variant v(std::in_place_index<1>, 42); static_assert(v.index() == 1); constexpr std::variant v2(v); static_assert(v2.index() == 1); static_assert(std::get<1>(v2).value == 42); } { constexpr std::variant v(std::in_place_index<0>, 42); static_assert(v.index() == 0); constexpr std::variant v2(v); static_assert(v2.index() == 0); static_assert(std::get<0>(v2).value == 42); } { constexpr std::variant v(std::in_place_index<1>, 42); static_assert(v.index() == 1); constexpr std::variant v2(v); static_assert(v2.index() == 1); static_assert(std::get<1>(v2).value == 42); } } int main() { test_copy_ctor_basic(); test_copy_ctor_sfinae(); }