diff options
author | Eric Fiselier <eric@efcs.ca> | 2017-11-22 19:49:21 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2017-11-22 19:49:21 +0000 |
commit | 18a268580952c47fac35e1e46bd9973058ef7352 (patch) | |
tree | a9abbd1b3fd22ce8f3f73e951812aa7d2b5a2d93 /test | |
parent | aa0e236289a6643641c6d268deb69e0013d5112a (diff) |
[libcxx] Implement std::to_address for C++20
Summary: Now implements P0653R2 - Utility to convert to raw pointer.
Reviewers: mclow.lists, EricWF
Reviewed By: EricWF
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D35470
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@318865 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/std/utilities/memory/pointer.conversion/to_address.pass.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp b/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp new file mode 100644 index 000000000..64a5c73af --- /dev/null +++ b/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp @@ -0,0 +1,120 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// template <class T> constexpr T* to_address(T* p) noexcept; +// template <class Ptr> auto to_address(const Ptr& p) noexcept; + +#include <memory> +#include <cassert> +#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 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); +} |