Don't make statement nonterminals match pattern nonterminals by compiler-errors · Pull Request #120221 · rust-lang/rust (original) (raw)
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
| fn may_be_ident(nt: &token::Nonterminal) -> bool { |
|---|
| match nt { |
| NtStmt(_) |
| | NtPat(_) |
| | NtExpr(_) |
| | NtTy(_) |
| | NtIdent(..) |
| | NtLiteral(_) // `true`, `false` |
| | NtMeta(_) |
| | NtPath(_) => true, |
| NtItem(_) |
| | NtBlock(_) |
| | NtVis(_) |
| | NtLifetime(_) => false, |
| } |
| } |
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m { ($pat:pat) => {}; ($stmt:stmt) => {}; }
macro_rules! m2 { ($stmt:stmt) => { m! { $stmt } }; }
m2! { let x = 1 }
This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
r? @nnethercote
(rustbot has picked a reviewer for you, use r? to override)
rustbot added S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
compiler-errors changed the title
Don't make pattern nonterminals match statement nonterminals Don't make statement nonterminals match pattern nonterminals
| NtBlock(..) | |
|---|
| NtPath(..)), |
| /// **NB**: Take care when modifying this function, since it will change |
| /// the stable set of tokens that are allowed to match an pat nonterminal. |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| /// the stable set of tokens that are allowed to match an pat nonterminal. |
|---|
| /// the stable set of tokens that are allowed to match a pat nonterminal. |
| AndAnd | // double reference |
|---|
| Literal(_) | // literal |
| DotDot | // range pattern (future compat) |
| DotDotDot | // range pattern (future compat) |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AFAICT, the net effect here:
- All identifiers now match, i.e. more than before
DotDotEqno longer matchesBinOp(Or)matches ifallow_leading_oris trueNtExpr,NtMeta,NtTynow matchNtBlockno longer matches
Is that right?
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, though it should be noted that can_begin_pattern was previously only used for diagnostics and was previously just a rip off of can_begin_expr from above.
A better way to look at the changes here is to compare it to the previous match that was located in nonterminal_may_begin_with. This PR copies that logic over, adds an uninterpolate call for consistency with can_begin_expr (rather than manually handling the NtIdent arm), and adjusting the match arm for the Interpolated token.
To sum it up, I believe the only token kind that now no longer matches pat nonterminals is the statement nonterminal.
| } |
|---|
| } |
| NonterminalKind::PatParam { .. } => token.can_begin_pattern(false), |
| NonterminalKind::PatWithOr => token.can_begin_pattern(true), |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And the net effect here is that NtStmt no longer matches. Which I think is the change that actually fixes the original problem, right?
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes
How did you find this problem? Just curious.
This appears to change more than is necessary to fix the cited bug. Is that intended?
How did you find this problem? Just curious.
I noticed it while authoring #120218, and thinking a bit about why there was a Token::can_begin_pattern (that, for the record, I believe I added for diagnostics purposes originally) that was not being used by Parser::nonterminal_may_begin_with.
This appears to change more than is necessary to fix the cited bug. Is that intended?
Yes. I don't see why we need to maintain an incorrect Token::can_begin_pattern just for diagnostics rather than just fixing it to actually reflect the set of tokens that can match pat nonterminals and using it everywhere.
Thanks for the explanations. r=me with the "a"/"an" nit fixed.
Actually, given that this is a change to a contract (the macro matchers), I'll pass this by t-lang as well.
@rustbot label: +I-lang-nominated
| NtPath(..)), |
|---|
| /// **NB**: Take care when modifying this function, since it will change |
| /// the stable set of tokens that are allowed to match a pat nonterminal. |
| pub fn can_begin_pattern(&self, allow_leading_or: bool) -> bool { |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: the bool here is very non-obvious in callers. Dunno if it'd be worth having an enum or something to make it clearer, or to have the bool-taking thing be non-pub with different names for the two cases, or something.
From CE: Right now the tokens that a macro matcher may begin with is a stable guarantee. We are relaxing the assumption that pattern matchers may begin with statement metavariables ($var whose type is stmt), because when we actually try to parse such a pattern, we are always guaranteed to fail. This only allows more code to compile, and would only break future code if we specifically wanted to begin patterns with statement metavariable.
I agree that it's weird to allow a :stmt in a pattern, so am happy to say we won't. Let's see what others think, since this conversation was in a sparsely-attended triage meeting:
@rfcbot fcp merge
The other thing we explored was what it would take to make this actually work, since you can actually put an :expr into a pattern. But CE argued that we don't actually like that that works, it's just something we're stuck with because people used it before :literal was available, which seems fair.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
scottmcm added disposition-merge
This issue / PR is in PFCP or FCP with a disposition to merge it.
and removed T-compiler
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
From CE: Right now the tokens that a macro matcher may begin with is a stable guarantee. We are relaxing the assumption that pattern matchers may begin with statement metavariables ($var whose type is stmt), because when we actually try to parse such a pattern, we are always guaranteed to fail. This only allows more code to compile, and would only break future code if we specifically wanted to begin patterns with statement metavariable.
I agree that it's weird to allow a :stmt in a pattern, so am happy to say we won't. Let's see what others think, since this conversation was in a sparsely-attended triage meeting:
@rfcbot fcp merge
The other thing we explored was what it would take to make this actually work, since you can actually put an :expr into a pattern. But CE argued that we don't actually like that that works, it's just something we're stuck with because people used it before :literal was available, which seems fair.
Team member @scottmcm has proposed to merge this. The next step is review by the rest of the tagged team members:
No concerns currently listed.
Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!
cc @rust-lang/lang-advisors: FCP proposed for lang, please feel free to register concerns.
See this document for info about what commands tagged team members can give me.
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.
DEPRECATED: Use the team-based variants `S-waiting-on-t-lang`, `S-waiting-on-t-compiler`, ...
labels
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request
…-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
bors added a commit to rust-lang-ci/rust that referenced this pull request
…kingjubilee
Rollup of 9 pull requests
Successful merges:
- rust-lang#120221 (Don't make statement nonterminals match pattern nonterminals)
- rust-lang#127912 (std: make
thread::currentavailable in allthread_local!destructors) - rust-lang#128166 (Improved
checked_isqrtandisqrtmethods) - rust-lang#129123 (rustdoc-json: Add test for
Selftype) - rust-lang#129366 (linker: Synchronize native library search in rustc and linker)
- rust-lang#129527 (Don't use
TyKindin a lint) - rust-lang#129534 (Deny
wasm_c_abilint to nudge the last 25%) - rust-lang#129640 (Re-enable android tests/benches in alloc/core)
- rust-lang#129675 (allow BufReader::peek to be called on unsized types)
r? @ghost
@rustbot modify labels: rollup
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request
…-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
bors added a commit to rust-lang-ci/rust that referenced this pull request
…kingjubilee
Rollup of 8 pull requests
Successful merges:
- rust-lang#120221 (Don't make statement nonterminals match pattern nonterminals)
- rust-lang#129123 (rustdoc-json: Add test for
Selftype) - rust-lang#129366 (linker: Synchronize native library search in rustc and linker)
- rust-lang#129527 (Don't use
TyKindin a lint) - rust-lang#129534 (Deny
wasm_c_abilint to nudge the last 25%) - rust-lang#129640 (Re-enable android tests/benches in alloc/core)
- rust-lang#129675 (allow BufReader::peek to be called on unsized types)
- rust-lang#129731 (Allow running
./x.py test compiler)
r? @ghost
@rustbot modify labels: rollup
bors added a commit to rust-lang-ci/rust that referenced this pull request
…kingjubilee
Rollup of 8 pull requests
Successful merges:
- rust-lang#120221 (Don't make statement nonterminals match pattern nonterminals)
- rust-lang#129123 (rustdoc-json: Add test for
Selftype) - rust-lang#129366 (linker: Synchronize native library search in rustc and linker)
- rust-lang#129527 (Don't use
TyKindin a lint) - rust-lang#129534 (Deny
wasm_c_abilint to nudge the last 25%) - rust-lang#129640 (Re-enable android tests/benches in alloc/core)
- rust-lang#129675 (allow BufReader::peek to be called on unsized types)
- rust-lang#129731 (Allow running
./x.py test compiler)
r? @ghost
@rustbot modify labels: rollup
bors added a commit to rust-lang-ci/rust that referenced this pull request
…kingjubilee
Rollup of 8 pull requests
Successful merges:
- rust-lang#120221 (Don't make statement nonterminals match pattern nonterminals)
- rust-lang#129123 (rustdoc-json: Add test for
Selftype) - rust-lang#129366 (linker: Synchronize native library search in rustc and linker)
- rust-lang#129527 (Don't use
TyKindin a lint) - rust-lang#129534 (Deny
wasm_c_abilint to nudge the last 25%) - rust-lang#129640 (Re-enable android tests/benches in alloc/core)
- rust-lang#129675 (allow BufReader::peek to be called on unsized types)
- rust-lang#129731 (Allow running
./x.py test compiler)
r? @ghost
@rustbot modify labels: rollup
bors added a commit to rust-lang-ci/rust that referenced this pull request
…kingjubilee
Rollup of 8 pull requests
Successful merges:
- rust-lang#120221 (Don't make statement nonterminals match pattern nonterminals)
- rust-lang#129123 (rustdoc-json: Add test for
Selftype) - rust-lang#129366 (linker: Synchronize native library search in rustc and linker)
- rust-lang#129527 (Don't use
TyKindin a lint) - rust-lang#129534 (Deny
wasm_c_abilint to nudge the last 25%) - rust-lang#129640 (Re-enable android tests/benches in alloc/core)
- rust-lang#129675 (allow BufReader::peek to be called on unsized types)
- rust-lang#129731 (Allow running
./x.py test compiler)
r? @ghost
@rustbot modify labels: rollup
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request
…-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
bors added a commit to rust-lang-ci/rust that referenced this pull request
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request
…-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
bors added a commit to rust-lang-ci/rust that referenced this pull request
bors added a commit to rust-lang-ci/rust that referenced this pull request
bors added a commit to rust-lang-ci/rust that referenced this pull request
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
…-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
This was referenced
Aug 31, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Rollup merge of rust-lang#120221 - compiler-errors:statements-are-not-patterns, r=nnethercote
Don't make statement nonterminals match pattern nonterminals
Right now, the heuristic we use to check if a token may begin a pattern nonterminal falls back to may_be_ident:
https://github.com/rust-lang/rust/blob/ef71f1047e04438181d7cb925a833e2ada6ab390/compiler/rustc_parse/src/parser/nonterminal.rs#L21-L37
This has the unfortunate side effect that a stmt nonterminal eagerly matches against a pat nonterminal, leading to a parse error:
macro_rules! m {
($pat:pat) => {};
($stmt:stmt) => {};
}
macro_rules! m2 {
($stmt:stmt) => {
m! { $stmt }
};
}
m2! { let x = 1 }This PR fixes it by more accurately reflecting the set of nonterminals that may begin a pattern nonterminal.
As a side-effect, I modified Token::can_begin_pattern to work correctly and used that in Parser::nonterminal_may_begin_with.
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request
This MR contains the following updates:
| Package | Update | Change |
|---|---|---|
| rust | minor | 1.81.0 -> 1.82.0 |
MR created with the help of el-capitano/tools/renovate-bot.
Proposed changes to behavior should be submitted there as MRs.
Release Notes
rust-lang/rust (rust)
v1.82.0
==========================
Language
- Don't make statement nonterminals match pattern nonterminals
- Patterns matching empty types can now be omitted in common cases
- Enforce supertrait outlives obligations when using trait impls
addr_of(_mut)!macros and the newly stabilized&raw (const|mut)are now safe to use with all static items- size_of_val_raw: for length 0 this is safe to call
- Reorder trait bound modifiers after
for<...>binder in trait bounds - Stabilize opaque type precise capturing (RFC 3617)
- Stabilize
&raw constand&raw mutoperators (RFC 2582) - Stabilize unsafe extern blocks (RFC 3484)
- Stabilize nested field access in
offset_of! - Do not require
Tto be live when dropping[T; 0] - Stabilize
constoperands in inline assembly - Stabilize floating-point arithmetic in
const fn - Stabilize explicit opt-in to unsafe attributes
- Document NaN bit patterns guarantees
Compiler
- Promote riscv64gc-unknown-linux-musl to tier 2
- Promote Mac Catalyst targets
aarch64-apple-ios-macabiandx86_64-apple-ios-macabito Tier 2, and ship them with rustup - Add tier 3 NuttX based targets for RISC-V and ARM
- Add tier 3 powerpc-unknown-linux-muslspe target
- Improved diagnostics to explain why a pattern is unreachable
- The compiler now triggers the unreachable code warning properly for async functions that don't return/are
-> ! - Promote
aarch64-apple-darwinto Tier 1 - Add Trusty OS target
aarch64-unknown-trustyandarmv7-unknown-trustyas tier 3 targets - Promote
wasm32-wasip2to Tier 2.
Libraries
Stabilized APIs
std::thread::Builder::spawn_uncheckedstd::str::CharIndices::offsetstd::option::Option::is_none_or[T]::is_sorted[T]::is_sorted_by[T]::is_sorted_by_keyIterator::is_sortedIterator::is_sorted_byIterator::is_sorted_by_keystd::future::Ready::into_innerstd::iter::repeat_nimpl<T: Clone> DoubleEndedIterator for Take<Repeat<T>>impl<T: Clone> ExactSizeIterator for Take<Repeat<T>>impl<T: Clone> ExactSizeIterator for Take<RepeatWith<T>>impl Default for std::collections::binary_heap::Iterimpl Default for std::collections::btree_map::RangeMutimpl Default for std::collections::btree_map::ValuesMutimpl Default for std::collections::vec_deque::Iterimpl Default for std::collections::vec_deque::IterMutRc<T>::new_uninitRc<T>::assume_initRc<[T]>::new_uninit_sliceRc<[MaybeUninit<T>]>::assume_initArc<T>::new_uninitArc<T>::assume_initArc<[T]>::new_uninit_sliceArc<[MaybeUninit<T>]>::assume_initBox<T>::new_uninitBox<T>::assume_initBox<[T]>::new_uninit_sliceBox<[MaybeUninit<T>]>::assume_initcore::arch::x86_64::_bextri_u64core::arch::x86_64::_bextri_u32core::arch::x86::_mm_broadcastsi128_si256core::arch::x86::_mm256_stream_load_si256core::arch::x86::_tzcnt_u16core::arch::x86::_mm_extracti_si64core::arch::x86::_mm_inserti_si64core::arch::x86::_mm_storeu_si16core::arch::x86::_mm_storeu_si32core::arch::x86::_mm_storeu_si64core::arch::x86::_mm_loadu_si16core::arch::x86::_mm_loadu_si32core::arch::wasm32::u8x16_relaxed_swizzlecore::arch::wasm32::i8x16_relaxed_swizzlecore::arch::wasm32::i32x4_relaxed_trunc_f32x4core::arch::wasm32::u32x4_relaxed_trunc_f32x4core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zerocore::arch::wasm32::u32x4_relaxed_trunc_f64x2_zerocore::arch::wasm32::f32x4_relaxed_maddcore::arch::wasm32::f32x4_relaxed_nmaddcore::arch::wasm32::f64x2_relaxed_maddcore::arch::wasm32::f64x2_relaxed_nmaddcore::arch::wasm32::i8x16_relaxed_laneselectcore::arch::wasm32::u8x16_relaxed_laneselectcore::arch::wasm32::i16x8_relaxed_laneselectcore::arch::wasm32::u16x8_relaxed_laneselectcore::arch::wasm32::i32x4_relaxed_laneselectcore::arch::wasm32::u32x4_relaxed_laneselectcore::arch::wasm32::i64x2_relaxed_laneselectcore::arch::wasm32::u64x2_relaxed_laneselectcore::arch::wasm32::f32x4_relaxed_mincore::arch::wasm32::f32x4_relaxed_maxcore::arch::wasm32::f64x2_relaxed_mincore::arch::wasm32::f64x2_relaxed_maxcore::arch::wasm32::i16x8_relaxed_q15mulrcore::arch::wasm32::u16x8_relaxed_q15mulrcore::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_addcore::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add
These APIs are now stable in const contexts:
std::task::Waker::from_rawstd::task::Context::from_wakerstd::task::Context::waker$integer::from_str_radixstd::num::ParseIntError::kind
Cargo
Compatibility Notes
- We now disallow setting some built-in cfgs via the command-line with the newly added
explicit_builtin_cfgs_in_flagslint in order to prevent incoherent state, eg.windowscfg active but target is Linux based. The appropriaterustcflag should be used instead. - The standard library has a new implementation of
binary_searchwhich is significantly improves performance (#128254). However when a sorted slice has multiple values which compare equal, the new implementation may select a different value among the equal ones than the old implementation. - illumos/Solaris now sets
MSG_NOSIGNALwhen writing to sockets. This avoids killing the process with SIGPIPE when writing to a closed socket, which matches the existing behavior on other UNIX targets. - Removes a problematic hack that always passed the --whole-archive linker flag for tests, which may cause linker errors for code accidentally relying on it.
- The WebAssembly target features
multivalueandreference-typesare now both enabled by default. These two features both have subtle changes implied for generated WebAssembly binaries. For themultivaluefeature, WebAssembly target support has changed when upgrading to LLVM 19. Support for generating functions with multiple returns no longer works and-Ctarget-feature=+multivaluehas a different meaning than it did in LLVM 18 and prior. There is no longer any supported means to generate a module that has a function with multiple returns in WebAssembly from Rust source code. For thereference-typesfeature the encoding of immediates in thecall_indirect, a commonly used instruction by the WebAssembly backend, has changed. Validators and parsers which don't understand thereference-typesproposal will no longer accept modules produced by LLVM due to this change in encoding of immediates. Additionally these features being enabled are encoded in thetarget_featurescustom section and may affect downstream tooling such aswasm-optconsuming the module. Generating a WebAssembly module that disables default features requires-Zbuild-stdsupport from Cargo and more information can be found at rust-lang/rust#128511. - Rust now raises unsafety errors for union patterns in parameter-position
Internal Changes
These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this MR and you won't be reminded about this update again.
- If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request
Pkgsrc changes:
- Adapt patches, apply to new vendored crates where needed.
- Back-port rust pull request 130110, "make dist vendoring configurable"
- Disable "dist vendoring", otherwise cargo would try to access the network during the build phase.
Upstream changes:
Version 1.82.0 (2024-10-17)
Language
- [Don't make statement nonterminals match pattern nonterminals] (rust-lang/rust#120221)
- [Patterns matching empty types can now be omitted in common cases] (rust-lang/rust#122792)
- [Enforce supertrait outlives obligations when using trait impls] (rust-lang/rust#124336)
- [
addr_of(_mut)!macros and the newly stabilized&raw (const|mut)are now safe to use with all static items] (rust-lang/rust#125834) - [size_of_val_raw: for length 0 this is safe to call] (rust-lang/rust#126152)
- [Reorder trait bound modifiers after
for<...>binder in trait bounds] (rust-lang/rust#127054) - [Stabilize opaque type precise capturing (RFC 3617)] (rust-lang/rust#127672)
- [Stabilize
&raw constand&raw mutoperators (RFC 2582)] (rust-lang/rust#127679) - [Stabilize unsafe extern blocks (RFC 3484)] (rust-lang/rust#127921)
- [Stabilize nested field access in
offset_of!] (rust-lang/rust#128284) - [Do not require
Tto be live when dropping[T; 0]] (rust-lang/rust#128438) - [Stabilize
constoperands in inline assembly] (rust-lang/rust#128570) - [Stabilize floating-point arithmetic in
const fn] (rust-lang/rust#128596) - [Stabilize explicit opt-in to unsafe attributes] (rust-lang/rust#128771)
- [Document NaN bit patterns guarantees] (rust-lang/rust#129559)
Compiler
- [Promote riscv64gc-unknown-linux-musl to tier 2] (rust-lang/rust#122049)
- [Promote Mac Catalyst targets
aarch64-apple-ios-macabiandx86_64-apple-ios-macabito Tier 2, and ship them with rustup] (rust-lang/rust#126450) - [Add tier 3 NuttX based targets for RISC-V and ARM] (rust-lang/rust#127755)
- [Add tier 3 powerpc-unknown-linux-muslspe target] (rust-lang/rust#127905)
- [Improved diagnostics to explain why a pattern is unreachable] (rust-lang/rust#128034)
- [The compiler now triggers the unreachable code warning properly
for async functions that don't return/are
-> !] (rust-lang/rust#128443) - [Promote
aarch64-apple-darwinto Tier 1] (rust-lang/rust#128592) - [Add Trusty OS target
aarch64-unknown-trustyandarmv7-unknown-trustyas tier 3 targets] (rust-lang/rust#129490) - [Promote
wasm32-wasip2to Tier 2.] (rust-lang/rust#126967)
Libraries
- [Generalize
{Rc,Arc}::make_mut()toPath,OsStr, andCStr.] (rust-lang/rust#126877)
Stabilized APIs
- [
std::thread::Builder::spawn_unchecked] (https://doc.rust-lang.org/stable/std/thread/struct.Builder.html#method.spawn_unchecked) - [
std::str::CharIndices::offset] (https://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.offset) - [
std::option::Option::is_none_or] (https://doc.rust-lang.org/nightly/std/option/enum.Option.html#method.is_none_or) - [
[T]::is_sorted] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted) - [
[T]::is_sorted_by] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted_by) - [
[T]::is_sorted_by_key] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted_by_key) - [
Iterator::is_sorted] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted) - [
Iterator::is_sorted_by] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted_by) - [
Iterator::is_sorted_by_key] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted_by_key) - [
std::future::Ready::into_inner] (https://doc.rust-lang.org/nightly/std/future/struct.Ready.html#method.into_inner) - [
std::iter::repeat_n] (https://doc.rust-lang.org/nightly/std/iter/fn.repeat_n.html) - [
impl<T: Clone> DoubleEndedIterator for Take<Repeat<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-DoubleEndedIterator-for-Take%3CRepeat%3CT%3E%3E) - [
impl<T: Clone> ExactSizeIterator for Take<Repeat<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-ExactSizeIterator-for-Take%3CRepeat%3CT%3E%3E) - [
impl<T: Clone> ExactSizeIterator for Take<RepeatWith<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-ExactSizeIterator-for-Take%3CRepeatWith%3CF%3E%3E) - [
impl Default for std::collections::binary_heap::Iter] (https://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Iter.html#impl-Default-for-Iter%3C'_,+T%3E) - [
impl Default for std::collections::btree_map::RangeMut] (https://doc.rust-lang.org/nightly/std/collections/btree_map/struct.RangeMut.html#impl-Default-for-RangeMut%3C'_,+K,+V%3E) - [
impl Default for std::collections::btree_map::ValuesMut] (https://doc.rust-lang.org/nightly/std/collections/btree_map/struct.ValuesMut.html#impl-Default-for-ValuesMut%3C'_,+K,+V%3E) - [
impl Default for std::collections::vec_deque::Iter] (https://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Iter.html#impl-Default-for-Iter%3C'_,+T%3E) - [
impl Default for std::collections::vec_deque::IterMut] (https://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.IterMut.html#impl-Default-for-IterMut%3C'_,+T%3E) - [
Rc<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.new_uninit) - [
Rc<T>::assume_init] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.assume_init) - [
Rc<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.new_uninit_slice) - [
Rc<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.assume_init-1) - [
Arc<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.new_uninit) - [
Arc<T>::assume_init] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.assume_init) - [
Arc<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.new_uninit_slice) - [
Arc<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.assume_init-1) - [
Box<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.new_uninit) - [
Box<T>::assume_init] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.assume_init) - [
Box<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.new_uninit_slice) - [
Box<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.assume_init-1) - [
core::arch::x86_64::_bextri_u64] (https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bextri_u64.html) - [
core::arch::x86_64::_bextri_u32] (https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bextri_u32.html) - [
core::arch::x86::_mm_broadcastsi128_si256] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_broadcastsi128_si256.html) - [
core::arch::x86::_mm256_stream_load_si256] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm256_stream_load_si256.html) - [
core::arch::x86::_tzcnt_u16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._tzcnt_u16.html) - [
core::arch::x86::_mm_extracti_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_extracti_si64.html) - [
core::arch::x86::_mm_inserti_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_inserti_si64.html) - [
core::arch::x86::_mm_storeu_si16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si16.html) - [
core::arch::x86::_mm_storeu_si32] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si32.html) - [
core::arch::x86::_mm_storeu_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si64.html) - [
core::arch::x86::_mm_loadu_si16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_loadu_si16.html) - [
core::arch::x86::_mm_loadu_si32] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_loadu_si32.html) - [
core::arch::wasm32::u8x16_relaxed_swizzle] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u8x16_relaxed_swizzle.html) - [
core::arch::wasm32::i8x16_relaxed_swizzle] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i8x16_relaxed_swizzle.html) - [
core::arch::wasm32::i32x4_relaxed_trunc_f32x4] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_trunc_f32x4.html) - [
core::arch::wasm32::u32x4_relaxed_trunc_f32x4] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_trunc_f32x4.html) - [
core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zero] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_trunc_f64x2_zero.html) - [
core::arch::wasm32::u32x4_relaxed_trunc_f64x2_zero] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_trunc_f64x2_zero.html) - [
core::arch::wasm32::f32x4_relaxed_madd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_madd.html) - [
core::arch::wasm32::f32x4_relaxed_nmadd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_nmadd.html) - [
core::arch::wasm32::f64x2_relaxed_madd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_madd.html) - [
core::arch::wasm32::f64x2_relaxed_nmadd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_nmadd.html) - [
core::arch::wasm32::i8x16_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i8x16_relaxed_laneselect.html) - [
core::arch::wasm32::u8x16_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u8x16_relaxed_laneselect.html) - [
core::arch::wasm32::i16x8_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_laneselect.html) - [
core::arch::wasm32::u16x8_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_laneselect.html) - [
core::arch::wasm32::i32x4_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_laneselect.html) - [
core::arch::wasm32::u32x4_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_laneselect.html) - [
core::arch::wasm32::i64x2_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i64x2_relaxed_laneselect.html) - [
core::arch::wasm32::u64x2_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u64x2_relaxed_laneselect.html) - [
core::arch::wasm32::f32x4_relaxed_min] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_min.html) - [
core::arch::wasm32::f32x4_relaxed_max] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_max.html) - [
core::arch::wasm32::f64x2_relaxed_min] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_min.html) - [
core::arch::wasm32::f64x2_relaxed_max] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_max.html) - [
core::arch::wasm32::i16x8_relaxed_q15mulr] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_q15mulr.html) - [
core::arch::wasm32::u16x8_relaxed_q15mulr] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_q15mulr.html) - [
core::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_dot_i8x16_i7x16.html) - [
core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_dot_i8x16_i7x16.html) - [
core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_add] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_dot_i8x16_i7x16_add.html) - [
core::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_dot_i8x16_i7x16_add.html)
These APIs are now stable in const contexts:
- [
std::task::Waker::from_raw] (https://doc.rust-lang.org/nightly/std/task/struct.Waker.html#method.from_raw) - [
std::task::Waker::waker] (https://doc.rust-lang.org/nightly/std/task/struct.Waker.html#method.from_raw) - [
std::task::Context::from_waker] (https://doc.rust-lang.org/nightly/std/task/struct.Context.html#method.from_waker) - [
std::task::Context::waker] (https://doc.rust-lang.org/nightly/std/task/struct.Context.html#method.waker) - [
$integer::from_str_radix] (https://doc.rust-lang.org/nightly/std/primitive.u32.html#method.from_str_radix) - [
std::num::ParseIntError::kind] (https://doc.rust-lang.org/nightly/std/num/struct.ParseIntError.html#method.kind)
Cargo
- [feat: Add
infocargo subcommand] (rust-lang/cargo#14141)
Compatibility Notes
We now disallow setting some built-in cfgs via the command-line with the newly added [
explicit_builtin_cfgs_in_flags] (https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html#explicit-builtin-cfgs-in-flags) lint in order to prevent incoherent state, eg.windowscfg active but target is Linux based. The appropriate [rustcflag] (https://doc.rust-lang.org/rustc/command-line-arguments.html) should be used instead.The standard library has a new implementation of
binary_searchwhich is significantly improves performance (#128254). However when a sorted slice has multiple values which compare equal, the new implementation may select a different value among the equal ones than the old implementation.illumos/Solaris now sets
MSG_NOSIGNALwhen writing to sockets. This avoids killing the process with SIGPIPE when writing to a closed socket, which matches the existing behavior on other UNIX targets.[Removes a problematic hack that always passed the --whole-archive linker flag for tests, which may cause linker errors for code accidentally relying on it.] (rust-lang/rust#128400)
The WebAssembly target features
multivalueandreference-typesare now both enabled by default. These two features both have subtle changes implied for generated WebAssembly binaries. For themultivaluefeature, WebAssembly target support has changed when upgrading to LLVM 19. Support for generating functions with multiple returns no longer works and-Ctarget-feature=+multivaluehas a different meaning than it did in LLVM 18 and prior. There is no longer any supported means to generate a module that has a function with multiple returns in WebAssembly from Rust source code. For thereference-typesfeature the encoding of immediates in thecall_indirect, a commonly used instruction by the WebAssembly backend, has changed. Validators and parsers which don't understand thereference-typesproposal will no longer accept modules produced by LLVM due to this change in encoding of immediates. Additionally these features being enabled are encoded in thetarget_featurescustom section and may affect downstream tooling such aswasm-optconsuming the module. Generating a WebAssembly module that disables default features requires-Zbuild-stdsupport from Cargo and more information can be found at rust-lang/rust#128511.[Rust now raises unsafety errors for union patterns in parameter-position] (rust-lang/rust#130531)
Internal Changes
These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.
- [Update to LLVM 19] (rust-lang/rust#127513)
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request
Pkgsrc changes:
- Adapt patches, apply to new vendored crates where needed.
- Back-port rust pull request 130110, "make dist vendoring configurable"
- Disable "dist vendoring", otherwise cargo would try to access the network during the build phase.
- Dial down the verbosity of the build by dropping -v argument to x.py.
Upstream changes:
Version 1.82.0 (2024-10-17)
Language
- [Don't make statement nonterminals match pattern nonterminals] (rust-lang/rust#120221)
- [Patterns matching empty types can now be omitted in common cases] (rust-lang/rust#122792)
- [Enforce supertrait outlives obligations when using trait impls] (rust-lang/rust#124336)
- [
addr_of(_mut)!macros and the newly stabilized&raw (const|mut)are now safe to use with all static items] (rust-lang/rust#125834) - [size_of_val_raw: for length 0 this is safe to call] (rust-lang/rust#126152)
- [Reorder trait bound modifiers after
for<...>binder in trait bounds] (rust-lang/rust#127054) - [Stabilize opaque type precise capturing (RFC 3617)] (rust-lang/rust#127672)
- [Stabilize
&raw constand&raw mutoperators (RFC 2582)] (rust-lang/rust#127679) - [Stabilize unsafe extern blocks (RFC 3484)] (rust-lang/rust#127921)
- [Stabilize nested field access in
offset_of!] (rust-lang/rust#128284) - [Do not require
Tto be live when dropping[T; 0]] (rust-lang/rust#128438) - [Stabilize
constoperands in inline assembly] (rust-lang/rust#128570) - [Stabilize floating-point arithmetic in
const fn] (rust-lang/rust#128596) - [Stabilize explicit opt-in to unsafe attributes] (rust-lang/rust#128771)
- [Document NaN bit patterns guarantees] (rust-lang/rust#129559)
Compiler
- [Promote riscv64gc-unknown-linux-musl to tier 2] (rust-lang/rust#122049)
- [Promote Mac Catalyst targets
aarch64-apple-ios-macabiandx86_64-apple-ios-macabito Tier 2, and ship them with rustup] (rust-lang/rust#126450) - [Add tier 3 NuttX based targets for RISC-V and ARM] (rust-lang/rust#127755)
- [Add tier 3 powerpc-unknown-linux-muslspe target] (rust-lang/rust#127905)
- [Improved diagnostics to explain why a pattern is unreachable] (rust-lang/rust#128034)
- [The compiler now triggers the unreachable code warning properly
for async functions that don't return/are
-> !] (rust-lang/rust#128443) - [Promote
aarch64-apple-darwinto Tier 1] (rust-lang/rust#128592) - [Add Trusty OS target
aarch64-unknown-trustyandarmv7-unknown-trustyas tier 3 targets] (rust-lang/rust#129490) - [Promote
wasm32-wasip2to Tier 2.] (rust-lang/rust#126967)
Libraries
- [Generalize
{Rc,Arc}::make_mut()toPath,OsStr, andCStr.] (rust-lang/rust#126877)
Stabilized APIs
- [
std::thread::Builder::spawn_unchecked] (https://doc.rust-lang.org/stable/std/thread/struct.Builder.html#method.spawn_unchecked) - [
std::str::CharIndices::offset] (https://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.offset) - [
std::option::Option::is_none_or] (https://doc.rust-lang.org/nightly/std/option/enum.Option.html#method.is_none_or) - [
[T]::is_sorted] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted) - [
[T]::is_sorted_by] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted_by) - [
[T]::is_sorted_by_key] (https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.is_sorted_by_key) - [
Iterator::is_sorted] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted) - [
Iterator::is_sorted_by] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted_by) - [
Iterator::is_sorted_by_key] (https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.is_sorted_by_key) - [
std::future::Ready::into_inner] (https://doc.rust-lang.org/nightly/std/future/struct.Ready.html#method.into_inner) - [
std::iter::repeat_n] (https://doc.rust-lang.org/nightly/std/iter/fn.repeat_n.html) - [
impl<T: Clone> DoubleEndedIterator for Take<Repeat<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-DoubleEndedIterator-for-Take%3CRepeat%3CT%3E%3E) - [
impl<T: Clone> ExactSizeIterator for Take<Repeat<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-ExactSizeIterator-for-Take%3CRepeat%3CT%3E%3E) - [
impl<T: Clone> ExactSizeIterator for Take<RepeatWith<T>>] (https://doc.rust-lang.org/nightly/std/iter/struct.Take.html#impl-ExactSizeIterator-for-Take%3CRepeatWith%3CF%3E%3E) - [
impl Default for std::collections::binary_heap::Iter] (https://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Iter.html#impl-Default-for-Iter%3C'_,+T%3E) - [
impl Default for std::collections::btree_map::RangeMut] (https://doc.rust-lang.org/nightly/std/collections/btree_map/struct.RangeMut.html#impl-Default-for-RangeMut%3C'_,+K,+V%3E) - [
impl Default for std::collections::btree_map::ValuesMut] (https://doc.rust-lang.org/nightly/std/collections/btree_map/struct.ValuesMut.html#impl-Default-for-ValuesMut%3C'_,+K,+V%3E) - [
impl Default for std::collections::vec_deque::Iter] (https://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Iter.html#impl-Default-for-Iter%3C'_,+T%3E) - [
impl Default for std::collections::vec_deque::IterMut] (https://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.IterMut.html#impl-Default-for-IterMut%3C'_,+T%3E) - [
Rc<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.new_uninit) - [
Rc<T>::assume_init] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.assume_init) - [
Rc<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.new_uninit_slice) - [
Rc<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/rc/struct.Rc.html#method.assume_init-1) - [
Arc<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.new_uninit) - [
Arc<T>::assume_init] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.assume_init) - [
Arc<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.new_uninit_slice) - [
Arc<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.assume_init-1) - [
Box<T>::new_uninit] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.new_uninit) - [
Box<T>::assume_init] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.assume_init) - [
Box<[T]>::new_uninit_slice] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.new_uninit_slice) - [
Box<[MaybeUninit<T>]>::assume_init] (https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.assume_init-1) - [
core::arch::x86_64::_bextri_u64] (https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bextri_u64.html) - [
core::arch::x86_64::_bextri_u32] (https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bextri_u32.html) - [
core::arch::x86::_mm_broadcastsi128_si256] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_broadcastsi128_si256.html) - [
core::arch::x86::_mm256_stream_load_si256] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm256_stream_load_si256.html) - [
core::arch::x86::_tzcnt_u16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._tzcnt_u16.html) - [
core::arch::x86::_mm_extracti_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_extracti_si64.html) - [
core::arch::x86::_mm_inserti_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_inserti_si64.html) - [
core::arch::x86::_mm_storeu_si16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si16.html) - [
core::arch::x86::_mm_storeu_si32] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si32.html) - [
core::arch::x86::_mm_storeu_si64] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_storeu_si64.html) - [
core::arch::x86::_mm_loadu_si16] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_loadu_si16.html) - [
core::arch::x86::_mm_loadu_si32] (https://doc.rust-lang.org/stable/core/arch/x86/fn._mm_loadu_si32.html) - [
core::arch::wasm32::u8x16_relaxed_swizzle] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u8x16_relaxed_swizzle.html) - [
core::arch::wasm32::i8x16_relaxed_swizzle] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i8x16_relaxed_swizzle.html) - [
core::arch::wasm32::i32x4_relaxed_trunc_f32x4] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_trunc_f32x4.html) - [
core::arch::wasm32::u32x4_relaxed_trunc_f32x4] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_trunc_f32x4.html) - [
core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zero] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_trunc_f64x2_zero.html) - [
core::arch::wasm32::u32x4_relaxed_trunc_f64x2_zero] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_trunc_f64x2_zero.html) - [
core::arch::wasm32::f32x4_relaxed_madd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_madd.html) - [
core::arch::wasm32::f32x4_relaxed_nmadd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_nmadd.html) - [
core::arch::wasm32::f64x2_relaxed_madd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_madd.html) - [
core::arch::wasm32::f64x2_relaxed_nmadd] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_nmadd.html) - [
core::arch::wasm32::i8x16_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i8x16_relaxed_laneselect.html) - [
core::arch::wasm32::u8x16_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u8x16_relaxed_laneselect.html) - [
core::arch::wasm32::i16x8_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_laneselect.html) - [
core::arch::wasm32::u16x8_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_laneselect.html) - [
core::arch::wasm32::i32x4_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_laneselect.html) - [
core::arch::wasm32::u32x4_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_laneselect.html) - [
core::arch::wasm32::i64x2_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i64x2_relaxed_laneselect.html) - [
core::arch::wasm32::u64x2_relaxed_laneselect] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u64x2_relaxed_laneselect.html) - [
core::arch::wasm32::f32x4_relaxed_min] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_min.html) - [
core::arch::wasm32::f32x4_relaxed_max] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f32x4_relaxed_max.html) - [
core::arch::wasm32::f64x2_relaxed_min] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_min.html) - [
core::arch::wasm32::f64x2_relaxed_max] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.f64x2_relaxed_max.html) - [
core::arch::wasm32::i16x8_relaxed_q15mulr] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_q15mulr.html) - [
core::arch::wasm32::u16x8_relaxed_q15mulr] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_q15mulr.html) - [
core::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i16x8_relaxed_dot_i8x16_i7x16.html) - [
core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u16x8_relaxed_dot_i8x16_i7x16.html) - [
core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_add] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.i32x4_relaxed_dot_i8x16_i7x16_add.html) - [
core::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add] (https://doc.rust-lang.org/nightly/core/arch/wasm32/fn.u32x4_relaxed_dot_i8x16_i7x16_add.html)
These APIs are now stable in const contexts:
- [
std::task::Waker::from_raw] (https://doc.rust-lang.org/nightly/std/task/struct.Waker.html#method.from_raw) - [
std::task::Waker::waker] (https://doc.rust-lang.org/nightly/std/task/struct.Waker.html#method.from_raw) - [
std::task::Context::from_waker] (https://doc.rust-lang.org/nightly/std/task/struct.Context.html#method.from_waker) - [
std::task::Context::waker] (https://doc.rust-lang.org/nightly/std/task/struct.Context.html#method.waker) - [
$integer::from_str_radix] (https://doc.rust-lang.org/nightly/std/primitive.u32.html#method.from_str_radix) - [
std::num::ParseIntError::kind] (https://doc.rust-lang.org/nightly/std/num/struct.ParseIntError.html#method.kind)
Cargo
- [feat: Add
infocargo subcommand] (rust-lang/cargo#14141)
Compatibility Notes
We now disallow setting some built-in cfgs via the command-line with the newly added [
explicit_builtin_cfgs_in_flags] (https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html#explicit-builtin-cfgs-in-flags) lint in order to prevent incoherent state, eg.windowscfg active but target is Linux based. The appropriate [rustcflag] (https://doc.rust-lang.org/rustc/command-line-arguments.html) should be used instead.The standard library has a new implementation of
binary_searchwhich is significantly improves performance (#128254). However when a sorted slice has multiple values which compare equal, the new implementation may select a different value among the equal ones than the old implementation.illumos/Solaris now sets
MSG_NOSIGNALwhen writing to sockets. This avoids killing the process with SIGPIPE when writing to a closed socket, which matches the existing behavior on other UNIX targets.[Removes a problematic hack that always passed the --whole-archive linker flag for tests, which may cause linker errors for code accidentally relying on it.] (rust-lang/rust#128400)
The WebAssembly target features
multivalueandreference-typesare now both enabled by default. These two features both have subtle changes implied for generated WebAssembly binaries. For themultivaluefeature, WebAssembly target support has changed when upgrading to LLVM 19. Support for generating functions with multiple returns no longer works and-Ctarget-feature=+multivaluehas a different meaning than it did in LLVM 18 and prior. There is no longer any supported means to generate a module that has a function with multiple returns in WebAssembly from Rust source code. For thereference-typesfeature the encoding of immediates in thecall_indirect, a commonly used instruction by the WebAssembly backend, has changed. Validators and parsers which don't understand thereference-typesproposal will no longer accept modules produced by LLVM due to this change in encoding of immediates. Additionally these features being enabled are encoded in thetarget_featurescustom section and may affect downstream tooling such aswasm-optconsuming the module. Generating a WebAssembly module that disables default features requires-Zbuild-stdsupport from Cargo and more information can be found at rust-lang/rust#128511.[Rust now raises unsafety errors for union patterns in parameter-position] (rust-lang/rust#130531)
Internal Changes
These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.
- [Update to LLVM 19] (rust-lang/rust#127513)