Skip to content

[libc++] Require fancy pointer to be correctly convertible #152989

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions libcxx/include/__hash_table
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ struct __hash_node_base {
__next_pointer __next_;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a release note and mention the potential for breakage. In particular, what kind of code would break after this change and what users should do to fix it.


_LIBCPP_HIDE_FROM_ABI __next_pointer __ptr() _NOEXCEPT {
return static_cast<__next_pointer>(pointer_traits<__node_base_pointer>::pointer_to(*this));
return pointer_traits<__node_base_pointer>::pointer_to(*this);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do I understand correctly that this would be the "right" way to perform this cast if we only want to use the requirements in https://eel.is/c++draft/allocator.requirements.general ?

Suggested change
return pointer_traits<__node_base_pointer>::pointer_to(*this);
return static_cast<__next_pointer>(static_cast<void_pointer>(pointer_traits<__node_base_pointer>::pointer_to(*this)));

}

_LIBCPP_HIDE_FROM_ABI __node_pointer __upcast() _NOEXCEPT {
Expand Down Expand Up @@ -1499,9 +1499,9 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(const_iterator __p
while (__pp->__next_ != __np)
__pp = __pp->__next_;
__cp->__next_ = __np;
__pp->__next_ = static_cast<__next_pointer>(__cp);
__pp->__next_ = __cp;
++size();
return iterator(static_cast<__next_pointer>(__cp));
return iterator(__cp);
}
return __node_insert_multi(__cp);
}
Expand Down Expand Up @@ -1547,9 +1547,9 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const&
__bucket_list_[std::__constrain_hash(__h->__next_->__hash(), __bc)] = __h.get()->__ptr();
} else {
__h->__next_ = __pn->__next_;
__pn->__next_ = static_cast<__next_pointer>(__h.get());
__pn->__next_ = __h.get();
}
__nd = static_cast<__next_pointer>(__h.release());
__nd = __h.release();
// increment size
++size();
__inserted = true;
Expand Down
12 changes: 0 additions & 12 deletions libcxx/include/__memory/pointer_traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,18 +252,6 @@ concept __resettable_smart_pointer_with_args = requires(_Smart __s, _Pointer __p

#endif

// This function ensures safe conversions between fancy pointers at compile-time, where we avoid casts from/to
// `__void_pointer` by obtaining the underlying raw pointer from the fancy pointer using `std::to_address`,
// then dereferencing it to retrieve the pointed-to object, and finally constructing the target fancy pointer
// to that object using the `std::pointer_traits<>::pinter_to` function.
template <class _PtrTo, class _PtrFrom>
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI _PtrTo __static_fancy_pointer_cast(const _PtrFrom& __p) {
using __ptr_traits = pointer_traits<_PtrTo>;
using __element_type = typename __ptr_traits::element_type;
return __p ? __ptr_traits::pointer_to(*static_cast<__element_type*>(std::addressof(*__p)))
: static_cast<_PtrTo>(nullptr);
}

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS
Expand Down
Loading
Loading