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