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