xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/__memory/addressof.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
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*4d6fc14bSjoerg addressof(_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*4d6fc14bSjoerg addressof(__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*4d6fc14bSjoerg addressof(__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*4d6fc14bSjoerg addressof(__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*4d6fc14bSjoerg addressof(__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