//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 // template constexpr T* to_address(T* p) noexcept; // template auto to_address(const Ptr& p) noexcept; #include #include #include "test_macros.h" class P1 { public: using element_type = int; explicit P1(int* p) : p_(p) { } int* operator->() const noexcept { return p_; } private: int* p_; }; class P2 { public: using element_type = int; explicit P2(int* p) : p_(p) { } P1 operator->() const noexcept { return p_; } private: P1 p_; }; class P3 { public: explicit P3(int* p) : p_(p) { } int* get() const noexcept { return p_; } private: int* p_; }; namespace std { template<> struct pointer_traits<::P3> { static int* to_address(const ::P3& p) noexcept { return p.get(); } }; } class P4 { public: explicit P4(int* p) : p_(p) { } int* operator->() const noexcept { return nullptr; } int* get() const noexcept { return p_; } private: int* p_; }; namespace std { template<> struct pointer_traits<::P4> { static int* to_address(const ::P4& p) noexcept { return p.get(); } }; } int n = 0; static_assert(std::to_address(&n) == &n); int main(int, char**) { int i = 0; ASSERT_NOEXCEPT(std::to_address(&i)); assert(std::to_address(&i) == &i); P1 p1(&i); ASSERT_NOEXCEPT(std::to_address(p1)); assert(std::to_address(p1) == &i); P2 p2(&i); ASSERT_NOEXCEPT(std::to_address(p2)); assert(std::to_address(p2) == &i); P3 p3(&i); ASSERT_NOEXCEPT(std::to_address(p3)); assert(std::to_address(p3) == &i); P4 p4(&i); ASSERT_NOEXCEPT(std::to_address(p4)); assert(std::to_address(p4) == &i); return 0; }