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