Teach libc++ about the addressof() overloads it needs to work with
Objective-C Automatic Reference Counting, where Objective-C object pointers can have several different qualifiers (__strong, __weak, __autoreleasing, __unsafe_unretained). These addressof() overloads are only provided in ARC mode, and the __weak variant is conditionalized on having weak-reference support in the ARC runtime. For historical reasons, Clang provides these definitions itself, and defines the macro _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF to note when it as done so. The code belongs here, and this redundancy will be eliminated in the future. Addresses <rdar://problem/9658274>. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@133656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f5d76a7afc
commit
35d2fcfc8e
@ -157,6 +157,15 @@ typedef __char32_t char32_t;
|
|||||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Objective-C++ features (opt-in)
|
||||||
|
#if __has_feature(objc_arc)
|
||||||
|
#define _LIBCPP_HAS_OBJC_ARC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(objc_arc_weak)
|
||||||
|
#define _LIBCPP_HAS_OBJC_ARC_WEAK
|
||||||
|
#endif
|
||||||
|
|
||||||
// Inline namespaces are available in Clang regardless of C++ dialect.
|
// Inline namespaces are available in Clang regardless of C++ dialect.
|
||||||
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
|
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
|
||||||
#define _LIBCPP_END_NAMESPACE_STD } }
|
#define _LIBCPP_END_NAMESPACE_STD } }
|
||||||
|
@ -619,6 +619,46 @@ addressof(_Tp& __x) _NOEXCEPT
|
|||||||
return (_Tp*)&(char&)__x;
|
return (_Tp*)&(char&)__x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
|
||||||
|
// Objective-C++ Automatic Reference Counting uses qualified pointers
|
||||||
|
// that require special addressof() signatures. When
|
||||||
|
// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
|
||||||
|
// itself is providing these definitions. Otherwise, we provide them.
|
||||||
|
template <class _Tp>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__strong _Tp*
|
||||||
|
addressof(__strong _Tp& __x) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return &__x;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
|
||||||
|
template <class _Tp>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__weak _Tp*
|
||||||
|
addressof(__weak _Tp& __x) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return &__x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__autoreleasing _Tp*
|
||||||
|
addressof(__autoreleasing _Tp& __x) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return &__x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__unsafe_unretained _Tp*
|
||||||
|
addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return &__x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class _Tp> class allocator;
|
template <class _Tp> class allocator;
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user