From 48aa2e14a2bd35820a40e3ebe0d447be15219389 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 14 Oct 2016 07:19:52 +0000 Subject: [PATCH] Add void_t and invoke feature test macros git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@284209 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/functional | 2 + include/type_traits | 2 + .../invoke_feature_test_macro.pass.cpp | 39 +++++++++++++++++++ .../void_t_feature_test_macro.pass.cpp | 36 +++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 test/std/utilities/function.objects/func.invoke/invoke_feature_test_macro.pass.cpp create mode 100644 test/std/utilities/meta/meta.unary.prop.query/void_t_feature_test_macro.pass.cpp diff --git a/include/functional b/include/functional index 4adb8c92a..088be05ca 100644 --- a/include/functional +++ b/include/functional @@ -2635,6 +2635,8 @@ struct _LIBCPP_TYPE_VIS_ONLY hash : public __enum_hash<_Tp> #if _LIBCPP_STD_VER > 14 +#define __cpp_lib_invoke 201411 + template result_of_t<_Fn&&(_Args&&...)> invoke(_Fn&& __f, _Args&&... __args) diff --git a/include/type_traits b/include/type_traits index 43687a7c6..0f158fdb8 100644 --- a/include/type_traits +++ b/include/type_traits @@ -4599,6 +4599,8 @@ struct __has_operator_addressof #endif // _LIBCPP_CXX03_LANG #if _LIBCPP_STD_VER > 14 + +#define __cpp_lib_void_t 201411 template using void_t = void; # ifndef _LIBCPP_HAS_NO_VARIADICS diff --git a/test/std/utilities/function.objects/func.invoke/invoke_feature_test_macro.pass.cpp b/test/std/utilities/function.objects/func.invoke/invoke_feature_test_macro.pass.cpp new file mode 100644 index 000000000..aaac98474 --- /dev/null +++ b/test/std/utilities/function.objects/func.invoke/invoke_feature_test_macro.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// + +// template +// result_of_t invoke(F&&, Args&&...); + +#include +#include + +#include "test_macros.h" + +#if TEST_STD_VER <= 14 +# ifdef __cpp_lib_invoke +# error Feature test macro should be defined +# endif +#else +# ifndef __cpp_lib_invoke +# error Feature test macro not defined +# endif +# if __cpp_lib_invoke != 201411 +# error __cpp_lib_invoke has the wrong value +# endif +#endif + +int foo(int) { return 42; } + +int main() { +#if defined(__cpp_lib_invoke) + assert(std::invoke(foo, 101) == 42); +#endif +} \ No newline at end of file diff --git a/test/std/utilities/meta/meta.unary.prop.query/void_t_feature_test_macro.pass.cpp b/test/std/utilities/meta/meta.unary.prop.query/void_t_feature_test_macro.pass.cpp new file mode 100644 index 000000000..f188c098c --- /dev/null +++ b/test/std/utilities/meta/meta.unary.prop.query/void_t_feature_test_macro.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// type_traits + +// void_t + +#include + +#include "test_macros.h" + +#if TEST_STD_VER <= 14 +# ifdef __cpp_lib_void_t +# error Feature test macro should not be defined! +# endif +#else +# ifndef __cpp_lib_void_t +# error Feature test macro is not defined +# endif +# if __cpp_lib_void_t != 201411 +# error Feature test macro has the wrong value +# endif +#endif + +int main() +{ +#if defined(__cpp_lib_void_t) + static_assert(std::is_same_v, void>, ""); +#endif +}