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

// <utility>

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

// template <class U, class V>
//  explicit(see-below) constexpr pair(const pair<U, V>& p);

#include <utility>
#include <cassert>

#include "archetypes.h"
#include "test_convertible.h"

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

template <class T1, class U1, bool CanCopy = true, bool CanConvert = CanCopy>
TEST_CONSTEXPR_CXX20 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;
};

TEST_CONSTEXPR_CXX20 bool test() {
  {
    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 true;
}

int main(int, char**) {
  test();
#if TEST_STD_VER >= 20
  static_assert(test());
#endif

  return 0;
}
