15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 95a83710eSEric Fiselier // <memory> 105a83710eSEric Fiselier 115a83710eSEric Fiselier // template <class T> 125a83710eSEric Fiselier // struct pointer_traits<T*> 135a83710eSEric Fiselier // { 1472720269SLouis Dionne // static pointer pointer_to(<details>); // constexpr in C++20 155a83710eSEric Fiselier // ... 165a83710eSEric Fiselier // }; 175a83710eSEric Fiselier 185a83710eSEric Fiselier #include <memory> 195a83710eSEric Fiselier #include <cassert> 20*85d4e29fSArthur O'Dwyer 2172720269SLouis Dionne #include "test_macros.h" 225a83710eSEric Fiselier 23*85d4e29fSArthur O'Dwyer TEST_CONSTEXPR_CXX20 bool test() 24*85d4e29fSArthur O'Dwyer { 255a83710eSEric Fiselier { 265a83710eSEric Fiselier int i = 0; 27*85d4e29fSArthur O'Dwyer static_assert(std::is_same<decltype(std::pointer_traits<int*>::pointer_to(i)), int*>::value, ""); 28*85d4e29fSArthur O'Dwyer assert(std::pointer_traits<int*>::pointer_to(i) == &i); 295a83710eSEric Fiselier } 305a83710eSEric Fiselier { 31*85d4e29fSArthur O'Dwyer int i = 0; 32*85d4e29fSArthur O'Dwyer static_assert(std::is_same<decltype(std::pointer_traits<const int*>::pointer_to(i)), const int*>::value, ""); 33*85d4e29fSArthur O'Dwyer assert(std::pointer_traits<const int*>::pointer_to(i) == &i); 345a83710eSEric Fiselier } 3572720269SLouis Dionne return true; 3672720269SLouis Dionne } 3772720269SLouis Dionne 38*85d4e29fSArthur O'Dwyer int main(int, char**) 39*85d4e29fSArthur O'Dwyer { 40*85d4e29fSArthur O'Dwyer test(); 4172720269SLouis Dionne #if TEST_STD_VER > 17 42*85d4e29fSArthur O'Dwyer static_assert(test()); 4372720269SLouis Dionne #endif 442df59c50SJF Bastien 45*85d4e29fSArthur O'Dwyer { 46*85d4e29fSArthur O'Dwyer // Check that pointer_traits<void*> is still well-formed, even though it has no pointer_to. 47*85d4e29fSArthur O'Dwyer static_assert(std::is_same<std::pointer_traits<void*>::element_type, void>::value, ""); 48*85d4e29fSArthur O'Dwyer static_assert(std::is_same<std::pointer_traits<const void*>::element_type, const void>::value, ""); 49*85d4e29fSArthur O'Dwyer static_assert(std::is_same<std::pointer_traits<volatile void*>::element_type, volatile void>::value, ""); 50*85d4e29fSArthur O'Dwyer } 51*85d4e29fSArthur O'Dwyer 522df59c50SJF Bastien return 0; 535a83710eSEric Fiselier } 54