1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

Add partial implementation of std::to_address() as llvm::to_address()

Summary:
Following on from the review for D58088, this patch provides the
prerequisite to_address() implementation that's needed to have
pointer_iterator support unique_ptr.

The late bound return should be removed once we move to C++14 to better
align with the C++20 declaration. Also, this implementation can be removed
once we move to C++20 where it's defined as std::to_addres()

The std::pointer_traits<>::to_address(p) variations of these overloads has
not been implemented.

Reviewers: dblaikie, paquette

Reviewed By: dblaikie

Subscribers: dexonsmith, kristina, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58421

llvm-svn: 354491
This commit is contained in:
Daniel Sanders 2019-02-20 18:08:48 +00:00
parent c8095b709a
commit 9daa37762d
2 changed files with 36 additions and 0 deletions

View File

@ -1576,6 +1576,19 @@ bool hasNItemsOrMore(
return true;
}
/// Returns a raw pointer that represents the same address as the argument.
///
/// The late bound return should be removed once we move to C++14 to better
/// align with the C++20 declaration. Also, this implementation can be removed
/// once we move to C++20 where it's defined as std::to_addres()
///
/// The std::pointer_traits<>::to_address(p) variations of these overloads has
/// not been implemented.
template <class Ptr> auto to_address(const Ptr &P) -> decltype(P.operator->()) {
return P.operator->();
}
template <class T> constexpr T *to_address(T *P) { return P; }
} // end namespace llvm
#endif // LLVM_ADT_STLEXTRAS_H

View File

@ -446,4 +446,27 @@ TEST(STLExtrasTest, splat) {
EXPECT_FALSE(is_splat(V));
}
TEST(STLExtrasTest, to_address) {
int *V1 = new int;
EXPECT_EQ(V1, to_address(V1));
// Check fancy pointer overload for unique_ptr
std::unique_ptr<int> V2 = make_unique<int>(0);
EXPECT_EQ(V2.get(), to_address(V2));
V2.reset(V1);
EXPECT_EQ(V1, to_address(V2));
V2.release();
// Check fancy pointer overload for shared_ptr
std::shared_ptr<int> V3 = std::make_shared<int>(0);
std::shared_ptr<int> V4 = V3;
EXPECT_EQ(V3.get(), V4.get());
EXPECT_EQ(V3.get(), to_address(V3));
EXPECT_EQ(V4.get(), to_address(V4));
V3.reset(V1);
EXPECT_EQ(V1, to_address(V3));
}
} // namespace