//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++98, c++03

// <utility>

// template <class T1, class T2> struct pair

// template <class U, class V> EXPLICIT constexpr pair(const pair<U, V>& p);

#include <utility>
#include <cassert>

#include "archetypes.hpp"
#include "test_convertible.hpp"

#include "test_macros.h"
using namespace ImplicitTypes; // Get implicitly archetypes

template <class T1, class U1,
          bool CanCopy = true, bool CanConvert = CanCopy>
void test_pair_const()
{
    using P1 = std::pair<T1, int>;
    using P2 = std::pair<int, T1>;
    using UP1 = std::pair<U1, int> const&;
    using UP2 = std::pair<int, U1> const&;
    static_assert(std::is_constructible<P1, UP1>::value == CanCopy, "");
    static_assert(test_convertible<P1, UP1>() == CanConvert, "");
    static_assert(std::is_constructible<P2, UP2>::value == CanCopy, "");
    static_assert(test_convertible<P2,  UP2>() == CanConvert, "");
}

template <class T, class U>
struct DPair : public std::pair<T, U> {
  using Base = std::pair<T, U>;
  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(int, char**)
{
    {
        typedef std::pair<int, int> P1;
        typedef std::pair<double, long> 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<long, long>;
        using P2 = std::pair<int, int>;
        P1 p1(42, 101);
        P2 p2(p1);
        assert(p2.first == 42);
        assert(p2.second == 101);
    }
    {
        test_pair_const<AllCtors, AllCtors>(); // copy construction
        test_pair_const<AllCtors, AllCtors&>();
        test_pair_const<AllCtors, AllCtors&&>();
        test_pair_const<AllCtors, const AllCtors&>();
        test_pair_const<AllCtors, const AllCtors&&>();

        test_pair_const<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors>(); // copy construction
        test_pair_const<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors&, true, false>();
        test_pair_const<ExplicitTypes::AllCtors, ExplicitTypes::AllCtors&&, true, false>();
        test_pair_const<ExplicitTypes::AllCtors, const ExplicitTypes::AllCtors&, true, false>();
        test_pair_const<ExplicitTypes::AllCtors, const ExplicitTypes::AllCtors&&, true, false>();

        test_pair_const<MoveOnly, MoveOnly, false>(); // copy construction
        test_pair_const<MoveOnly, MoveOnly&, false>();
        test_pair_const<MoveOnly, MoveOnly&&, false>();

        test_pair_const<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly, false>(); // copy construction
        test_pair_const<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly&, false>();
        test_pair_const<ExplicitTypes::MoveOnly, ExplicitTypes::MoveOnly&&, false>();

        test_pair_const<CopyOnly, CopyOnly>();
        test_pair_const<CopyOnly, CopyOnly&>();
        test_pair_const<CopyOnly, CopyOnly&&>();

        test_pair_const<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly>();
        test_pair_const<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly&, true, false>();
        test_pair_const<ExplicitTypes::CopyOnly, ExplicitTypes::CopyOnly&&, true, false>();

        test_pair_const<NonCopyable, NonCopyable, false>();
        test_pair_const<NonCopyable, NonCopyable&, false>();
        test_pair_const<NonCopyable, NonCopyable&&, false>();
        test_pair_const<NonCopyable, const NonCopyable&, false>();
        test_pair_const<NonCopyable, const NonCopyable&&, false>();
    }

    { // Test construction of references
        test_pair_const<NonCopyable&, NonCopyable&>();
        test_pair_const<NonCopyable&, NonCopyable&&>();
        test_pair_const<NonCopyable&, NonCopyable const&, false>();
        test_pair_const<NonCopyable const&, NonCopyable&&>();
        test_pair_const<NonCopyable&&, NonCopyable&&, false>();

        test_pair_const<ConvertingType&, int, false>();
        test_pair_const<ExplicitTypes::ConvertingType&, int, false>();
        // Unfortunately the below conversions are allowed and create dangling
        // references.
        //test_pair_const<ConvertingType&&, int>();
        //test_pair_const<ConvertingType const&, int>();
        //test_pair_const<ConvertingType const&&, int>();
        // But these are not because the converting constructor is explicit.
        test_pair_const<ExplicitTypes::ConvertingType&&, int, false>();
        test_pair_const<ExplicitTypes::ConvertingType const&, int, false>();
        test_pair_const<ExplicitTypes::ConvertingType const&&, int, false>();

    }
    {
        test_pair_const<AllCtors, int, false>();
        test_pair_const<ExplicitTypes::AllCtors, int, false>();
        test_pair_const<ConvertingType, int>();
        test_pair_const<ExplicitTypes::ConvertingType, int, true, false>();

        test_pair_const<ConvertingType, int>();
        test_pair_const<ConvertingType, ConvertingType>();
        test_pair_const<ConvertingType, ConvertingType const&>();
        test_pair_const<ConvertingType, ConvertingType&>();
        test_pair_const<ConvertingType, ConvertingType&&>();

        test_pair_const<ExplicitTypes::ConvertingType, int, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, int&, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, const int&, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, int&&, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, const int&&, true, false>();

        test_pair_const<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType>();
        test_pair_const<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType const&, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType&, true, false>();
        test_pair_const<ExplicitTypes::ConvertingType, ExplicitTypes::ConvertingType&&, true, false>();
    }
#if TEST_STD_VER > 11
    {
        typedef std::pair<int, int> P1;
        typedef std::pair<double, long> P2;
        constexpr P1 p1(3, 4);
        constexpr P2 p2 = p1;
        static_assert(p2.first == 3, "");
        static_assert(p2.second == 4, "");
    }
    {
        using P1 = std::pair<int, int>;
        using P2 = std::pair<ExplicitT, ExplicitT>;
        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<int, int>;
        using P2 = std::pair<ImplicitT, ImplicitT>;
        constexpr P1 p1(42, 101);
        constexpr P2 p2 = p1;
        static_assert(p2.first.value == 42, "");
        static_assert(p2.second.value == 101, "");
    }
#endif

  return 0;
}
