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