1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier// UNSUPPORTED: c++98, c++03 11e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <utility> 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class T1, class T2> struct pair 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class U, class V> pair(pair<U, V>&& p); 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <utility> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <memory> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 22e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier#include "archetypes.hpp" 23e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier#include "test_convertible.hpp" 2492741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselierusing namespace ImplicitTypes; // Get implicitly archetypes 25e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 26e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiseliertemplate <class T1, class U1, 27e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier bool CanCopy = true, bool CanConvert = CanCopy> 28e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiseliervoid test_pair_rv() 29e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier{ 30e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using P1 = std::pair<T1, int>; 31e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using P2 = std::pair<int, T1>; 32e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using UP1 = std::pair<U1, int>&&; 33e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using UP2 = std::pair<int, U1>&&; 34e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(std::is_constructible<P1, UP1>::value == CanCopy, ""); 35e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(test_convertible<P1, UP1>() == CanConvert, ""); 36e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(std::is_constructible<P2, UP2>::value == CanCopy, ""); 37e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(test_convertible<P2, UP2>() == CanConvert, ""); 38e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier} 39e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct Base 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual ~Base() {} 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct Derived 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public Base 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 50e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 51e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiseliertemplate <class T, class U> 52e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselierstruct DPair : public std::pair<T, U> { 53e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using Base = std::pair<T, U>; 54e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using Base::Base; 55e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier}; 56e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 57e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselierstruct ExplicitT { 58e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr explicit ExplicitT(int x) : value(x) {} 59e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier int value; 60e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier}; 61e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 62e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselierstruct ImplicitT { 63e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr ImplicitT(int x) : value(x) {} 64e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier int value; 65e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier}; 66e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::pair<std::unique_ptr<Derived>, short> P1; 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::pair<std::unique_ptr<Base>, long> P2; 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant P1 p1(std::unique_ptr<Derived>(), 4); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant P2 p2 = std::move(p1); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(p2.first == nullptr); 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(p2.second == 4); 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 77e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { 78e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier // We allow derived types to use this constructor 79e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using P1 = DPair<long, long>; 80e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier using P2 = std::pair<int, int>; 81e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier P1 p1(42, 101); 82e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier P2 p2(std::move(p1)); 83e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier assert(p2.first == 42); 842b7279cb08dbec4ff3561b0714f62f887fc8f34dEric Fiselier assert(p2.second == 101); 85e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 86e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { 87e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, AllCtors>(); 88e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, AllCtors&>(); 89e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, AllCtors&&>(); 90e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, const AllCtors&>(); 91e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, const AllCtors&&>(); 92e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 9392741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors>(); 9492741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors&, true, false>(); 9592741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors&&, true, false>(); 9692741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, const ExplicitTypes::AllCtors&, true, false>(); 9792741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, const ExplicitTypes::AllCtors&&, true, false>(); 98e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 99e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<MoveOnly, MoveOnly>(); 100e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<MoveOnly, MoveOnly&, false>(); 101e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<MoveOnly, MoveOnly&&>(); 102e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 10392741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly>(); // copy construction 10492741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly&, false>(); 10592741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly&&, true, false>(); 106e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 107e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<CopyOnly, CopyOnly>(); 108e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<CopyOnly, CopyOnly&>(); 109e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<CopyOnly, CopyOnly&&>(); 110e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 11192741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly>(); 11292741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly&, true, false>(); 11392741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly&&, true, false>(); 114e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 115e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable, NonCopyable, false>(); 116e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable, NonCopyable&, false>(); 117e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable, NonCopyable&&, false>(); 118e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable, const NonCopyable&, false>(); 119e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable, const NonCopyable&&, false>(); 120e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 121e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { // Test construction of references 122e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable&, NonCopyable&>(); 123e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable&, NonCopyable&&>(); 124e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable&, NonCopyable const&, false>(); 125e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable const&, NonCopyable&&>(); 126e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<NonCopyable&&, NonCopyable&&>(); 127e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 128e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType&, int, false>(); 12992741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType&, int, false>(); 130e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier // Unfortunately the below conversions are allowed and create dangling 131e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier // references. 132e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier //test_pair_rv<ConvertingType&&, int>(); 133e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier //test_pair_rv<ConvertingType const&, int>(); 134e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier //test_pair_rv<ConvertingType const&&, int>(); 135e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier // But these are not because the converting constructor is explicit. 13692741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType&&, int, false>(); 13792741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType const&, int, false>(); 13892741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType const&&, int, false>(); 139e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 140e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { 141e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<AllCtors, int, false>(); 14292741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::AllCtors, int, false>(); 143e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, int>(); 14492741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, int, true, false>(); 145e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 146e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, int>(); 147e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, ConvertingType>(); 148e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, ConvertingType const&>(); 149e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, ConvertingType&>(); 150e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier test_pair_rv<ConvertingType, ConvertingType&&>(); 151e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 15292741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, int, true, false>(); 15392741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, int&, true, false>(); 15492741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, const int&, true, false>(); 15592741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, int&&, true, false>(); 15692741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, const int&&, true, false>(); 157e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier 15892741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType>(); 15992741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType const&, true, false>(); 16092741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType&, true, false>(); 16192741e2493312b6ed4e6bcc2359f2381a80b6594Eric Fiselier test_pair_rv<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType&&, true, false>(); 162e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 163e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier#if TEST_STD_VER > 11 164e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { // explicit constexpr test 165e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr std::pair<int, int> p1(42, 43); 166e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr std::pair<ExplicitT, ExplicitT> p2(std::move(p1)); 167e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(p2.first.value == 42, ""); 168e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(p2.second.value == 43, ""); 169e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 170e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier { // implicit constexpr test 171e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr std::pair<int, int> p1(42, 43); 172e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier constexpr std::pair<ImplicitT, ImplicitT> p2 = std::move(p1); 173e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(p2.first.value == 42, ""); 174e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier static_assert(p2.second.value == 43, ""); 175e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier } 176e1445fd8edd9c19aae2af818f51d32f37d6c4d30Eric Fiselier#endif 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 178