Index: libcxx/include/type_traits =================================================================== --- libcxx/include/type_traits +++ libcxx/include/type_traits @@ -784,6 +784,11 @@ template struct __libcpp_is_pointer : public false_type {}; template struct __libcpp_is_pointer<_Tp*> : public true_type {}; +#if defined(_LIBCPP_HAS_OBJC_ARC) +template struct __libcpp_is_pointer<_Tp* __weak> : public true_type {}; +template struct __libcpp_is_pointer<_Tp* __autoreleasing> : public true_type {}; +template struct __libcpp_is_pointer<_Tp* __unsafe_unretained> : public true_type {}; +#endif template struct _LIBCPP_TEMPLATE_VIS is_pointer : public __libcpp_is_pointer::type> {}; Index: libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm =================================================================== --- /dev/null +++ libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// 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_pointer + +// Test that we correctly handle Objective-C++ ARC qualifiers on pointers. + +#include + + +static_assert(std::is_pointer<__weak id>::value, ""); +static_assert(std::is_pointer<__strong id>::value, ""); +static_assert(std::is_pointer<__autoreleasing id>::value, ""); +static_assert(std::is_pointer<__unsafe_unretained id>::value, ""); + +int main(int, char**) { + return 0; +}