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

Merged
merged 2 commits into from
Aug 14, 2025
Merged

Implement ptr_cast_array #144515

merged 2 commits into from
Aug 14, 2025

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.

Copy link
Contributor

Choose a reason for hiding this comment

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

I was curious and ended up implementing them with the slice_as_array feature in this branch okaneco@a64b928

I haven't checked them all, but it seems to optimize to the current assembly output without extra length checks for the array cast.
split_last_chunk_mut - https://rust.godbolt.org/z/Y4oa9rh5c

@scottmcm
Copy link
Member Author

r? libs

@rustbot rustbot assigned Mark-Simulacrum and unassigned thomcc Aug 13, 2025
@Mark-Simulacrum
Copy link
Member

@bors r+ rollup

@bors
Copy link
Collaborator

bors commented Aug 14, 2025

📌 Commit 51b0416 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 14, 2025
bors added a commit that referenced this pull request Aug 14, 2025
Rollup of 13 pull requests

Successful merges:

 - #140434 (rustdoc: Allow multiple references to a single footnote)
 - #142372 (Improve `--remap-path-prefix` documentation)
 - #142741 (Fix unsoundness in some tests)
 - #144515 (Implement `ptr_cast_array`)
 - #144727 (Add tracing to resolve-related functions)
 - #144959 (fix(unicode-table-generator): fix duplicated unique indices)
 - #145179 (Avoid abbreviating "numerator" as "numer", to allow catching typo "numer" elsewhere)
 - #145250 (Add regression test for a former ICE involving helper attributes containing interpolated tokens)
 - #145266 (Reduce some queries around associated items)
 - #145299 (doc test: fix mpsc.rs try_send doc test)
 - #145323 (Port the `#[linkage]` attribute to the new attribute system)
 - #145361 (Suppress wrapper suggestion when expected and actual ty are the same adt and the variant is unresolved)
 - #145372 (resolve: Miscellaneous cleanups)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 31d8277 into rust-lang:master Aug 14, 2025
10 checks passed
@rustbot rustbot added this to the 1.91.0 milestone Aug 14, 2025
rust-timer added a commit that referenced this pull request Aug 14, 2025
Rollup merge of #144515 - scottmcm:ptr_cast_array, r=Mark-Simulacrum

Implement `ptr_cast_array`

ACP: rust-lang/libs-team#602
Tracking Issue: #144514
github-actions bot pushed a commit to rust-lang/miri that referenced this pull request Aug 15, 2025
Rollup of 13 pull requests

Successful merges:

 - rust-lang/rust#140434 (rustdoc: Allow multiple references to a single footnote)
 - rust-lang/rust#142372 (Improve `--remap-path-prefix` documentation)
 - rust-lang/rust#142741 (Fix unsoundness in some tests)
 - rust-lang/rust#144515 (Implement `ptr_cast_array`)
 - rust-lang/rust#144727 (Add tracing to resolve-related functions)
 - rust-lang/rust#144959 (fix(unicode-table-generator): fix duplicated unique indices)
 - rust-lang/rust#145179 (Avoid abbreviating "numerator" as "numer", to allow catching typo "numer" elsewhere)
 - rust-lang/rust#145250 (Add regression test for a former ICE involving helper attributes containing interpolated tokens)
 - rust-lang/rust#145266 (Reduce some queries around associated items)
 - rust-lang/rust#145299 (doc test: fix mpsc.rs try_send doc test)
 - rust-lang/rust#145323 (Port the `#[linkage]` attribute to the new attribute system)
 - rust-lang/rust#145361 (Suppress wrapper suggestion when expected and actual ty are the same adt and the variant is unresolved)
 - rust-lang/rust#145372 (resolve: Miscellaneous cleanups)

r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. 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.

6 participants