summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities/function.objects
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/std/utilities/function.objects')
-rw-r--r--libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp66
-rw-r--r--libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp (renamed from libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp)62
2 files changed, 100 insertions, 28 deletions
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
index aa6b743b523..403d646f421 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: c++98, c++03
+
// <functional>
// class function<R(ArgTypes...)>
@@ -14,8 +16,10 @@
// template<class A> function(allocator_arg_t, const A&, function&&);
#include <functional>
+#include <memory>
#include <cassert>
+#include "test_macros.h"
#include "min_allocator.h"
#include "count_new.hpp"
@@ -46,23 +50,57 @@ public:
int A::count = 0;
+int g(int) { return 0; }
+
int main()
{
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
assert(globalMemCounter.checkOutstandingNewEq(0));
{
- std::function<int(int)> f = A();
- assert(A::count == 1);
- assert(globalMemCounter.checkOutstandingNewEq(1));
- assert(f.target<A>());
- assert(f.target<int(*)(int)>() == 0);
- std::function<int(int)> f2(std::allocator_arg, bare_allocator<A>(), std::move(f));
- assert(A::count == 1);
- assert(globalMemCounter.checkOutstandingNewEq(1));
- assert(f2.target<A>());
- assert(f2.target<int(*)(int)>() == 0);
- assert(f.target<A>() == 0);
- assert(f.target<int(*)(int)>() == 0);
+ std::function<int(int)> f = A();
+ assert(A::count == 1);
+ assert(globalMemCounter.checkOutstandingNewEq(1));
+ assert(f.target<A>());
+ assert(f.target<int(*)(int)>() == 0);
+ std::function<int(int)> f2(std::allocator_arg, bare_allocator<A>(), std::move(f));
+ assert(A::count == 1);
+ assert(globalMemCounter.checkOutstandingNewEq(1));
+ assert(f2.target<A>());
+ assert(f2.target<int(*)(int)>() == 0);
+ assert(f.target<A>() == 0);
+ assert(f.target<int(*)(int)>() == 0);
+ }
+ assert(globalMemCounter.checkOutstandingNewEq(0));
+ {
+ // Test that moving a function constructed from a reference wrapper
+ // is done without allocating.
+ DisableAllocationGuard g;
+ using Ref = std::reference_wrapper<A>;
+ A a;
+ Ref aref(a);
+ std::function<int(int)> f(aref);
+ assert(A::count == 1);
+ assert(f.target<A>() == nullptr);
+ assert(f.target<Ref>());
+ std::function<int(int)> f2(std::allocator_arg, std::allocator<void>{},
+ std::move(f));
+ assert(A::count == 1);
+ assert(f2.target<A>() == nullptr);
+ assert(f2.target<Ref>());
+ assert(f.target<Ref>()); // f is unchanged because the target is small
+ }
+ {
+ // Test that moving a function constructed from a function pointer
+ // is done without allocating
+ DisableAllocationGuard guard;
+ using Ptr = int(*)(int);
+ Ptr p = g;
+ std::function<int(int)> f(p);
+ assert(f.target<A>() == nullptr);
+ assert(f.target<Ptr>());
+ std::function<int(int)> f2(std::allocator_arg, std::allocator<void>(),
+ std::move(f));
+ assert(f2.target<A>() == nullptr);
+ assert(f2.target<Ptr>());
+ assert(f.target<Ptr>()); // f is unchanged because the target is small
}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp
index f603da9dd13..387b371a933 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp
@@ -14,9 +14,11 @@
// function(const function& f);
#include <functional>
+#include <memory>
#include <cstdlib>
#include <cassert>
+#include "test_macros.h"
#include "count_new.hpp"
class A
@@ -98,21 +100,53 @@ int main()
assert(g.target<A>() == 0);
assert(!g);
}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if TEST_STD_VER >= 11
+ assert(globalMemCounter.checkOutstandingNewEq(0));
+ { // Test rvalue references
+ std::function<int(int)> f = A();
+ assert(A::count == 1);
+ assert(globalMemCounter.checkOutstandingNewEq(1));
+ assert(f.target<A>());
+ assert(f.target<int(*)(int)>() == 0);
+ std::function<int(int)> f2 = std::move(f);
+ assert(A::count == 1);
+ assert(globalMemCounter.checkOutstandingNewEq(1));
+ assert(f2.target<A>());
+ assert(f2.target<int(*)(int)>() == 0);
+ assert(f.target<A>() == 0);
+ assert(f.target<int(*)(int)>() == 0);
+ }
assert(globalMemCounter.checkOutstandingNewEq(0));
{
- std::function<int(int)> f = A();
- assert(A::count == 1);
- assert(globalMemCounter.checkOutstandingNewEq(1));
- assert(f.target<A>());
- assert(f.target<int(*)(int)>() == 0);
- std::function<int(int)> f2 = std::move(f);
- assert(A::count == 1);
- assert(globalMemCounter.checkOutstandingNewEq(1));
- assert(f2.target<A>());
- assert(f2.target<int(*)(int)>() == 0);
- assert(f.target<A>() == 0);
- assert(f.target<int(*)(int)>() == 0);
+ // Test that moving a function constructed from a reference wrapper
+ // is done without allocating.
+ DisableAllocationGuard g;
+ using Ref = std::reference_wrapper<A>;
+ A a;
+ Ref aref(a);
+ std::function<int(int)> f(aref);
+ assert(A::count == 1);
+ assert(f.target<A>() == nullptr);
+ assert(f.target<Ref>());
+ std::function<int(int)> f2(std::move(f));
+ assert(A::count == 1);
+ assert(f2.target<A>() == nullptr);
+ assert(f2.target<Ref>());
+ assert(f.target<Ref>()); // f is unchanged because the target is small
+ }
+ {
+ // Test that moving a function constructed from a function pointer
+ // is done without allocating
+ DisableAllocationGuard guard;
+ using Ptr = int(*)(int);
+ Ptr p = g;
+ std::function<int(int)> f(p);
+ assert(f.target<A>() == nullptr);
+ assert(f.target<Ptr>());
+ std::function<int(int)> f2(std::move(f));
+ assert(f2.target<A>() == nullptr);
+ assert(f2.target<Ptr>());
+ assert(f.target<Ptr>()); // f is unchanged because the target is small
}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#endif // TEST_STD_VER >= 11
}
OpenPOWER on IntegriCloud