Skip to content

Implement ptr_cast_array #144515

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 2 commits into
base: master
Choose a base branch
from
Open

Conversation

scottmcm
Copy link
Member

ACP: rust-lang/libs-team#602
Tracking Issue: #144514

@rustbot
Copy link
Collaborator

rustbot commented Jul 26, 2025

r? @thomcc

rustbot has assigned @thomcc.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jul 26, 2025
@@ -330,7 +330,7 @@ impl<T> [T] {
} else {
// SAFETY: We explicitly check for the correct number of elements,
// and do not let the reference outlive the slice.
Some(unsafe { &*(self.as_ptr().cast::<[T; N]>()) })
Some(unsafe { &*(self.as_ptr().cast_array()) })
Copy link
Contributor

Choose a reason for hiding this comment

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

I noticed this in the libs-api thread before it was accepted but didn't want to be off-topic.
I was wondering how many uses of unsafe ptr casts are really just working around lack of const casting traits.

I think all of chunk methods could also be a fixme(const-hack) for TryFrom not being const before the const trait initiative. So the unsafe could also be removed here eventually.

I thought the other cast_array uses were more motivating outside of this module.

Copy link
Member Author

@scottmcm scottmcm Jul 26, 2025

Choose a reason for hiding this comment

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

True, there's a bunch of different ways this could be done. Certainly there's also options like self.as_chunks().0.first() that would work for this function.

I don't think these chunk methods would be TryFrom, though, because the &[T; N] as TryFrom<&[T]> intentionally requires an exact length match. (That's aligned with the general guidance that "from" stuff gives the "same" thing, and having them be eq needs the lengths to be the same.)

But yeah, .get(..N)?.as_array() (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.as_array) would be an option if get worked in const. (That's still two checks in the MIR, though, so dunno if it's better that way or not.)

EDIT: Oh, wait, not, the as_chunks version doesn't work because that panics for N == 0. But yes, lots of options. Even split_at_checked(N)?.0.as_array(), I suppose, which doesn't need to wait for const-trait.

Copy link
Contributor

@okaneco okaneco Jul 26, 2025

Choose a reason for hiding this comment

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

I was thinking of TryInto (unless that has the same issues and I'm just mistaken/misremembering). But as you said, now we have a lot of other options.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants