• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
11 // UNSUPPORTED: libcpp-no-deduction-guides
12 
13 // GCC's implementation of class template deduction is still immature and runs
14 // into issues with libc++. However GCC accepts this code when compiling
15 // against libstdc++.
16 // XFAIL: gcc
17 
18 // <utility>
19 
20 // Test that the constructors offered by std::pair are formulated
21 // so they're compatible with implicit deduction guides, or if that's not
22 // possible that they provide explicit guides to make it work.
23 
24 #include <utility>
25 #include <memory>
26 #include <string>
27 #include <cassert>
28 
29 #include "test_macros.h"
30 #include "archetypes.hpp"
31 
32 
33 // Overloads
34 // ---------------
35 // (1)  pair(const T1&, const T2&) -> pair<T1, T2>
36 // (2)  explicit pair(const T1&, const T2&) -> pair<T1, T2>
37 // (3)  pair(pair const& t) -> decltype(t)
38 // (4)  pair(pair&& t) -> decltype(t)
39 // (5)  pair(pair<U1, U2> const&) -> pair<U1, U2>
40 // (6)  explicit pair(pair<U1, U2> const&) -> pair<U1, U2>
41 // (7)  pair(pair<U1, U2> &&) -> pair<U1, U2>
42 // (8)  explicit pair(pair<U1, U2> &&) -> pair<U1, U2>
main()43 int main()
44 {
45   using E = ExplicitTestTypes::TestType;
46   static_assert(!std::is_convertible<E const&, E>::value, "");
47   { // Testing (1)
48     int const x = 42;
49     std::pair t1("abc", x);
50     ASSERT_SAME_TYPE(decltype(t1), std::pair<const char*, int>);
51   }
52   { // Testing (2)
53     std::pair p1(E{}, 42);
54     ASSERT_SAME_TYPE(decltype(p1), std::pair<E, int>);
55 
56     const E t{};
57     std::pair p2(t, E{});
58     ASSERT_SAME_TYPE(decltype(p2), std::pair<E, E>);
59   }
60   { // Testing (3, 5)
61     std::pair<double, decltype(nullptr)> const p(0.0, nullptr);
62     std::pair p1(p);
63     ASSERT_SAME_TYPE(decltype(p1), std::pair<double, decltype(nullptr)>);
64   }
65   { // Testing (3, 6)
66     std::pair<E, decltype(nullptr)> const p(E{}, nullptr);
67     std::pair p1(p);
68     ASSERT_SAME_TYPE(decltype(p1), std::pair<E, decltype(nullptr)>);
69   }
70   { // Testing (4, 7)
71     std::pair<std::string, void*> p("abc", nullptr);
72     std::pair p1(std::move(p));
73     ASSERT_SAME_TYPE(decltype(p1), std::pair<std::string, void*>);
74   }
75   { // Testing (4, 8)
76     std::pair<std::string, E> p("abc", E{});
77     std::pair p1(std::move(p));
78     ASSERT_SAME_TYPE(decltype(p1), std::pair<std::string, E>);
79   }
80 }
81