From aac928537794e41bbc1e84a9772483ab351865ff Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Tue, 2 Apr 2019 19:48:39 +0000 Subject: [PATCH] [libc++] Correctly handle Objective-C++ ARC qualifiers in std::is_pointer Summary: Otherwise, std::is_pointer works, but std::is_pointer (and others) don't work as expected. rdar://problem/49126333 Reviewers: ahatanak, EricWF Subscribers: christof, jkorous, dexonsmith, libcxx-commits Differential Revision: https://reviews.llvm.org/D60087 llvm-svn: 357517 --- libcxx/include/type_traits | 5 ++ .../libcxx/type_traits/is_pointer_objc.arc.pass.mm | 56 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 libcxx/test/libcxx/type_traits/is_pointer_objc.arc.pass.mm diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 2b79490..a42299f 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -784,6 +784,11 @@ _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_array_v 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 index 0000000..8f0e52b --- /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; +} -- 2.7.4