diff options
Diffstat (limited to 'test/std/utilities/utility/pairs')
4 files changed, 83 insertions, 3 deletions
diff --git a/test/std/utilities/utility/pairs/pair.astuple/tuple_element.fail.cpp b/test/std/utilities/utility/pairs/pair.astuple/tuple_element.fail.cpp index 8e994126cc0d..4ca31f7debe8 100644 --- a/test/std/utilities/utility/pairs/pair.astuple/tuple_element.fail.cpp +++ b/test/std/utilities/utility/pairs/pair.astuple/tuple_element.fail.cpp @@ -18,5 +18,5 @@ int main() { typedef std::pair<int, short> T; - typename std::tuple_element<2, T>::type foo; // expected-error@utility:* {{Index out of bounds in std::tuple_element<std::pair<T1, T2>>}} + std::tuple_element<2, T>::type foo; // expected-error@utility:* {{Index out of bounds in std::tuple_element<std::pair<T1, T2>>}} } diff --git a/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp index ade8130d7822..715b65537761 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp @@ -71,7 +71,7 @@ int main() P1 p1(42, 101); P2 p2(p1); assert(p2.first == 42); - assert(p2.second = 101); + assert(p2.second == 101); } { test_pair_const<AllCtors, AllCtors>(); // copy construction diff --git a/test/std/utilities/utility/pairs/pairs.pair/implicit_deduction_guides.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/implicit_deduction_guides.pass.cpp new file mode 100644 index 000000000000..7933dd99c1f4 --- /dev/null +++ b/test/std/utilities/utility/pairs/pairs.pair/implicit_deduction_guides.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// 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.hpp" + + +// 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() +{ + 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>); + } +} diff --git a/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp index 2856190841c0..f5d3bb621deb 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp @@ -81,7 +81,7 @@ int main() P1 p1(42, 101); P2 p2(std::move(p1)); assert(p2.first == 42); - assert(p2.second = 101); + assert(p2.second == 101); } { test_pair_rv<AllCtors, AllCtors>(); |