From 790df1454346085eaff37a6b2cade2d5ff762e7e Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Sun, 24 Jul 2016 04:16:40 +0000 Subject: [PATCH] Implement LWG 2393. Check for LValue-callability. llvm-svn: 276546 --- .../func.wrap.func/func.wrap.func.con/F.pass.cpp | 21 ++++++++++++++++++++ .../func.wrap.func.con/F_assign.pass.cpp | 21 ++++++++++++++++++++ .../func.wrap.func.con/alloc_F.pass.cpp | 23 ++++++++++++++++++++++ libcxx/www/cxx1z_status.html | 2 +- 4 files changed, 66 insertions(+), 1 deletion(-) 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 82a6f6c..fd296a7 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 @@ -16,6 +16,7 @@ #include #include +#include "test_macros.h" #include "count_new.hpp" class A @@ -49,6 +50,17 @@ int A::count = 0; int g(int) {return 0;} +#if TEST_STD_VER >= 11 +struct RValueCallable { + template + void operator()(Args&&...) && {} +}; +struct LValueCallable { + template + void operator()(Args&&...) & {} +}; +#endif + int main() { assert(globalMemCounter.checkOutstandingNewEq(0)); @@ -91,4 +103,13 @@ int main() std::function f(static_cast(0)); assert(!f); } +#if TEST_STD_VER >= 11 + { + using Fn = std::function; + static_assert(std::is_constructible::value, ""); + static_assert(std::is_constructible::value, ""); + static_assert(!std::is_constructible::value, ""); + static_assert(!std::is_constructible::value, ""); + } +#endif } 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 11716e7..e927ad4 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 @@ -19,6 +19,7 @@ #include #include +#include "test_macros.h" #include "count_new.hpp" class A @@ -52,6 +53,17 @@ int A::count = 0; int g(int) {return 0;} +#if TEST_STD_VER >= 11 +struct RValueCallable { + template + void operator()(Args&&...) && {} +}; +struct LValueCallable { + template + void operator()(Args&&...) & {} +}; +#endif + int main() { assert(globalMemCounter.checkOutstandingNewEq(0)); @@ -95,4 +107,13 @@ int main() assert(f.target() != 0); f(1); } +#if TEST_STD_VER >= 11 + { + using Fn = std::function; + static_assert(std::is_assignable::value, ""); + static_assert(std::is_assignable::value, ""); + static_assert(!std::is_assignable::value, ""); + static_assert(!std::is_assignable::value, ""); + } +#endif } 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 352ecfc..e662b6c 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 @@ -16,11 +16,24 @@ #include #include +#include "test_macros.h" #include "min_allocator.h" #include "test_allocator.h" #include "count_new.hpp" #include "../function_types.h" + +#if TEST_STD_VER >= 11 +struct RValueCallable { + template + void operator()(Args&&...) && {} +}; +struct LValueCallable { + template + void operator()(Args&&...) & {} +}; +#endif + class DummyClass {}; template @@ -103,4 +116,14 @@ int main() non_default_test_allocator non_default_alloc(42); test_for_alloc(non_default_alloc); } +#if TEST_STD_VER >= 11 + { + using Fn = std::function; + static_assert(std::is_constructible, LValueCallable&>::value, ""); + static_assert(std::is_constructible, LValueCallable>::value, ""); + static_assert(!std::is_constructible, RValueCallable&>::value, ""); + static_assert(!std::is_constructible, RValueCallable>::value, ""); + } +#endif + } diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html index db3eb83..5df7c98 100644 --- a/libcxx/www/cxx1z_status.html +++ b/libcxx/www/cxx1z_status.html @@ -265,7 +265,7 @@ 2310Public exposition only member in std::arrayOuluComplete 2312tuple's constructor constraints need to be phrased more preciselyOuluComplete 2328Rvalue stream extraction should use perfect forwardingOuluComplete - 2393std::function's Callable definition is brokenOulu + 2393std::function's Callable definition is brokenOuluComplete 2422std::numeric_limits<T>::is_modulo description: "most machines" errataOuluComplete 2426Issue about compare_exchangeOulu 2436Comparators for associative containers should always be CopyConstructibleOuluComplete -- 2.7.4