1*4d6fc14bSjoerg // -*- C++ -*- 2*4d6fc14bSjoerg //===----------------------------------------------------------------------===// 3*4d6fc14bSjoerg // 4*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg // 8*4d6fc14bSjoerg //===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg #ifndef _LIBCPP___MEMORY_ADDRESSOF_H 11*4d6fc14bSjoerg #define _LIBCPP___MEMORY_ADDRESSOF_H 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg #include <__config> 14*4d6fc14bSjoerg 15*4d6fc14bSjoerg #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16*4d6fc14bSjoerg #pragma GCC system_header 17*4d6fc14bSjoerg #endif 18*4d6fc14bSjoerg 19*4d6fc14bSjoerg _LIBCPP_PUSH_MACROS 20*4d6fc14bSjoerg #include <__undef_macros> 21*4d6fc14bSjoerg 22*4d6fc14bSjoerg _LIBCPP_BEGIN_NAMESPACE_STD 23*4d6fc14bSjoerg 24*4d6fc14bSjoerg #ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF 25*4d6fc14bSjoerg 26*4d6fc14bSjoerg template <class _Tp> 27*4d6fc14bSjoerg inline _LIBCPP_CONSTEXPR_AFTER_CXX14 28*4d6fc14bSjoerg _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY 29*4d6fc14bSjoerg _Tp* addressof(_Tp & __x)30*4d6fc14bSjoergaddressof(_Tp& __x) _NOEXCEPT 31*4d6fc14bSjoerg { 32*4d6fc14bSjoerg return __builtin_addressof(__x); 33*4d6fc14bSjoerg } 34*4d6fc14bSjoerg 35*4d6fc14bSjoerg #else 36*4d6fc14bSjoerg 37*4d6fc14bSjoerg template <class _Tp> 38*4d6fc14bSjoerg inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY 39*4d6fc14bSjoerg _Tp* 40*4d6fc14bSjoerg addressof(_Tp& __x) _NOEXCEPT 41*4d6fc14bSjoerg { 42*4d6fc14bSjoerg return reinterpret_cast<_Tp *>( 43*4d6fc14bSjoerg const_cast<char *>(&reinterpret_cast<const volatile char &>(__x))); 44*4d6fc14bSjoerg } 45*4d6fc14bSjoerg 46*4d6fc14bSjoerg #endif // _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF 47*4d6fc14bSjoerg 48*4d6fc14bSjoerg #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) 49*4d6fc14bSjoerg // Objective-C++ Automatic Reference Counting uses qualified pointers 50*4d6fc14bSjoerg // that require special addressof() signatures. When 51*4d6fc14bSjoerg // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler 52*4d6fc14bSjoerg // itself is providing these definitions. Otherwise, we provide them. 53*4d6fc14bSjoerg template <class _Tp> 54*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY 55*4d6fc14bSjoerg __strong _Tp* addressof(__strong _Tp & __x)56*4d6fc14bSjoergaddressof(__strong _Tp& __x) _NOEXCEPT 57*4d6fc14bSjoerg { 58*4d6fc14bSjoerg return &__x; 59*4d6fc14bSjoerg } 60*4d6fc14bSjoerg 61*4d6fc14bSjoerg #ifdef _LIBCPP_HAS_OBJC_ARC_WEAK 62*4d6fc14bSjoerg template <class _Tp> 63*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY 64*4d6fc14bSjoerg __weak _Tp* addressof(__weak _Tp & __x)65*4d6fc14bSjoergaddressof(__weak _Tp& __x) _NOEXCEPT 66*4d6fc14bSjoerg { 67*4d6fc14bSjoerg return &__x; 68*4d6fc14bSjoerg } 69*4d6fc14bSjoerg #endif 70*4d6fc14bSjoerg 71*4d6fc14bSjoerg template <class _Tp> 72*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY 73*4d6fc14bSjoerg __autoreleasing _Tp* addressof(__autoreleasing _Tp & __x)74*4d6fc14bSjoergaddressof(__autoreleasing _Tp& __x) _NOEXCEPT 75*4d6fc14bSjoerg { 76*4d6fc14bSjoerg return &__x; 77*4d6fc14bSjoerg } 78*4d6fc14bSjoerg 79*4d6fc14bSjoerg template <class _Tp> 80*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY 81*4d6fc14bSjoerg __unsafe_unretained _Tp* addressof(__unsafe_unretained _Tp & __x)82*4d6fc14bSjoergaddressof(__unsafe_unretained _Tp& __x) _NOEXCEPT 83*4d6fc14bSjoerg { 84*4d6fc14bSjoerg return &__x; 85*4d6fc14bSjoerg } 86*4d6fc14bSjoerg #endif 87*4d6fc14bSjoerg 88*4d6fc14bSjoerg #if !defined(_LIBCPP_CXX03_LANG) 89*4d6fc14bSjoerg template <class _Tp> _Tp* addressof(const _Tp&&) noexcept = delete; 90*4d6fc14bSjoerg #endif 91*4d6fc14bSjoerg 92*4d6fc14bSjoerg _LIBCPP_END_NAMESPACE_STD 93*4d6fc14bSjoerg 94*4d6fc14bSjoerg _LIBCPP_POP_MACROS 95*4d6fc14bSjoerg 96*4d6fc14bSjoerg #endif // _LIBCPP___MEMORY_ADDRESSOF_H 97