diff options
author | Eric Fiselier <eric@efcs.ca> | 2015-02-10 16:48:45 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2015-02-10 16:48:45 +0000 |
commit | 54519a6be9296fb115b949f1f0785d9cbfacc7c5 (patch) | |
tree | d99921a0bd8162f333fba7fe5ecd741c09e89805 /libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con | |
parent | 51544023a955929cbb3d105421b2e59f6be43964 (diff) | |
download | bcm5719-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/func.wrap/func.wrap.func/func.wrap.func.con')
3 files changed, 21 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); + } } |