diff --git a/libcxx/include/__config b/libcxx/include/__config --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -463,6 +463,10 @@ #define _LIBCPP_HAS_OBJC_ARC_WEAK #endif +#if __has_extension(blocks) +# define _LIBCPP_HAS_OBJC_BLOCKS +#endif + #if !(__has_feature(cxx_relaxed_constexpr)) #define _LIBCPP_HAS_NO_CXX14_CONSTEXPR #endif diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1031,13 +1031,19 @@ = is_scalar<_Tp>::value; #endif +template struct __is_block : false_type {}; +#if defined(_LIBCPP_HAS_OBJC_BLOCKS) +template struct __is_block<_Rp (^)(_Args...)> : true_type {}; +#endif + // is_object template struct _LIBCPP_TEMPLATE_VIS is_object : public integral_constant::value || is_array<_Tp>::value || is_union<_Tp>::value || - is_class<_Tp>::value > {}; + is_class<_Tp>::value || + __is_block<_Tp>::value > {}; #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) template diff --git a/libcxx/test/libcxx/type_traits/is_object.objc.pass.mm b/libcxx/test/libcxx/type_traits/is_object.objc.pass.mm new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/type_traits/is_object.objc.pass.mm @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: c++98, c++03 + +// + +// std::is_object + +// Make sure we report that blocks are object types. + +#include + +struct Foo { }; +template struct Arg { }; + +static_assert(std::is_object::value, ""); +static_assert(std::is_object::value, ""); +static_assert(std::is_object)>::value, ""); +static_assert(std::is_object, Arg<1>)>::value, ""); +static_assert(std::is_object, Arg<1>, Arg<2>)>::value, ""); +static_assert(std::is_object::value, ""); +static_assert(std::is_object::value, ""); +static_assert(std::is_object)>::value, ""); +static_assert(std::is_object, Arg<1>)>::value, ""); +static_assert(std::is_object, Arg<1>, Arg<2>)>::value, ""); + +int main(int, char**) { + return 0; +}