//===----------------------------------------------------------------------===//
//
// 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, c++11, c++14
// UNSUPPORTED: libcpp-no-deduction-guides

// GCC's implementation of class template deduction is still immature and runs
// into issues with libc++. However GCC accepts this code when compiling
// against libstdc++.
// XFAIL: gcc

// <utility>

// Test that the constructors offered by std::pair are formulated
// so they're compatible with implicit deduction guides, or if that's not
// possible that they provide explicit guides to make it work.

#include <utility>
#include <memory>
#include <string>
#include <cassert>

#include "test_macros.h"
#include "archetypes.h"


// Overloads
// ---------------
// (1)  pair(const T1&, const T2&) -> pair<T1, T2>
// (2)  explicit pair(const T1&, const T2&) -> pair<T1, T2>
// (3)  pair(pair const& t) -> decltype(t)
// (4)  pair(pair&& t) -> decltype(t)
// (5)  pair(pair<U1, U2> const&) -> pair<U1, U2>
// (6)  explicit pair(pair<U1, U2> const&) -> pair<U1, U2>
// (7)  pair(pair<U1, U2> &&) -> pair<U1, U2>
// (8)  explicit pair(pair<U1, U2> &&) -> pair<U1, U2>
int main(int, char**)
{
  using E = ExplicitTestTypes::TestType;
  static_assert(!std::is_convertible<E const&, E>::value, "");
  { // Testing (1)
    int const x = 42;
    std::pair t1("abc", x);
    ASSERT_SAME_TYPE(decltype(t1), std::pair<const char*, int>);
  }
  { // Testing (2)
    std::pair p1(E{}, 42);
    ASSERT_SAME_TYPE(decltype(p1), std::pair<E, int>);

    const E t{};
    std::pair p2(t, E{});
    ASSERT_SAME_TYPE(decltype(p2), std::pair<E, E>);
  }
  { // Testing (3, 5)
    std::pair<double, decltype(nullptr)> const p(0.0, nullptr);
    std::pair p1(p);
    ASSERT_SAME_TYPE(decltype(p1), std::pair<double, decltype(nullptr)>);
  }
  { // Testing (3, 6)
    std::pair<E, decltype(nullptr)> const p(E{}, nullptr);
    std::pair p1(p);
    ASSERT_SAME_TYPE(decltype(p1), std::pair<E, decltype(nullptr)>);
  }
  { // Testing (4, 7)
    std::pair<std::string, void*> p("abc", nullptr);
    std::pair p1(std::move(p));
    ASSERT_SAME_TYPE(decltype(p1), std::pair<std::string, void*>);
  }
  { // Testing (4, 8)
    std::pair<std::string, E> p("abc", E{});
    std::pair p1(std::move(p));
    ASSERT_SAME_TYPE(decltype(p1), std::pair<std::string, E>);
  }

  return 0;
}
