1*0eae32dcSDimitry Andric // -*- C++ -*- 2*0eae32dcSDimitry Andric //===----------------------------------------------------------------------===// 3*0eae32dcSDimitry Andric // 4*0eae32dcSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*0eae32dcSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6*0eae32dcSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*0eae32dcSDimitry Andric // 8*0eae32dcSDimitry Andric //===----------------------------------------------------------------------===// 9*0eae32dcSDimitry Andric 10*0eae32dcSDimitry Andric #ifndef _LIBCPP___MEMORY_VOIDIFY_H 11*0eae32dcSDimitry Andric #define _LIBCPP___MEMORY_VOIDIFY_H 12*0eae32dcSDimitry Andric 13*0eae32dcSDimitry Andric #include <__config> 14*0eae32dcSDimitry Andric #include <__memory/addressof.h> 15*0eae32dcSDimitry Andric 16*0eae32dcSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*0eae32dcSDimitry Andric # pragma GCC system_header 18*0eae32dcSDimitry Andric #endif 19*0eae32dcSDimitry Andric 20*0eae32dcSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 21*0eae32dcSDimitry Andric 22*0eae32dcSDimitry Andric template <typename _Tp> 23*0eae32dcSDimitry Andric _LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 void* __voidify(_Tp& __from) { 24*0eae32dcSDimitry Andric // Cast away cv-qualifiers to allow modifying elements of a range through const iterators. 25*0eae32dcSDimitry Andric return const_cast<void*>(static_cast<const volatile void*>(_VSTD::addressof(__from))); 26*0eae32dcSDimitry Andric } 27*0eae32dcSDimitry Andric 28*0eae32dcSDimitry Andric _LIBCPP_END_NAMESPACE_STD 29*0eae32dcSDimitry Andric 30*0eae32dcSDimitry Andric #endif // _LIBCPP___MEMORY_VOIDIFY_H 31