diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits --- a/libcxx/include/type_traits +++ b/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> {}; diff --git a/libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm b/libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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 + + +template +void test() { + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); + static_assert(std::is_pointer::value, ""); +} + +@class Foo; + +int main(int, char**) { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + + return 0; +}