//===----------------------------------------------------------------------===// // // 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 // // template struct pair // template EXPLICIT constexpr pair(const pair& p); #include #include #include "archetypes.hpp" #include "test_convertible.hpp" using namespace ImplicitTypes; // Get implicitly archetypes template void test_pair_const() { using P1 = std::pair; using P2 = std::pair; using UP1 = std::pair const&; using UP2 = std::pair const&; static_assert(std::is_constructible::value == CanCopy, ""); static_assert(test_convertible() == CanConvert, ""); static_assert(std::is_constructible::value == CanCopy, ""); static_assert(test_convertible() == CanConvert, ""); } template struct DPair : public std::pair { using Base = std::pair; using Base::Base; }; struct ExplicitT { constexpr explicit ExplicitT(int x) : value(x) {} constexpr explicit ExplicitT(ExplicitT const& o) : value(o.value) {} int value; }; struct ImplicitT { constexpr ImplicitT(int x) : value(x) {} constexpr ImplicitT(ImplicitT const& o) : value(o.value) {} int value; }; int main() { { typedef std::pair P1; typedef std::pair P2; const P1 p1(3, 4); const P2 p2 = p1; assert(p2.first == 3); assert(p2.second == 4); } { // We allow derived types to use this constructor using P1 = DPair; using P2 = std::pair; P1 p1(42, 101); P2 p2(p1); assert(p2.first == 42); assert(p2.second = 101); } { test_pair_const(); // copy construction test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); // copy construction test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); // copy construction test_pair_const(); test_pair_const(); test_pair_const(); // copy construction test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); } { // Test construction of references test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); // Unfortunately the below conversions are allowed and create dangling // references. //test_pair_const(); //test_pair_const(); //test_pair_const(); // But these are not because the converting constructor is explicit. test_pair_const(); test_pair_const(); test_pair_const(); } { test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); } #if TEST_STD_VER > 11 { typedef std::pair P1; typedef std::pair P2; constexpr P1 p1(3, 4); constexpr P2 p2 = p1; static_assert(p2.first == 3, ""); static_assert(p2.second == 4, ""); } { using P1 = std::pair; using P2 = std::pair; constexpr P1 p1(42, 101); constexpr P2 p2(p1); static_assert(p2.first.value == 42, ""); static_assert(p2.second.value == 101, ""); } { using P1 = std::pair; using P2 = std::pair; constexpr P1 p1(42, 101); constexpr P2 p2 = p1; static_assert(p2.first.value == 42, ""); static_assert(p2.second.value == 101, ""); } #endif }