1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP___MEMORY_ADDRESSOF_H 11 #define _LIBCPP___MEMORY_ADDRESSOF_H 12 13 #include <__config> 14 15 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16 # pragma GCC system_header 17 #endif 18 19 _LIBCPP_BEGIN_NAMESPACE_STD 20 21 template <class _Tp> 22 inline _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_NO_CFI _LIBCPP_HIDE_FROM_ABI _Tp* addressof(_Tp& __x) _NOEXCEPT { 23 return __builtin_addressof(__x); 24 } 25 26 #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) 27 // Objective-C++ Automatic Reference Counting uses qualified pointers 28 // that require special addressof() signatures. When 29 // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler 30 // itself is providing these definitions. Otherwise, we provide them. 31 template <class _Tp> 32 inline _LIBCPP_HIDE_FROM_ABI __strong _Tp* addressof(__strong _Tp& __x) _NOEXCEPT { 33 return &__x; 34 } 35 36 # ifdef _LIBCPP_HAS_OBJC_ARC_WEAK 37 template <class _Tp> 38 inline _LIBCPP_HIDE_FROM_ABI __weak _Tp* addressof(__weak _Tp& __x) _NOEXCEPT { 39 return &__x; 40 } 41 # endif 42 43 template <class _Tp> 44 inline _LIBCPP_HIDE_FROM_ABI __autoreleasing _Tp* addressof(__autoreleasing _Tp& __x) _NOEXCEPT { 45 return &__x; 46 } 47 48 template <class _Tp> 49 inline _LIBCPP_HIDE_FROM_ABI __unsafe_unretained _Tp* addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT { 50 return &__x; 51 } 52 #endif 53 54 #if !defined(_LIBCPP_CXX03_LANG) 55 template <class _Tp> 56 _Tp* addressof(const _Tp&&) noexcept = delete; 57 #endif 58 59 _LIBCPP_END_NAMESPACE_STD 60 61 #endif // _LIBCPP___MEMORY_ADDRESSOF_H 62