summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities/function.objects
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2015-02-10 16:48:45 +0000
committerEric Fiselier <eric@efcs.ca>2015-02-10 16:48:45 +0000
commit54519a6be9296fb115b949f1f0785d9cbfacc7c5 (patch)
treed99921a0bd8162f333fba7fe5ecd741c09e89805 /libcxx/test/std/utilities/function.objects
parent51544023a955929cbb3d105421b2e59f6be43964 (diff)
downloadbcm5719-llvm-54519a6be9296fb115b949f1f0785d9cbfacc7c5.tar.gz
bcm5719-llvm-54519a6be9296fb115b949f1f0785d9cbfacc7c5.zip
[libcxx] Fix PR 22468 - std::function<void()> does not accept non-void-returning functions
Summary: The bug can be found here: http://llvm.org/bugs/show_bug.cgi?id=22468 `__invoke_void_return_wrapper` is needed to properly handle calling a function that returns a value but where the std::function return type is void. Without this '-Wsystem-headers' will cause `function::operator()(...)` to not compile. Reviewers: eugenis, K-ballo, mclow.lists Reviewed By: mclow.lists Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D7444 llvm-svn: 228705
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/F.pass.cpp6
-rw-r--r--libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp7
-rw-r--r--libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.pass.cpp8
-rw-r--r--libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke_no_variadics.pass.cpp60
4 files changed, 81 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
index f506af0e001..cd86e4cbf8e 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
@@ -81,4 +81,10 @@ int main()
assert(globalMemCounter.checkOutstandingNewEq(0));
assert(f.target<int (A::*)(int) const>() != 0);
}
+ {
+ std::function<void(int)> f(&g);
+ assert(f);
+ assert(f.target<int(*)(int)>() != 0);
+ f(1);
+ }
}
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
index 7784943cb13..11716e7946b 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
@@ -88,4 +88,11 @@ int main()
assert(globalMemCounter.checkOutstandingNewEq(0));
assert(f.target<int (A::*)(int) const>() != 0);
}
+ {
+ std::function<void(int)> f;
+ f = &g;
+ assert(f);
+ assert(f.target<int(*)(int)>() != 0);
+ f(1);
+ }
}
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.pass.cpp
index 17601db7c42..28e44a67a71 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.pass.cpp
@@ -89,4 +89,12 @@ int main()
fun(10);
}
#endif
+ {
+ std::function<void(int)> fun(std::allocator_arg,
+ test_allocator<int(*)(int)>(),
+ &g);
+ assert(fun);
+ assert(fun.target<int(*)(int)>() != 0);
+ fun(10);
+ }
}
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke_no_variadics.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke_no_variadics.pass.cpp
new file mode 100644
index 00000000000..c0a14fd96fc
--- /dev/null
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke_no_variadics.pass.cpp
@@ -0,0 +1,60 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+// <functional>
+
+// class function<R()>
+
+// Test that we properly return both values and void for all non-variadic
+// overloads of function::operator()(...)
+
+#define _LIBCPP_HAS_NO_VARIADICS
+#include <functional>
+#include <cassert>
+
+int foo0() { return 42; }
+int foo1(int) { return 42; }
+int foo2(int, int) { return 42; }
+int foo3(int, int, int) { return 42; }
+
+int main()
+{
+ {
+ std::function<int()> f(&foo0);
+ assert(f() == 42);
+ }
+ {
+ std::function<int(int)> f(&foo1);
+ assert(f(1) == 42);
+ }
+ {
+ std::function<int(int, int)> f(&foo2);
+ assert(f(1, 1) == 42);
+ }
+ {
+ std::function<int(int, int, int)> f(&foo3);
+ assert(f(1, 1, 1) == 42);
+ }
+ {
+ std::function<void()> f(&foo0);
+ f();
+ }
+ {
+ std::function<void(int)> f(&foo1);
+ f(1);
+ }
+ {
+ std::function<void(int, int)> f(&foo2);
+ f(1, 1);
+ }
+ {
+ std::function<void(int, int, int)> f(&foo3);
+ f(1, 1, 1);
+ }
+}
OpenPOWER on IntegriCloud