summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities/utility/pairs
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2018-03-29 03:30:00 +0000
committerEric Fiselier <eric@efcs.ca>2018-03-29 03:30:00 +0000
commitf8aa23879e4719fbb040c59276dfec8f4854f9a1 (patch)
tree644e8221d557599f794d762da970d3fbb3effa26 /libcxx/test/std/utilities/utility/pairs
parent7456af88f4bf6c68291e9175565cdd87b94f907f (diff)
downloadbcm5719-llvm-f8aa23879e4719fbb040c59276dfec8f4854f9a1.tar.gz
bcm5719-llvm-f8aa23879e4719fbb040c59276dfec8f4854f9a1.zip
Move libc++ pair/tuple assign test to libcxx/ test directory.
Libc++ implements the pair& operator=(pair<U, V>) assignment operator using a single template that handles assignment from all tuple-like types. This patch moves the test for that to the libcxx test directory since it's non-standard. It also adds additional tests to the std/.../pair directory to test the standard behavior this template implements. llvm-svn: 328758
Diffstat (limited to 'libcxx/test/std/utilities/utility/pairs')
-rw-r--r--libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_const_pair_U_V.pass.cpp22
-rw-r--r--libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_rv_pair_U_V.pass.cpp16
-rw-r--r--libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_tuple.pass.cpp140
3 files changed, 38 insertions, 140 deletions
diff --git a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_const_pair_U_V.pass.cpp b/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_const_pair_U_V.pass.cpp
index 132443f66a7..3ee6f0755a8 100644
--- a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_const_pair_U_V.pass.cpp
+++ b/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_const_pair_U_V.pass.cpp
@@ -16,6 +16,11 @@
#include <utility>
#include <cassert>
+#include "test_macros.h"
+#if TEST_STD_VER >= 11
+#include "archetypes.hpp"
+#endif
+
int main()
{
{
@@ -27,4 +32,21 @@ int main()
assert(p2.first == 3);
assert(p2.second == 4);
}
+#if TEST_STD_VER >= 11
+ {
+ using C = TestTypes::TestType;
+ using P = std::pair<int, C>;
+ using T = std::pair<long, C>;
+ const T t(42, -42);
+ P p(101, 101);
+ C::reset_constructors();
+ p = t;
+ assert(C::constructed == 0);
+ assert(C::assigned == 1);
+ assert(C::copy_assigned == 1);
+ assert(C::move_assigned == 0atu);
+ assert(p.first == 42);
+ assert(p.second.value == -42);
+ }
+#endif
}
diff --git a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_rv_pair_U_V.pass.cpp b/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_rv_pair_U_V.pass.cpp
index 76dfc3f65a2..b7a89a84460 100644
--- a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_rv_pair_U_V.pass.cpp
+++ b/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_rv_pair_U_V.pass.cpp
@@ -18,6 +18,7 @@
#include <utility>
#include <memory>
#include <cassert>
+#include <archetypes.hpp>
struct Base
{
@@ -40,4 +41,19 @@ int main()
assert(p2.first == nullptr);
assert(p2.second == 4);
}
+ {
+ using C = TestTypes::TestType;
+ using P = std::pair<int, C>;
+ using T = std::pair<long, C>;
+ T t(42, -42);
+ P p(101, 101);
+ C::reset_constructors();
+ p = std::move(t);
+ assert(C::constructed == 0);
+ assert(C::assigned == 1);
+ assert(C::copy_assigned == 0);
+ assert(C::move_assigned == 1);
+ assert(p.first == 42);
+ assert(p.second.value == -42);
+ }
}
diff --git a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_tuple.pass.cpp b/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_tuple.pass.cpp
deleted file mode 100644
index ef7bebcf5c2..00000000000
--- a/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_tuple.pass.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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
-
-// <utility>
-
-// template <class T1, class T2> struct pair
-
-// template<class U, class V> pair& operator=(tuple<U, V>&& p);
-
-#include <utility>
-#include <tuple>
-#include <array>
-#include <memory>
-#include <cassert>
-
-// Clang warns about missing braces when initializing std::array.
-#if defined(__clang__)
-#pragma clang diagnostic ignored "-Wmissing-braces"
-#endif
-
-struct CountingType {
- static int constructed;
- static int copy_constructed;
- static int move_constructed;
- static int assigned;
- static int copy_assigned;
- static int move_assigned;
- static void reset() {
- constructed = copy_constructed = move_constructed = 0;
- assigned = copy_assigned = move_assigned = 0;
- }
- CountingType() : value(0) { ++constructed; }
- CountingType(int v) : value(v) { ++constructed; }
- CountingType(CountingType const& o) : value(o.value) { ++constructed; ++copy_constructed; }
- CountingType(CountingType&& o) : value(o.value) { ++constructed; ++move_constructed; o.value = -1;}
-
- CountingType& operator=(CountingType const& o) {
- ++assigned;
- ++copy_assigned;
- value = o.value;
- return *this;
- }
- CountingType& operator=(CountingType&& o) {
- ++assigned;
- ++move_assigned;
- value = o.value;
- o.value = -1;
- return *this;
- }
- int value;
-};
-int CountingType::constructed;
-int CountingType::copy_constructed;
-int CountingType::move_constructed;
-int CountingType::assigned;
-int CountingType::copy_assigned;
-int CountingType::move_assigned;
-
-int main()
-{
- using C = CountingType;
- {
- using P = std::pair<int, C>;
- using T = std::tuple<int, C>;
- T t(42, C{42});
- P p(101, C{101});
- C::reset();
- p = t;
- assert(C::constructed == 0);
- assert(C::assigned == 1);
- assert(C::copy_assigned == 1);
- assert(C::move_assigned == 0);
- assert(p.first == 42);
- assert(p.second.value == 42);
- }
- {
- using P = std::pair<int, C>;
- using T = std::tuple<int, C>;
- T t(42, -42);
- P p(101, 101);
- C::reset();
- p = std::move(t);
- assert(C::constructed == 0);
- assert(C::assigned == 1);
- assert(C::copy_assigned == 0);
- assert(C::move_assigned == 1);
- assert(p.first == 42);
- assert(p.second.value == -42);
- }
- {
- using P = std::pair<C, C>;
- using T = std::array<C, 2>;
- T t = {42, -42};
- P p{101, 101};
- C::reset();
- p = t;
- assert(C::constructed == 0);
- assert(C::assigned == 2);
- assert(C::copy_assigned == 2);
- assert(C::move_assigned == 0);
- assert(p.first.value == 42);
- assert(p.second.value == -42);
- }
- {
- using P = std::pair<C, C>;
- using T = std::array<C, 2>;
- T t = {42, -42};
- P p{101, 101};
- C::reset();
- p = t;
- assert(C::constructed == 0);
- assert(C::assigned == 2);
- assert(C::copy_assigned == 2);
- assert(C::move_assigned == 0);
- assert(p.first.value == 42);
- assert(p.second.value == -42);
- }
- {
- using P = std::pair<C, C>;
- using T = std::array<C, 2>;
- T t = {42, -42};
- P p{101, 101};
- C::reset();
- p = std::move(t);
- assert(C::constructed == 0);
- assert(C::assigned == 2);
- assert(C::copy_assigned == 0);
- assert(C::move_assigned == 2);
- assert(p.first.value == 42);
- assert(p.second.value == -42);
- }
-}
OpenPOWER on IntegriCloud