-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Reorder trait bound modifiers *after* for<...>
binder in trait bounds
#127054
Conversation
@bors try |
Reorder trait bound modifiers *after* `for<...>` binder in trait bounds r? `@fmease` or reassign if you're busy I wanted to crater this to see what the consequences are. Otherwise, we may be able to make this into a lint if the crater fallout is really bad. The motivation for this is because we currently parse: ```rust T: async for<'a> Fn(&'a ()) ``` Instead of: ```rust T: for<'a> async Fn(&'a ()) ``` I believe the latter to be the correct ordering of bounds, since the `async` keyword modifies the *trait* so it should be attached to the trait path.
|
||
if let (more_lifetime_defs, Some(binder_span)) = self.parse_late_bound_lifetime_defs()? { | ||
lifetime_defs.extend(more_lifetime_defs); | ||
self.dcx().emit_err(errors::BinderBeforeModifiers { binder_span, modifiers_span }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could also just make this into a warning if there's too much fallout 🤔
Checking crater for failures using an error, though.
☀️ Try build successful - checks-actions |
@craterbot check |
👌 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
r=me with nits addressed and after a lang FCP once the crater results come back (assuming they don't paint a grim picture)
@@ -1094,16 +1121,19 @@ impl<'a> Parser<'a> { | |||
} | |||
|
|||
/// Optionally parses `for<$generic_params>`. | |||
pub(super) fn parse_late_bound_lifetime_defs(&mut self) -> PResult<'a, ThinVec<GenericParam>> { | |||
pub(super) fn parse_late_bound_lifetime_defs( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(preexisting) this name is like super outdated
…d-parsing, r=fmease Move binder and polarity parsing into `parse_generic_ty_bound` Let's pull out the parts of rust-lang#127054 which just: 1. Make the parsing code less confusing 2. Fix `?use<>` (to correctly be denied) 3. Improve `T: for<'a> 'a` diagnostics This should have no user-facing effects on stable parsing. r? fmease
Rollup merge of rust-lang#127103 - compiler-errors:tighten-trait-bound-parsing, r=fmease Move binder and polarity parsing into `parse_generic_ty_bound` Let's pull out the parts of rust-lang#127054 which just: 1. Make the parsing code less confusing 2. Fix `?use<>` (to correctly be denied) 3. Improve `T: for<'a> 'a` diagnostics This should have no user-facing effects on stable parsing. r? fmease
🚧 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
🎉 Experiment
|
👌 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
🚧 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
The final comment period, with a disposition to merge, as per the review above, is now complete. As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed. This will be merged soon. |
Ok(TraitBoundModifiers { constness, asyncness, polarity }) | ||
} | ||
|
||
/// Parses a type bound according to: | ||
/// ```ebnf | ||
/// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) | ||
/// TY_BOUND_NOPAREN = [TRAIT_BOUND_MODIFIERS] [for<LT_PARAM_DEFS>] SIMPLE_PATH | ||
/// TY_BOUND_NOPAREN = [for<LT_PARAM_DEFS>] [TRAIT_BOUND_MODIFIERS] SIMPLE_PATH |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// TY_BOUND_NOPAREN = [for<LT_PARAM_DEFS>] [TRAIT_BOUND_MODIFIERS] SIMPLE_PATH | |
/// TY_BOUND_NOPAREN = [for<GENERIC_PARAMS> CONSTNESS ASYNCNESS | POLARITY] SIMPLE_PATH |
/// TRAIT_BOUND_MODIFIERS = [["~"] "const"] ["async"] ["?" | "!"] | ||
/// ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// TRAIT_BOUND_MODIFIERS = [["~"] "const"] ["async"] ["?" | "!"] | |
/// ``` | |
/// CONSTNESS = [["~"] "const"] | |
/// ASYNCNESS = ["async"] | |
/// POLARITY = ["?" | "!"] | |
/// ``` | |
/// | |
/// See [`Self::parse_generic_ty_bound`] for the complete grammar of trait bound modifiers. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yuup, the discrepancy between the grammar snippets & the recursive descent parser (not semantically only organizationally) is giving me the ick
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, the EBNF snippets in rustc_parse
are like my worst nightmare lol, switching between different styles (EBNF is an open family of dialects after all practically speaking) and being beyond outdated. I've been meaning to make everything consistent in one big PR for a while now, but er, not sure if it's worth my energy ^^'
@bors r+ |
…iaskrgr Rollup of 5 pull requests Successful merges: - rust-lang#127054 (Reorder trait bound modifiers *after* `for<...>` binder in trait bounds) - rust-lang#127528 (Replace ASCII control chars with Unicode Control Pictures) - rust-lang#127872 (Migrate `pointer-auth-link-with-c`, `c-dynamic-rlib` and `c-dynamic-dylib` `run-make` tests to rmake) - rust-lang#128111 (Do not use question as label) - rust-lang#128160 (Don't ICE when auto trait has assoc ty in old solver) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#127054 - compiler-errors:bound-ordering, r=fmease Reorder trait bound modifiers *after* `for<...>` binder in trait bounds This PR suggests changing the grammar of trait bounds from: ``` [CONSTNESS] [ASYNCNESS] [?] [BINDER] [TRAIT_PATH] const async ? for<'a> Sized ``` to ``` ([BINDER] [CONSTNESS] [ASYNCNESS] | [?]) [TRAIT_PATH] ``` i.e., either ``` ? Sized ``` or ``` for<'a> const async Sized ``` (but not both) ### Why? I think it's strange that the binder applies "more tightly" than the `?` trait polarity. This becomes even weirder when considering that we (or at least, I) want to have `async` trait bounds expressed like: ``` where T: for<'a> async Fn(&'a ()) -> i32, ``` and not: ``` where T: async for<'a> Fn(&'a ()) -> i32, ``` ### Fallout No crates on crater use this syntax, presumably because it's literally useless. This will require modifying the reference grammar, though. ### Alternatives If this is not desirable, then we can alternatively keep parsing `for<'a>` after the `?` but deprecate it with either an FCW (or an immediate hard error), and begin parsing `for<'a>` *before* the `?`.
@rust-timer build 0d5c969 |
This comment has been minimized.
This comment has been minimized.
Finished benchmarking commit (0d5c969): comparison URL. Overall result: no relevant changes - no action neededBenchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf. @bors rollup=never Instruction countThis benchmark run did not return any relevant results for this metric. Max RSS (memory usage)Results (primary -2.0%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
CyclesResults (primary 3.1%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 771.74s -> 770.597s (-0.15%) |
… r=ytmimi Rustfmt `for<'a> async` correctly In rust-lang#127054, we decided to move the trait bound modifier for `async for<'a> Fn()` to `for<'a> async Fn()`. This wasn't adjusted in rustfmt, so this PR implements that. It also requires consolidating the bound formatting into the `Rewrite` impl for `PolyTraitRef`. Fixes rust-lang#131649
… r=ytmimi Rustfmt `for<'a> async` correctly In rust-lang#127054, we decided to move the trait bound modifier for `async for<'a> Fn()` to `for<'a> async Fn()`. This wasn't adjusted in rustfmt, so this PR implements that. It also requires consolidating the bound formatting into the `Rewrite` impl for `PolyTraitRef`. Fixes rust-lang#131649
Rollup merge of rust-lang#131657 - compiler-errors:rustfmt-modifiers, r=ytmimi Rustfmt `for<'a> async` correctly In rust-lang#127054, we decided to move the trait bound modifier for `async for<'a> Fn()` to `for<'a> async Fn()`. This wasn't adjusted in rustfmt, so this PR implements that. It also requires consolidating the bound formatting into the `Rewrite` impl for `PolyTraitRef`. Fixes rust-lang#131649
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [rust](https://github.com/rust-lang/rust) | minor | `1.81.0` -> `1.82.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>rust-lang/rust (rust)</summary> ### [`v1.82.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1820-2024-10-17) [Compare Source](rust-lang/rust@1.81.0...1.82.0) \========================== <a id="1.82.0-Language"></a> ## 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 const` and `&raw mut` operators (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 `T` to be live when dropping `[T; 0]`](rust-lang/rust#128438) - [Stabilize `const` operands 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) <a id="1.82.0-Compiler"></a> ## Compiler - [Promote riscv64gc-unknown-linux-musl to tier 2](rust-lang/rust#122049) - [Promote Mac Catalyst targets `aarch64-apple-ios-macabi` and `x86_64-apple-ios-macabi` to 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-darwin` to Tier 1](rust-lang/rust#128592) - [Add Trusty OS target `aarch64-unknown-trusty` and `armv7-unknown-trusty` as tier 3 targets](rust-lang/rust#129490) - [Promote `wasm32-wasip2` to Tier 2.](rust-lang/rust#126967) <a id="1.82.0-Libraries"></a> ## Libraries - [Generalize `{Rc,Arc}::make_mut()` to `Path`, `OsStr`, and `CStr`.](rust-lang/rust#126877) <a id="1.82.0-Stabilized-APIs"></a> ## 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::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) <a id="1.82.0-Cargo"></a> ## Cargo - [feat: Add `info` cargo subcommand](rust-lang/cargo#14141) <a id="1.82.0-Compatibility-Notes"></a> ## Compatibility Notes - We now [disallow setting some built-in cfgs via the command-line](rust-lang/rust#126158) 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. `windows` cfg active but target is Linux based. The appropriate [`rustc` flag](https://doc.rust-lang.org/rustc/command-line-arguments.html) should be used instead. - The standard library has a new implementation of `binary_search` which is significantly improves performance ([#​128254](rust-lang/rust#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_NOSIGNAL` when writing to sockets](rust-lang/rust#128259). 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 `multivalue` and `reference-types` are now both enabled by default. These two features both have subtle changes implied for generated WebAssembly binaries. For the `multivalue` feature, WebAssembly target support has changed when upgrading to LLVM 19. Support for generating functions with multiple returns no longer works and `-Ctarget-feature=+multivalue` has 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 the `reference-types` feature the encoding of immediates in the `call_indirect`, a commonly used instruction by the WebAssembly backend, has changed. Validators and parsers which don't understand the `reference-types` proposal will no longer accept modules produced by LLVM due to this change in encoding of immediates. Additionally these features being enabled are encoded in the `target_features` custom section and may affect downstream tooling such as `wasm-opt` consuming the module. Generating a WebAssembly module that disables default features requires `-Zbuild-std` support from Cargo and more information can be found at [rust-lang/rust#128511](rust-lang/rust#128511). - [Rust now raises unsafety errors for union patterns in parameter-position](rust-lang/rust#130531) <a id="1.82.0-Internal-Changes"></a> ## 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) </details> --- ### 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. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
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 const` and `&raw mut` operators (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 `T` to be live when dropping `[T; 0]`] (rust-lang/rust#128438) - [Stabilize `const` operands 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-macabi` and `x86_64-apple-ios-macabi` to 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-darwin` to Tier 1] (rust-lang/rust#128592) - [Add Trusty OS target `aarch64-unknown-trusty` and `armv7-unknown-trusty` as tier 3 targets] (rust-lang/rust#129490) - [Promote `wasm32-wasip2` to Tier 2.] (rust-lang/rust#126967) Libraries --------- - [Generalize `{Rc,Arc}::make_mut()` to `Path`, `OsStr`, and `CStr`.] (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 `info` cargo subcommand] (rust-lang/cargo#14141) Compatibility Notes ------------------- - We now [disallow setting some built-in cfgs via the command-line](rust-lang/rust#126158) 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. `windows` cfg active but target is Linux based. The appropriate [`rustc` flag] (https://doc.rust-lang.org/rustc/command-line-arguments.html) should be used instead. - The standard library has a new implementation of `binary_search` which is significantly improves performance ([#128254](rust-lang/rust#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_NOSIGNAL` when writing to sockets](rust-lang/rust#128259). 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 `multivalue` and `reference-types` are now both enabled by default. These two features both have subtle changes implied for generated WebAssembly binaries. For the `multivalue` feature, WebAssembly target support has changed when upgrading to LLVM 19. Support for generating functions with multiple returns no longer works and `-Ctarget-feature=+multivalue` has 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 the `reference-types` feature the encoding of immediates in the `call_indirect`, a commonly used instruction by the WebAssembly backend, has changed. Validators and parsers which don't understand the `reference-types` proposal will no longer accept modules produced by LLVM due to this change in encoding of immediates. Additionally these features being enabled are encoded in the `target_features` custom section and may affect downstream tooling such as `wasm-opt` consuming the module. Generating a WebAssembly module that disables default features requires `-Zbuild-std` support from Cargo and more information can be found at [rust-lang/rust#128511](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)
This PR suggests changing the grammar of trait bounds from:
to
i.e., either
or
(but not both)
Why?
I think it's strange that the binder applies "more tightly" than the
?
trait polarity. This becomes even weirder when considering that we (or at least, I) want to haveasync
trait bounds expressed like:and not:
Fallout
No crates on crater use this syntax, presumably because it's literally useless. This will require modifying the reference grammar, though.
Alternatives
If this is not desirable, then we can alternatively keep parsing
for<'a>
after the?
but deprecate it with either an FCW (or an immediate hard error), and begin parsingfor<'a>
before the?
.