1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <memory> 10 11 // template <class T> 12 // struct pointer_traits<T*> 13 // { 14 // static pointer pointer_to(<details>); // constexpr in C++20 15 // ... 16 // }; 17 18 #include <memory> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 TEST_CONSTEXPR_CXX20 bool test() 24 { 25 { 26 int i = 0; 27 static_assert(std::is_same<decltype(std::pointer_traits<int*>::pointer_to(i)), int*>::value, ""); 28 assert(std::pointer_traits<int*>::pointer_to(i) == &i); 29 } 30 { 31 int i = 0; 32 static_assert(std::is_same<decltype(std::pointer_traits<const int*>::pointer_to(i)), const int*>::value, ""); 33 assert(std::pointer_traits<const int*>::pointer_to(i) == &i); 34 } 35 return true; 36 } 37 38 int main(int, char**) 39 { 40 test(); 41 #if TEST_STD_VER > 17 42 static_assert(test()); 43 #endif 44 45 { 46 // Check that pointer_traits<void*> is still well-formed, even though it has no pointer_to. 47 static_assert(std::is_same<std::pointer_traits<void*>::element_type, void>::value, ""); 48 static_assert(std::is_same<std::pointer_traits<const void*>::element_type, const void>::value, ""); 49 static_assert(std::is_same<std::pointer_traits<volatile void*>::element_type, volatile void>::value, ""); 50 } 51 52 return 0; 53 } 54