From 03265b459f0fb0138c8197377ea3eba279989709 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sun, 14 Sep 2025 10:30:29 -0400 Subject: [PATCH 01/37] Update CURRENT_RUSTC_VERSION post-bump --- compiler/rustc_feature/src/accepted.rs | 6 +- compiler/rustc_feature/src/removed.rs | 4 +- compiler/rustc_feature/src/unstable.rs | 18 +++--- library/alloc/src/boxed.rs | 2 +- library/alloc/src/collections/btree/map.rs | 10 +-- library/alloc/src/collections/btree/set.rs | 10 +-- library/alloc/src/rc.rs | 2 +- library/alloc/src/sync.rs | 2 +- library/core/src/any.rs | 2 +- library/core/src/array/mod.rs | 6 +- library/core/src/cell.rs | 4 +- library/core/src/iter/adapters/chain.rs | 2 +- library/core/src/iter/adapters/mod.rs | 2 +- library/core/src/iter/mod.rs | 2 +- library/core/src/iter/traits/accum.rs | 2 +- library/core/src/net/ip_addr.rs | 12 ++-- library/core/src/num/int_macros.rs | 56 ++++++++-------- library/core/src/num/uint_macros.rs | 64 +++++++++---------- library/core/src/ptr/mod.rs | 4 +- library/core/src/str/mod.rs | 8 +-- library/core/src/sync/atomic.rs | 14 ++-- library/core/src/time.rs | 8 +-- library/std/src/ffi/os_str.rs | 2 +- library/std/src/os/windows/ffi.rs | 2 +- library/std/src/panic.rs | 2 +- library/std/src/path.rs | 24 +++---- .../src/platform-support/apple-ios-macabi.md | 2 +- .../rustc/src/platform-support/apple-ios.md | 2 +- .../feature-gate-sanitize.stderr | 2 +- 29 files changed, 138 insertions(+), 138 deletions(-) diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index 6af4cfb0e562e..364a1202b05c2 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -205,7 +205,7 @@ declare_features! ( (accepted, extended_key_value_attributes, "1.54.0", Some(78835)), /// Allows using `aapcs`, `efiapi`, `sysv64` and `win64` as calling conventions /// for functions with varargs. - (accepted, extended_varargs_abi_support, "CURRENT_RUSTC_VERSION", Some(100189)), + (accepted, extended_varargs_abi_support, "1.91.0", Some(100189)), /// Allows resolving absolute paths as paths from other crates. (accepted, extern_absolute_paths, "1.30.0", Some(44660)), /// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude. @@ -400,7 +400,7 @@ declare_features! ( /// Allows use of `&foo[a..b]` as a slicing syntax. (accepted, slicing_syntax, "1.0.0", None), /// Allows use of `sse4a` target feature. - (accepted, sse4a_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (accepted, sse4a_target_feature, "1.91.0", Some(44839)), /// Allows elision of `'static` lifetimes in `static`s and `const`s. (accepted, static_in_const, "1.17.0", Some(35897)), /// Allows the definition recursive static items. @@ -414,7 +414,7 @@ declare_features! ( /// Allows the use of `#[target_feature]` on safe functions. (accepted, target_feature_11, "1.86.0", Some(69098)), /// Allows use of `tbm` target feature. - (accepted, tbm_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (accepted, tbm_target_feature, "1.91.0", Some(44839)), /// Allows `fn main()` with return types which implements `Termination` (RFC 1937). (accepted, termination_trait, "1.26.0", Some(43301)), /// Allows `#[test]` functions where the return type implements `Termination` (RFC 1937). diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index e37fc6b7bfcce..32115535e9941 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -192,7 +192,7 @@ declare_features! ( (removed, no_debug, "1.43.0", Some(29721), Some("removed due to lack of demand"), 69667), // Allows the use of `no_sanitize` attribute. /// The feature was renamed to `sanitize` and the attribute to `#[sanitize(xyz = "on|off")]` - (removed, no_sanitize, "CURRENT_RUSTC_VERSION", Some(39699), Some(r#"renamed to sanitize(xyz = "on|off")"#), 142681), + (removed, no_sanitize, "1.91.0", Some(39699), Some(r#"renamed to sanitize(xyz = "on|off")"#), 142681), /// Note: this feature was previously recorded in a separate /// `STABLE_REMOVED` list because it, uniquely, was once stable but was /// then removed. But there was no utility storing it separately, so now @@ -203,7 +203,7 @@ declare_features! ( (removed, object_safe_for_dispatch, "1.83.0", Some(43561), Some("renamed to `dyn_compatible_for_dispatch`"), 131511), /// Allows using `#[omit_gdb_pretty_printer_section]`. - (removed, omit_gdb_pretty_printer_section, "CURRENT_RUSTC_VERSION", None, None, 144738), + (removed, omit_gdb_pretty_printer_section, "1.91.0", None, None, 144738), /// Allows using `#[on_unimplemented(..)]` on traits. /// (Moved to `rustc_attrs`.) (removed, on_unimplemented, "1.40.0", None, None, 65794), diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 93e5588146e14..6ef0df72365ec 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -327,7 +327,7 @@ declare_features! ( (unstable, m68k_target_feature, "1.85.0", Some(134328)), (unstable, mips_target_feature, "1.27.0", Some(44839)), (unstable, movrs_target_feature, "1.88.0", Some(137976)), - (unstable, nvptx_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (unstable, nvptx_target_feature, "1.91.0", Some(44839)), (unstable, powerpc_target_feature, "1.27.0", Some(44839)), (unstable, prfchw_target_feature, "1.78.0", Some(44839)), (unstable, riscv_target_feature, "1.45.0", Some(44839)), @@ -471,7 +471,7 @@ declare_features! ( /// Allows deref patterns. (incomplete, deref_patterns, "1.79.0", Some(87121)), /// Allows deriving the From trait on single-field structs. - (unstable, derive_from, "CURRENT_RUSTC_VERSION", Some(144889)), + (unstable, derive_from, "1.91.0", Some(144889)), /// Tells rustdoc to automatically generate `#[doc(cfg(...))]`. (unstable, doc_auto_cfg, "1.58.0", Some(43781)), /// Allows `#[doc(cfg(...))]`. @@ -481,7 +481,7 @@ declare_features! ( /// Allows `#[doc(masked)]`. (unstable, doc_masked, "1.21.0", Some(44027)), /// Allows features to allow target_feature to better interact with traits. - (incomplete, effective_target_features, "CURRENT_RUSTC_VERSION", Some(143352)), + (incomplete, effective_target_features, "1.91.0", Some(143352)), /// Allows the .use postfix syntax `x.use` and use closures `use |x| { ... }` (incomplete, ergonomic_clones, "1.87.0", Some(132290)), /// Allows exhaustive pattern matching on types that contain uninhabited types. @@ -554,9 +554,9 @@ declare_features! ( /// Allows fused `loop`/`match` for direct intraprocedural jumps. (incomplete, loop_match, "1.90.0", Some(132306)), /// Allow `macro_rules!` attribute rules - (unstable, macro_attr, "CURRENT_RUSTC_VERSION", Some(83527)), + (unstable, macro_attr, "1.91.0", Some(83527)), /// Allow `macro_rules!` derive rules - (unstable, macro_derive, "CURRENT_RUSTC_VERSION", Some(143549)), + (unstable, macro_derive, "1.91.0", Some(143549)), /// Give access to additional metadata about declarative macro meta-variables. (unstable, macro_metavar_expr, "1.61.0", Some(83527)), /// Provides a way to concatenate identifiers using metavariable expressions. @@ -613,7 +613,7 @@ declare_features! ( (unstable, proc_macro_hygiene, "1.30.0", Some(54727)), /// Allows the use of raw-dylibs on ELF platforms (incomplete, raw_dylib_elf, "1.87.0", Some(135694)), - (unstable, reborrow, "CURRENT_RUSTC_VERSION", Some(145612)), + (unstable, reborrow, "1.91.0", Some(145612)), /// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024. (incomplete, ref_pat_eat_one_layer_2024, "1.79.0", Some(123076)), /// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024—structural variant @@ -627,13 +627,13 @@ declare_features! ( /// Allows `extern "rust-cold"`. (unstable, rust_cold_cc, "1.63.0", Some(97544)), /// Allows the use of the `sanitize` attribute. - (unstable, sanitize, "CURRENT_RUSTC_VERSION", Some(39699)), + (unstable, sanitize, "1.91.0", Some(39699)), /// Allows the use of SIMD types in functions declared in `extern` blocks. (unstable, simd_ffi, "1.0.0", Some(27731)), /// Allows specialization of implementations (RFC 1210). (incomplete, specialization, "1.7.0", Some(31844)), /// Allows using `#[rustc_align_static(...)]` on static items. - (unstable, static_align, "CURRENT_RUSTC_VERSION", Some(146177)), + (unstable, static_align, "1.91.0", Some(146177)), /// Allows attributes on expressions and non-item statements. (unstable, stmt_expr_attributes, "1.6.0", Some(15701)), /// Allows lints part of the strict provenance effort. @@ -645,7 +645,7 @@ declare_features! ( /// Allows subtrait items to shadow supertrait items. (unstable, supertrait_item_shadowing, "1.86.0", Some(89151)), /// Allows the use of target_feature when a function is marked inline(always). - (unstable, target_feature_inline_always, "CURRENT_RUSTC_VERSION", Some(145574)), + (unstable, target_feature_inline_always, "1.91.0", Some(145574)), /// Allows using `#[thread_local]` on `static` items. (unstable, thread_local, "1.0.0", Some(29594)), /// Allows defining `trait X = A + B;` alias items. diff --git a/library/alloc/src/boxed.rs b/library/alloc/src/boxed.rs index 98c9f6b51ab86..c67b75a070a67 100644 --- a/library/alloc/src/boxed.rs +++ b/library/alloc/src/boxed.rs @@ -1718,7 +1718,7 @@ impl Default for Box { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 98f11e2ea57fd..e5943f55eb4bf 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -1449,7 +1449,7 @@ impl BTreeMap { /// assert_eq!(low.keys().copied().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.keys().copied().collect::>(), [4, 5, 6, 7]); /// ``` - #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "btree_extract_if", since = "1.91.0")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F, A> where K: Ord, @@ -1936,7 +1936,7 @@ impl Default for Values<'_, K, V> { } /// An iterator produced by calling `extract_if` on BTreeMap. -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1969,7 +1969,7 @@ pub(super) struct ExtractIfInner<'a, K, V, R> { range: R, } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl fmt::Debug for ExtractIf<'_, K, V, R, F, A> where K: fmt::Debug, @@ -1981,7 +1981,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl Iterator for ExtractIf<'_, K, V, R, F, A> where K: PartialOrd, @@ -2055,7 +2055,7 @@ impl<'a, K, V, R> ExtractIfInner<'a, K, V, R> { } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl FusedIterator for ExtractIf<'_, K, V, R, F> where K: PartialOrd, diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index e6b0a1f632321..6e6996bcbd69b 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -1218,7 +1218,7 @@ impl BTreeSet { /// assert_eq!(low.into_iter().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.into_iter().collect::>(), [4, 5, 6, 7]); /// ``` - #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "btree_extract_if", since = "1.91.0")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A> where T: Ord, @@ -1553,7 +1553,7 @@ impl<'a, T, A: Allocator + Clone> IntoIterator for &'a BTreeSet { } /// An iterator produced by calling `extract_if` on BTreeSet. -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1568,7 +1568,7 @@ pub struct ExtractIf< alloc: A, } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl fmt::Debug for ExtractIf<'_, T, R, F, A> where T: fmt::Debug, @@ -1581,7 +1581,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl Iterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, @@ -1601,7 +1601,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl FusedIterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index 529b583cdd2bc..71bce93b6dc5f 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -2398,7 +2398,7 @@ impl Default for Rc<[T]> { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index a21b6880674c6..4ddc5c4185a87 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -3655,7 +3655,7 @@ impl Default for Arc<[T]> { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/core/src/any.rs b/library/core/src/any.rs index 76ea2d18a82f4..3ab95438c3ff3 100644 --- a/library/core/src/any.rs +++ b/library/core/src/any.rs @@ -774,7 +774,7 @@ impl TypeId { /// ``` #[must_use] #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_type_id", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_type_id", since = "1.91.0")] pub const fn of() -> TypeId { const { intrinsics::type_id::() } } diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index d14419a23a1d8..00726e1abce21 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -49,7 +49,7 @@ pub use iter::IntoIter; /// ``` #[inline] #[must_use = "cloning is often expensive and is not expected to have side effects"] -#[stable(feature = "array_repeat", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "array_repeat", since = "1.91.0")] pub fn repeat(val: T) -> [T; N] { from_trusted_iterator(repeat_n(val, N)) } @@ -622,7 +622,7 @@ impl [T; N] { /// assert_eq!(strings.len(), 3); /// ``` #[stable(feature = "array_methods", since = "1.77.0")] - #[rustc_const_stable(feature = "const_array_each_ref", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_array_each_ref", since = "1.91.0")] pub const fn each_ref(&self) -> [&T; N] { let mut buf = [null::(); N]; @@ -653,7 +653,7 @@ impl [T; N] { /// assert_eq!(floats, [0.0, 2.7, -1.0]); /// ``` #[stable(feature = "array_methods", since = "1.77.0")] - #[rustc_const_stable(feature = "const_array_each_ref", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_array_each_ref", since = "1.91.0")] pub const fn each_mut(&mut self) -> [&mut T; N] { let mut buf = [null_mut::(); N]; diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 9b53b75ebee80..9a6c6c12ffcbd 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -705,8 +705,8 @@ impl Cell<[T; N]> { /// let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array); /// let array_cell: &[Cell; 3] = cell_array.as_array_of_cells(); /// ``` - #[stable(feature = "as_array_of_cells", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "as_array_of_cells", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "as_array_of_cells", since = "1.91.0")] + #[rustc_const_stable(feature = "as_array_of_cells", since = "1.91.0")] pub const fn as_array_of_cells(&self) -> &[Cell; N] { // SAFETY: `Cell` has the same memory layout as `T`. unsafe { &*(self as *const Cell<[T; N]> as *const [Cell; N]) } diff --git a/library/core/src/iter/adapters/chain.rs b/library/core/src/iter/adapters/chain.rs index 3ebdf7b472796..0ece54554d464 100644 --- a/library/core/src/iter/adapters/chain.rs +++ b/library/core/src/iter/adapters/chain.rs @@ -60,7 +60,7 @@ impl Chain { /// assert_eq!(iter.next(), Some(6)); /// assert_eq!(iter.next(), None); /// ``` -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub fn chain(a: A, b: B) -> Chain where A: IntoIterator, diff --git a/library/core/src/iter/adapters/mod.rs b/library/core/src/iter/adapters/mod.rs index 6c6de0a4e5c98..1ff5093922b6d 100644 --- a/library/core/src/iter/adapters/mod.rs +++ b/library/core/src/iter/adapters/mod.rs @@ -32,7 +32,7 @@ mod zip; pub use self::array_chunks::ArrayChunks; #[unstable(feature = "std_internals", issue = "none")] pub use self::by_ref_sized::ByRefSized; -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub use self::chain::chain; #[stable(feature = "iter_cloned", since = "1.1.0")] pub use self::cloned::Cloned; diff --git a/library/core/src/iter/mod.rs b/library/core/src/iter/mod.rs index bc07324f5204c..c7e1c4ef767ba 100644 --- a/library/core/src/iter/mod.rs +++ b/library/core/src/iter/mod.rs @@ -404,7 +404,7 @@ pub use self::adapters::StepBy; pub use self::adapters::TrustedRandomAccess; #[unstable(feature = "trusted_random_access", issue = "none")] pub use self::adapters::TrustedRandomAccessNoCoerce; -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub use self::adapters::chain; pub(crate) use self::adapters::try_process; #[stable(feature = "iter_zip", since = "1.59.0")] diff --git a/library/core/src/iter/traits/accum.rs b/library/core/src/iter/traits/accum.rs index 3b805139ded17..375b5ef52859f 100644 --- a/library/core/src/iter/traits/accum.rs +++ b/library/core/src/iter/traits/accum.rs @@ -148,7 +148,7 @@ macro_rules! saturating_integer_sum_product { saturating_integer_sum_product!(@impls Saturating(0), Saturating(1), "The short-circuiting behavior of this implementation is unspecified. If you care about \ short-circuiting, use [`Iterator::fold`] directly.", - #[stable(feature = "saturating_iter_arith", since = "CURRENT_RUSTC_VERSION")], + #[stable(feature = "saturating_iter_arith", since = "1.91.0")], $(Saturating<$a>)*); ); } diff --git a/library/core/src/net/ip_addr.rs b/library/core/src/net/ip_addr.rs index 9779fb8fe4d5e..a1bfd774710d5 100644 --- a/library/core/src/net/ip_addr.rs +++ b/library/core/src/net/ip_addr.rs @@ -631,8 +631,8 @@ impl Ipv4Addr { /// let addr = Ipv4Addr::from_octets([13u8, 12u8, 11u8, 10u8]); /// assert_eq!(Ipv4Addr::new(13, 12, 11, 10), addr); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_octets(octets: [u8; 4]) -> Ipv4Addr { @@ -1478,8 +1478,8 @@ impl Ipv6Addr { /// addr /// ); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_segments(segments: [u16; 8]) -> Ipv6Addr { @@ -2043,8 +2043,8 @@ impl Ipv6Addr { /// addr /// ); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_octets(octets: [u8; 16]) -> Ipv6Addr { diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs index 64a3dd3e8bc54..93f586b1e871d 100644 --- a/library/core/src/num/int_macros.rs +++ b/library/core/src/num/int_macros.rs @@ -519,8 +519,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -609,8 +609,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add_unsigned(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -659,8 +659,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MIN + 2).strict_sub(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -749,8 +749,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MIN + 2).strict_sub_unsigned(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -799,8 +799,8 @@ macro_rules! int_impl { /// ``` should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_mul(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -906,8 +906,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -973,8 +973,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1139,8 +1139,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_rem(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1205,8 +1205,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_rem_euclid(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1286,8 +1286,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_neg();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1342,8 +1342,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = 0x1", stringify!($SelfT), ".strict_shl(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1517,8 +1517,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shr(128);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1693,8 +1693,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_abs();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1762,8 +1762,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_pow(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] diff --git a/library/core/src/num/uint_macros.rs b/library/core/src/num/uint_macros.rs index bf72ec8319704..7b40373065fd7 100644 --- a/library/core/src/num/uint_macros.rs +++ b/library/core/src/num/uint_macros.rs @@ -667,8 +667,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -762,8 +762,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add_signed(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -821,8 +821,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0", stringify!($SelfT), ".strict_sub(1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -946,8 +946,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX).strict_sub_signed(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1002,8 +1002,8 @@ macro_rules! uint_impl { "::MAX), Some(0));" )] /// ``` - #[stable(feature = "unsigned_signed_diff", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "unsigned_signed_diff", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_signed_diff", since = "1.91.0")] + #[rustc_const_stable(feature = "unsigned_signed_diff", since = "1.91.0")] #[inline] pub const fn checked_signed_diff(self, rhs: Self) -> Option<$SignedT> { let res = self.wrapping_sub(rhs) as $SignedT; @@ -1055,8 +1055,8 @@ macro_rules! uint_impl { /// ``` should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_mul(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1151,8 +1151,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1205,8 +1205,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1353,8 +1353,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 5", stringify!($SelfT), ".strict_rem(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1409,8 +1409,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 5", stringify!($SelfT), ".strict_rem_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1694,8 +1694,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 1", stringify!($SelfT), ".strict_neg();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1750,8 +1750,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shl(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1922,8 +1922,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shr(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2104,8 +2104,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_pow(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2682,7 +2682,7 @@ macro_rules! uint_impl { /// /// assert_eq!((sum1, sum0), (9, 6)); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -2774,7 +2774,7 @@ macro_rules! uint_impl { /// #[doc = concat!("assert_eq!((diff1, diff0), (3, ", stringify!($SelfT), "::MAX));")] /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -2991,7 +2991,7 @@ macro_rules! uint_impl { /// 789_u16.wrapping_mul(456).wrapping_add(123), /// ); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -3057,7 +3057,7 @@ macro_rules! uint_impl { /// u32::to_le_bytes(0xcffc982d) /// ); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 625024373ef47..b29d267654252 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -975,7 +975,7 @@ pub const fn dangling_mut() -> *mut T { #[must_use] #[inline(always)] #[stable(feature = "exposed_provenance", since = "1.84.0")] -#[rustc_const_stable(feature = "const_exposed_provenance", since = "CURRENT_RUSTC_VERSION")] +#[rustc_const_stable(feature = "const_exposed_provenance", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[allow(fuzzy_provenance_casts)] // this *is* the explicit provenance API one should use instead pub const fn with_exposed_provenance(addr: usize) -> *const T { @@ -1016,7 +1016,7 @@ pub const fn with_exposed_provenance(addr: usize) -> *const T { #[must_use] #[inline(always)] #[stable(feature = "exposed_provenance", since = "1.84.0")] -#[rustc_const_stable(feature = "const_exposed_provenance", since = "CURRENT_RUSTC_VERSION")] +#[rustc_const_stable(feature = "const_exposed_provenance", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[allow(fuzzy_provenance_casts)] // this *is* the explicit provenance API one should use instead pub const fn with_exposed_provenance_mut(addr: usize) -> *mut T { diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index 04fdaa8143eff..f67038d5ae449 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -404,8 +404,8 @@ impl str { /// assert_eq!(closest, 10); /// assert_eq!(&s[..closest], "❤️🧡"); /// ``` - #[stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "round_char_boundary", since = "1.91.0")] + #[rustc_const_stable(feature = "round_char_boundary", since = "1.91.0")] #[inline] pub const fn floor_char_boundary(&self, index: usize) -> usize { if index >= self.len() { @@ -447,8 +447,8 @@ impl str { /// assert_eq!(closest, 14); /// assert_eq!(&s[..closest], "❤️🧡💛"); /// ``` - #[stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "round_char_boundary", since = "1.91.0")] + #[rustc_const_stable(feature = "round_char_boundary", since = "1.91.0")] #[inline] pub const fn ceil_char_boundary(&self, index: usize) -> usize { if index >= self.len() { diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index 1b4a54b1b7a78..30a42d4eb5e64 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -2208,7 +2208,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_ptr_add(&self, val: usize, order: Ordering) -> *mut T { self.fetch_byte_add(val.wrapping_mul(size_of::()), order) @@ -2252,7 +2252,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_ptr_sub(&self, val: usize, order: Ordering) -> *mut T { self.fetch_byte_sub(val.wrapping_mul(size_of::()), order) @@ -2286,7 +2286,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_byte_add(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2321,7 +2321,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_byte_sub(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2371,7 +2371,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_or(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2420,7 +2420,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_and(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2467,7 +2467,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_xor(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. diff --git a/library/core/src/time.rs b/library/core/src/time.rs index d205bc376f125..f721fcd6156cf 100644 --- a/library/core/src/time.rs +++ b/library/core/src/time.rs @@ -416,8 +416,8 @@ impl Duration { /// assert_eq!(6 * 60 * 60, duration.as_secs()); /// assert_eq!(0, duration.subsec_nanos()); /// ``` - #[stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "duration_constructors_lite", since = "1.91.0")] + #[rustc_const_stable(feature = "duration_constructors_lite", since = "1.91.0")] #[must_use] #[inline] pub const fn from_hours(hours: u64) -> Duration { @@ -444,8 +444,8 @@ impl Duration { /// assert_eq!(10 * 60, duration.as_secs()); /// assert_eq!(0, duration.subsec_nanos()); /// ``` - #[stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "duration_constructors_lite", since = "1.91.0")] + #[rustc_const_stable(feature = "duration_constructors_lite", since = "1.91.0")] #[must_use] #[inline] pub const fn from_mins(mins: u64) -> Duration { diff --git a/library/std/src/ffi/os_str.rs b/library/std/src/ffi/os_str.rs index a39565d215924..6c098034eea3b 100644 --- a/library/std/src/ffi/os_str.rs +++ b/library/std/src/ffi/os_str.rs @@ -137,7 +137,7 @@ impl OsString { #[stable(feature = "rust1", since = "1.0.0")] #[must_use] #[inline] - #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "1.91.0")] pub const fn new() -> OsString { OsString { inner: Buf::from_string(String::new()) } } diff --git a/library/std/src/os/windows/ffi.rs b/library/std/src/os/windows/ffi.rs index 345d5b74285e1..20e5383dc09e0 100644 --- a/library/std/src/os/windows/ffi.rs +++ b/library/std/src/os/windows/ffi.rs @@ -141,7 +141,7 @@ impl OsStrExt for OsStr { pub struct EncodeWide<'a> { inner: alloc::wtf8::EncodeWide<'a>, } -#[stable(feature = "encode_wide_debug", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "encode_wide_debug", since = "1.91.0")] impl fmt::Debug for EncodeWide<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Debug::fmt(&self.inner, f) diff --git a/library/std/src/panic.rs b/library/std/src/panic.rs index 5e8d2f8e78ec7..1997785885d34 100644 --- a/library/std/src/panic.rs +++ b/library/std/src/panic.rs @@ -122,7 +122,7 @@ impl<'a> PanicHookInfo<'a> { /// ``` #[must_use] #[inline] - #[stable(feature = "panic_payload_as_str", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "panic_payload_as_str", since = "1.91.0")] pub fn payload_as_str(&self) -> Option<&str> { if let Some(s) = self.payload.downcast_ref::<&str>() { Some(s) diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 70ba502d68421..b3f992a402955 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -1191,7 +1191,7 @@ impl PathBuf { #[stable(feature = "rust1", since = "1.0.0")] #[must_use] #[inline] - #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "1.91.0")] pub const fn new() -> PathBuf { PathBuf { inner: OsString::new() } } @@ -1594,7 +1594,7 @@ impl PathBuf { /// p.add_extension(""); /// assert_eq!(Path::new("/feel/the.formatted.dark"), p.as_path()); /// ``` - #[stable(feature = "path_add_extension", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_add_extension", since = "1.91.0")] pub fn add_extension>(&mut self, extension: S) -> bool { self._add_extension(extension.as_ref()) } @@ -2103,7 +2103,7 @@ impl PartialEq for PathBuf { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &str) -> bool { @@ -2111,7 +2111,7 @@ impl cmp::PartialEq for PathBuf { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for str { #[inline] fn eq(&self, other: &PathBuf) -> bool { @@ -2119,7 +2119,7 @@ impl cmp::PartialEq for str { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &String) -> bool { @@ -2127,7 +2127,7 @@ impl cmp::PartialEq for PathBuf { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &PathBuf) -> bool { @@ -2724,7 +2724,7 @@ impl Path { /// /// [`Path::file_stem`]: Path::file_stem /// - #[stable(feature = "path_file_prefix", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_file_prefix", since = "1.91.0")] #[must_use] pub fn file_prefix(&self) -> Option<&OsStr> { self.file_name().map(split_file_at_dot).and_then(|(before, _after)| Some(before)) @@ -2888,7 +2888,7 @@ impl Path { /// assert_eq!(path.with_added_extension("xz"), PathBuf::from("foo.tar.gz.xz")); /// assert_eq!(path.with_added_extension("").with_added_extension("txt"), PathBuf::from("foo.tar.gz.txt")); /// ``` - #[stable(feature = "path_add_extension", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_add_extension", since = "1.91.0")] pub fn with_added_extension>(&self, extension: S) -> PathBuf { let mut new_path = self.to_path_buf(); new_path.add_extension(extension); @@ -3405,7 +3405,7 @@ impl PartialEq for Path { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for Path { #[inline] fn eq(&self, other: &str) -> bool { @@ -3414,7 +3414,7 @@ impl cmp::PartialEq for Path { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for str { #[inline] fn eq(&self, other: &Path) -> bool { @@ -3422,7 +3422,7 @@ impl cmp::PartialEq for str { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for Path { #[inline] fn eq(&self, other: &String) -> bool { @@ -3430,7 +3430,7 @@ impl cmp::PartialEq for Path { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &Path) -> bool { diff --git a/src/doc/rustc/src/platform-support/apple-ios-macabi.md b/src/doc/rustc/src/platform-support/apple-ios-macabi.md index c6f68f7a1e812..0d0acaa3bef28 100644 --- a/src/doc/rustc/src/platform-support/apple-ios-macabi.md +++ b/src/doc/rustc/src/platform-support/apple-ios-macabi.md @@ -57,7 +57,7 @@ $ rustc --target aarch64-apple-ios-macabi your-code.rs ``` The target can be differentiated from the iOS targets with the -`target_env = "macabi"` cfg (or `target_abi = "macabi"` before Rust CURRENT_RUSTC_VERSION). +`target_env = "macabi"` cfg (or `target_abi = "macabi"` before Rust 1.91.0). ```rust if cfg!(target_env = "macabi") { diff --git a/src/doc/rustc/src/platform-support/apple-ios.md b/src/doc/rustc/src/platform-support/apple-ios.md index 586afa652262b..2e705e3aef5c3 100644 --- a/src/doc/rustc/src/platform-support/apple-ios.md +++ b/src/doc/rustc/src/platform-support/apple-ios.md @@ -68,7 +68,7 @@ $ rustc --target aarch64-apple-ios your-code.rs The simulator variants can be differentiated from the variants running on-device with the `target_env = "sim"` cfg (or `target_abi = "sim"` before -Rust CURRENT_RUSTC_VERSION). +Rust 1.91.0). ```rust if cfg!(all(target_vendor = "apple", target_env = "sim")) { diff --git a/tests/ui/feature-gates/feature-gate-sanitize.stderr b/tests/ui/feature-gates/feature-gate-sanitize.stderr index 513999636a95c..59e8b69de2e3d 100644 --- a/tests/ui/feature-gates/feature-gate-sanitize.stderr +++ b/tests/ui/feature-gates/feature-gate-sanitize.stderr @@ -4,7 +4,7 @@ error[E0557]: feature has been removed LL | #![feature(no_sanitize)] | ^^^^^^^^^^^ feature has been removed | - = note: removed in CURRENT_RUSTC_VERSION; see for more information + = note: removed in 1.91.0; see for more information = note: renamed to sanitize(xyz = "on|off") error[E0658]: the `#[sanitize]` attribute is an experimental feature From 9c650eade68a01c0b48c7371e72a66519e03a2ac Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sun, 14 Sep 2025 10:31:13 -0400 Subject: [PATCH 02/37] Set channel to beta --- src/ci/channel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ci/channel b/src/ci/channel index bf867e0ae5b6c..65b2df87f7df3 100644 --- a/src/ci/channel +++ b/src/ci/channel @@ -1 +1 @@ -nightly +beta From 8499d50da045588edbacb81f50220fae45c1b834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 15 Sep 2025 12:32:03 +0200 Subject: [PATCH 03/37] Only run Cranelift dist test on nightly --- tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs b/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs index 198f8d1bc10c1..6d12ab1e4cf6f 100644 --- a/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs +++ b/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs @@ -2,6 +2,7 @@ // dist artifacts. //@ only-dist +//@ only-nightly (cranelift is not stable yet) //@ only-x86_64-unknown-linux-gnu //@ compile-flags: -Z codegen-backend=cranelift //@ run-pass From 6347e7f7e00b7ea0d07748443bba31d52ac45626 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Wed, 17 Sep 2025 16:33:41 -0400 Subject: [PATCH 04/37] Revert "compiler: Add Windows resources to rustc-main and rustc_driver" This reverts commit 095fa86a3ba30f4198c88ef300354391d3ab97e1. --- Cargo.lock | 9 -- compiler/rustc/Cargo.toml | 5 - compiler/rustc/build.rs | 16 +-- compiler/rustc_codegen_ssa/Cargo.toml | 2 +- compiler/rustc_driver/Cargo.toml | 5 - compiler/rustc_driver/build.rs | 21 ---- compiler/rustc_llvm/Cargo.toml | 2 +- compiler/rustc_windows_rc/Cargo.toml | 11 -- compiler/rustc_windows_rc/rustc.rc.in | 40 ------ compiler/rustc_windows_rc/src/lib.rs | 158 ------------------------ src/bootstrap/src/core/builder/tests.rs | 10 +- 11 files changed, 8 insertions(+), 271 deletions(-) delete mode 100644 compiler/rustc_driver/build.rs delete mode 100644 compiler/rustc_windows_rc/Cargo.toml delete mode 100644 compiler/rustc_windows_rc/rustc.rc.in delete mode 100644 compiler/rustc_windows_rc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4677d34d2a630..0c492e3af1623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3275,7 +3275,6 @@ dependencies = [ "rustc_driver_impl", "rustc_public", "rustc_public_bridge", - "rustc_windows_rc", "tikv-jemalloc-sys", ] @@ -3651,7 +3650,6 @@ name = "rustc_driver" version = "0.0.0" dependencies = [ "rustc_driver_impl", - "rustc_windows_rc", ] [[package]] @@ -4748,13 +4746,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustc_windows_rc" -version = "0.0.0" -dependencies = [ - "cc", -] - [[package]] name = "rustdoc" version = "0.0.0" diff --git a/compiler/rustc/Cargo.toml b/compiler/rustc/Cargo.toml index e3214d1ab9cec..3ca752354466f 100644 --- a/compiler/rustc/Cargo.toml +++ b/compiler/rustc/Cargo.toml @@ -33,8 +33,3 @@ llvm = ['rustc_driver_impl/llvm'] max_level_info = ['rustc_driver_impl/max_level_info'] rustc_randomized_layouts = ['rustc_driver_impl/rustc_randomized_layouts'] # tidy-alphabetical-end - -[build-dependencies] -# tidy-alphabetical-start -rustc_windows_rc = { path = "../rustc_windows_rc" } -# tidy-alphabetical-end diff --git a/compiler/rustc/build.rs b/compiler/rustc/build.rs index 9b5def53e3cbf..8b7d28d2b8aa6 100644 --- a/compiler/rustc/build.rs +++ b/compiler/rustc/build.rs @@ -1,6 +1,4 @@ -use std::{env, path}; - -use rustc_windows_rc::{VersionInfoFileType, compile_windows_resource_file}; +use std::env; fn main() { let target_os = env::var("CARGO_CFG_TARGET_OS"); @@ -15,18 +13,6 @@ fn main() { // Add a manifest file to rustc.exe. fn set_windows_exe_options() { - set_windows_resource(); - set_windows_manifest(); -} - -fn set_windows_resource() { - let stem = path::PathBuf::from("rustc_main_resource"); - let file_description = "rustc"; - let res_file = compile_windows_resource_file(&stem, file_description, VersionInfoFileType::App); - println!("cargo:rustc-link-arg={}", res_file.display()); -} - -fn set_windows_manifest() { static WINDOWS_MANIFEST_FILE: &str = "Windows Manifest.xml"; let mut manifest = env::current_dir().unwrap(); diff --git a/compiler/rustc_codegen_ssa/Cargo.toml b/compiler/rustc_codegen_ssa/Cargo.toml index 5462163f4ffd3..2dfbc58164323 100644 --- a/compiler/rustc_codegen_ssa/Cargo.toml +++ b/compiler/rustc_codegen_ssa/Cargo.toml @@ -9,7 +9,7 @@ ar_archive_writer = "0.5" bitflags = "2.4.1" bstr = "1.11.3" # `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_llvm` and `rustc_windows_rc`. +# per crate", so if you change this, you need to also change it in `rustc_llvm`. cc = "=1.2.16" itertools = "0.12" pathdiff = "0.2.0" diff --git a/compiler/rustc_driver/Cargo.toml b/compiler/rustc_driver/Cargo.toml index 5190971982763..e3ee83512952a 100644 --- a/compiler/rustc_driver/Cargo.toml +++ b/compiler/rustc_driver/Cargo.toml @@ -10,8 +10,3 @@ crate-type = ["dylib"] # tidy-alphabetical-start rustc_driver_impl = { path = "../rustc_driver_impl" } # tidy-alphabetical-end - -[build-dependencies] -# tidy-alphabetical-start -rustc_windows_rc = { path = "../rustc_windows_rc" } -# tidy-alphabetical-end diff --git a/compiler/rustc_driver/build.rs b/compiler/rustc_driver/build.rs deleted file mode 100644 index ba44fe7a86ed9..0000000000000 --- a/compiler/rustc_driver/build.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::{env, path}; - -use rustc_windows_rc::{VersionInfoFileType, compile_windows_resource_file}; - -fn main() { - let target_os = env::var("CARGO_CFG_TARGET_OS"); - let target_env = env::var("CARGO_CFG_TARGET_ENV"); - if Ok("windows") == target_os.as_deref() && Ok("msvc") == target_env.as_deref() { - set_windows_dll_options(); - } else { - // Avoid rerunning the build script every time. - println!("cargo:rerun-if-changed=build.rs"); - } -} - -fn set_windows_dll_options() { - let stem = path::PathBuf::from("rustc_driver_resource"); - let file_description = "rustc_driver"; - let res_file = compile_windows_resource_file(&stem, file_description, VersionInfoFileType::Dll); - println!("cargo:rustc-link-arg={}", res_file.display()); -} diff --git a/compiler/rustc_llvm/Cargo.toml b/compiler/rustc_llvm/Cargo.toml index 0dfd1b13df502..cd352ce3d0f4f 100644 --- a/compiler/rustc_llvm/Cargo.toml +++ b/compiler/rustc_llvm/Cargo.toml @@ -11,7 +11,7 @@ libc = "0.2.73" [build-dependencies] # tidy-alphabetical-start # `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_codegen_ssa` and `rustc_windows_rc`. +# per crate", so if you change this, you need to also change it in `rustc_codegen_ssa`. cc = "=1.2.16" # tidy-alphabetical-end diff --git a/compiler/rustc_windows_rc/Cargo.toml b/compiler/rustc_windows_rc/Cargo.toml deleted file mode 100644 index 080acd35c38cb..0000000000000 --- a/compiler/rustc_windows_rc/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "rustc_windows_rc" -version = "0.0.0" -edition = "2024" - -[dependencies] -#tidy-alphabetical-start -# `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_llvm` and `rustc_codegen_ssa`. -cc = "=1.2.16" -#tidy-alphabetical-end diff --git a/compiler/rustc_windows_rc/rustc.rc.in b/compiler/rustc_windows_rc/rustc.rc.in deleted file mode 100644 index 10a00b9bd4e32..0000000000000 --- a/compiler/rustc_windows_rc/rustc.rc.in +++ /dev/null @@ -1,40 +0,0 @@ -// A template for the rustc_driver and rustc Windows resource files. -// This file is processed by the build script to produce rustc.rc and rustc_driver.rc -// with the appropriate version information filled in. - -// All the strings are in UTF-8 -#pragma code_page(65001) - -#define RUSTC_FILEDESCRIPTION_STR "@RUSTC_FILEDESCRIPTION_STR@" -#define RUSTC_FILETYPE @RUSTC_FILETYPE@ -#define RUSTC_FILEVERSION_QUAD @RUSTC_FILEVERSION_QUAD@ -#define RUSTC_FILEVERSION_STR "@RUSTC_FILEVERSION_STR@" - -#define RUSTC_PRODUCTNAME_STR "@RUSTC_PRODUCTNAME_STR@" -#define RUSTC_PRODUCTVERSION_QUAD @RUSTC_PRODUCTVERSION_QUAD@ -#define RUSTC_PRODUCTVERSION_STR "@RUSTC_PRODUCTVERSION_STR@" - - -1 VERSIONINFO -FILEVERSION RUSTC_FILEVERSION_QUAD -PRODUCTVERSION RUSTC_PRODUCTVERSION_QUAD -FILEOS 0x00040004 -FILETYPE RUSTC_FILETYPE -FILESUBTYPE 0 -FILEFLAGSMASK 0x3f -FILEFLAGS 0x0 -{ - BLOCK "StringFileInfo" - { - BLOCK "000004b0" - { - VALUE "FileDescription", RUSTC_FILEDESCRIPTION_STR - VALUE "FileVersion", RUSTC_FILEVERSION_STR - VALUE "ProductVersion", RUSTC_PRODUCTVERSION_STR - VALUE "ProductName", RUSTC_PRODUCTNAME_STR - } - } - BLOCK "VarFileInfo" { - VALUE "Translation", 0x0, 0x04b0 - } -} diff --git a/compiler/rustc_windows_rc/src/lib.rs b/compiler/rustc_windows_rc/src/lib.rs deleted file mode 100644 index caa5e5ef27656..0000000000000 --- a/compiler/rustc_windows_rc/src/lib.rs +++ /dev/null @@ -1,158 +0,0 @@ -//! A build script dependency to create a Windows resource file for the compiler -//! -//! Uses values from the `CFG_VERSION` and `CFG_RELEASE` environment variables -//! to set the product and file version information in the Windows resource file. -use std::{env, ffi, fs, path, process}; - -use cc::windows_registry; - -/// The template for the Windows resource file. -const RESOURCE_TEMPLATE: &str = include_str!("../rustc.rc.in"); - -/// A subset of the possible values for the `FILETYPE` field in a Windows resource file -/// -/// See the `dwFileType` member of [VS_FIXEDFILEINFO](https://learn.microsoft.com/en-us/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo#members) -#[derive(Debug, Clone, Copy)] -#[repr(u32)] -pub enum VersionInfoFileType { - /// `VFT_APP` - The file is an application. - App = 0x00000001, - /// `VFT_DLL` - The file is a dynamic link library. - Dll = 0x00000002, -} - -/// Create and compile a Windows resource file with the product and file version information for the rust compiler. -/// -/// Returns the path to the compiled resource file -/// -/// Does not emit any cargo directives, the caller is responsible for that. -pub fn compile_windows_resource_file( - file_stem: &path::Path, - file_description: &str, - filetype: VersionInfoFileType, -) -> path::PathBuf { - let mut resources_dir = path::PathBuf::from(env::var_os("OUT_DIR").unwrap()); - resources_dir.push("resources"); - fs::create_dir_all(&resources_dir).unwrap(); - - let resource_compiler = - find_resource_compiler(&env::var("CARGO_CFG_TARGET_ARCH").unwrap()).expect("found rc.exe"); - - let rc_path = resources_dir.join(file_stem.with_extension("rc")); - - write_resource_script_file(&rc_path, file_description, filetype); - - let res_path = resources_dir.join(file_stem.with_extension("res")); - - let status = process::Command::new(resource_compiler) - .arg("/fo") - .arg(&res_path) - .arg(&rc_path) - .status() - .expect("can execute resource compiler"); - assert!(status.success(), "rc.exe failed with status {}", status); - assert!( - res_path.try_exists().unwrap_or(false), - "resource file {} was not created", - res_path.display() - ); - res_path -} - -/// Writes a Windows resource script file for the rust compiler with the product and file version information -/// into `rc_path` -fn write_resource_script_file( - rc_path: &path::Path, - file_description: &str, - filetype: VersionInfoFileType, -) { - let mut resource_script = RESOURCE_TEMPLATE.to_string(); - - // Set the string product and file version to the same thing as `rustc --version` - let descriptive_version = env::var("CFG_VERSION").unwrap_or("unknown".to_string()); - - // Set the product name to "Rust Compiler" or "Rust Compiler (nightly)" etc - let product_name = product_name(env::var("CFG_RELEASE_CHANNEL").unwrap()); - - // For the numeric version we need `major,minor,patch,build`. - // Extract them from `CFG_RELEASE` which is "major.minor.patch" and a "-dev", "-nightly" or similar suffix - let cfg_release = env::var("CFG_RELEASE").unwrap(); - // remove the suffix, if present and parse into [`ResourceVersion`] - let version = parse_version(cfg_release.split("-").next().unwrap_or("0.0.0")) - .expect("valid CFG_RELEASE version"); - - resource_script = resource_script - .replace("@RUSTC_FILEDESCRIPTION_STR@", file_description) - .replace("@RUSTC_FILETYPE@", &format!("{}", filetype as u32)) - .replace("@RUSTC_FILEVERSION_QUAD@", &version.to_quad_string()) - .replace("@RUSTC_FILEVERSION_STR@", &descriptive_version) - .replace("@RUSTC_PRODUCTNAME_STR@", &product_name) - .replace("@RUSTC_PRODUCTVERSION_QUAD@", &version.to_quad_string()) - .replace("@RUSTC_PRODUCTVERSION_STR@", &descriptive_version); - - fs::write(&rc_path, resource_script) - .unwrap_or_else(|_| panic!("failed to write resource file {}", rc_path.display())); -} - -fn product_name(channel: String) -> String { - format!( - "Rust Compiler{}", - if channel == "stable" { "".to_string() } else { format!(" ({})", channel) } - ) -} - -/// Windows resources store versions as four 16-bit integers. -struct ResourceVersion { - major: u16, - minor: u16, - patch: u16, - build: u16, -} - -impl ResourceVersion { - /// Format the version as a comma-separated string of four integers - /// as expected by Windows resource scripts for the `FILEVERSION` and `PRODUCTVERSION` fields. - fn to_quad_string(&self) -> String { - format!("{},{},{},{}", self.major, self.minor, self.patch, self.build) - } -} - -/// Parse a string in the format "major.minor.patch" into a [`ResourceVersion`]. -/// The build is set to 0. -/// Returns `None` if the version string is not in the expected format. -fn parse_version(version: &str) -> Option { - let mut parts = version.split('.'); - let major = parts.next()?.parse::().ok()?; - let minor = parts.next()?.parse::().ok()?; - let patch = parts.next()?.parse::().ok()?; - if parts.next().is_some() { - None - } else { - Some(ResourceVersion { major, minor, patch, build: 0 }) - } -} - -/// Find the Windows SDK resource compiler `rc.exe` for the given architecture or target triple. -/// Returns `None` if the tool could not be found. -fn find_resource_compiler(arch_or_target: &str) -> Option { - find_windows_sdk_tool(arch_or_target, "rc.exe") -} - -/// Find a Windows SDK tool for the given architecture or target triple. -/// Returns `None` if the tool could not be found. -fn find_windows_sdk_tool(arch_or_target: &str, tool_name: &str) -> Option { - // windows_registry::find_tool can only find MSVC tools, not Windows SDK tools, but - // cc does include the Windows SDK tools in the PATH environment of MSVC tools. - - let msvc_linker = windows_registry::find_tool(arch_or_target, "link.exe")?; - let path = &msvc_linker.env().iter().find(|(k, _)| k == "PATH")?.1; - find_tool_in_path(tool_name, path) -} - -/// Find a tool in the directories in a given PATH-like string. -fn find_tool_in_path>(tool_name: &str, path: P) -> Option { - env::split_paths(path.as_ref()).find_map(|p| { - let tool_path = p.join(tool_name); - if tool_path.try_exists().unwrap_or(false) { Some(tool_path) } else { None } - }) -} diff --git a/src/bootstrap/src/core/builder/tests.rs b/src/bootstrap/src/core/builder/tests.rs index 229adf714598b..89a0ab7711ee2 100644 --- a/src/bootstrap/src/core/builder/tests.rs +++ b/src/bootstrap/src/core/builder/tests.rs @@ -1805,7 +1805,7 @@ mod snapshot { insta::assert_snapshot!( ctx.config("check") .path("compiler") - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] @@ -1831,7 +1831,7 @@ mod snapshot { ctx.config("check") .path("compiler") .stage(1) - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] @@ -1845,7 +1845,7 @@ mod snapshot { [build] llvm [build] rustc 0 -> rustc 1 [build] rustc 1 -> std 1 - [check] rustc 1 -> rustc 2 (75 crates) + [check] rustc 1 -> rustc 2 (74 crates) "); } @@ -1861,7 +1861,7 @@ mod snapshot { [build] rustc 0 -> rustc 1 [build] rustc 1 -> std 1 [check] rustc 1 -> std 1 - [check] rustc 1 -> rustc 2 (75 crates) + [check] rustc 1 -> rustc 2 (74 crates) [check] rustc 1 -> rustc 2 [check] rustc 1 -> Rustdoc 2 [check] rustc 1 -> rustc_codegen_cranelift 2 @@ -1957,7 +1957,7 @@ mod snapshot { ctx.config("check") .paths(&["library", "compiler"]) .args(&args) - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] From af93ed5a79e30de968cdeb8ca65f29afbc35c455 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sat, 20 Sep 2025 13:13:53 -0400 Subject: [PATCH 05/37] Bump to released stable compiler on beta branch --- src/stage0 | 870 ++++++++++++++++++++++------------------------------- 1 file changed, 368 insertions(+), 502 deletions(-) diff --git a/src/stage0 b/src/stage0 index a705cd1c760d6..d960a46978326 100644 --- a/src/stage0 +++ b/src/stage0 @@ -13,506 +13,372 @@ nightly_branch=master # All changes below this comment will be overridden the next time the # tool is executed. -compiler_date=2025-08-05 -compiler_version=beta -rustfmt_date=2025-09-05 -rustfmt_version=nightly +compiler_date=2025-09-18 +compiler_version=1.90.0 -dist/2025-08-05/rustc-beta-aarch64-apple-darwin.tar.gz=b9d8f74da46aeadb6c650a4ccfc3c2de08e229e4211a198fa2914103f09f579d -dist/2025-08-05/rustc-beta-aarch64-apple-darwin.tar.xz=493ed87c65bac5593c104373a3277ddc2330072796704e4b6800c531326da860 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-gnullvm.tar.gz=6c20a3b2e4d3ef9a54b1fe4f50c71895d4d8557d6960f887ef4958c0f2a19eab -dist/2025-08-05/rustc-beta-aarch64-pc-windows-gnullvm.tar.xz=d6bffc013745c0d69f4cf7ab4f747f8ad885e3b1b77fa56c2e7de8808e278294 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-msvc.tar.gz=3b6bf7e2aff93854346c1d0970cf207c049c17c5ea6ee299dcdb1fd92e996fc0 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-msvc.tar.xz=8241fdc7c673499091700cfcfafe10f3b70bf91918a3b7204a73d2b28445cfa5 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-gnu.tar.gz=36a093e6c99f227e293ebcaebc89e58166e3da7447d2499069c616610fb4e691 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-gnu.tar.xz=7cad77f36dcabbe77d603b8b3b4bfa83488a3af2e9b815f698f544de148c77a8 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-musl.tar.gz=421980aa1ef5467f59c1a8ad43415d69057c9277fdc91d1d5c2b53c246e8bbe9 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-musl.tar.xz=0ba5b4cd4f5975a58cf86331de5a3c80fb2fd620d50797360a5af4ebf2bba575 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabi.tar.gz=13b3e61ca606bfdf90d46a8873ca4f14fa07ad8bd77364f1a85f557f31ba7299 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabi.tar.xz=f6a1991e55af549d6cd59ddbebb6d2289d90d1e37b2a9449d7831b4c117a54bf -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz=a5533df1ae642bcea571aa6c2b5eda16a56c6cd597906081840bb7531f7b02a3 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz=2a7187ad6d0215f07d0472880e117556508780e37df6e2a1a7fdbb67fd8dc87e -dist/2025-08-05/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz=3ae6e7d83ae3e1c5c8030ba93b9103addaf11f0f8807f1fbf813305d8e6a9188 -dist/2025-08-05/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz=324d6de1a8e4d9c1dd13cc86665fd06cb167d4a3ea55607cd5353300733f480e -dist/2025-08-05/rustc-beta-i686-pc-windows-gnu.tar.gz=0bc4b50638818008e054af245d4e987ce5e55fdc56e19d31c18e8c0165f860ab -dist/2025-08-05/rustc-beta-i686-pc-windows-gnu.tar.xz=b0e5343207a9684d5efe81e536d23135df07bebd869dcad69c632811e1e37137 -dist/2025-08-05/rustc-beta-i686-pc-windows-msvc.tar.gz=c3231335a50402989d4e08857fd7194a3fe5384d2aa34153a25a3f2955a942ef -dist/2025-08-05/rustc-beta-i686-pc-windows-msvc.tar.xz=be578fcbfe32e40fd9688e618927ddcce88e7e08a279778d4c3399eb46e8ae29 -dist/2025-08-05/rustc-beta-i686-unknown-linux-gnu.tar.gz=96b2cdda499b63aadb76b37a4895623a4806c5c8db8f6edeaeb1b812d337192f -dist/2025-08-05/rustc-beta-i686-unknown-linux-gnu.tar.xz=f6496eabe0efcc09c7a4994cc4825e9c3e494c8ca7679cfcbd38a699438e1b74 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-gnu.tar.gz=3403d7be2f49387149ce075b427f8eaa306066db9fd4ec69de61dc01f6834037 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-gnu.tar.xz=8cb3a329ef3632afc1f709b9f9b99a2ab7f5c18590590ddacf64f1b3e5a3ff69 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-musl.tar.gz=9485ce37e99a6a53b5521683bec65d015a730a41c4c3f3baa19226edd211fc39 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-musl.tar.xz=450d91ad61a23f69560e53c7001aec047bd17fb4831bafb97e7226162bb3c0f4 -dist/2025-08-05/rustc-beta-powerpc-unknown-linux-gnu.tar.gz=dc9ff117a7dd3e685c634e8668d78022f66f6e58dc449fbe5f398688ed2dae0a -dist/2025-08-05/rustc-beta-powerpc-unknown-linux-gnu.tar.xz=7dbc936f94d531040601d6fc02d9db87335a1b7927637494c9e208a43f012010 -dist/2025-08-05/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz=4a68557cf53063817ee651f5838ad2c3de93a647b9002fe3c82f0372cbd71708 -dist/2025-08-05/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz=f5ae9c4ba17d2941e8fa947d9712a8db8dbbdecbcfa4330988d02b9299fbc814 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz=ad33c48172c3b9abbd95b9dd3c1d38d5f6bc25fe84b95e492b6cdad27ef1bf19 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz=89d40fb02cded4e8d9b3e177f07e1b984481d493015a2532dfdb5b8aaf5ffa94 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-musl.tar.gz=a5ab7a321363502609a4ec5464be96629c693395503c8ce285990db3c556a775 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-musl.tar.xz=7e3b5afc7858857d5840bd6e788fd88449555e2fbe4c9a206ee3552e61dd79b0 -dist/2025-08-05/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz=fde633217cf77d6fc6f901d84619f681a1fd1e42be75960809bab4806528a451 -dist/2025-08-05/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz=69541c68f31a401229d770ef2ea6d032104fe928db845eae23f04c40db021a8d -dist/2025-08-05/rustc-beta-s390x-unknown-linux-gnu.tar.gz=dc257bbab4790dbc3f9df70853eadce198dd5f6f47c8e830254ee2b21c6c79a3 -dist/2025-08-05/rustc-beta-s390x-unknown-linux-gnu.tar.xz=d5a9d5c555241b231eacc0584db0b540ee2982e8bd66cf8568064aab4beb0c94 -dist/2025-08-05/rustc-beta-sparcv9-sun-solaris.tar.gz=96b25f8ce6db2f9d9b7e8da75839d1bd4c97011bebd2544633ab2061e4460bb3 -dist/2025-08-05/rustc-beta-sparcv9-sun-solaris.tar.xz=88438d143441da62bf5415857aab3490697f7f413b7de41cd113bac1480ea7de -dist/2025-08-05/rustc-beta-x86_64-apple-darwin.tar.gz=f59175ef402489c1dd2f6a8984ecb66314240a8e4f7c55e5d92017fc025fa4ee -dist/2025-08-05/rustc-beta-x86_64-apple-darwin.tar.xz=21de96e49395252e6eb5b175ee794acad78ccd4ac081303a8da7ec84bf2b6ab1 -dist/2025-08-05/rustc-beta-x86_64-pc-solaris.tar.gz=164a9b76347131d78fb81519627ab50f13a313d8da13d09f7fa479a41c519458 -dist/2025-08-05/rustc-beta-x86_64-pc-solaris.tar.xz=0f91f1f4b8880944341d82894b830a70f8a60837687829e0ab9626f3281ddd1b -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnu.tar.gz=634711ae22708a5ae57bb2022fd22257664a8510b59975f4b4ad4b9a8acf475b -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnu.tar.xz=b72c0d3f5800e92b91d1361e52b28ff622aeb1f1cbdff2efd22c2f2a3315dd68 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnullvm.tar.gz=668f3a8b48092721bb6e1a01440776d6b906850a11e1bcc37a50bb13ef8d7b04 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnullvm.tar.xz=e06a183829e09448e76daaf8c317b52d11fac7d16ad191ef61b8f7a806eb9414 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-msvc.tar.gz=564849501d1e41fe776f5443b87c9500621adef97eff05d2c03d539ea3c886da -dist/2025-08-05/rustc-beta-x86_64-pc-windows-msvc.tar.xz=6a1c1cc47c0e8b6aaad215d4d4e8b770b96336e9f2a0317fcf0511b662966bfd -dist/2025-08-05/rustc-beta-x86_64-unknown-freebsd.tar.gz=560bcc4d150f4e22f5598d61fce86c9baeda1b57bda837270f7cac78cfc12b19 -dist/2025-08-05/rustc-beta-x86_64-unknown-freebsd.tar.xz=cdfe207645068b4659b0f979cae177723c5f211084f45ae9180b2d93ee83fce6 -dist/2025-08-05/rustc-beta-x86_64-unknown-illumos.tar.gz=5a362ca0c686b0e0666824df3f304ec49d7d419abb08473fece69d41e96ee625 -dist/2025-08-05/rustc-beta-x86_64-unknown-illumos.tar.xz=fb4e7b12b5223545f6fd57754744f03dd6807b6801e97f9f0fe07bc371efed62 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-gnu.tar.gz=74225a1889120c0174a056e7ca7656f38e8788137ee3d29df857567ae0605692 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-gnu.tar.xz=2d37542e88f84a0501841e12865262142fec0efef9ca729d26a3c333f16e465d -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-musl.tar.gz=156eabc89e1ee9558b9de6f60b1bc47c81ab33ae20fa946c4ad4e32b7f30c221 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-musl.tar.xz=0cf9e649b9020fcfd25282ae1edb1ac59560b7d6d0f79ff7ff3b62871ff25d86 -dist/2025-08-05/rustc-beta-x86_64-unknown-netbsd.tar.gz=8db86a95b22efc2ff2f344e301171813375ccfd2aacad61d3aa84a63f573647a -dist/2025-08-05/rustc-beta-x86_64-unknown-netbsd.tar.xz=68c10c6431b4433d4de5d24a9bb6ebabe99769b077cdd80ab5e0ee67a273035e -dist/2025-08-05/rust-std-beta-aarch64-apple-darwin.tar.gz=872e61e6d6915c02de0b9437b910f6f37f5e11c83347bbe2284a59c31aa27ac3 -dist/2025-08-05/rust-std-beta-aarch64-apple-darwin.tar.xz=748516af852836f06efa927cc96bdd2ad6b012d0262e87bdec97a112212cc24a -dist/2025-08-05/rust-std-beta-aarch64-apple-ios.tar.gz=2c1cf24819ec790d124c7ace59c12a903250eefdad6362b40c779a97b732459e -dist/2025-08-05/rust-std-beta-aarch64-apple-ios.tar.xz=b2fd6df9653b6c0bc13d4331355b3b9a4756886ba46d6c744687bf7bbd8e4630 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-macabi.tar.gz=c266b75c66ea17b174ce8a746bbad78bca58bd72c3cdda603f20a868f9b3b00c -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-macabi.tar.xz=da5558b25c82a5fc1b66786b035212c5d0df2d4124da3e581e15636f29547dd0 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-sim.tar.gz=8441032f41e142faebe78e84501344180447121602a2000d1310d7a716cf3695 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-sim.tar.xz=48713adfa5605addd97e13312f6bc4cf103c06623f67705732684b51d0bed8b1 -dist/2025-08-05/rust-std-beta-aarch64-linux-android.tar.gz=1eb2bbc5fac670aa5867546f1caf1378591d5c0d3a3800ca1dd052645fea0cd6 -dist/2025-08-05/rust-std-beta-aarch64-linux-android.tar.xz=ae5e8aedcc5c8bf719e8ed788d52cc69daf64dfcf878e8497b45454c1c582c56 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-gnullvm.tar.gz=bedf5d7663acb4e1afed9dea4b5b8e9b7f0e0dd68e311d3597819ddd028576f7 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-gnullvm.tar.xz=e19fd9dc6d9e774e30a9e4a16ac5d6d1fd3300eb880c09f6b61cc63d52370629 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-msvc.tar.gz=8ad111b1e8e19fdc5bd33d82a1f6d88b9c1809e27531af9d9fed2e37f75edeb4 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-msvc.tar.xz=332976524e42b4d7b2763a28cae3ebbc3eec03465c098df26e81242294277de4 -dist/2025-08-05/rust-std-beta-aarch64-unknown-fuchsia.tar.gz=92f4737a1775c1fed9311b8949950c6606ca34d272f787d222923555fb69f98b -dist/2025-08-05/rust-std-beta-aarch64-unknown-fuchsia.tar.xz=2f1ebaa974dc3c6b39c43e38cf6d9f5c6fba0d46229a0423be676d817905850c -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz=798dafd6f581f367dfed9763b62b35e77466f87ae8252a52f503f1c1bf58f1a5 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz=c4434727604a2773f73e8919a6e967c7c487d75684514cacbe59fb2d6a5f0d29 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-musl.tar.gz=c48d4e44b0e94f341e7ab2f9d47b08280930152a53dff20d6c9140739fbd2898 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-musl.tar.xz=8cac54d6a39c13dd0f38fde523a852c5db7f61a7f05b3e3ad0f78c7f59513d02 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-ohos.tar.gz=5c3d7ea7ac6ab60311fb49c5a2f04a92266bc8a675d7f333219177a91b400f9b -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-ohos.tar.xz=f1f9f8a71fc5903bf720d39bedaadab16363b37f9e99817d7cf27b7122ad1ad0 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none.tar.gz=ceffb671e87556b304e63cf01572e1cad8c8cfa0b33ccd1a373b033c60696376 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none.tar.xz=a9a9b17f2b4fdf45f46359726e0c28f6a1289a7abf81fdbe1ae180b2f550aa60 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz=9f6f6a121e3b19b7b3b2c85dcd13544c12af18cc5544403e29ea8bbd5b13fecc -dist/2025-08-05/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz=5b0f0059dd5d837fad74aaf2971fb135229b030a832268106be512557cc7a611 -dist/2025-08-05/rust-std-beta-aarch64-unknown-uefi.tar.gz=67166c7d6d7210ca97c3610abfa126234653d0e26658bbea64d574852fad04fe -dist/2025-08-05/rust-std-beta-aarch64-unknown-uefi.tar.xz=05f72e7c0ebbf7b41bf3e773bbbc073ca9c71417a80dec8f3916dafbe0cdcf7b -dist/2025-08-05/rust-std-beta-arm-linux-androideabi.tar.gz=bdf103a29035659972f35bb9060ba8df5ca9b7b068e3c094d758331a5e667144 -dist/2025-08-05/rust-std-beta-arm-linux-androideabi.tar.xz=8fa8b6994b4e04fec77a6657db0fde4e4cb9336466ce0c4f3e2b154709969c93 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz=4298510905c958e45291c2fbc4c54bfed9fdafbd48636896fe00a73e94f700ba -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz=79e0e393f5286429755faee738ed110fb1cc51b83aec3c94194e903f0b938d73 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz=37278a621e2449b9030045c174c71f3ddf74e70b49b5f247c36fea1b1654979f -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz=3ac094e855f7593a22a56ec40923384a0e25265645d05b2a46dde2612d9c6cf9 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabi.tar.gz=b5bc7d83a3c59764cdc169ae349e01cd052b8ab054eb13b4f2a1cd02ddd7fd6c -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabi.tar.xz=2f8558fee897543da620531e500f3a73c5aac4ea815b7bd418945103dedde530 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz=2e812427b5169e7de22b720776208ae92f9075c5509f6b9ad8666b9866232735 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz=e544363209177357386f220d6c4101b1d86d84c03e51254ff459ca42ef187107 -dist/2025-08-05/rust-std-beta-arm64ec-pc-windows-msvc.tar.gz=778c947235bb0023ca26dc0592e4d3cb9ad9665c3316d57822c173ba2b5e231e -dist/2025-08-05/rust-std-beta-arm64ec-pc-windows-msvc.tar.xz=3a5bf7620e1b24e1f72968f5cc28cc58acc9b5739f2c08f5c4b9e449d8c551a1 -dist/2025-08-05/rust-std-beta-armebv7r-none-eabi.tar.gz=fcace82dc77156a6e7c658fc5abe4992075cfe822fb18a1edfca1967102a6adc -dist/2025-08-05/rust-std-beta-armebv7r-none-eabi.tar.xz=9616372693902e89b55de55b62009a59baccb11ccb63710a475856deca70655c -dist/2025-08-05/rust-std-beta-armebv7r-none-eabihf.tar.gz=2c596de7d22a4762908676d4e048f5075cbf2d66c5f7a03afb96e709f2d080ca -dist/2025-08-05/rust-std-beta-armebv7r-none-eabihf.tar.xz=b1ff9e3fe11acc22fa5ad46530dff62bfceac9df6fcbd3da7999535a00dd2e3e -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz=e033e4bfc11a5bcb7f0645426fac899f7d071236a228300ca2022935997b17fd -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz=919587b40e2bc6c6e8f496244c357c04d5e53b8adb9b3f274432943fd789a1a4 -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz=392a1f0528e4b783e5fd0be74efbec58eb3b0ebd69c3855675301ebf96b76c4a -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz=183144eb89cc1a035c04d50c4060e159ca5099fec71f4f25801a924fa013d04a -dist/2025-08-05/rust-std-beta-armv7-linux-androideabi.tar.gz=f968b761773b76f151b39dce0f3757f59eee2d8b70373d1419e0986429885d7d -dist/2025-08-05/rust-std-beta-armv7-linux-androideabi.tar.xz=fecda678541a151b76f3874e710e875a662a9165eaf1cf12b081ea55ea18a38b -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz=300d7e8adaad86ddeff643109d0c83a87e41a056171f9d48b0b6108719003325 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz=acb8f61c97efae6e95aaabe1cab1300bc3cc3a1dc2066c7e2376ad6a9994971c -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz=5e90333cb68f3161f8cb30e69d4ebe46f6653998651c72a87a795ab02c11dade -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz=355bc516a7a6454eaacc66eadaa4d640cb3ffc7b5400a01bb4bdccf4470ae650 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz=8daa2c4c4dd9e8a1b9ee8a60f2cab0dab81aaf1e7a9d732093979ccdeac8bf60 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz=52b78d85f8e9e19da83504bb523aecf7b641d15c1de2f9b988bedf52912636d4 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz=c63000f15b52881c20f40cf1468afd4f3a2a6a84e944357fe6532c7d0e281b3a -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz=53fc3486e4d805386c1ac4d6a1007a9b5461ae606c9c820951b720b45dc8f35c -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-ohos.tar.gz=315fc371ac2cddeb65c87bd50369e28247c16ca55fdab527e88899e01adc9efe -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-ohos.tar.xz=d7999aff0a39c63709977f5c18d79b575f8bfb467fbacf4f1b41cd26b52a6701 -dist/2025-08-05/rust-std-beta-armv7a-none-eabi.tar.gz=0707721586e8929811c2904e4136d31f5c415e3f00bfa88dbb920360aa9deea9 -dist/2025-08-05/rust-std-beta-armv7a-none-eabi.tar.xz=bedfd1a808f758f5088ea0fcb746d3ccf11730945e2b07220e93829c0d5c472a -dist/2025-08-05/rust-std-beta-armv7r-none-eabi.tar.gz=315fadb161b3be540b7a276ebe15b1f8d4bdf73b46c1633e39f698014aca8eb1 -dist/2025-08-05/rust-std-beta-armv7r-none-eabi.tar.xz=4bc2fcd9dee2ee44914da0e6af3763c7ddcbe3ebd9fb20c1d552a0226cd877d7 -dist/2025-08-05/rust-std-beta-armv7r-none-eabihf.tar.gz=9c8be30130709ff94a9718091559a752530f0eeb21be80fc3cca0665e85ae0dc -dist/2025-08-05/rust-std-beta-armv7r-none-eabihf.tar.xz=f0dd0bd30ed70c3a022016d8bbed54a6e942571f2e4c773bd8b4198d7dccdb5c -dist/2025-08-05/rust-std-beta-i586-unknown-linux-gnu.tar.gz=ca6c3b8af1c44deaf7dce9e8d4c8786a5801226b30beaa646067d393eeaa0ee8 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-gnu.tar.xz=4e96f0e5f2e3eda60ca2b6d9ce234ae74c5eb2412a7e2c0c571eaf792dca6e28 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-musl.tar.gz=60c736e3ac2aa5b9ceedcd73e39efa12bc9b889ef85f548170f80fbf2b05dfa0 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-musl.tar.xz=fe636d893e38c32a163a88ece160d5b5ea61a3fa63463d4e4f425d229c2927f1 -dist/2025-08-05/rust-std-beta-i686-linux-android.tar.gz=9e62d61041187a91b74c81fe77cd6802a7e38c5a535412c71850426f6a48f37c -dist/2025-08-05/rust-std-beta-i686-linux-android.tar.xz=862d3d5442fb011b917f565aaadb201c22e7b2ecd6a68c0c410b3335741c1c22 -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnu.tar.gz=05a8da51c477e2c2ce4ea12d41c8afaaf0d226a6b933b6c55fd3584b39103366 -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnu.tar.xz=cf15b3d2011ceb57064d0b2285defee7df8628c3bf2b95f7f2ac92a449546d4f -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnullvm.tar.gz=fe11b777eae25d823f40352e47272222c2de8edc2d271eb4f6e7ff508efa198d -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnullvm.tar.xz=a7bb6f223e3542e613eaa7f2b9d9974be71cd2debf8426faa50cfb63fde681fd -dist/2025-08-05/rust-std-beta-i686-pc-windows-msvc.tar.gz=5fbd709698d80b3227a8bc6cbecfc597e99dede3824c751e1d166cac2c5862dc -dist/2025-08-05/rust-std-beta-i686-pc-windows-msvc.tar.xz=92fd2a6a5dbe53f68e9ba3ce40cd3beea95ba9d6a2f1293f7f3d917f34739a66 -dist/2025-08-05/rust-std-beta-i686-unknown-freebsd.tar.gz=182acad6cea45855f66646d437ee44ddb1f85c2c998cc5c7a4bbb025ca0d9da9 -dist/2025-08-05/rust-std-beta-i686-unknown-freebsd.tar.xz=53f8bfaabff1dbc47929a99a92025a31c1e272bf6a8091c4f95d33557dfe9ea1 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-gnu.tar.gz=b80dd4e77c56256f7a7f837bf84129d19e1a4aa08a0ca7e2881402371a7e4395 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-gnu.tar.xz=52efb657f28303b0747cf281c972653abfbeb4bf6d0b841f8bbab7f08c5d7310 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-musl.tar.gz=323abc9766231dca10c225b3ec567c694c0ff6f6eddcc30d728a0f08aa6d2186 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-musl.tar.xz=8998ce49f1be28bcd837831f1d7b79b0b339bc74ced42adb6d997ed016e90e88 -dist/2025-08-05/rust-std-beta-i686-unknown-uefi.tar.gz=07261ce98c95839b8714f40e07cbffa32c10fc7c59394dc87b07e144564c5fef -dist/2025-08-05/rust-std-beta-i686-unknown-uefi.tar.xz=fb6eb023b9722a44e63bcd48fd88c61cf41453842a211107c84039c6883409e5 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-gnu.tar.gz=d0a52888f5ef3107ecdbf28b918eb516a9176ae8695079a81a22d1b7ca0e29bd -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-gnu.tar.xz=c14a477558a6c924e05e1b58bd9df60f5e4966c7f0da294dd38e3bd89c1dc5f6 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-musl.tar.gz=bbb93219393948d055df44edcdfff4b03ca251205c545d6f1bd53ade5f314d52 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-musl.tar.xz=48b437a8afe240828c0377a6baa276500f125661f1bc888ebd1ea546f0497f4a -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none.tar.gz=fcec6b60a1a22dcd04b8409d38103496d76bb4297ded9f1f092743bd05f0bd54 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none.tar.xz=2f4aacb734b5a1dd522b4836035ab213db675508b9ff9a1bdc0c2df3ea9d39d1 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none-softfloat.tar.gz=aad8445e9a5deb4a466ebed84cab101bbe8ef49530315c0349d93e2062ae65a8 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none-softfloat.tar.xz=906e1cbd1e3b22eb5c378417646baf18b00acb274ee4198ea59ea356f4f1a0da -dist/2025-08-05/rust-std-beta-nvptx64-nvidia-cuda.tar.gz=b0d7e8daae2eff0c660b6e01bc76258550b9bfbdbf95c104019db7c797339ef5 -dist/2025-08-05/rust-std-beta-nvptx64-nvidia-cuda.tar.xz=c0bffdbb4de90486cad1a26df997006c142f1acc7ed39419975c10b0d09c6217 -dist/2025-08-05/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz=3c845cade37fe2b1cfe3087c69f9ecb3e0eec32d2558701c677d4c21ea9e08db -dist/2025-08-05/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz=15830d827258f6c3386fa09da66e06ff0460098b46432e28b4e96bd36d61e787 -dist/2025-08-05/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz=4b63d9260253f1d3a0168ed367792284584b87aa936fc76262e9fe0ad83c7fa1 -dist/2025-08-05/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz=dfba70ad94524437fc8ec5e4684239eceb76678112776915f02502b80cb0afac -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz=3d96bebe611a0167a43060312cbfa2fe4000b9949772ee44ffd27226acd006c8 -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz=44e95c2756f52129b8bd21d7d4ad7ec8e05e43192f3bc894cba4a371b579a6d8 -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-musl.tar.gz=ca5b7c47b63fa8e005078cb73d111462c438b764909ca106933837ac93d5780f -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-musl.tar.xz=b102756451c18003ad1b132d25d333ed1a0e4959b87d2904a6e407fc02a7e422 -dist/2025-08-05/rust-std-beta-riscv32i-unknown-none-elf.tar.gz=a592e995b40d3b1eb69cb1f7cd3c100713ea092742ab6ec5769e8df8551ffa16 -dist/2025-08-05/rust-std-beta-riscv32i-unknown-none-elf.tar.xz=af9cd91be3d667cf31b535862882537a406f49932f58308f283228b20fc7bd76 -dist/2025-08-05/rust-std-beta-riscv32im-unknown-none-elf.tar.gz=bf9e9d0f8c4ce8041c6e628e1b637ac0cb316f865f97a43cf2bf522e255c5ec1 -dist/2025-08-05/rust-std-beta-riscv32im-unknown-none-elf.tar.xz=c3e56d71c1586559212f701508ee94f0bfa7801e7d2fdc62c062dcce8a0d040d -dist/2025-08-05/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz=068023ed1f1dea01f2523f3b2b9ef41b22a301ceafa0526ebaa757481d14408a -dist/2025-08-05/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz=1e3db6625ebb12a8c735cf4e8658a33bac7bca461de1e516860843d50027ee7d -dist/2025-08-05/rust-std-beta-riscv32imafc-unknown-none-elf.tar.gz=aeb986eef375fa1ebb179668c6778c587d1af8b9e1ff50e5b56f9a3b48f1d8df -dist/2025-08-05/rust-std-beta-riscv32imafc-unknown-none-elf.tar.xz=45d314189b9327645f6490628157fce32b7b59eccdf57676be0c31e1247f5385 -dist/2025-08-05/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz=82d6e6549c80e62d392654693a28528f2ea540652f3ec0810b6646968cae6509 -dist/2025-08-05/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz=805ffe0a6dfbc886f0ba93ac9ce796c110ea6d0a64b2d6209cdadd56cd2a570f -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz=941c683ef7d013166c7f3439ee1229f80a367405f55bab9072dd12725364db6b -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz=8b666222443b3954a7550b14ef919b7ab038e6a4a2355386e42c9acbe28f2024 -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-musl.tar.gz=80f740bd004b98d5c090fe280ef5e372e4bff7a34dc2ba4940204cf02f50bb93 -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-musl.tar.xz=b69ad00f5d60c63fa6d7b32c4d7006d195540d902f8390754c7db92a9221973d -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz=ed52f0f9bac7b9d7ec49226eea471e44fecf0416608a5b169d35b12d009e9c1b -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz=d4dc1b096b26814f14e1e23717cef10f3f63cdc6902e345916e015a99851cb69 -dist/2025-08-05/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz=aa1de02a79f16bb4affb50c3ba0e719352c9925fc57f22f989eed3f7df1a8e5c -dist/2025-08-05/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz=a36e2749e118f995417f0de9c9835db4b36f8ed6d76d8805510853984f648c5b -dist/2025-08-05/rust-std-beta-s390x-unknown-linux-gnu.tar.gz=32e6e3672d3c379a1defb6c661eca6f2ce342784feaceafec004bdaa89a0b226 -dist/2025-08-05/rust-std-beta-s390x-unknown-linux-gnu.tar.xz=a449f0392193ab8a48a30b0a8c0c57b0a02747ae8302d08b3be89d475f1b8291 -dist/2025-08-05/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz=a4e0901c13d3c534e176fdf824a97e5a6ca66a198b73a132b957d41b1f198261 -dist/2025-08-05/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz=64720eab59f7c958aadd360b8e2dc5696760d62e9f5f44daba890fc55a4fb6a1 -dist/2025-08-05/rust-std-beta-sparcv9-sun-solaris.tar.gz=8d5d3be06cfe5431b9a8e965fe06837efe531c365e8d46ee8cdc8e9da19099f0 -dist/2025-08-05/rust-std-beta-sparcv9-sun-solaris.tar.xz=913d7fc4aa75ac2175aa52891f9086d48065d96007885e0caf5feb628953a86d -dist/2025-08-05/rust-std-beta-thumbv6m-none-eabi.tar.gz=ca59366093c472f19381fdc71aacf6b3d659750a8a3bd8894191a42c8c3b82f9 -dist/2025-08-05/rust-std-beta-thumbv6m-none-eabi.tar.xz=e16dc610520f4748ffca99b235e58a544e7f97ca4cf99cbebbeb106ed4acffd1 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabi.tar.gz=08a281c1bd56149ebd05531fe405a621383ad440fcf273fec04e0792f325d669 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabi.tar.xz=a9f7eadfa375061835f139bbb870a5692b727de8a85fb8177d8fabd0588e28cd -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabihf.tar.gz=f996d8b1aae894af11407ac90c277e161acd58378307548ffaa2fa0a4314f3d7 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabihf.tar.xz=48b9e7d257ad1fac0b23b3a7d6b3ae8afb5dd19db7b5dd2a59ddfe51364db72f -dist/2025-08-05/rust-std-beta-thumbv7m-none-eabi.tar.gz=1061c6b8794aa4e1f66ff17d91934bb9711c6064362cca7bca1d7cdd4f9189cb -dist/2025-08-05/rust-std-beta-thumbv7m-none-eabi.tar.xz=974b1078724ac06757d7899fde62f623e61c86ac0853cdbf02a252b13383e55a -dist/2025-08-05/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz=a4fd4047a744bea871a54af311f27a08b5f7c8f04e5e62f7abf292689378ab4f -dist/2025-08-05/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz=19c31d2a0982689228eb58522ac7610d33cfcc1b5f72ee2e41e218695a49d09d -dist/2025-08-05/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz=8b5e150d6950866734b025e58b3714c4acfe631785fc464e6fe3cbedd98709d0 -dist/2025-08-05/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz=23ca585e084fb548488e17adaea92e16ac98340fe146073046d1bfbe6faa325f -dist/2025-08-05/rust-std-beta-thumbv8m.base-none-eabi.tar.gz=d31bcb162cd2ee40a69acb2c201c07c233b8c2710bc07ad322263121f0d422db -dist/2025-08-05/rust-std-beta-thumbv8m.base-none-eabi.tar.xz=67354653ab11222806f4a688c11be6dc80468785e14a8b58f2285a695c53c5a2 -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabi.tar.gz=ad61d8510d82ca1094a893879d7148446e2880dd1d172b9e8a420772b0b4611b -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabi.tar.xz=5c1ddf66949a40265effbc76ac3da59efb1bb3349dbe2a8037b8215375647fdb -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz=4895c9a6659e831cdacd314ff2ca4c968fd368c6bf9308f334468cb07892ae56 -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz=f64a05715457288b36dd16fcbbdd91816829b889047c277841f3f4972bcc6076 -dist/2025-08-05/rust-std-beta-wasm32-unknown-emscripten.tar.gz=3b144570ddc44868a6609f921028b23f994de337c54a96fccaf976abe4e2ceff -dist/2025-08-05/rust-std-beta-wasm32-unknown-emscripten.tar.xz=355a1bc09dd4163a416cb78e55ec998e95b8acbb9b072dbd3a8e34f5e95d3378 -dist/2025-08-05/rust-std-beta-wasm32-unknown-unknown.tar.gz=52213b11d29f02d4531495c9d35ee7022ef6b8400a8386b8728156b33d2a9eed -dist/2025-08-05/rust-std-beta-wasm32-unknown-unknown.tar.xz=1f282c355a1499fc2a212705700fbb8de7e568dbdc5d43d3c895af86fe9f735b -dist/2025-08-05/rust-std-beta-wasm32-wasip1.tar.gz=f40da6445acb1e854625a02b1078f670874e75d763168430d0ca17ef3b9bae26 -dist/2025-08-05/rust-std-beta-wasm32-wasip1.tar.xz=a0e59495bacc1bceaeec940273fcc6d1505c283de9e2a60ee7d492f2a7efec3d -dist/2025-08-05/rust-std-beta-wasm32-wasip1-threads.tar.gz=4b4eb08ab33ff2a300828c65a9636f32428dfec784bf115aa53856b5336d61d5 -dist/2025-08-05/rust-std-beta-wasm32-wasip1-threads.tar.xz=54ae55557d66f922112a42aa2c296841f5919907ccd81354f0dbe1b0517867f8 -dist/2025-08-05/rust-std-beta-wasm32-wasip2.tar.gz=b625337e6180ec57abbed063de5bf384949254c46a5fbbb12804a3dbd0d1c3a6 -dist/2025-08-05/rust-std-beta-wasm32-wasip2.tar.xz=5a098a042f5586e7e1b7444bf64edf3dcc535d75226fa44be420c0d42b90c25c -dist/2025-08-05/rust-std-beta-wasm32v1-none.tar.gz=b11ed27b745437b39ea9699f7fd5413bdb25019720569b9940f1cbac4849344c -dist/2025-08-05/rust-std-beta-wasm32v1-none.tar.xz=3dd3f07214429f36a088a89c3de7404659d1b584895ff5b7938845fd4a669f27 -dist/2025-08-05/rust-std-beta-x86_64-apple-darwin.tar.gz=14522f13786b81727646acfcb18c81b3f78b24bf522ebaf65adba416971d9939 -dist/2025-08-05/rust-std-beta-x86_64-apple-darwin.tar.xz=b78a1df21a97c25d9977a69bf778190fbf34947c6837f895aeeb53c870083438 -dist/2025-08-05/rust-std-beta-x86_64-apple-ios.tar.gz=a5d57bef3b09c4a4e6789d756cbec9e9459261ab70c94a406d4519eb2da992ec -dist/2025-08-05/rust-std-beta-x86_64-apple-ios.tar.xz=1b461aaf03e808d26bcae49417f04b71ad1432f266f0b25b3d6b26a67b7f8953 -dist/2025-08-05/rust-std-beta-x86_64-apple-ios-macabi.tar.gz=6c7a3326abd3fb7c878af095699164237f97ce5827bd428d8aad5c9818b2098c -dist/2025-08-05/rust-std-beta-x86_64-apple-ios-macabi.tar.xz=427684c9613ce04737837a594987bb1eb81d1d3f5ea2a1b19c2b76b3be32ab62 -dist/2025-08-05/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz=2e10607e6eb7fb3168fe593f1d260b52ac578d590cc6788555346cf9bac9f586 -dist/2025-08-05/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz=256331077a036bfed1650177cd1a886aeb4ce9aa9ce2a35f5450767f5e06aee6 -dist/2025-08-05/rust-std-beta-x86_64-linux-android.tar.gz=b5943cc4d10bf039d9b52e56713a99e8edb21d9de3655450d16c557c9013f47e -dist/2025-08-05/rust-std-beta-x86_64-linux-android.tar.xz=ceeb89fa082b98c8d50c043cfd2e4bb8ac1d98943859a75d74a555ffda8d0a5d -dist/2025-08-05/rust-std-beta-x86_64-pc-solaris.tar.gz=98d9d51da4b74a2a1899be7f0dd8d3c0f980fb4ce96fddd1c2dedb76e174984b -dist/2025-08-05/rust-std-beta-x86_64-pc-solaris.tar.xz=0fed1f0452475bf10d3ec0bfef12e9fe05bb117910d871f4099bdd4ca947d74b -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnu.tar.gz=f458eab66adc91aba026a434cab47bbbd98a9d5e7d0f5a1a1979e0e6a89c8e7e -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnu.tar.xz=bfdc3bb5b66a525281236b01513f49d96d644e4cd62ce89eb59a8179fe4707b0 -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnullvm.tar.gz=b543f21106bc3a72d31a5c49118553187cbb0d2e630ea943aa97d3ae5bb4c40f -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnullvm.tar.xz=9056c113ee03defb6cd33acbed9829712b57ef3606623169d28416be4110a31a -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-msvc.tar.gz=c66ff2e88c79f3fe574f9ef7822d5d2e6f73efe3ebe67c6bd35096622b668d1c -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-msvc.tar.xz=45765252e930a96badbf06eb04ec092bb989c0ce2067aaab52b7ddc72ea511b8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-freebsd.tar.gz=9b3d68e86e0ce6a484bf615313f98bd289db73899a55cecfa5b7955b4b0878f4 -dist/2025-08-05/rust-std-beta-x86_64-unknown-freebsd.tar.xz=bd48292b8582167a5e89ebe521c9754495403968c184b925df8b2ec1da344fc3 -dist/2025-08-05/rust-std-beta-x86_64-unknown-fuchsia.tar.gz=b4c6c046299391beb2f50eff198f4c9b6571b6c1748dd621bdd154694fffce3a -dist/2025-08-05/rust-std-beta-x86_64-unknown-fuchsia.tar.xz=a30857c8f066191b64d7b52378fae8790814a251ca452c80710bd9a49c5c0c85 -dist/2025-08-05/rust-std-beta-x86_64-unknown-illumos.tar.gz=1ee4b264021b510342c2ed96da0dacf5cf1704874de3bf9380642433defb3e0a -dist/2025-08-05/rust-std-beta-x86_64-unknown-illumos.tar.xz=ca431d4426cfba2efd408b8822f9aeb0961d81373c6154a0b7eeb957abebc33b -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz=ebba9fa476d5b0a42054a6b6ca51526efd7c2cf5ac34eb8af119bfa69f3f0a5c -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz=d4498920cce484a8b3a5cdf8ee856d80cf1379f9782169340dfff2597b530598 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz=20c37745f3ee13c2c81dfc77a80919cc0448180f6be0be56d7fb5239e5651294 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz=dd319a6c381b372ba230d86bd07a089cd2431656c7c765f029e8e10d60bbd778 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-musl.tar.gz=d0c20b13113eb62c9a78a796418386d0352f4221095de272018af6d5ec6bd9f1 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-musl.tar.xz=d0e1001e8e5af571f0fd53115ec873091a33e4943dd27a16ccd74dcd8c71abce -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-ohos.tar.gz=4be537d5fb6c0d867a131539ef4b0872f9f6d175ba0517fed50b1d463c615157 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-ohos.tar.xz=ca034c852a4c9099a062f55c5e479bd700f2ffd89a3b2c2c7354df54e41057a8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-netbsd.tar.gz=11b5a73da1f560c218cecf9a71d6b2173df1fbe276e63e20e1e85f2dc48579bf -dist/2025-08-05/rust-std-beta-x86_64-unknown-netbsd.tar.xz=2de6a8850076e9c1edd8aa3e13902ebbc599da9637f88da347858007f8e5c212 -dist/2025-08-05/rust-std-beta-x86_64-unknown-none.tar.gz=dacb8aa48387ad15380a094104bbcfabdcdd5f88e189d9203fd3e3f466b92fa3 -dist/2025-08-05/rust-std-beta-x86_64-unknown-none.tar.xz=ce2eb95efe252de2ecbe619b3805b01ec84863a9b30330dc4ad5683d67d7c9d8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-redox.tar.gz=bf28f90b1b24eabd80da75262bd260ee811ef30a1ba94bdeb7a005f132ceeead -dist/2025-08-05/rust-std-beta-x86_64-unknown-redox.tar.xz=99aa3603b7fdc84893a02e66a774e147439a1cfd77ba63818c58b11ae692058d -dist/2025-08-05/rust-std-beta-x86_64-unknown-uefi.tar.gz=75c57e4a9367a6fbee02f8857da2dd4bce8bd20c8946a3c2460a77cb95af0972 -dist/2025-08-05/rust-std-beta-x86_64-unknown-uefi.tar.xz=552c14c20d1f786c8350882a32618951de0a06e0636fa3b8d69f2ffab7e7561d -dist/2025-08-05/cargo-beta-aarch64-apple-darwin.tar.gz=4723292f91e645d3f86474ed55e52eae4f35af7458602d3da9d38b0a513cfeef -dist/2025-08-05/cargo-beta-aarch64-apple-darwin.tar.xz=d0150ce874376c41950966b0385f011ebbbd5ef4955deec7829d8ccb669e9e86 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-gnullvm.tar.gz=fb0a8a8dff4d42f9491ed9a0223a9541bbaf8691c831b5536220494c479b21e3 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-gnullvm.tar.xz=6bd35ea43ab877d84bff4b32b965371b942b10c6f6feabb3a5b481a4c84513fc -dist/2025-08-05/cargo-beta-aarch64-pc-windows-msvc.tar.gz=3437221155f338e81f55dea9d715b3958fe7d3a260d77d14725e62d0780bfc76 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-msvc.tar.xz=94886636f7bf805809a8a1ac99b514036c5db1755ccfed61cb6cd01d57d244a3 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-gnu.tar.gz=7f167793fc72f5fdb6bbed97e96684cfa089f9932d3a64239bc755fe7603e7a3 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-gnu.tar.xz=1018ea99c4142db9fbf386547dee8396dc27d3d3608085a1b0b0e97e2d0172c7 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-musl.tar.gz=8e03af7a838e81c12c395ed76151aa6ead12b3e60effa3b0d775508118149058 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-musl.tar.xz=507de5fbe92e144dd37dc34123ee58b9e46805c85eccd4a759a117020578d742 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabi.tar.gz=263ad4a9ed084dd76b6ea62d377fa470043f78e0343f7fb80d5c9b50659d8977 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabi.tar.xz=ed850f484ee870172b721ab6824f0a15b41dd80ffc623557aa58a5b839d992c5 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz=afb4cdac4a3c28fe08fbba8b98962eec6c625f6a10a52ee8cc988881852b79dd -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz=7f332d11e74d76efe236a7858021a626d31fb856d9ad0745369b99d9fdfe3b44 -dist/2025-08-05/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz=5c0c79bbf734c0ce18001cf27605f6728d83d24bc97ea5c78b423fb9faf46d96 -dist/2025-08-05/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz=3aff39ef7b9e8adc2e6bca19c2940287c4e091ad7ce4503c46334e6969ce0c95 -dist/2025-08-05/cargo-beta-i686-pc-windows-gnu.tar.gz=af99a5778ab4c9cea122897bcd3ea1626893156fb71346d66a584553d6531469 -dist/2025-08-05/cargo-beta-i686-pc-windows-gnu.tar.xz=8425eda844728c0353b4c7edc4636141dad265e461addf009cfa1a224df0e7cd -dist/2025-08-05/cargo-beta-i686-pc-windows-msvc.tar.gz=46d1b318b6cf826d8e7e694e54ce5b9c651dc2f8facf32ddebe21fc32e1e8dc4 -dist/2025-08-05/cargo-beta-i686-pc-windows-msvc.tar.xz=bef58a9f31aa3434152f79b2e271958fb07e925c938a569d1c9431f7764d19f1 -dist/2025-08-05/cargo-beta-i686-unknown-linux-gnu.tar.gz=c432ae4d909a21336a6645b85a90ec541818424bb76da16b19979a61a11845b2 -dist/2025-08-05/cargo-beta-i686-unknown-linux-gnu.tar.xz=053c02b341219d583caba881e525eae2cbb125ecc188e1b43d641fd7f3f027f2 -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-gnu.tar.gz=40542d76adaebdbc3fb16047a8324d439abba0485d227253614beddcc3cee2dd -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-gnu.tar.xz=d25210467dabf91917eefad9a5a415a3912a31b37ce1fd3d755b6c72b3a6ce8a -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-musl.tar.gz=09755de73380c39daf64208df9708613ed6f8790e2f5cf79e80cb7826fd74f28 -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-musl.tar.xz=e8eab1aa5b41c04b518d43a86849307cbfec76df13c834a460c546ab6b170089 -dist/2025-08-05/cargo-beta-powerpc-unknown-linux-gnu.tar.gz=93398391d308bd0c08fa2a7bab7bb6a38b78400280cbe765604a3da9d6caeb47 -dist/2025-08-05/cargo-beta-powerpc-unknown-linux-gnu.tar.xz=ed37a7c5a8c62db06e709779b81d1e013975feeb82c185c76bb3d218aa142cc4 -dist/2025-08-05/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz=a398b3ff0967b1ec2fdc2716a6b2c3a04defc14ebed577d93e45040aa5552dc8 -dist/2025-08-05/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz=51d6a1a3e71713157a4e6291023b8393e21334a952a947f82f9636a725989281 -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz=cef935747fe5205c3c5944f4dcf80e3111d2859616e7d727b8a5c77abe2d9fef -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz=fcb8aee743adcc3796b564570e0ad6d9950031160ba9a6cafbd92af2f0a0c213 -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-musl.tar.gz=73b2c9676122e842a73a8a9890f1e1aac426f75449a99b4fc0ae3f5dd5ce238e -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-musl.tar.xz=ba293bb860349ee4732c5363d38b5e386544a25f65ef8ee33850061bc84bfe64 -dist/2025-08-05/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz=bff3ac251a42b1664a544706185826a4d9137cde990620dc73951252d2d7fb41 -dist/2025-08-05/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz=61056d4405af01b4b1c3134af8e83ed86473d0846beb41d3ab72df92edf316a6 -dist/2025-08-05/cargo-beta-s390x-unknown-linux-gnu.tar.gz=f89a30322a3621c4737f932788f4ca78c83b9f2845e324c4944522f35d44baf1 -dist/2025-08-05/cargo-beta-s390x-unknown-linux-gnu.tar.xz=394d522c9553182cf5f496e2b5324499c1845c0a0621fa527aaa925946b58d21 -dist/2025-08-05/cargo-beta-sparcv9-sun-solaris.tar.gz=0b18adbb22b34448576e6a3ba637c7565d369e1c994474337bed48b3cd0b0231 -dist/2025-08-05/cargo-beta-sparcv9-sun-solaris.tar.xz=c57709b87524d29661f77df3e3585bae4776fb3fb6de3874edb942f724543a89 -dist/2025-08-05/cargo-beta-x86_64-apple-darwin.tar.gz=c8faf66575d43fcbc03376225ac22d571def08ed1fc239d468c15929d9ecd393 -dist/2025-08-05/cargo-beta-x86_64-apple-darwin.tar.xz=538d81c3fe2b5a9edfc1e99655120d37fa159dcf761e1ddbe5233115e39b38b1 -dist/2025-08-05/cargo-beta-x86_64-pc-solaris.tar.gz=a2fb63b0a2cc3d3ea9523c8ffe61ba9ccb367dff136e6fc39aeea6400034363c -dist/2025-08-05/cargo-beta-x86_64-pc-solaris.tar.xz=02e8990865ef8f14a31e4d0f17be4cc0cbecda7e82e062b4b9cfdb99dd45156d -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnu.tar.gz=ba86f300cd40cb3cb23ac41970246ce54c03ee153f86127a379fecda930c020b -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnu.tar.xz=3bc0bf2da392ac52bcf2aa1dc19bea1a86bd7a4fe246feaae862a792c82ec476 -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnullvm.tar.gz=68a2a34e656395fabd42d20b7008d96b2a86e9a47caa52e6e2613ccb3b1b2d8f -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnullvm.tar.xz=1e2e31fe2306e26bfe58c49a99cc89664e8a7857c2c18ad74c20cdb35bd3c586 -dist/2025-08-05/cargo-beta-x86_64-pc-windows-msvc.tar.gz=5fa21f665aa40fab1896bd4a49dc5608b4b453d26f4b975771908634c699ab8e -dist/2025-08-05/cargo-beta-x86_64-pc-windows-msvc.tar.xz=adc5900506d399246960445c1e2d59f0c4b2a5cfeff9972f1617de030ce82bfa -dist/2025-08-05/cargo-beta-x86_64-unknown-freebsd.tar.gz=a2bbb1d5fa283e77ddbbc0c8d69e36b9c2bbb01912f302f522af48c2187327b3 -dist/2025-08-05/cargo-beta-x86_64-unknown-freebsd.tar.xz=11e1a51740a728f5825364a8679b28454a68e7efc96320730f9b58a8fc2e6fae -dist/2025-08-05/cargo-beta-x86_64-unknown-illumos.tar.gz=9993f4130b5ce50898e530e7411efe6923a36b5d56459ab672b1395717fe69bb -dist/2025-08-05/cargo-beta-x86_64-unknown-illumos.tar.xz=0a41315ced9f4fdce9c1877a4c27e5cca6e494f5dc8c2560334a5b75d42f495e -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-gnu.tar.gz=6b8f74b1c850093acb7227306caaed4581d70d015ebb0bb5f924af1c8bee7bd1 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-gnu.tar.xz=f6f7bb4e4f1156329946d83bad5893e508645dd76b9ce522a53ea673791da006 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-musl.tar.gz=68c829663d6166661563704e25a6e85a973705e12efc9265a23264b9ffbff4d7 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-musl.tar.xz=2c40e68c9978e58250f0e017b5cdb2fc390f26ef96324129c489f55898784488 -dist/2025-08-05/cargo-beta-x86_64-unknown-netbsd.tar.gz=65166585138bc6f09f54f88ee889aea6d4e63019d64a684798341d6b332ce99d -dist/2025-08-05/cargo-beta-x86_64-unknown-netbsd.tar.xz=97491edef98b3a13b0571907555bf5867be13ec8fd4af69142db92a8deaf8586 -dist/2025-08-05/clippy-beta-aarch64-apple-darwin.tar.gz=b933611d47ccbcf5aad43f1134cc72ac708fdf59bace0dab75cfe139e2357373 -dist/2025-08-05/clippy-beta-aarch64-apple-darwin.tar.xz=c3d473e366db3b271cbe438b3a5531e9c5a72e28248d94de0f81ee93a8a2e7cd -dist/2025-08-05/clippy-beta-aarch64-pc-windows-gnullvm.tar.gz=e5b4fc054121eb13b21171b2e851dc1c824e11aad1257dc92b4ca9e332898b40 -dist/2025-08-05/clippy-beta-aarch64-pc-windows-gnullvm.tar.xz=40bddcdd9186cfb9f8763e8e289087c15c2c8b8ab78f41ba7380cdb08fedb0da -dist/2025-08-05/clippy-beta-aarch64-pc-windows-msvc.tar.gz=7e7c47305708ae073ed8d86e621a3c0be0e135b2480508814665f24121588a56 -dist/2025-08-05/clippy-beta-aarch64-pc-windows-msvc.tar.xz=c4a5bfe2d48a2301adb4f7524cccd64f4a3ccecf985f131972a13bd221346454 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-gnu.tar.gz=dd26d49359f6010e94e04198067f83c83e81618546d1cf51606d157a02b4938f -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-gnu.tar.xz=e7c9834067311a87f547450108718582991498a102dfcba0e1a99671205e9bc2 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-musl.tar.gz=b584c26e267b0f7e105f65c436c12cfd6d9b8f2b92f9662a4797fa5e95455e11 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-musl.tar.xz=6b0eaadfea879cfc8c758fce002ffe77e34484e167c496ac0659dcc789dfc080 -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabi.tar.gz=eebd0632971888cb3bcc3b07a06f25a47af594ce5606e8e1e069fe85ec702e5c -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabi.tar.xz=946d6791e4e15ffca6195bd7c9bd2d160b9c65468fddc800948f41adc8fec597 -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabihf.tar.gz=3862815aa14e8122b70b39c1137088e0c2a724900d2d13ac2b37a1a430b23a1f -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabihf.tar.xz=8278e11b7ea2bc035e6de21f826a775d66273a9031195d8b887752137424f2e0 -dist/2025-08-05/clippy-beta-armv7-unknown-linux-gnueabihf.tar.gz=83a847698eeafcbd3288d59013157d3d2a11b90b521ebadf1b26dac90877d11f -dist/2025-08-05/clippy-beta-armv7-unknown-linux-gnueabihf.tar.xz=308de9cedc422c2051661df74024ab26c59b86368fbf50ce4dd7b2b2907ccc8f -dist/2025-08-05/clippy-beta-i686-pc-windows-gnu.tar.gz=95fe71a1f8e68f0f3a5306dfa04e269c636ad036908e201c1b4ed7a3f99b1dc7 -dist/2025-08-05/clippy-beta-i686-pc-windows-gnu.tar.xz=5b8c928be909433fb005498a92d2fb3ff535f31c68a5e134523f9731cacb029a -dist/2025-08-05/clippy-beta-i686-pc-windows-msvc.tar.gz=d736ec4f447f6b204f250b044b406b4e4b96f014887b6f7755b037e211aad3af -dist/2025-08-05/clippy-beta-i686-pc-windows-msvc.tar.xz=8a4ac568284aabb994964323465c7287715d3dd4ab881271a4746d2ae5390ffc -dist/2025-08-05/clippy-beta-i686-unknown-linux-gnu.tar.gz=d8b87338abdb4123eb25dd778d038c516c5bd472e1426b5a5f74f25126957039 -dist/2025-08-05/clippy-beta-i686-unknown-linux-gnu.tar.xz=ebb6dcc1b038deff6a966062ca3a966d3426f8932e5aeba398636a2d2e9be0c0 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-gnu.tar.gz=51bf4e84be5b677ad9afba442d9567b96f59209219cddad5eb3f49b788bd8fe2 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-gnu.tar.xz=e63e3346089c7f300bdc73521def20cd2a012f8de98b8b05a653e85f3516371c -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-musl.tar.gz=aeb3782ca34a0ac47420109c241041ebbc029050a690a5c828c865108f56ca18 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-musl.tar.xz=80dabbd511bd5bdfc944d7613a02c9bdac702abf2de916222a37e59a92c2e577 -dist/2025-08-05/clippy-beta-powerpc-unknown-linux-gnu.tar.gz=9307396973615663330474ec145efebd4246c6bae5d979a80b6d93f832af0137 -dist/2025-08-05/clippy-beta-powerpc-unknown-linux-gnu.tar.xz=fb2a34f9472d2c1beb1381e9ff8bca23d9058c978fdb2e52a3c7f0cba8305c59 -dist/2025-08-05/clippy-beta-powerpc64-unknown-linux-gnu.tar.gz=e985eebd182d78604861ce60aba5078e98a9a078b76752da8fabcfc5fa471fc3 -dist/2025-08-05/clippy-beta-powerpc64-unknown-linux-gnu.tar.xz=1092ddf60ba04418f91c1e51f9c9da1e0d6b61dbdb104fc8028043dc1a33caec -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-gnu.tar.gz=bf0238a4909fa15034f067d5a51e38e43c91e69f29f51c39246d5c0b23925042 -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-gnu.tar.xz=39caa6aedcd746ed1c4745e207cf8cd65de7b774f15e8892987ce2c3fdde543e -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-musl.tar.gz=b19ef1a8cdc21925887ced0c594ff5ab658bf66a0d137c01b6375fcdd0de8e35 -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-musl.tar.xz=0ec300c1e791f946503db692e602680acf11857715b9ecc87cb446ac10d2527c -dist/2025-08-05/clippy-beta-riscv64gc-unknown-linux-gnu.tar.gz=e7c8fe214ffd70599648cfacb50b3457597b479d320bf8383869dda8b0559d42 -dist/2025-08-05/clippy-beta-riscv64gc-unknown-linux-gnu.tar.xz=d8ba0c42074c2a94dff3b05f2388f17225044485abd0459e155928f4762c8988 -dist/2025-08-05/clippy-beta-s390x-unknown-linux-gnu.tar.gz=510b9c9ca885a8e91c3d25f14cbfb34a7a927d374fa1a9149678d7ed9c4e4c2c -dist/2025-08-05/clippy-beta-s390x-unknown-linux-gnu.tar.xz=b53697799d99beb46fc17b3cca8ccfdc4ecbf7f3e1fd47f031852f07fb749ea0 -dist/2025-08-05/clippy-beta-sparcv9-sun-solaris.tar.gz=f3109a1dd87c23256057fcc94d3fade0b49d20a51040b4fbdda366f5b7c9b58e -dist/2025-08-05/clippy-beta-sparcv9-sun-solaris.tar.xz=ba265d781254d0b032d836a440c94c31ca33bc136e027ad05332cfc0cf40bf54 -dist/2025-08-05/clippy-beta-x86_64-apple-darwin.tar.gz=74c49a7cd4b6605b9a43961415fcaed1197b8f5aca798efd4b62a15d837b956b -dist/2025-08-05/clippy-beta-x86_64-apple-darwin.tar.xz=69128daabb11fd29720752bb13d83ef4bb3faa1d4aea8d525da2cb04f42b6010 -dist/2025-08-05/clippy-beta-x86_64-pc-solaris.tar.gz=e1975507778e448ac9b3040f330340f3a7d54e6dd40357494e3d891008375364 -dist/2025-08-05/clippy-beta-x86_64-pc-solaris.tar.xz=43c142c870116f4c2408f4b3208680b81390a4b37805f5a32696ad17bb313b48 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnu.tar.gz=ccd8806b6614edb270a2816cf0dc3b6376046fe58d258d296ffb222929d42d91 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnu.tar.xz=21148cd754493da3cdf72adc8da19ebfca1da8d642e1bef51782772241b48084 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnullvm.tar.gz=5a7cecb6c054a71ec5b1fb284f6bf2c069925fffcc1757ac631e8a2d08b116b0 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnullvm.tar.xz=b451057a4a75341924072fe26334eefce8b6eaa3edd79d3226eb02c1c99fcdb3 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-msvc.tar.gz=74e9cea693203c6217934549694a240460dda2818b144bac5777f41c44a06d53 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-msvc.tar.xz=bd90fc3fc80f28ce415dc1cfd105d17ec5ecfc63fae017baeec734bf94f5d71b -dist/2025-08-05/clippy-beta-x86_64-unknown-freebsd.tar.gz=fb61d60d6c66a4632911944b5c7858b8c055ab8ae5a194d78e7d7ba18b65e940 -dist/2025-08-05/clippy-beta-x86_64-unknown-freebsd.tar.xz=bbc7b2aa6f05ecf391a757ffc5b6fa6e0989d00f7e8fa48b83faca8996f99dd1 -dist/2025-08-05/clippy-beta-x86_64-unknown-illumos.tar.gz=10e8be6eb15269cb2d0573e19e3a5004dbbd2b14e2f016d6b9c60713e22f716b -dist/2025-08-05/clippy-beta-x86_64-unknown-illumos.tar.xz=c3748db93829d3f5d9c5498592d247468125ca301ef238c41e42d37b7b90c6a4 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-gnu.tar.gz=5a0365eda14ac1a366f3c480a2358eccbfcbfce86323711d7fcfdcfd85652b42 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-gnu.tar.xz=908576635e79fe589583f18bd6ace4c488cd11ed0c59501082bb0b397df24f39 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-musl.tar.gz=79fd42cffac98024308c511144b716d18693b902dbdc1c4b88645bc7d4ae7109 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-musl.tar.xz=a3a616554ed25630df9f8cef37a5d36573e6f722b1f6b4220ff4885e2d3a60de -dist/2025-08-05/clippy-beta-x86_64-unknown-netbsd.tar.gz=ad1849cb72ccfd52ba17a34d90f65226726e5044f7ffbe975c74f23643d87d98 -dist/2025-08-05/clippy-beta-x86_64-unknown-netbsd.tar.xz=608001728598164e234f176d0c6cfe7317dde27fb4cbb8ad1c2452289e83bf30 -dist/2025-09-05/rustfmt-nightly-aarch64-apple-darwin.tar.gz=6fd7eece7221e76c2596e0472e7311fdced87e9fab26d2a4673a3242fe779bd3 -dist/2025-09-05/rustfmt-nightly-aarch64-apple-darwin.tar.xz=1a662a55931f58be9ac05841360305f277f8b1e36f99bd0a2ee4d2cc92b7ad14 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.gz=d1c3c52cf61522697d726b32ed28d7b8b4cfadf30ec57f242e8c7f9f8e09f692 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.xz=2cc7cbbfa06803a2fe422ed3266f6eb519360b403c83f92259cc1b83f5ddca45 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz=61f525d050d1ff4a29cc7240912d84c9c091f25195b58411af9ef176175a3200 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz=504b8ace2ab7ac13be143d95ed74d94940e8706ef9f53b7778da215840337e20 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz=ff48bd98d109310638822f5813042583900e2b70edd45fccd871c7c03dd1c2e6 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz=b3de2bba7858e76cdafd326f3072e4c5b534ca9b679ea62caeffb07722e9a3c9 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz=8ca4caedc50f09995dad7bc6e001cc863c524e28c45c186022ded589f3728709 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz=8f2cfb052f9697052d89bb729d17d74583af3fa0be98f18a3c44ea518a8f4855 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz=b12ac2a38b379bf0de4a92f29ca40e1955c45273e798edd1a72bd40253de70f1 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz=87fb7185aa46f3810e09479dc8fafb66d13b41f4f40e9c4e866ea77fa47b1bb6 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz=be1e8377f3d10f4f8a07ae06ab9f649f9d2fc9cfc395abaa5f0ad10a95c4fe7a -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz=60646799fdacdafec9e0ed81357b5db70f85bb1241fe775e71b8ad3feb686116 -dist/2025-09-05/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz=ed8cade9b846efb5ac121aa70ac188fbd2e61fa9402fe68c80b2cbd3ee32ccbd -dist/2025-09-05/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz=0d0bfbd9cd4123e0404fe476a6f16eec6e435ce28d328dc0dd0aad257b295d64 -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-gnu.tar.gz=bd411db34707c36d5b60f14bba776b0b89b69d4266007a3b591c467a17ef053c -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-gnu.tar.xz=f0f2a6a81177ae6d06ff9b8f4a5bdf3bc8b26710aaf0f09258b32f7f710722c0 -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-msvc.tar.gz=b49130da444e01fe4ef997b649aada8978b8dcca60dd38cf9e7400a7c7569e1b -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-msvc.tar.xz=0195cdddc74cba2bf17eaa1d53edb1a2bc0e34cdf13c7b25a34ad9729a2635b8 -dist/2025-09-05/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz=1141897495ddca10fd6d9476a624b6a340fc2bfc619148e183bcf355a0078b18 -dist/2025-09-05/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz=81b31bc8b3d431120005c3c8eeff3ed194dd18e56220c175c3250855cbdcddbe -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.gz=10a27070239e7dfcf701669c8d93ecb2d310b9fde768639a2bf5be62cd13528d -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.xz=0ac4a529f4f62a94d5ae4cc8a4a52f0e7d57296ac0884258dcc5478e6b0b1785 -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.gz=9d0ed6778fc4f0601be1e317438cf95c414fcab6d3207c635babb4f3a6faf2b0 -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.xz=e40b607faf2f37c9d654cc0b60c47ea155893a3b62236cd66728f68665becb18 -dist/2025-09-05/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz=46c029ebbfa35972b0b9e366d17c41ff8e278e01ce12634d5e3146cbf6d1a32e -dist/2025-09-05/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz=8d1462fd09b04a94bfb1c1841c522430b644961995bf0e19e7c8fa150628e7c7 -dist/2025-09-05/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz=5827684ccb4d38956e77858ddeadeaff2d92905c67093207bed0f38202268151 -dist/2025-09-05/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz=975c7d7beb5b66caed7d507aaec092fdf33de2308f4dc7de46fe74e5e15b5352 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz=8829677ab0f898c98badf22dad61094cf53c6d599b2cc76142d3d792a44f3770 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz=3d961bead4010f8a488a065ac8a4153e3c747dfcd7d5f7eeba1cad00767a7ac5 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.gz=0138c30ebe74e8ee838d9eef31c7882812bb52d2304f2de7c23c47dedd6a5032 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.xz=bdb4b7b3c89a30c79f51b5fa33a2a29fc8313f8193bc43ee611e8ce7d80382d2 -dist/2025-09-05/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz=8e440dd400bf3eb4a144318459e111069a64bb309a5a51eeb0f0383dc48ee55f -dist/2025-09-05/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz=f623e1d7d38d94965d7653fdf4a272630b2b6dec81662fbbe5d2573f2f3f3b8f -dist/2025-09-05/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz=f46a8278352d5a981c6746b876fe19df3093090a866d20d24cd5cb081136b1c0 -dist/2025-09-05/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz=fdf8b44c6f110a33ad7f969e651ad396c880a85545aadfee8a24ca3cbed35974 -dist/2025-09-05/rustfmt-nightly-sparcv9-sun-solaris.tar.gz=59d778dea354867d64c809b40443ca0762c685dd0e5361971daab04aa7c5a5ad -dist/2025-09-05/rustfmt-nightly-sparcv9-sun-solaris.tar.xz=18628b2888d77281fc9b2ac5636ce4ec444ab0e47bbe0e8a08238f90040c20a3 -dist/2025-09-05/rustfmt-nightly-x86_64-apple-darwin.tar.gz=169d9f2ee4a0c726040f4940370d1162502aa6568a0a442c92cad3fbc7bd95c2 -dist/2025-09-05/rustfmt-nightly-x86_64-apple-darwin.tar.xz=7f955cfa1ab07819f31cd904b0a79c67cae70090aabc7dafffdc1f3f67463248 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-solaris.tar.gz=d2cc32d6be1d0f1a8654400f0418d16e789b62db3fbc0cca0d0d492615bcf6e2 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-solaris.tar.xz=3dbc29c923a6a2809a8ef561d2ad375211b09dcb107bceabbf510ab0d7b471f0 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz=d9b4ca2abf1062e888b31f31f517ccc6b451bd2bfdae915ec3984bc88a8be91a -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz=00c6d92b6e82ae58e682e72c974f2dcc865820567ba44ed008e4759dfdbdca87 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.gz=e75424d0aece8d548b2c9d896291288615d08ff2a37f1c4844a70839c612e633 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.xz=cce9578d9b35bd8192a26e2dc7d7f7e7d5b9f08c7d73b3f4dde08208b448b063 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz=ac4282e06b0972033f974c63d2c6cbf194d4e66a1c811f443d3fa0b886868825 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz=a2465b31855861d0e0eea072bb366480acf2bafdd7fdfdab79c809d8bbf8d8e4 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz=30c22a97066a5711f207c1919a1d74a328540da0d9d6f85a0cc044174049c927 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz=40987da0b665940f9c406cfbb4889dc101d73846730b0bdfa1382d051297ad08 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-illumos.tar.gz=443ba10092122fbba9854abb4aa9d2e71d8e5e65b99fae6dd572909bf50f28c5 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-illumos.tar.xz=10285942b9140efc9897965cb3a4204145e774bd1b0c2690d45d8b04498fb917 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz=b09af4fe367df416bce622654d9e3dfb610c564f5e6d14b200d949340595673c -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz=1f9a585a017cee5a05190377cab105603f039fbefd9b4934278dc555dfca91b0 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz=24f911745fcc9f120e44acccb98f54dc6406e492915410aae17efdd00e2752c3 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz=48eb58ba1d58701dbff341e19fb6d446ed937cc410207b35297babafa29dd889 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz=c2d1cfdcd8a08bde3f9a635eaf2d6d2fbd82e4cabbbd459e3c47e64bf1581f11 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz=ed1775b4fd3d7d1203f8749f70328ea4ade802fa0a76c4d7ab3e2d63ca1535af -dist/2025-09-05/rustc-nightly-aarch64-apple-darwin.tar.gz=4b64c4148e5cdd6585a4200125cc394c6a998da3686ef758f37742ec2d33d573 -dist/2025-09-05/rustc-nightly-aarch64-apple-darwin.tar.xz=fd45182f9db059bdc17f2c465dbaae22589eb8e8d2d88776437a34ddca3b7153 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-gnullvm.tar.gz=c14f2d7f391492d150f2f2f91af413266649cbdbdb042fc8b660b3cb141b80c7 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-gnullvm.tar.xz=d72ea1c571fe2376ef05cfd15fb3207ee2d27c3c851f3391dfbb082c06a5bdd0 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-msvc.tar.gz=3a485d8fd8d58fdfbc1216e51414aa4d90f0c7285a99abea0fa5935d2337251b -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-msvc.tar.xz=7317060a29eecd2e28d47f0ff8780150059756b07e2bc9137c3877be8af593b7 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-gnu.tar.gz=58a53ae147de1beb0a53629898bf7c51097351271be3713a2e2344b86a4080a4 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz=f79d2730843dbea9e9588fd1c1b0d854441969d8f93f76021f06af2efe22b845 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-musl.tar.gz=eddf23e28b8067021e80883faf2eb1d6d3005a6e8419a1232b84236bea286f78 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-musl.tar.xz=4f0af1a66050f5e2d9d48b696349b9ccd420bdcfdb88b251a6655cc22a11949b -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabi.tar.gz=fd2f0446e3c993d746e8a5f72ccebd8b0a49172316ac1d1c58bad10596becbf3 -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabi.tar.xz=0b06e7ba47621819b4e59e048e5d336b3d6978e906c7363f06bbc804e49f1046 -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabihf.tar.gz=97d7c34b53628f28e6636fae738a18d0f1f4c60a9febddfb7145e6b91fcf3fdc -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabihf.tar.xz=323025215bf851024a7eb6566ad7dc5719832d81e8d46e70adaece98adc5644b -dist/2025-09-05/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.gz=3017e03222d030448ffe2805624143540197bd6d3b3e93f9f73469ace25ae4be -dist/2025-09-05/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.xz=4f6e86b185fb54f7a0b7d09a0faae7daac722351354f6abebd388efb3037dfa0 -dist/2025-09-05/rustc-nightly-i686-pc-windows-gnu.tar.gz=292c3770b96cde97072d70c58234488f955ed5582b7c3044c6de66891e73d639 -dist/2025-09-05/rustc-nightly-i686-pc-windows-gnu.tar.xz=6855d3fd9040fb4da554fd732eaf8a1c723921c35bb8a8efb31c78af69b2e4ec -dist/2025-09-05/rustc-nightly-i686-pc-windows-msvc.tar.gz=64a86a2971ed9934bbb6aaa0afc2a7f747da463afb55b51a7c5fdbdaa294e437 -dist/2025-09-05/rustc-nightly-i686-pc-windows-msvc.tar.xz=c98f1fc3e077b8c8eb3e526c416a6551c08c62e58be57b4a4c7d59670bc435f9 -dist/2025-09-05/rustc-nightly-i686-unknown-linux-gnu.tar.gz=5481c97d788899f896473380dde0877808489bc4a0ed6d98265558631fa67a57 -dist/2025-09-05/rustc-nightly-i686-unknown-linux-gnu.tar.xz=afadaae945c0b9a8b50dbdee28791e0c03c880cb22d3c20996eeb7fab94df0bf -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-gnu.tar.gz=18b276a2464b6c5a817d72384f25442c7619cac05b2d8d0af212c0dad96ccfc6 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-gnu.tar.xz=b74323cd2dbee966eebe8e63e24fae026ecd900a025e9167cca0341e50333cc3 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-musl.tar.gz=916dc5144107d9173479b320b55b0a95d2d42156c69fbdb0f21377d825fe0892 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-musl.tar.xz=3a83da72aa4a6553ecd957af35a05274528dc79f87d24d8470c20b8b4478b05b -dist/2025-09-05/rustc-nightly-powerpc-unknown-linux-gnu.tar.gz=59e031b6b79a1f11406c0640e1a357f2941967ea8c034a94148d60928038e58e -dist/2025-09-05/rustc-nightly-powerpc-unknown-linux-gnu.tar.xz=53f0e33cf2651d5dc8931ec5af8f04994188d8f9a10a5c61bd72cc822df34501 -dist/2025-09-05/rustc-nightly-powerpc64-unknown-linux-gnu.tar.gz=0eec56e3b725d918cb21e494a803b2e38eb6d744f64f1a82481a4c704eb7c1f0 -dist/2025-09-05/rustc-nightly-powerpc64-unknown-linux-gnu.tar.xz=5efc97abb235f349c6cc952b4a1e4dae7d56d70b0f8b8da2a1060b85f9b734fd -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.gz=cb45bbcdf8841b1ac184a0aacc909f153c830e8051260e09ca4e32c1f048e2fb -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.xz=1c9ddddb90d45612e4fd190fb71e527b523df13146343dde200580fb2b638794 -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-musl.tar.gz=3a9bdd4d14e8f121d3051944ee83a901b5ca4c0921f2d01e34596fb7450b49e3 -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-musl.tar.xz=732b9abb8a80191884fe1ff1d4d923cc1b74c21b81e6327bc5979ae526337400 -dist/2025-09-05/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.gz=1826e74200fe286478e1659ab88ea86b43efa7b023074d00dbc814d80bebc883 -dist/2025-09-05/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.xz=c30b52d0f474fd6193bb1b3e147fb79fa8cc31e5db38444f023d84d1c2d93d12 -dist/2025-09-05/rustc-nightly-s390x-unknown-linux-gnu.tar.gz=c330067621ed25d8383f27e494346eca4d7d4866e48f331f2ec897ff1c386e56 -dist/2025-09-05/rustc-nightly-s390x-unknown-linux-gnu.tar.xz=cb4097ea582a83a94cab80ff2f36b6f7141c140d75c30b1d261a1ddd4ea45bd4 -dist/2025-09-05/rustc-nightly-sparcv9-sun-solaris.tar.gz=0af19e764f10333017a3ab66020b82c7185ad648d1230b68f10977e0affb937f -dist/2025-09-05/rustc-nightly-sparcv9-sun-solaris.tar.xz=a22cfb55cdd122dd99bf3566eabd781bb2ecded90c71a41fd33b1e0588bcc39c -dist/2025-09-05/rustc-nightly-x86_64-apple-darwin.tar.gz=163a07b91e36e85c6c41368598793667414cdc6cadc980866811234539f3aec3 -dist/2025-09-05/rustc-nightly-x86_64-apple-darwin.tar.xz=76711800685b39b3b75945395682062c40efe3195f9979784bf318837e21768a -dist/2025-09-05/rustc-nightly-x86_64-pc-solaris.tar.gz=69142a6c04703c3c8309c6fdf66b25831bf9efa3ee70cc93da4b5b75f901b29a -dist/2025-09-05/rustc-nightly-x86_64-pc-solaris.tar.xz=7e535f4aa136284e4bdfd4d56891caac6844dab91e1b711fa3914a5974dfcb60 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnu.tar.gz=ff0ea563126ff28df297258001d9fac4dbd85788b5d27a0f5d6be75306f21139 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnu.tar.xz=6b66adcaa9a5332979591464242423897f59276e9e2cbeb9ab038a72e72c3a5c -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnullvm.tar.gz=64cac5e377bc115a8f8176719575903e695337941db43cfb35546d65c0723130 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnullvm.tar.xz=11e2765e4b3e2296ea05ecf735cf7b5f7beb08d76d12449cfae67f88bab02819 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-msvc.tar.gz=c7d15ae7cd5af774ae70e63fec3ba8723b85fa4c4640917b3960907eedb30b39 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-msvc.tar.xz=55036567af270cdac046fb4306e515787ca6ef5073617311fac79fb87ffe9366 -dist/2025-09-05/rustc-nightly-x86_64-unknown-freebsd.tar.gz=2d24470d2bb4c4d2605c15f1b2654cc45805384babb73b1960e8aea0b8cc227d -dist/2025-09-05/rustc-nightly-x86_64-unknown-freebsd.tar.xz=fa41782cb2e22aba30d1619db1f478c0305944ceb4de1d1001f221c5c68c104e -dist/2025-09-05/rustc-nightly-x86_64-unknown-illumos.tar.gz=d0f9785f76c59f3a67a499cfff4a5639f3ae05cbc76750b867faaa60b7d67f78 -dist/2025-09-05/rustc-nightly-x86_64-unknown-illumos.tar.xz=925e473c6e31d8811879a805358cfd2e5ab8f4de836c270d02dc8403771bed3a -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-gnu.tar.gz=ebac845114b89dfe7d0efc0cfe8820902faad617ed21eb2a701d73cf7b544a85 -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz=2512a5462e3f46c95ed4aba4228282a357b3e0694e9db117a857196448fe7bcc -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-musl.tar.gz=b4a5d364b84464e9a92140fff50349d4942b8d970b64150a4bc6d720cc6c4a4e -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-musl.tar.xz=6c57c2edc305737530f8551d789ee79ff952f42a0d52d6f8d7d7f1ea2027cfca -dist/2025-09-05/rustc-nightly-x86_64-unknown-netbsd.tar.gz=f3192ded327875d5a27fb50c690e3fce36669e8f71c47de304dc21edad573ff9 -dist/2025-09-05/rustc-nightly-x86_64-unknown-netbsd.tar.xz=11359e4731866f6a788e5699867e45befdf1ad49ef35c0aba22af76d3f327cc3 +dist/2025-09-18/rustc-1.90.0-aarch64-apple-darwin.tar.gz=77e8d4c354aab89b2abcd4608d2cb7612a99000d8064491aeafbc325c757943a +dist/2025-09-18/rustc-1.90.0-aarch64-apple-darwin.tar.xz=89551c0ba1cc6d0312aebc4a6cafe4497223217ea8e87c81f6afbe127dfaeeb6 +dist/2025-09-18/rustc-1.90.0-aarch64-pc-windows-msvc.tar.gz=d58d2528aeec0d659934c8ee47a5465c256f380e32ffdac54e94039d3a271952 +dist/2025-09-18/rustc-1.90.0-aarch64-pc-windows-msvc.tar.xz=7343b2ab3b39d305d804c227b7b754c726872684d0d2b9d15ade0e8a80bd52f4 +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-gnu.tar.gz=648fa8d03b1e9e2689fc530dd564e23f5db69da6b82d551eccc4c0a7f16d28bf +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-gnu.tar.xz=4e1a9987a11d7d91f0d5afbf5333feb62f44172e4a31f33ce7246549003217f2 +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-musl.tar.gz=111741cd8456820af482d93e40ee3a2f767a1f700bfac3430c8356d7362f574e +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-musl.tar.xz=8edced1f743772a9d3d5700b53fe9cd5f53b1942aac81bdd918e3eca98eaf373 +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabi.tar.gz=1774694e35a1536eda0766bd2ea0c048ab24a9b13fa053e52469fdf293241c1d +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabi.tar.xz=1b7b72abbf22cb62cbfb15b6a34b3b152554bab8e8d56907e2cd3044b9e1c3ad +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=4b436393e515f0e9546d2fc5b97a51506a35bf1360f960a6014ae0ce4f7f5526 +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=e3c1fbdd69e3071cdd10a41184fe2e4213caf898b5cabceb891b22b50711a794 +dist/2025-09-18/rustc-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=45feb2554086611d02ee13df6490abedc68402358549098d2adfe9267c520c63 +dist/2025-09-18/rustc-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=ded6744a78b8f9e73993c287d75094f29f0437aaf3c0ce8c6f1775d0972618b0 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-gnu.tar.gz=2cf0221698eb9ce672d55001a8fdc3679faac44a302557d7043c91f7e3185d82 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-gnu.tar.xz=ef4c632c10ba4f0ff8c7739b7361ef79efb241e0228282fca640c118f554cd70 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-msvc.tar.gz=03fee2cef0c0d46c05340237541b3b2e3f1c69958639460e56f32abe16f3c110 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-msvc.tar.xz=491d1ab5e6fa0d2f1291d17bca0bd85f083cfcf0fb4a2869b1fb4ee2597e3e0f +dist/2025-09-18/rustc-1.90.0-i686-unknown-linux-gnu.tar.gz=65e9c41b6e6588c1d2d3964648ce63eec77290854383c487da8858c2b5d51ca3 +dist/2025-09-18/rustc-1.90.0-i686-unknown-linux-gnu.tar.xz=3b33cef77f9a57d592beb5117d933134bc76258006e6d4f9aed2969d20c75742 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=408c736424deab1dabb7e7bbd6b2bb002267541782c46c2fbb563229650e38c8 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=aca7ee7f0d98e34dafa367cef9c35626d37cf8334f356498aa2bda2fc02206b3 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-musl.tar.gz=279da484d255f937bea113b11f144758065a99196053282e556d8b1216d744ff +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-musl.tar.xz=4f0289ff7ad32c9c458ab435529be35c65aec3f55bd601e2d1e2a5edf4dae5f9 +dist/2025-09-18/rustc-1.90.0-powerpc-unknown-linux-gnu.tar.gz=78e372aa3f32d065cbaa0886566eec8261413fcac39df64cd26be6d3129859a3 +dist/2025-09-18/rustc-1.90.0-powerpc-unknown-linux-gnu.tar.xz=c5d898ca92063d634011525557f2acabc65d4ea268022e7005f99b6ba917357b +dist/2025-09-18/rustc-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=5ae3928941064b2eef40d5f6d9984de9636b4f935f53ad2218278daa79a80020 +dist/2025-09-18/rustc-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=7adbc3c317a73b7d504e171d65a2b0e93953e3e572dab99acabe91140101f81d +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=44bd31c3a64931218056833224caafd1d50bf53b19fed96a968f8715dc37272a +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=e87b8eb926a65211a99f6712ff376c5950b4b11c67ed7f92019da27a34ae7085 +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=7b00abe2fba2282c98ee7f2000587b352b2eeb980db9222a3495f93f18a402ea +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=94490108a5b24d5fbdefd0ecef9a001bac8623d9651586d3ceb10566779b7e7d +dist/2025-09-18/rustc-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=e2baf36f41c4575927f7bbcab933d074f07a17a928be87d73cc827c5ff62cdc9 +dist/2025-09-18/rustc-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=11ae522969c6b18ad4b5a1ae229473de59406af7ab2e831acb43ee247a16b58d +dist/2025-09-18/rustc-1.90.0-s390x-unknown-linux-gnu.tar.gz=1e1b72b4392a4f1709833d82ab9268da981d83c4ecb9ac00f0ae166cf3d19ba4 +dist/2025-09-18/rustc-1.90.0-s390x-unknown-linux-gnu.tar.xz=274daef5a69c8812411248a4afea4f58a096c978dffba6b1198da8e3b5a02de7 +dist/2025-09-18/rustc-1.90.0-sparcv9-sun-solaris.tar.gz=66e70dd43d64765bde80703752f97e571a6150c6fe70ee918bfef8185ff325d7 +dist/2025-09-18/rustc-1.90.0-sparcv9-sun-solaris.tar.xz=a0a2d3f97d093ef897214b956ee87fd3d667ac20311812a543aaf34c498e9665 +dist/2025-09-18/rustc-1.90.0-x86_64-apple-darwin.tar.gz=50d1f94bd8c2815008041d077bfb2713bf830d9e72ecb15aa4ed67d637f41ac1 +dist/2025-09-18/rustc-1.90.0-x86_64-apple-darwin.tar.xz=594687a61b671445ea9fff0e6b6c6eef81cba30b005d22710217b4da8d2d2ecc +dist/2025-09-18/rustc-1.90.0-x86_64-pc-solaris.tar.gz=a75e86b0b771ab8a0ff2c3fc8c0756c9f4a664bd6667a5d011a780be85b9920f +dist/2025-09-18/rustc-1.90.0-x86_64-pc-solaris.tar.xz=98114a77eb7905ba1f8ad1f7adde8bea9997f2faf3f0533cc84bf2b507a3659e +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-gnu.tar.gz=4ee149033f1a686d25e9bd40f37e46b9fdefb67efccfe98b94e11ed7e8a22d7b +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-gnu.tar.xz=925e67ef4684861eb301d123a45292a63a0afba49060b60e3264f73c7f9cc1ec +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-msvc.tar.gz=e73b85f204d984d562060154727c616145dd7b3c64d6ed85b95693292469a655 +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-msvc.tar.xz=a18b3912905f154c34a7572954dda9e9849ac6411a1e02fa390bf742f918fbcb +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-freebsd.tar.gz=d2a985b47f5cb3eb754ebd32ca0219a516f86dbe5c1876f57aa12862afde4db6 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-freebsd.tar.xz=9c0acd773db47aa18f0dbe7adef71192163f3d5e76897217d9229328f0b37f12 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-illumos.tar.gz=cd00b480f1d0cf817d509abee27b6878a3a700ceb7218287c2f7e2bacea16a2d +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-illumos.tar.xz=735446819124fad059336422f03cb093ab11b951f176cd8e892101416c823721 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.gz=b22d65fd75f50cc036c0cb514500628253aaa815bf2e18ec65620acb8a1ad244 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.xz=48c2a42de9e92fcae8c24568f5fe40d5734696a6f80e83cc6d46eef1a78f13c9 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-musl.tar.gz=1ce89b34797bcf6885f5ae01919d3387d87ff148ca0facb68ed3e3acb0d9281a +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-musl.tar.xz=993cb26cee9525b1553d82b8fc2b6ddffd50a0a561cd896e3daa3a9f8ae65949 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-netbsd.tar.gz=46cc7b7ab3ddae2a89524e9c1a9a7af0c3239dbbfcd956d62a2f1204975a7e2b +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-netbsd.tar.xz=7befecc400527789829c88f87bd26ac0217bc5186471136f3ddfbebcdfd390c4 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-darwin.tar.gz=30d6e3008a288f779c90c92d867dcd4f05fd5107d7f3e69d4d37a5945878110a +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-darwin.tar.xz=c36777aec17d617f85f94b7cb87bdd4270eeca30ef38c6f686809d163c881609 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios.tar.gz=0e9fc3777909512989188023eb1124f788defa2afefa5726d7b690678f426e47 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios.tar.xz=781416004db05053431d8f1385450a5b441977cf822451450b7ef147f8584164 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-macabi.tar.gz=43ee5b6c721f655a2e86e0e4cd01162864f0441709078cd47c21c59db57712bc +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-macabi.tar.xz=836df3652144992a4e4e47b4fe5655d0b68700290f9d674d97f64313590603ab +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-sim.tar.gz=78f1a3b2dc79d6b42cc7ff54fd8ce0d1c2e498ec7783ff01376988f87210c4ae +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-sim.tar.xz=8092114ab1787075d52a0c1f32b7626b620ae3f8acfb4f297058f774be4f880f +dist/2025-09-18/rust-std-1.90.0-aarch64-linux-android.tar.gz=3d5d41ecea4cafa623c12d1acc694505aa6b12c7f2265a1f18cb0b06fee6d7e9 +dist/2025-09-18/rust-std-1.90.0-aarch64-linux-android.tar.xz=7ee2ca40b11788e6350d1d29cd966e9c7418716a08178b104a5329d43c8fa464 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-gnullvm.tar.gz=ab632b4c6f711e1374b654ebeb415e500771248f65437046e0a17b674413ca96 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-gnullvm.tar.xz=5129a3e05338afee4bf3ebf0ec65b83644989829fe9d6cbedb63aa34749f553e +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-msvc.tar.gz=58b9333df1aaf662b5202c9e903c4e583c9b14e0a7213b500131ea472960b8e0 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-msvc.tar.xz=0aa0ca1d58eeff8faec557922a6b6321556ee0679ffa8c026d4963cf202764f5 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-fuchsia.tar.gz=56bbc334d3f628ac3d830928771460b624fa783eec6c196ac71f2c9767114202 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-fuchsia.tar.xz=18852fa9cb088aa241eb8d678c87001291f099068747201abcc74e3f33bdaa6e +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-gnu.tar.gz=609df2b364009d86c3b62f7c9d2225a31839d3bfd81c02e4ae5633b2432cef4d +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-gnu.tar.xz=4952abb7d9d3ed7cea4f7ea44dcb23dc67631fae4ac44a5f059b90a4b5e9223f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-musl.tar.gz=ef546dfa4e749c57d3dd42457319336f6b78b09af41443602b89b26314c482a8 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-musl.tar.xz=a603e135d4eb67ababdd193268a69937fa4490bafde592f2c931d17c7567b228 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-ohos.tar.gz=4bcac2a4daf99f976c47399fecbc23fcdbc4e5e42219dfa8738f2f7faebdda65 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-ohos.tar.xz=cd0a6e1a7b05134500338b6e621ffd6eca66cbe80d621c182911b1d3f48c151f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none.tar.gz=94337166d307943787f4142b05b2a122eaa8650206d4fb0551d66304b0665318 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none.tar.xz=20079b3887df0f622c13c71f942ad9912042e3cad50fb3f73f488115695507fc +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none-softfloat.tar.gz=aedca63362b6bb71364ea101ccaf0cca1975a797ddabf29d7dae166934fc12a2 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none-softfloat.tar.xz=8a644b41355abea904ee5920fb1baa64f099c7ac60002c07a9129579429b2da2 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-uefi.tar.gz=015eb13fe64ac4b7190c3af3ecbc6d790f1635166735a239aa6ce8303a95803f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-uefi.tar.xz=3638ca1ac6ae3cb977e18814a6df177526fbdb20a0b856b75a0b76c7fab3cb1c +dist/2025-09-18/rust-std-1.90.0-arm-linux-androideabi.tar.gz=e592d0855d83d02d8dfc35b1a954af177d640abedef610d909df4abcc45ac457 +dist/2025-09-18/rust-std-1.90.0-arm-linux-androideabi.tar.xz=1d380ac2cfae19e045612ff6009938a9da7d9f0c5d1073eee244792d82c8f01e +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabi.tar.gz=8d28ae8940d27ee30d8465361ec6ade9777f177fbf98fe58071412db21110575 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9362a3474cd26ace0776dc064c620b7512ac1391ac68c972b926188e3a60b9f9 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=9be34eae2283cd313fe55be005ea76c850ac37aa202f8e6fdc10bbf4f9eb5bfb +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=a839d314309c6ce1d00f2005311a5d9d17d5ce1351d8ad1d09c0e78f716d4741 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabi.tar.gz=134c0af3d09afe077ea7cf99e5aa6a1281d28d995676641c17ad31619be81b46 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabi.tar.xz=e30b176633b8513cc6cfeab0d9ff6784be4483727d1a8d7aa2c3182da91c22e5 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabihf.tar.gz=621a5f23f443b0a7960badc8f36741d0581654853b4077cb6f3b802179cd1e8d +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabihf.tar.xz=0c691759d82980bc18276b27918578ccc9ee17cdbb83669b58ea4b49e1b07b38 +dist/2025-09-18/rust-std-1.90.0-arm64ec-pc-windows-msvc.tar.gz=673b29d5a13819324204e143dc2fdcc1444610a8e55b72f245073231a04e0b71 +dist/2025-09-18/rust-std-1.90.0-arm64ec-pc-windows-msvc.tar.xz=99858f01263b61689ef429be0f0675048c65ec4f50df4ba4ef5c2643573fc69e +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabi.tar.gz=30752bc097368d527f97f119e2f33eba8430771bdb0605b7361b519aa00839dc +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabi.tar.xz=50f48d01edbd92a379e47f80528cdc299d94ecf2d210d205b697ea88758a2ece +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabihf.tar.gz=e8b031a5ae8be624bd796d33c586fa047dc5e4ff7e9b871c78aef1d307980b2f +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabihf.tar.xz=7bb33a1cc828ea2de2d8b30c5be4f2ea0f607003dbc38f0a961833f5d6c44fe4 +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-gnueabi.tar.gz=0fd9e7288a02a151c105709bc68f8781cdbfd0c518c4d7173922576d8493ce5b +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-gnueabi.tar.xz=599112c1a380d641b21c76e8cbfef60fc4201f415c658dcbf6b7485cad96615f +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-musleabi.tar.gz=fa1c8e3ff6f8661806bf72a9b8124d9ee1d3baccf44325c924730aff375ce65c +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-musleabi.tar.xz=5ddbdffdfabf10d6f2fcfcccb7305d1c3ee07c6e8a212d7358ab2a921a6ccada +dist/2025-09-18/rust-std-1.90.0-armv7-linux-androideabi.tar.gz=8aa2cea2f074a1496035a51d13bc91d2884e07b4f01d1e675ffbfab664bfa5f6 +dist/2025-09-18/rust-std-1.90.0-armv7-linux-androideabi.tar.xz=3d017192c80457cbb3163299fd79e26d98df7243024d3c78b84e72a0d59f10b1 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabi.tar.gz=9a0df1f1e7fbebce383cb68e5cc16160a950aef188f9160912130a49beb8efb9 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabi.tar.xz=d37e6157ae9b62e7cdb59acc177c25a727cb99c8b48f711359ad91fd84a96230 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=dcce5a4dc892c58e7ba7662dccdcbed5a9e1a40b1108e5fb76a50a0a4d3e62ff +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=3549bb5a6c1676809dd1e7eb32039c62a3e02927e31c30cf864fdbaa7a4bb9d0 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabi.tar.gz=ef01796ff70e65ebc61e0100e3a73a3589c42a384e2d4acffaef2b00fb3caa45 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabi.tar.xz=2d6c62518ae63f979172f9d8aa6fbfe9aaa9bcffdf2a43f0a8e01ea304e32d9a +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabihf.tar.gz=199f4489cd33455a738022b7da0767c08a2b38316f2b58dfaa041dc18d92c0f3 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabihf.tar.xz=072027aa8ce4ce6d053c73abc3a8bb603149533e4109dce72b36c9f0fd63d00a +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-ohos.tar.gz=da0946a9603ae4c3c5eeaa2047dc1f01b7aaa824b49ceaf14799d5b8d38104cc +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-ohos.tar.xz=a259c966a66dfd90be86b67651fd3b591cb41e9f79bf04372247eef0f2fb427e +dist/2025-09-18/rust-std-1.90.0-armv7a-none-eabi.tar.gz=b70ff023674bd2834d198bfb32b0e40ed4541a89c231c0ad6ce1ec46b348d56d +dist/2025-09-18/rust-std-1.90.0-armv7a-none-eabi.tar.xz=c019b4060a1aafe84b2ce91feca4b2f0f2ca615d9c4a479a3c4284315f1161fb +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabi.tar.gz=0af7efdcc243ad1127d2bcd42b7e9e184b62d76353c63847a4fdd6f474d4f8f5 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabi.tar.xz=332ceb902eb22dfd349860261cee6cb9077d718e4361c85f4312f0edfed7b165 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabihf.tar.gz=7bc50a6a4d4824cb8b39f33ae9e4321c0fd7cdb809e9cf3a455231b2b46bf228 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabihf.tar.xz=2075bfc1f4de14bde51dbef421c921e3da5fef58ed62315367fa8464efa02add +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-gnu.tar.gz=f5c4fcfc1bd07d78ebdba8637f50ab2c63ad4c95f2d0c70f887d9ffe6d2f6100 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-gnu.tar.xz=46eab5c41bf9160a31a53560ff5fc43308c0998cde952533e76fadef66799553 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-musl.tar.gz=e512dc8fc0f8234485aa0b51f9a8a626b10930b3dc7f668bf736f3ec6721d453 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-musl.tar.xz=4cce18ea1d46a9944eca6bd10bfdabca7980fbe1b47b052c49be1e68962ebf75 +dist/2025-09-18/rust-std-1.90.0-i686-linux-android.tar.gz=9cbd75f7c51fc6389b2b7100e5bf88c8a2457dbed19feb4181c143262e5b348b +dist/2025-09-18/rust-std-1.90.0-i686-linux-android.tar.xz=e68dd5d8c902daaee7fd12d692518e42005b6c0c47cd8b7dc7e6ad84b18f52d5 +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnu.tar.gz=1b6365967179e68b96fea465d1c285057f2a2af7a6cbc06524cca8c1d5575c0f +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnu.tar.xz=47e11eedfe870a3d11e81996fbd6f6bdb8617bd1e34df480b170f080dc3bfd31 +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnullvm.tar.gz=9b67ecd0297a199412cd59de7edbcfdd264ab4567b107550564847cdfba6a1be +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnullvm.tar.xz=f5234e6e2826fb94e427a2d0459fecc167ac931d93fe310203abcc13f158e27f +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-msvc.tar.gz=b4424b6b97f1fffaf98f48f4ca0f2c032e7ee85e22aed9ea614251177c03289d +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-msvc.tar.xz=afff4d53d4b1e5b6d7fb5c3bd89e9e08090268e0244f0c6f2c79ac04cd1420b7 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-freebsd.tar.gz=d27a8919d3eaa2ee4bfc9bbc03712e2e59444c3e2b99692e3990b6369f288cde +dist/2025-09-18/rust-std-1.90.0-i686-unknown-freebsd.tar.xz=627d417afe5dce38d39446e52bd2e0fb8f18eb4afcc3cadd0290a516b87256f9 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-gnu.tar.gz=8736064309c51aa957a4b6918f3650ab204ce24859dffed59611394b81fe58fb +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-gnu.tar.xz=dc4bffa768326e0cc47d6b129bcb891af6e7b7bf09ec92bca45e49420b9837bd +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-musl.tar.gz=6e947f9851ce39023ea9c331ce736705095913beecd2c63011487d0d94d9962a +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-musl.tar.xz=0913253ea961e9b5c689b3f43a3ed0eaed48ab217afcef07c4505491e303d34b +dist/2025-09-18/rust-std-1.90.0-i686-unknown-uefi.tar.gz=19cab5a5e4d3a1edc7360e71500cafb243cd45d9c57f1d55ff320cce7d6c2832 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-uefi.tar.xz=139d867f7b1feb56271c168122008d1308bb75c1fc60c9f5173fe8de5d40a0ac +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=95fdcbe23e0abf18bfeb93394c25357abaf25d5f0144e3cecf528004af7b385e +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=cb779575cec151223c3c144bc9ca957530fa510e36b32bc9f35bbb1b7dde9e2f +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-musl.tar.gz=250224d084e4a879d5217e8a760cd50bc744c7ff45c0fb5be72787ff4cd7cda8 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-musl.tar.xz=bcaeb5c943f422356f115b2e4583cba92dfdc1a6a34bf03604fc81acf6eef75a +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none.tar.gz=a827faa6bc5fede52656f506b0a8ea43a4b0dad8efe3714de3baee3afe3842b1 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none.tar.xz=51a8913f46f10cc1e1b2862c3ecae70d5b09e1dc2eef41e3e81dd15a3693f8f5 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none-softfloat.tar.gz=84c0445e5bccf22a4649cf852525bd30f083ccb85e02347c11c3e6bfad6843f4 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none-softfloat.tar.xz=78c056e0f330d0e79b317230773ab95f2899cba9c374c8398074b7d4aa670ebe +dist/2025-09-18/rust-std-1.90.0-nvptx64-nvidia-cuda.tar.gz=1a40253c6d2cfe0d54cd256e37e732cba7fe3a9b6d4629e5d3578db1aeca39d3 +dist/2025-09-18/rust-std-1.90.0-nvptx64-nvidia-cuda.tar.xz=d5a501b01ad92ada96ed3c1110e28860ceb82de96f23d5a1e7c2d8cbd74c2104 +dist/2025-09-18/rust-std-1.90.0-powerpc-unknown-linux-gnu.tar.gz=7311b0bfe1169b8c8a82ee3cc04c690bfd6136db162787cc4509deb3ca1de6e9 +dist/2025-09-18/rust-std-1.90.0-powerpc-unknown-linux-gnu.tar.xz=756d1bbd66ebb0d4d575b650a8a94d52546f6892bd2f864410411f6027ed879f +dist/2025-09-18/rust-std-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=64fa57ff7ac8b27880f3fc78c7fe83a6a25f09a702e564e8c17c1d410d8a2dda +dist/2025-09-18/rust-std-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=16daac5dc6994c03ab3b8c4e6e5e52c41f5fc5846acea08f4fdf0759cc273aa2 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=1bc7b28f48ddf9fa5c628c93c4ae39f697b5c6d483dee02c54ac434ab193a5ca +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=eac29f92ccd335c51553c362c7a6d3de2eb7071b5ae3839470e351a6a3ebdb77 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=90a8089f1faf7f4d382e5abc335d2afbe318832a3fb5db55f4ee95f2974548e0 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=fac9e7d7acb39f157466537c600083040733934cc74e52c116e85bccbd8e05ed +dist/2025-09-18/rust-std-1.90.0-riscv32i-unknown-none-elf.tar.gz=917f3f63a9c97c508062be65c724a61dbabbd59b7c8de89760c9a8e3da2f0055 +dist/2025-09-18/rust-std-1.90.0-riscv32i-unknown-none-elf.tar.xz=9a624cfdc7b0f388b2d5a7c59e35a2a87bfde5f545644d8ef7954b3b00887d37 +dist/2025-09-18/rust-std-1.90.0-riscv32im-unknown-none-elf.tar.gz=76f6cc83037cac0090732042d1eec41780dd6c2882bbc23f18fc0c6525ebae98 +dist/2025-09-18/rust-std-1.90.0-riscv32im-unknown-none-elf.tar.xz=673e07fa7c53277a9ad0c9b7cdf3ac08572bdbdc5821df2d57ab687ad4564ddb +dist/2025-09-18/rust-std-1.90.0-riscv32imac-unknown-none-elf.tar.gz=f5a8c5239fd7f20784700e87b44d29a8c0ebbc52fd5bd048c4ac1b6d6a551601 +dist/2025-09-18/rust-std-1.90.0-riscv32imac-unknown-none-elf.tar.xz=ee60074b1ee8ee62404113070d27eb93c319fcbb2ba8fef654a709087787a348 +dist/2025-09-18/rust-std-1.90.0-riscv32imafc-unknown-none-elf.tar.gz=bbe7d7674d9528d9f0e07abbc810cc8563fbaac107f6b6654d3ede3b28947e3c +dist/2025-09-18/rust-std-1.90.0-riscv32imafc-unknown-none-elf.tar.xz=da00e370a32a50cbca2034a06a7c17572d3b8704ac6d31b0a3fcc2e6afb1b947 +dist/2025-09-18/rust-std-1.90.0-riscv32imc-unknown-none-elf.tar.gz=3960d90e43baae2353c3f275acab46593cde3683d9ae632b82948f033a226cc2 +dist/2025-09-18/rust-std-1.90.0-riscv32imc-unknown-none-elf.tar.xz=ea0b3ebc3a7d6aceec237048aed2275ef4e377aac3875ee5012b81ef9c98c82b +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=1abdc9a7a36244185aac647bc2170e91656ecb53d420801a40ecfca45b1e069e +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=675dc5556d9d879101d2401b693fcf79edac8f00a49249e2e0f19cecd172ce51 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-musl.tar.gz=c1e20fc2715aaba244907799ac7ed8f9ab0aca4dd7f5ea6e7d4af2f68e8b3e8e +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-musl.tar.xz=e35b32e8202ba06887b5f3b4a7553c0c5964a413c38c8dd1fa6588ed9dd3deb4 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-none-elf.tar.gz=c0c376585f16dd180da12fc74b5082941ac5388ae969f43ab484f3747c679786 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-none-elf.tar.xz=063ef69235d9510880b7d40e07b4e73ab7339c266cdcc1e265d80bfb87529d9d +dist/2025-09-18/rust-std-1.90.0-riscv64imac-unknown-none-elf.tar.gz=d94b61f5cf71140d85dd053c4522c6c2f05dfa62273c18725c4eae073825385d +dist/2025-09-18/rust-std-1.90.0-riscv64imac-unknown-none-elf.tar.xz=5da0a13d98797d83d65e5e3715d7838853b1d029020ea688a66acbff97aed1a8 +dist/2025-09-18/rust-std-1.90.0-s390x-unknown-linux-gnu.tar.gz=ea7448013ea52b1e76b34d4c71d8286dbe1ed795b5b1c479a36da3a0849ea4df +dist/2025-09-18/rust-std-1.90.0-s390x-unknown-linux-gnu.tar.xz=e3e7e3dbc65616eebc69e642d9042363ec38d7f50393ef816cc5238ec475f3f5 +dist/2025-09-18/rust-std-1.90.0-sparc64-unknown-linux-gnu.tar.gz=10bac16d087f80cd52864c558a05462859ecadcea74c2aa50fb37515110c270d +dist/2025-09-18/rust-std-1.90.0-sparc64-unknown-linux-gnu.tar.xz=c204ecb424090cc6c0100cef3013f8636d29f288db99c037578aee7d2672a711 +dist/2025-09-18/rust-std-1.90.0-sparcv9-sun-solaris.tar.gz=95241fe58f9260ece56d2dc52981ba2721ab14dfe7f03179b278654db0397de1 +dist/2025-09-18/rust-std-1.90.0-sparcv9-sun-solaris.tar.xz=7b953e6b67e958b15fc7eb4b8fb1e3a8330044f2afb9e88edadb226928af6be0 +dist/2025-09-18/rust-std-1.90.0-thumbv6m-none-eabi.tar.gz=f129ffa91cf7c08cc3514e8f80d5804d17b924d8805468fd42b9de5d665fbea5 +dist/2025-09-18/rust-std-1.90.0-thumbv6m-none-eabi.tar.xz=b7c4b94649d927ee7d38df7e72b2a2716961c05325b63681ee3a05ea42806402 +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabi.tar.gz=4378a41ef1c77e8637765bbf29e330aea5dbbb15873d913c6fefc5b1d00e03ce +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabi.tar.xz=dde6d6e27729cddaaffc6b4b70ce947cd9ed19c2ec443c99d3157a3be24dee13 +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabihf.tar.gz=d94852a55ddda2b1fe56c4be638b86c9c73709c439dc451ea3cdd483577a61fc +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabihf.tar.xz=03dad7d86b0d0764622671cbd4aebc9d1c046c49dc20689a0a01fcd9d19a8dd3 +dist/2025-09-18/rust-std-1.90.0-thumbv7m-none-eabi.tar.gz=c39811d330618a562aec2085e0e2968576bd95476b141404ea12833bd9165c74 +dist/2025-09-18/rust-std-1.90.0-thumbv7m-none-eabi.tar.xz=96d1f0fb69770ffa7f810b434064309c8763ee3946128cc85fb35205a184da92 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-linux-androideabi.tar.gz=762b1a125f8059b1d6aae4dae122671b64fdfc0a94ed869b0fd024f826ae25b3 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-linux-androideabi.tar.xz=80176eca21e02528bb92211821338638717e77eb7edd8a5a55fafb514286e429 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-unknown-linux-gnueabihf.tar.gz=09eac0dd5f00785f08302e93405f6ac2f0ea7e5063f2fdc8697998f4085d37e4 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-unknown-linux-gnueabihf.tar.xz=d73864434c087942244296f7128b441a540237787e0c6cdb61c4159f605dd9f0 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.base-none-eabi.tar.gz=590eb5e84480458ef8048a9c77762b93840e93d44feed103719150b7d605d9b1 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.base-none-eabi.tar.xz=3491c627c0389b37308f95ba732d34f1668cfa7823faa1fb29c537620b56552c +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabi.tar.gz=36adea203fda3b1e90453dc2646e118689f1caff9c57301edf734d5b666d2ea8 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabi.tar.xz=a1241f24ea3b0cbe5d4d9bba934a7b13f4b33a690bebcd258ffa16a52044a278 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabihf.tar.gz=bb57af3e26109f8a077a2b11d9378de5037d3025d91f757f718cb9d6a269da20 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabihf.tar.xz=06db4701e5ff7c2d683c4ef340f61fdb37b740eb82c6ca1b109c79f7a97e8625 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-emscripten.tar.gz=73d3c17f4b06df7ccfb5a5f8e2ce8f78ae550c4bdfc4d8d35113ab4499bfc278 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-emscripten.tar.xz=865be91ae976398ddecee4817fd50dbaeb50e31354d1491b556e6fa545601334 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-unknown.tar.gz=cbcd4ea55884e9c3d8d72e1497c70e9ed18c4a824d4d0f049006a245229d11af +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-unknown.tar.xz=e6e3964f4a9639688577d5a3609633b983c795ad8de43c9eceb878a84d1aeb78 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1.tar.gz=0ea19575b8fd5238e4e094bfb849df1d265a97c824ca6f31d607699588b3dffd +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1.tar.xz=d813ddb537b57e79f18b6493e7ec2b0a18a8dd2be0dec0a7d6472d9bd62edbe6 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1-threads.tar.gz=8926af63c5aed3d1a06b7dfe5786604032f8b1a1f1af06d7748ed6c7da046eb5 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1-threads.tar.xz=19e4a3b180f1143cf19802e80af2db812039077ece8cf99c00465467452307f6 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip2.tar.gz=f4405a408199bac5babba5f26ab967a61b19002ae8b75514874822b4b4fd1238 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip2.tar.xz=8fc58f7b3e49b4ef0295486ca012dc2195bd8df7a17acc02c407e6a14dcd15e2 +dist/2025-09-18/rust-std-1.90.0-wasm32v1-none.tar.gz=f99b455756a45d367006d5c625e2369bacce4f479cd3df7c4b0d51645c640d8b +dist/2025-09-18/rust-std-1.90.0-wasm32v1-none.tar.xz=cb5e5c225d3dbcad4892e60fd938f1c11682ce734b86b7744e7bdc1e931227ea +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-darwin.tar.gz=73535b1a8f40133d789d9897f2fff4d441bd8a629a5c079bc0e94984267602f1 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-darwin.tar.xz=dd731e6f9f30cb9b2928b92b084d2f12a3abf06a481ecbd8c3553c3e6f742139 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios.tar.gz=6671a532000d1fad538da3477d2089c15a78452fad7cf303cb50eacf39949c32 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios.tar.xz=60e6c9bd7cc38f440689ff05f0e5f1f441a5d3b9e1491df2ccd3a893133a275a +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios-macabi.tar.gz=2cd2e240a4c807277a716d8264ffbbec7c7aa36aede712502d6693595e78a3a3 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios-macabi.tar.xz=1ab0d0a2bd049fce9923046c6e126aaed3704177a19bcb6ac4068ffc8bfeafdc +dist/2025-09-18/rust-std-1.90.0-x86_64-fortanix-unknown-sgx.tar.gz=6d7a331740879480b9ee7fb4af4a583f83762d61ffac46ea591758b7ca58c27c +dist/2025-09-18/rust-std-1.90.0-x86_64-fortanix-unknown-sgx.tar.xz=e614e5aef818385970674e1716ce654802884e1abc6593dbe72505b2f3c71b6f +dist/2025-09-18/rust-std-1.90.0-x86_64-linux-android.tar.gz=2f441da296b1848b6e68d20b2cb25d77fe10966433070ce93326b5f36b369403 +dist/2025-09-18/rust-std-1.90.0-x86_64-linux-android.tar.xz=66639dcb8ac7fdf7bd7e476aca045a10c3ad827d84069d03cdc317534c64924f +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-solaris.tar.gz=7cefdd59f37ad2dced7ce8b532326776f4af811e610c8c15c237aed8d413fc4c +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-solaris.tar.xz=bbbe65a0625b0467db7203b228321998ea78aed4d43dc4383b38285da8f14ba3 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnu.tar.gz=63758c76bd4758a77d4e3e2429b93833d3ab20fbad205db2c72640670e894d16 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnu.tar.xz=d82b3240908390cef1ddb88d2d922fa6d5e8abb6e6ef1d47948ec503ba694bf5 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnullvm.tar.gz=ea6a14c08499be72d95bc908da58be921f35d68f193ea8ccbc116746c162e3ab +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnullvm.tar.xz=f18594d0ea4794b9693e3bc1485d800577b21a185fc6ada9960c41c8d9354cdd +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-msvc.tar.gz=ee4bf4c2928598359fd517445ec2af4b46b2926730c111f2ffbac2a1b9550b72 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-msvc.tar.xz=3b8c22f81c93c7e914369433430792bd6c06403806ae25b0b95f3cfc540a8b48 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-freebsd.tar.gz=16f32d2b9deff920e291909a3e4eb0fc3327a0822f8d1320f908d95e484ea470 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-freebsd.tar.xz=c092ff153ed4e9670c63d9ca62e48ac41da339d4bb286f187b7afb0dfe333f10 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-fuchsia.tar.gz=46d763abedc893fb21f9eb7ea22bbb9fdd6d0064e5da95d222050a48a6bd6d06 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-fuchsia.tar.xz=0e0ed1e28906be354db48c39f85942f3de72974f5741fea66d6fefd9ad3265f6 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-illumos.tar.gz=f9b7456042092d07a85a4383c58625f18fe280fd48cc691cfd7e8d77ea2255f7 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-illumos.tar.xz=7ed43bd9062abbed7e5264af7b0c5f6d2916b78f108cb5d3b282d3844bf760d2 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.gz=81d7dad58adaf8a9904771d1aa1ea7e8dc732236fe0a1b148a068ceb502de7fb +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.xz=663f4ab7945b392d5e5294dec1b050a66820a20e86f084ec37eeb0f2f7ff5569 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnux32.tar.gz=d83c0d9a67ae9ef0435b4dc566fdaeebff2cad5b2d30844e9869174af56643fe +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnux32.tar.xz=f1c2cb20f8f9a54e76317a876e9c7317412e925eb9ca3f1663213aab4a92bedf +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-musl.tar.gz=9e8bf994828cc45eaa22d94ec674f3bac710ef7771ba6742bf37ae706a1caf75 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-musl.tar.xz=38490d575786f4688e83b357baeb022d8dde0ace2cb8c1357e060c76644fc56a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-ohos.tar.gz=dbd013ffe203172d937b0e3e6edc07c69e51f246f25e4d70a18fbe0f9fc37c0a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-ohos.tar.xz=aba4de9f449a090bf72ae692bd300ec18b43138c629869dee41a398c68004261 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-netbsd.tar.gz=7009e9a611492120240a1e6291629202ea2023088562044c1dcbb1aaa7aee46a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-netbsd.tar.xz=a3b3317fb3af19733fbf7d7dc5d7e256db217a36f2f4d2a096ea2efc2d84e2c9 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-none.tar.gz=e856bc9b19b9afcae970e6424f92dadf7da767b7ac2c6668a89effbcb781e028 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-none.tar.xz=47cb9f0ffcbeebeaee06a92a189ea81011b46d7dd10360a3b0801a041bc3b9af +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-redox.tar.gz=2603317c04e3cd074f4c189a4d5e344b1c46ae5177750bce999740191e72522c +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-redox.tar.xz=caaa6bbf4b9b60d9f5b78d5d4bfc7afaa833398b400484acd8c3e86745f1c7a9 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-uefi.tar.gz=46c75836427094d7925be0a9af7cb62e31a37b8933df4b96b939d6903e0ba2ff +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-uefi.tar.xz=1e3df3bac5f1451675e06118f7cd197e52cc1413d7bf1f1c38df0d28a8e5c916 +dist/2025-09-18/cargo-1.90.0-aarch64-apple-darwin.tar.gz=a242bb8d88d4d1b621f33742d0c718ebb5a551b07d21240e8b8c31152dc29737 +dist/2025-09-18/cargo-1.90.0-aarch64-apple-darwin.tar.xz=17a4410a27bf7dad4765f3809265c225f25f8b009da3d4b76cd0927acdae04b5 +dist/2025-09-18/cargo-1.90.0-aarch64-pc-windows-msvc.tar.gz=6443553c44608439c1858f95ff57e3e15fea85295c28af081239f8b45750ac79 +dist/2025-09-18/cargo-1.90.0-aarch64-pc-windows-msvc.tar.xz=7c3e8bdb15ea6962e9b5546d6afd20052bcd9ab2429c870b3f349c59da8e2d98 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-gnu.tar.gz=33527828bc38026702d85996a28c08a894d5376a5756dd9085247d36aa208405 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-gnu.tar.xz=bd8d1da6fe88ea7e29338f24277c22156267447adbfc47d690467ad32d02c2a7 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-musl.tar.gz=6eedfd1251d969cea2ecd971e8e39c437a9b643f7de4d3472c699a1f4c65812f +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-musl.tar.xz=a9ad4ca5612aebfcf43cc4825d743765d5179a15fc1cc1bcf24507d169988bd4 +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabi.tar.gz=625ec0d3d27d1eeef044a109560e1060a9472886d770fca3b3636c06493cf238 +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9cabfa20559414319e326f6a548cf10f4bf23b5772e48cd29ad3d57bf7848aff +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=455ac4e24f8da188bcf890ddfb871ce20226970e3e439f43500e82cc21d41dbc +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=f556cb4aecf8faa51bd3ca888eaccd85015aa8ada7a82c6b0554690e23246e57 +dist/2025-09-18/cargo-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=ea37292c265115c86e880896c90a4d0d35d38a0d7fdb37cb42e4d6d3669f0fc9 +dist/2025-09-18/cargo-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=21592e98e5370921a9363d6c8ef1b05198dd7cc32be91809f0f98cfa28de1edf +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-gnu.tar.gz=b0a70e77f2191981dc230dc8bf5634d47fc52458cd393a7e388b577bd0f1b4dd +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-gnu.tar.xz=5aa5720799d5b1b438c6828b90f4cd889a68fb72c86b6cd1ecf7de9106780848 +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-msvc.tar.gz=8453ed9c0d82e95b03748acb8cd395268da552aafce024bdc8d630d9254ae121 +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-msvc.tar.xz=0548f668f52dff4df274739cd85032cecfa14a0eb88585d4aa3335a882f10dd4 +dist/2025-09-18/cargo-1.90.0-i686-unknown-linux-gnu.tar.gz=d96e439702f269d61ea49b628b81df24e98510ec33168b7761902f52a7126527 +dist/2025-09-18/cargo-1.90.0-i686-unknown-linux-gnu.tar.xz=c1e9b24bbfa95550b5dba9de2045a4c906bea108625781758692b2a407428391 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=b587b6e6acf3d919a690e6e4c4f777163d167679099b3d68402ba3a4a522bebb +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=6ae37dc8eb3ff4655053a39d5f973613a82a8a8e2fff42c423ca33d8cf19e6c1 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-musl.tar.gz=b3c82f952339c2c352acb0f42e6eac390a38186790ee8900b30f890705ce76e1 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-musl.tar.xz=253180784cbd7eba742e95a7662df565ec857e7a7ba9efb334e51c1915e00dd0 +dist/2025-09-18/cargo-1.90.0-powerpc-unknown-linux-gnu.tar.gz=324de3898ba142de96ddc139eb0a2aa2ccb8189dee25d5bbc9e301f034ffc7f4 +dist/2025-09-18/cargo-1.90.0-powerpc-unknown-linux-gnu.tar.xz=5b160a2bf0e6f470b83c5988db5b6f02b6d65d3d97a9b965acbfe940b4143b34 +dist/2025-09-18/cargo-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=ad4424305b864223892d882a5633d71293e89c3a0598dfccadaff27b0927f782 +dist/2025-09-18/cargo-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=fdf90d22476c88d5b9cf8a3ac0937d0b9c6b7dafbf6b3afde369c2f5b8faec88 +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=b2f52bc70cbede869244813baddd16a61220d4684555e03f4122c5b7169adadc +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=f029151dfeed6570b8b347e04a5bb7dcb9c59d8e5454c535c05bb5069c216354 +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=2f255c7d4224ed662436daf0638d9b48b56fc5bd5f0cd1510aac640544c810dc +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=456e87fd1268f4a1618439b845524d4c937a3d71ca084327de26cd9bf0b4bbe1 +dist/2025-09-18/cargo-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=caa3d7ce6f672026135344d6c974d975b365cb66657198c23c293a5b8b30bf87 +dist/2025-09-18/cargo-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=8a09de014f7cec749b338c6636d190a1b73fd377bab6a223eb715d3c76c49e79 +dist/2025-09-18/cargo-1.90.0-s390x-unknown-linux-gnu.tar.gz=4309d80687b83a11127ccd99729f5f34e609faf663567581e506a5a3b65a895c +dist/2025-09-18/cargo-1.90.0-s390x-unknown-linux-gnu.tar.xz=468ace270ee4edac0a10185ea876ea555e41bacc0137ff08985d2155fe8cc777 +dist/2025-09-18/cargo-1.90.0-sparcv9-sun-solaris.tar.gz=44f43a409ee88098de38630f9b6555bb2c459947280b0bbfb48643b69e60d592 +dist/2025-09-18/cargo-1.90.0-sparcv9-sun-solaris.tar.xz=128e91be2066d93d60a3e2b243ce2de11ca0e601db078b6f5217fde5ec591e36 +dist/2025-09-18/cargo-1.90.0-x86_64-apple-darwin.tar.gz=0352cd2b1812363228948a310cc49d590b1ca9fc00e2cf3b00ae88c93f1e148c +dist/2025-09-18/cargo-1.90.0-x86_64-apple-darwin.tar.xz=b2fa21c8fed854775e379bb4617145abd047d1be729e8383148139ba1d05c88f +dist/2025-09-18/cargo-1.90.0-x86_64-pc-solaris.tar.gz=ea6f83c9de71c2a4af6e423228fdd94a1ec5b6846fb501dfd5cb37ce4e80a1b6 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-solaris.tar.xz=0f560b1411b6d83b8ef47316e449fe3d061b928a6dd331e10a33a64a70e5a0d4 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-gnu.tar.gz=3bd189735b120530bc66d50f9d18ff1def03c373f46b8d153e4d9d411ebb16df +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-gnu.tar.xz=b7806005e41b7733b1f4ec9111b43c2590e1535a7713644660346161cdc71c46 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-msvc.tar.gz=06a25c49843528ad1809eacd72d677a659f013a67cc005253841153a3b82eebf +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-msvc.tar.xz=a238d6a87cb0935e4f1bf0b4d093cbac3833d2f8b04413417bb622779669bec5 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-freebsd.tar.gz=82d3aa7fc1362b337fac8499106e6f1adacfb757cff8761c1a21df2f51eba6dd +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-freebsd.tar.xz=58d094940c719267f2cc1bb517263019d3c2c337dad8c8a385a36e59c46bdcee +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-illumos.tar.gz=15f210f727a22b3462fe9259a176433e2c7cf8aff414de5a38401aaf16e1e993 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-illumos.tar.xz=2a7a0610e95d999494cefaf3256c556fed1a4fc54a28f92f29dc1112750c164e +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-gnu.tar.gz=dc0f70c6e681776d0c5e01953b50488e8b2f972eed5aece6d094e497ea480ab0 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-gnu.tar.xz=9853db03d68578a30972e2755c89c66aec035fec641cf8f3a7117c81eec2578d +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-musl.tar.gz=d616d83146b254cc62cd2f90258d9743586944c294cd39b48c26e9b962dc0e30 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-musl.tar.xz=dddd1ee3da59440d5aa4d149ebb5fbbe0d7252dd94e171d5f2b071d7354f9b3a +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-netbsd.tar.gz=badf108c3362ff4fe5501ffda2eecfc7579b42324500c82ba012b2fc7a26790d +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-netbsd.tar.xz=ac72f885666fbce5c2b624b2c923bde7949214b51f6b2b53079342cb792e90ab +dist/2025-09-18/clippy-1.90.0-aarch64-apple-darwin.tar.gz=323a3ebca03d5aa7dc8d8d54ac05963e08a1c4fb22066ef6b05ee5398e397b12 +dist/2025-09-18/clippy-1.90.0-aarch64-apple-darwin.tar.xz=3a0514b40b967810dd318a43cdc3d97bc47c3ad3844bde759c93223a28d56903 +dist/2025-09-18/clippy-1.90.0-aarch64-pc-windows-msvc.tar.gz=99c64c890e1d8320b1d48d50f4f7e8718f4e7c8db2bdb11db196ea7620b6d23a +dist/2025-09-18/clippy-1.90.0-aarch64-pc-windows-msvc.tar.xz=0d53737e4f66adccdd5c8fe7fcb7adf91e522ed5b986ec1fbd28e343eee7c1e2 +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-gnu.tar.gz=e0a970c0997db493e489bb27781ee3488e09815de175b99f843b98934db137ff +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-gnu.tar.xz=1a7f969c5712c17d960d6fba8235b33f264a9484b369dc388766a540f1ba464f +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-musl.tar.gz=5e60f59aaa2b6cee457a07585863012a1fe435f5ef864c6f2407714f25a1cfdb +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-musl.tar.xz=b461300782ce55a4a67acec4f21366c9dc96c4a1e073c4e8823876be1bbd7e42 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabi.tar.gz=45dda2c7de1d182fa6bd8824630836bfcea429230e5fcc20fc19e7185583aa32 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9af18a37afc55fc08fde139ab18391f195ae583cc8cf3714e2440855fb5cc808 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=0227f0114e85725fe83c0bff6460e47e3e5f78a23fbd9e5248a0f6a20151bdbb +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=99b6bf1db1de4b35f9bef774a78ead28a9c97b24b8799503d3492eca65994dc4 +dist/2025-09-18/clippy-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=fe17099b96f3e383b5d2a0388d86050f15b7bf244a4e41e62ffdc61dbe56030d +dist/2025-09-18/clippy-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=9cb09e749dd1162f02376ce70c1ee74f95b55ab134ceb50dc3c23f40027f5196 +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-gnu.tar.gz=4e2ebe77044f41c80c4bd13385080506bb17c8a6c02f492b7206f8a4b6ccc40a +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-gnu.tar.xz=19b64336455e2c1d78132de2d1fa2ea10f794e0f741dbfd7eaec4db06cc98b5d +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-msvc.tar.gz=b0cd1a85441a681b16a945f0991788cfa584de6536efd245eab961ecc61828bd +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-msvc.tar.xz=ddb0ab9cf4b63a019b22ee183258607d377fed53a8a57e8cc10f7577416acbcc +dist/2025-09-18/clippy-1.90.0-i686-unknown-linux-gnu.tar.gz=49938b7213313ed846bc5c9c33e7f2708c30ecc7475568269eb9b49dc7743b8d +dist/2025-09-18/clippy-1.90.0-i686-unknown-linux-gnu.tar.xz=3e902971ef6b44ccb804af73aba5dc8c6199ed09a76f178b0eed6f53f7f56eab +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=d5c0e41cff60e70274b2b1f96cb9a53aff2292f56922f85c3e487be4c36f9fd1 +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=847b3d4bd3d2be23bafbb90cd2ed5e1bf1aacb2e7152e7d2f99bee1078aa0eaa +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-musl.tar.gz=236e57e5d28dfba7c24fff52840fe448d284cf5882b0b127f10edf0c566dd8bf +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-musl.tar.xz=8e7a8ee3b048fe863710dcafbecf0550e47cebda8f0d1679278ab77dacea913d +dist/2025-09-18/clippy-1.90.0-powerpc-unknown-linux-gnu.tar.gz=a1cd64461aca05901a532716ded08f63197b548a765df3247b86dbb44d577744 +dist/2025-09-18/clippy-1.90.0-powerpc-unknown-linux-gnu.tar.xz=42ac7480dcac12a843803f5ee398d2a42389359178774cab20c66eda4f6927a5 +dist/2025-09-18/clippy-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=23e576086a58ac3544214a91e8bdccb2540b53e1ec4f8395bf25f47a2605a954 +dist/2025-09-18/clippy-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=071e06a50d5b2975905bb2d6211f2d2372ab0dbd50b7b0097168cb64e77a4bb0 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=c78cf5f24a49ad5857092e2955317f489c1edd5bf4458d8828f079808baf83a1 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=12d19dbec34c5a35cd285fe74dcd0226563c0b25be5d041479744060e9374c98 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=7d1a99da80ed5051fcac569a06c08eec8006bec1c9e3f0c785189172e95e8c86 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=b77a4daf504100396fe0df8db5f8eeedc2b7ea30d0b1af2e48961364e483f133 +dist/2025-09-18/clippy-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=02ca569b044f919df7d43a1fcf9d957444d6ef2b3eee1aaff7fe05937597aec4 +dist/2025-09-18/clippy-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=02338e25b3d2b61d9dbee7bee4c9ed148f18e2d010c6297ffd36df98042f41a2 +dist/2025-09-18/clippy-1.90.0-s390x-unknown-linux-gnu.tar.gz=e9f5ec0fc78c9e43a4d17cf0b7ee53d5f64503fffcc3c53ece4cf7b595ebc51e +dist/2025-09-18/clippy-1.90.0-s390x-unknown-linux-gnu.tar.xz=bb0a9483a36fdbdab08b433613b374c036779d247a8d508e31265193c3759a8d +dist/2025-09-18/clippy-1.90.0-sparcv9-sun-solaris.tar.gz=c0fd7946ffa7d326a3ac28b40e5aa16bb7c4735f794abc4065030358d14bd240 +dist/2025-09-18/clippy-1.90.0-sparcv9-sun-solaris.tar.xz=cc830dcecde477232d6c47ad94ef8cd36c116a878da95abb38b791cee0039277 +dist/2025-09-18/clippy-1.90.0-x86_64-apple-darwin.tar.gz=36294e19b84bdd36139b5a46ffe2dd7ee9e27707296762909aa467573cdb51df +dist/2025-09-18/clippy-1.90.0-x86_64-apple-darwin.tar.xz=4c5736f0e6c8b10dd9274e1c7cbf370050aa345c013bc321c3943a4fea55d078 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-solaris.tar.gz=7b7eb300a0505d1eb02a3cc8f24118c1a61f82535233a2a0c17018d8e70306d7 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-solaris.tar.xz=a1ad3894a3eba067a70b6fd001dd640c2b154d179e2b17e1716cb7c1f6d89069 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-gnu.tar.gz=6c9d6d370550886291570062aa82ef4e61781e200cf8c7cf402e8aa5f6824fd3 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-gnu.tar.xz=a99055503a4d95a730f7205a7a2a2ab4af3b749610c9c3384fed56a39947ce96 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-msvc.tar.gz=c27d21c9400abab4cf14819e3e31e110acefe05ea7d2ccc2b5f81ea3ec9f8538 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-msvc.tar.xz=d7d71f603ea9c2f79ba186cd3572ea41593907f933d26bd028d60b7b0943b49e +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-freebsd.tar.gz=7301156ec837ae70bdd38e4dc11779e891091e2b40b82ea84e7248eb1cfae9ab +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-freebsd.tar.xz=de5d1a2a35c39a32f1f37b6438cad56311fdb1287fd23a9d6fa7397480044e08 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-illumos.tar.gz=b5832425f90e213c54ae1312ca40c69b4a7b41cb126e1376620f238550fccc84 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-illumos.tar.xz=d8dc3f25ce1b3588a9a383642676fab68ce50f4d419b13c19b82fc266899c878 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-gnu.tar.gz=0e1db6adef940dd21896dbd7a051e25056df2fede90591c583552f94e913af22 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-gnu.tar.xz=5b6466419693a05365827378145014a37ae74fb2948fab390d5210a524792ed8 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-musl.tar.gz=3d9683996a016c131fb6e09859c3246b5ba996bdf1095cf21f370a6bb4001681 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-musl.tar.xz=80e29439beb1794e11939508d2a939fe82e6a1f9948a79349ae6655c71b2a79d +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-netbsd.tar.gz=8b967a3e0d4b6292c7750c1d7824ce88ca9e29d8734036101ad80bcb05b050d8 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-netbsd.tar.xz=363aa8d9241f94f10c03e1c9ed77f68640c74380d483a13621cc7d042e96a72d From 186d91daf73188357d569b41906aa5f44a55dfba Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 25 Sep 2025 16:36:51 +0200 Subject: [PATCH 06/37] Revert "Auto merge of #144086 - clubby789:alloc-zeroed, r=nikic" This reverts commit 040a98af70f0a7da03f3d5356531b28a2a7a77e4, reversing changes made to e8a792daf500b5ff8097896ddb6cc037abe92487. --- compiler/rustc_codegen_llvm/src/attributes.rs | 10 ---------- compiler/rustc_feature/src/builtin_attrs.rs | 4 ---- compiler/rustc_span/src/symbol.rs | 1 - library/alloc/src/alloc.rs | 1 - tests/codegen-llvm/vec-calloc.rs | 20 ------------------- 5 files changed, 36 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/attributes.rs b/compiler/rustc_codegen_llvm/src/attributes.rs index 573c51a95398b..bdc025cd955a4 100644 --- a/compiler/rustc_codegen_llvm/src/attributes.rs +++ b/compiler/rustc_codegen_llvm/src/attributes.rs @@ -435,16 +435,6 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>( || codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::ALLOCATOR_ZEROED) { to_add.push(create_alloc_family_attr(cx.llcx)); - if let Some(zv) = - cx.tcx.get_attr(instance.def_id(), rustc_span::sym::rustc_allocator_zeroed_variant) - && let Some(name) = zv.value_str() - { - to_add.push(llvm::CreateAttrStringValue( - cx.llcx, - "alloc-variant-zeroed", - &mangle_internal_symbol(cx.tcx, name.as_str()), - )); - } // apply to argument place instead of function let alloc_align = AttributeKind::AllocAlign.create_attr(cx.llcx); attributes::apply_to_llfn(llfn, AttributePlace::Argument(1), &[alloc_align]); diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 129ab7eccb577..fe358bd1ecb33 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -1001,10 +1001,6 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_allocator_zeroed, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, ), - rustc_attr!( - rustc_allocator_zeroed_variant, Normal, template!(NameValueStr: "function"), ErrorPreceding, - EncodeCrossCrate::Yes, - ), gated!( default_lib_allocator, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, allocator_internals, experimental!(default_lib_allocator), diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index cdb0b5b58da6d..f1de56c3f75d5 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1850,7 +1850,6 @@ symbols! { rustc_align_static, rustc_allocator, rustc_allocator_zeroed, - rustc_allocator_zeroed_variant, rustc_allow_const_fn_unstable, rustc_allow_incoherent_impl, rustc_allowed_through_unstable_modules, diff --git a/library/alloc/src/alloc.rs b/library/alloc/src/alloc.rs index 76630a746dd26..c9b98fa4e5a9b 100644 --- a/library/alloc/src/alloc.rs +++ b/library/alloc/src/alloc.rs @@ -17,7 +17,6 @@ unsafe extern "Rust" { #[rustc_allocator] #[rustc_nounwind] #[rustc_std_internal_symbol] - #[rustc_allocator_zeroed_variant = "__rust_alloc_zeroed"] fn __rust_alloc(size: usize, align: usize) -> *mut u8; #[rustc_deallocator] #[rustc_nounwind] diff --git a/tests/codegen-llvm/vec-calloc.rs b/tests/codegen-llvm/vec-calloc.rs index 15971bbfa0036..d1c320ead012e 100644 --- a/tests/codegen-llvm/vec-calloc.rs +++ b/tests/codegen-llvm/vec-calloc.rs @@ -1,6 +1,4 @@ -//@ revisions: normal llvm21 //@ compile-flags: -Copt-level=3 -Z merge-functions=disabled -//@ [llvm21] min-llvm-version: 21 //@ only-x86_64 #![crate_type = "lib"] @@ -178,24 +176,6 @@ pub fn vec_option_i32(n: usize) -> Vec> { vec![None; n] } -// LLVM21-LABEL: @vec_array -#[cfg(llvm21)] -#[no_mangle] -pub fn vec_array(n: usize) -> Vec<[u32; 1_000_000]> { - // LLVM21-NOT: call {{.*}}alloc::vec::from_elem - // LLVM21-NOT: call {{.*}}reserve - // LLVM21-NOT: call {{.*}}__rust_alloc( - - // LLVM21: call {{.*}}__rust_alloc_zeroed( - - // LLVM21-NOT: call {{.*}}alloc::vec::from_elem - // LLVM21-NOT: call {{.*}}reserve - // LLVM21-NOT: call {{.*}}__rust_alloc( - - // LLVM21: ret void - vec![[0; 1_000_000]; 3] -} - // Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away. // CHECK: declare noalias noundef ptr @{{.*}}__rust_alloc_zeroed(i64 noundef, i64 allocalign noundef) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]] From f1fbf1f6ae5bffbcd91aa4f926d9bfd6bbbb3c6f Mon Sep 17 00:00:00 2001 From: dianne Date: Fri, 19 Sep 2025 20:53:31 -0700 Subject: [PATCH 07/37] add positive and negative tests for temporary scope shortening FCW --- .../auxiliary/external-macros.rs | 12 +++ .../macro-extended-temporary-scopes.rs | 102 ++++++++++++++++++ .../non-extended.rs | 15 +++ .../non-extended.stderr | 35 ++++++ .../user-defined-macros.rs | 50 +++++++++ 5 files changed, 214 insertions(+) create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs new file mode 100644 index 0000000000000..74717755ca336 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs @@ -0,0 +1,12 @@ +//! The macros that are in `../user-defined-macros.rs`, but external to test diagnostics. +//@ edition: 2024 + +#[macro_export] +macro_rules! wrap { + ($arg:expr) => { { &$arg } } +} + +#[macro_export] +macro_rules! print_with_internal_wrap { + () => { println!("{:?}{}", (), $crate::wrap!(String::new())) } +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs new file mode 100644 index 0000000000000..0034b57c92e1d --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs @@ -0,0 +1,102 @@ +//! Future-compatibility warning test for #145838: make sure we catch all expected breakage. +//! Shortening temporaries in the tails of block expressions should warn in Rust 2024, and +//! shortening temporaries in the tails of `if` expressions' blocks should warn in all editions. +//@ revisions: e2021 e2024 +//@ [e2021] edition: 2021 +//@ [e2024] edition: 2024 +//@ check-pass +use std::pin::pin; + +struct Struct { field: () } + +fn cond() -> bool { true } +fn temp() {} +fn array_temp() -> [(); 1] { [()] } +fn tuple_temp() -> ((),) { ((),) } +fn struct_temp() -> Struct { Struct { field: () } } +fn smart_ptr_temp() -> Box<()> { Box::new(()) } + +const CONST_STRING: String = String::new(); +static STATIC_UNIT: () = (); + +fn main() { + let local = String::new(); + + // #145880 doesn't apply here, so this `temp()`'s lifetime is reduced by #145838 in Rust 2024. + println!("{:?}{:?}", { &temp() }, ()); + // TODO: warn in Rust 2024 + + // In real-world projects, this breakage typically appeared in `if` expressions with a reference + // to a `String` temporary in one branch's tail expression. This is edition-independent since + // `if` expressions' blocks are temporary scopes in all editions. + println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + // TODO: warn in all editions + println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + // TODO: warn in all editions + println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + // TODO: warn in all editions + + // Make sure we catch indexed and dereferenced temporaries. + pin!( + if cond() { + &array_temp()[0] + // TODO: warn in all editions + } else if cond() { + &tuple_temp().0 + // TODO: warn in all editions + } else if cond() { + &struct_temp().field + // TODO: warn in all editions + } else { + &*&*smart_ptr_temp() + // TODO: warn in all editions + } + ); + + // Test that `super let` extended by parent `super let`s in non-extending blocks are caught. + pin!(pin!({ &temp() })); + // TODO: warn in Rust 2024 + + // We shouldn't warn when lifetime extension applies. + let _ = format_args!("{:?}{:?}", { &temp() }, if cond() { &temp() } else { &temp() }); + let _ = pin!( + if cond() { + &array_temp()[0] + } else if cond() { + &tuple_temp().0 + } else if cond() { + &struct_temp().field + } else { + &*&*smart_ptr_temp() + } + ); + let _ = pin!(pin!({ &temp() })); + + // We shouldn't warn when borrowing from non-temporary places. + pin!({ &local }); + pin!({ &STATIC_UNIT }); + + // We shouldn't warn for promoted constants. + pin!({ &size_of::<()>() }); + pin!({ &(1 / 1) }); + pin!({ &mut ([] as [(); 0]) }); + pin!({ &None:: }); + pin!({ &|| String::new() }); + + // But we do warn on these temporaries, since they aren't promoted. + pin!({ &(1 / 0) }); + // TODO: warn in Rust 2024 + pin!({ &mut [()] }); + // TODO: warn in Rust 2024 + pin!({ &Some(String::new()) }); + // TODO: warn in Rust 2024 + pin!({ &(|| ())() }); + // TODO: warn in Rust 2024 + pin!({ &|| &local }); + // TODO: warn in Rust 2024 + pin!({ &CONST_STRING }); + // TODO: warn in Rust 2024 + + // This lint only catches future errors. Future dangling pointers do not produce warnings. + pin!({ &raw const *&temp() }); +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs new file mode 100644 index 0000000000000..5b5a43c94735b --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs @@ -0,0 +1,15 @@ +//! Test that `macro_extended_temporary_scopes` doesn't warn on non-extended temporaries. +//@ edition: 2024 +#![deny(macro_extended_temporary_scopes)] //~ WARN unknown lint + +fn temp() {} + +fn main() { + // Due to #145880, this argument isn't an extending context. + println!("{:?}", { &temp() }); + //~^ ERROR temporary value dropped while borrowed + + // Subexpressions of function call expressions are not extending. + println!("{:?}{:?}", (), { std::convert::identity(&temp()) }); + //~^ ERROR temporary value dropped while borrowed +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr new file mode 100644 index 0000000000000..6ea3dcacaefe7 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr @@ -0,0 +1,35 @@ +warning: unknown lint: `macro_extended_temporary_scopes` + --> $DIR/non-extended.rs:3:9 + | +LL | #![deny(macro_extended_temporary_scopes)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unknown_lints)]` on by default + +error[E0716]: temporary value dropped while borrowed + --> $DIR/non-extended.rs:9:25 + | +LL | println!("{:?}", { &temp() }); + | ---^^^^^--- + | | | | + | | | temporary value is freed at the end of this statement + | | creates a temporary value which is freed while still in use + | borrow later used here + | + = note: consider using a `let` binding to create a longer lived value + +error[E0716]: temporary value dropped while borrowed + --> $DIR/non-extended.rs:13:56 + | +LL | println!("{:?}{:?}", (), { std::convert::identity(&temp()) }); + | --------------------------^^^^^^--- + | | | | + | | | temporary value is freed at the end of this statement + | | creates a temporary value which is freed while still in use + | borrow later used here + | + = note: consider using a `let` binding to create a longer lived value + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0716`. diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs new file mode 100644 index 0000000000000..24d12cf0d55f2 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs @@ -0,0 +1,50 @@ +//! Test that the future-compatibility warning for #145838 doesn't break in the presence of +//! user-defined macros. +//@ build-pass +//@ edition: 2024 +//@ aux-build:external-macros.rs +//@ dont-require-annotations: NOTE + +extern crate external_macros; + +macro_rules! wrap { + ($arg:expr) => { { &$arg } } +} + +macro_rules! print_with_internal_wrap { + () => { println!("{:?}{}", (), wrap!(String::new())) } +} + +fn main() { + print!( + "{:?}{}", + (), + format_args!( + "{:?}{:?}", + + // This is promoted; do not warn. + wrap!(None::), + + // This does not promote; warn. + wrap!(String::new()) + // TODO: warn + ) + ); + + print_with_internal_wrap!(); + // TODO: warn + + print!( + "{:?}{:?}", + + // This is promoted; do not warn. + external_macros::wrap!(None::), + + // This does not promote; warn. + external_macros::wrap!(String::new()) + // TODO: warn + ); + + external_macros::print_with_internal_wrap!(); + // TODO: warn +} From b6643862e8227fcf07416989945e283b141ec165 Mon Sep 17 00:00:00 2001 From: lcnr Date: Tue, 23 Sep 2025 08:25:07 +0200 Subject: [PATCH 08/37] yeet fastpath (cherry picked from commit 4fcafc9daad24e5811546896b80e4e18578bf9f3) --- compiler/rustc_trait_selection/src/infer.rs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/compiler/rustc_trait_selection/src/infer.rs b/compiler/rustc_trait_selection/src/infer.rs index 4c50c44b84182..cd076d1cb692a 100644 --- a/compiler/rustc_trait_selection/src/infer.rs +++ b/compiler/rustc_trait_selection/src/infer.rs @@ -9,7 +9,7 @@ use rustc_middle::infer::canonical::{ Canonical, CanonicalQueryInput, CanonicalQueryResponse, QueryResponse, }; use rustc_middle::traits::query::NoSolution; -use rustc_middle::ty::{self, GenericArg, Ty, TyCtxt, TypeFoldable, TypeVisitableExt, Upcast}; +use rustc_middle::ty::{self, GenericArg, Ty, TyCtxt, TypeFoldable, Upcast}; use rustc_span::DUMMY_SP; use tracing::instrument; @@ -31,19 +31,7 @@ impl<'tcx> InferCtxt<'tcx> { fn type_is_copy_modulo_regions(&self, param_env: ty::ParamEnv<'tcx>, ty: Ty<'tcx>) -> bool { let ty = self.resolve_vars_if_possible(ty); - - // FIXME(#132279): This should be removed as it causes us to incorrectly - // handle opaques in their defining scope, and stalled coroutines. - if !self.next_trait_solver() && !(param_env, ty).has_infer() && !ty.has_coroutines() { - return self.tcx.type_is_copy_modulo_regions(self.typing_env(param_env), ty); - } - let copy_def_id = self.tcx.require_lang_item(LangItem::Copy, DUMMY_SP); - - // This can get called from typeck (by euv), and `moves_by_default` - // rightly refuses to work with inference variables, but - // moves_by_default has a cache, which we want to use in other - // cases. traits::type_known_to_meet_bound_modulo_regions(self, param_env, ty, copy_def_id) } From dad01bc9a8f205b9f18de05c886dacdf2a97fc1c Mon Sep 17 00:00:00 2001 From: lcnr Date: Tue, 23 Sep 2025 17:08:29 +0200 Subject: [PATCH 09/37] remove test for no_core (cherry picked from commit 83532f8544e18dfc2025ab33e7c01fb27865667f) --- .../missing-copy-lang-item-issue-19660.rs | 19 ------------------- .../missing-copy-lang-item-issue-19660.stderr | 8 -------- 2 files changed, 27 deletions(-) delete mode 100644 tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs delete mode 100644 tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr diff --git a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs b/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs deleted file mode 100644 index 35d5d079c6894..0000000000000 --- a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![feature(lang_items, no_core)] -#![no_core] -#![no_main] - -#[lang = "pointee_sized"] -pub trait PointeeSized {} - -#[lang = "meta_sized"] -pub trait MetaSized: PointeeSized {} - -#[lang = "sized"] -trait Sized: MetaSized { } - -struct S; - -#[no_mangle] -extern "C" fn main(argc: i32, _argv: *const *const u8) -> i32 { - argc //~ ERROR requires `copy` lang_item -} diff --git a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr b/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr deleted file mode 100644 index 7b9541f734fa8..0000000000000 --- a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: requires `copy` lang_item - --> $DIR/missing-copy-lang-item-issue-19660.rs:18:5 - | -LL | argc - | ^^^^ - -error: aborting due to 1 previous error - From 34182f6e7da548606231dd6a81cb4b36c6da5fe6 Mon Sep 17 00:00:00 2001 From: lcnr Date: Wed, 24 Sep 2025 15:02:41 +0200 Subject: [PATCH 10/37] add test (cherry picked from commit 7a0adc08786df857e810c9f6a5a0cb6cae32659b) --- .../coroutine/copy-fast-path-query-cycle.rs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tests/ui/coroutine/copy-fast-path-query-cycle.rs diff --git a/tests/ui/coroutine/copy-fast-path-query-cycle.rs b/tests/ui/coroutine/copy-fast-path-query-cycle.rs new file mode 100644 index 0000000000000..644cba0d47af2 --- /dev/null +++ b/tests/ui/coroutine/copy-fast-path-query-cycle.rs @@ -0,0 +1,40 @@ +//@ edition: 2024 +//@ revisions: current next +//@[next] compile-flags: -Znext-solver +//@ check-pass + +// Regression test for #146813. We previously used a pseudo-canonical +// query during HIR typeck which caused a query cycle when looking at the +// witness of a coroutine. + +use std::future::Future; + +trait ConnectMiddleware {} + +trait ConnectHandler: Sized { + fn with(self, _: M) -> impl ConnectHandler + where + M: ConnectMiddleware, + { + LayeredConnectHandler + } +} + +struct LayeredConnectHandler; +impl ConnectHandler for LayeredConnectHandler {} +impl ConnectHandler for F where F: FnOnce() {} + +impl ConnectMiddleware for F +where + F: FnOnce() -> Fut, + Fut: Future + Send, +{ +} + +pub async fn fails() { + { || {} } + .with(async || ()) + .with(async || ()) + .with(async || ()); +} +fn main() {} From 6271db5ab52fc6118561d2565ac4b1c21f04a078 Mon Sep 17 00:00:00 2001 From: Iris Shi <0.0@owo.li> Date: Wed, 24 Sep 2025 12:55:38 +0800 Subject: [PATCH 11/37] Fix infinite recursion in Path::eq with String (cherry picked from commit 5a4e53603631475335bab3e1416f4aca61172094) --- library/std/src/path.rs | 12 ++++++------ library/std/tests/path.rs | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/library/std/src/path.rs b/library/std/src/path.rs index b3f992a402955..718c7c2e3b1a6 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -2107,7 +2107,7 @@ impl PartialEq for PathBuf { impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &str) -> bool { - Path::eq(self, other) + self.as_path() == other } } @@ -2115,7 +2115,7 @@ impl cmp::PartialEq for PathBuf { impl cmp::PartialEq for str { #[inline] fn eq(&self, other: &PathBuf) -> bool { - other == self + self == other.as_path() } } @@ -2123,7 +2123,7 @@ impl cmp::PartialEq for str { impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &String) -> bool { - **self == **other + self.as_path() == other.as_str() } } @@ -2131,7 +2131,7 @@ impl cmp::PartialEq for PathBuf { impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &PathBuf) -> bool { - other == self + self.as_str() == other.as_path() } } @@ -3426,7 +3426,7 @@ impl cmp::PartialEq for str { impl cmp::PartialEq for Path { #[inline] fn eq(&self, other: &String) -> bool { - self == &*other + self == other.as_str() } } @@ -3434,7 +3434,7 @@ impl cmp::PartialEq for Path { impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &Path) -> bool { - other == self + self.as_str() == other } } diff --git a/library/std/tests/path.rs b/library/std/tests/path.rs index fa76c50597b05..837a14b808ff8 100644 --- a/library/std/tests/path.rs +++ b/library/std/tests/path.rs @@ -2528,7 +2528,17 @@ fn normalize_lexically() { } #[test] -/// See issue#146183 -fn compare_path_to_str() { - assert!(&PathBuf::from("x") == "x"); +/// See issue#146183 and issue#146940 +fn compare_path_like_to_str_like() { + let path_buf = PathBuf::from("x"); + let path = Path::new("x"); + let s = String::from("x"); + assert!(path == "x"); + assert!("x" == path); + assert!(path == &s); + assert!(&s == path); + assert!(&path_buf == "x"); + assert!("x" == &path_buf); + assert!(path_buf == s); + assert!(s == path_buf); } From 61380c48ddcb51d53c12f5e93026ffd57abf1edc Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Sat, 4 Oct 2025 17:55:54 -0700 Subject: [PATCH 12/37] Update cargo submodule from branch `rust-1.91.0` --- src/tools/cargo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/cargo b/src/tools/cargo index 24bb93c388fb8..785a383cf7154 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 24bb93c388fb8c211a37986539f24a819dc669d3 +Subproject commit 785a383cf715417fcd68c4a98a4523c2d082bb0f From d4278373a93b7e0538f11de13c71a98197eee9b4 Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Thu, 2 Oct 2025 10:15:00 +0200 Subject: [PATCH 13/37] Add failing regression test for #[link="dl"] (cherry picked from commit 5c95f8bea6ea37d750910e5b0ac7ae049579e437) --- .../ui/attributes/link-dl.default_fcw.stderr | 26 +++++++++++++++++++ tests/ui/attributes/link-dl.rs | 19 ++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/ui/attributes/link-dl.default_fcw.stderr create mode 100644 tests/ui/attributes/link-dl.rs diff --git a/tests/ui/attributes/link-dl.default_fcw.stderr b/tests/ui/attributes/link-dl.default_fcw.stderr new file mode 100644 index 0000000000000..6bff216ad03f4 --- /dev/null +++ b/tests/ui/attributes/link-dl.default_fcw.stderr @@ -0,0 +1,26 @@ +error[E0539]: malformed `link` attribute input + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ expected this to be a list + | + = note: for more information, visit +help: try changing it to one of the following valid forms of the attribute + | +LL - #[link="dl"] +LL + #[link(name = "...")] + | +LL - #[link="dl"] +LL + #[link(name = "...", import_name_type = "decorated|noprefix|undecorated")] + | +LL - #[link="dl"] +LL + #[link(name = "...", kind = "dylib|static|...")] + | +LL - #[link="dl"] +LL + #[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")] + | + = and 1 other candidate + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0539`. diff --git a/tests/ui/attributes/link-dl.rs b/tests/ui/attributes/link-dl.rs new file mode 100644 index 0000000000000..0785c83cb442f --- /dev/null +++ b/tests/ui/attributes/link-dl.rs @@ -0,0 +1,19 @@ +// Regression test for an issue discovered in https://github.com/rust-lang/rust/pull/143193/files and rediscovered in https://github.com/rust-lang/rust/issues/147254#event-20049906781 +// Malformed #[link] attribute was supposed to be deny-by-default report-in-deps FCW, +// but accidentally was landed as a hard error. +// +// revision `default_fcw` tests that with `ill_formed_attribute_input` (the default) denied, +// the attribute produces an FCW +// revision `allowed` tests that with `ill_formed_attribute_input` allowed the test passes + +//@ revisions: default_fcw allowed +//@[allowed] check-pass + +#[cfg_attr(allowed, allow(ill_formed_attribute_input))] + +#[link="dl"] +//[default_fcw]~^ ERROR valid forms for the attribute are +//[default_fcw]~| WARN previously accepted +extern "C" { } + +fn main() {} From 0d2b92cd1e640a21d4b434d1d05a01af8ae1d4af Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Thu, 2 Oct 2025 10:20:08 +0200 Subject: [PATCH 14/37] Make `#[link="dl"]` a warning rather than an error (cherry picked from commit 1c85a1dc2eaa2cbc55b5d0a6bbde1ca73706385d) --- .../src/attributes/link_attrs.rs | 29 ++++++++++----- compiler/rustc_span/src/symbol.rs | 1 + tests/ui/attributes/link-dl.allowed.stderr | 10 ++++++ .../ui/attributes/link-dl.default_fcw.stderr | 35 +++++++++---------- 4 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 tests/ui/attributes/link-dl.allowed.stderr diff --git a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs index d4942e56f429d..04eaa485f736c 100644 --- a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs +++ b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs @@ -65,10 +65,22 @@ impl CombineAttributeParser for LinkParser { cx: &'c mut AcceptContext<'_, '_, S>, args: &'c ArgParser<'_>, ) -> impl IntoIterator + 'c { - let mut result = None; - let Some(items) = args.list() else { - cx.expected_list(cx.attr_span); - return result; + let items = match args { + ArgParser::List(list) => list, + // This is an edgecase added because making this a hard error would break too many crates + // Specifically `#[link = "dl"]` is accepted with a FCW + // For more information, see https://github.com/rust-lang/rust/pull/143193 + ArgParser::NameValue(nv) if nv.value_as_str().is_some_and(|v| v == sym::dl) => { + let suggestions = >::TEMPLATE + .suggestions(cx.attr_style, "link"); + let span = cx.attr_span; + cx.emit_lint(AttributeLintKind::IllFormedAttributeInput { suggestions }, span); + return None; + } + _ => { + cx.expected_list(cx.attr_span); + return None; + } }; let sess = cx.sess(); @@ -113,7 +125,7 @@ impl CombineAttributeParser for LinkParser { } }; if !cont { - return result; + return None; } } @@ -202,7 +214,7 @@ impl CombineAttributeParser for LinkParser { } let Some((name, name_span)) = name else { cx.emit_err(LinkRequiresName { span: cx.attr_span }); - return result; + return None; }; // Do this outside of the loop so that `import_name_type` can be specified before `kind`. @@ -218,15 +230,14 @@ impl CombineAttributeParser for LinkParser { cx.emit_err(RawDylibNoNul { span: name_span }); } - result = Some(LinkEntry { + Some(LinkEntry { span: cx.attr_span, kind: kind.unwrap_or(NativeLibKind::Unspecified), name, cfg, verbatim, import_name_type, - }); - result + }) } } diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index f1de56c3f75d5..bc2c687035e36 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -871,6 +871,7 @@ symbols! { div, div_assign, diverging_block_default, + dl, do_not_recommend, doc, doc_alias, diff --git a/tests/ui/attributes/link-dl.allowed.stderr b/tests/ui/attributes/link-dl.allowed.stderr new file mode 100644 index 0000000000000..e0070d970595f --- /dev/null +++ b/tests/ui/attributes/link-dl.allowed.stderr @@ -0,0 +1,10 @@ +Future incompatibility report: Future breakage diagnostic: +warning: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + diff --git a/tests/ui/attributes/link-dl.default_fcw.stderr b/tests/ui/attributes/link-dl.default_fcw.stderr index 6bff216ad03f4..249895fd17d00 100644 --- a/tests/ui/attributes/link-dl.default_fcw.stderr +++ b/tests/ui/attributes/link-dl.default_fcw.stderr @@ -1,26 +1,23 @@ -error[E0539]: malformed `link` attribute input +error: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` --> $DIR/link-dl.rs:14:1 | LL | #[link="dl"] - | ^^^^^^^^^^^^ expected this to be a list + | ^^^^^^^^^^^^ | - = note: for more information, visit -help: try changing it to one of the following valid forms of the attribute - | -LL - #[link="dl"] -LL + #[link(name = "...")] - | -LL - #[link="dl"] -LL + #[link(name = "...", import_name_type = "decorated|noprefix|undecorated")] - | -LL - #[link="dl"] -LL + #[link(name = "...", kind = "dylib|static|...")] - | -LL - #[link="dl"] -LL + #[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")] - | - = and 1 other candidate + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + = note: `#[deny(ill_formed_attribute_input)]` (part of `#[deny(future_incompatible)]`) on by default error: aborting due to 1 previous error -For more information about this error, try `rustc --explain E0539`. +Future incompatibility report: Future breakage diagnostic: +error: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + = note: `#[deny(ill_formed_attribute_input)]` (part of `#[deny(future_incompatible)]`) on by default + From 91163a9e1e03303c3605965f3e72295ec829f980 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Fri, 3 Oct 2025 10:32:11 -0400 Subject: [PATCH 15/37] Don't normalize higher-ranked assumptions if they're not used (cherry picked from commit e3f104608c0ad26e80b1ebedef2ab8a748189e52) --- .../src/traits/select/confirmation.rs | 31 ++++++----- .../higher-ranked-normalize-assumptions-2.rs | 38 ++++++++++++++ .../higher-ranked-normalize-assumptions.rs | 51 +++++++++++++++++++ 3 files changed, 107 insertions(+), 13 deletions(-) create mode 100644 tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs create mode 100644 tests/ui/async-await/higher-ranked-normalize-assumptions.rs diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 488094b15ac60..5a3b45591f248 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -423,19 +423,24 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { constituents.types, ); - // FIXME(coroutine_clone): We could uplift this into `collect_predicates_for_types` - // and do this for `Copy`/`Clone` too, but that's feature-gated so it doesn't really - // matter yet. - for assumption in constituents.assumptions { - let assumption = normalize_with_depth_to( - self, - obligation.param_env, - cause.clone(), - obligation.recursion_depth + 1, - assumption, - &mut obligations, - ); - self.infcx.register_region_assumption(assumption); + // Only normalize these goals if `-Zhigher-ranked-assumptions` is enabled, since + // we don't want to cause ourselves to do extra work if we're not even able to + // take advantage of these assumption clauses. + if self.tcx().sess.opts.unstable_opts.higher_ranked_assumptions { + // FIXME(coroutine_clone): We could uplift this into `collect_predicates_for_types` + // and do this for `Copy`/`Clone` too, but that's feature-gated so it doesn't really + // matter yet. + for assumption in constituents.assumptions { + let assumption = normalize_with_depth_to( + self, + obligation.param_env, + cause.clone(), + obligation.recursion_depth + 1, + assumption, + &mut obligations, + ); + self.infcx.register_region_assumption(assumption); + } } Ok(obligations) diff --git a/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs b/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs new file mode 100644 index 0000000000000..410d4e503b7c2 --- /dev/null +++ b/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs @@ -0,0 +1,38 @@ +//@ revisions: stock hr +//@[hr] compile-flags: -Zhigher-ranked-assumptions +//@ edition: 2024 +//@ check-pass + +// Test that we don't normalize the higher-ranked assumptions of an auto trait goal +// unless we have `-Zhigher-ranked-assumptions`, since obligations that result from +// this normalization may lead to higher-ranked lifetime errors when the flag is not +// enabled. + +// Regression test for . + +pub fn a() -> impl Future + Send { + async { + let queries = core::iter::empty().map(Thing::f); + b(queries).await; + } +} + +async fn b(queries: impl IntoIterator) { + c(queries).await; +} + +fn c<'a, I>(_queries: I) -> impl Future +where + I: IntoIterator, + I::IntoIter: 'a, +{ + async {} +} + +pub struct Thing<'a>(pub &'a ()); + +impl Thing<'_> { + fn f(_: &Self) {} +} + +fn main() {} diff --git a/tests/ui/async-await/higher-ranked-normalize-assumptions.rs b/tests/ui/async-await/higher-ranked-normalize-assumptions.rs new file mode 100644 index 0000000000000..ec9cf3a152214 --- /dev/null +++ b/tests/ui/async-await/higher-ranked-normalize-assumptions.rs @@ -0,0 +1,51 @@ +//@ revisions: stock hr +//@[hr] compile-flags: -Zhigher-ranked-assumptions +//@ edition: 2024 +//@ check-pass + +// Test that we don't normalize the higher-ranked assumptions of an auto trait goal +// unless we have `-Zhigher-ranked-assumptions`, since obligations that result from +// this normalization may lead to higher-ranked lifetime errors when the flag is not +// enabled. + +// Regression test for . + +pub trait Service { + type Response; +} + +impl Service for T +where + T: FnMut() -> R, + R: 'static, +{ + type Response = R; +} + +async fn serve(_: C) +where + C: Service, + C::Response: 'static, +{ + connect::().await; +} + +async fn connect() +where + C: Service, + C::Response: 'static, +{ +} + +fn repro() -> impl Send { + async { + let server = || do_something(); + serve(server).await; + } +} + +fn do_something() -> Box { + unimplemented!() +} + +fn main() {} From 15843ffde1e367beb3397eb9ab85802b42a1d5fe Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Mon, 6 Oct 2025 22:31:38 +0200 Subject: [PATCH 16/37] Fix target list of `link_section` Signed-off-by: Jonathan Brouwer (cherry picked from commit 4787834edaa66a596be6b78459b85e20363adb0c) --- .../rustc_attr_parsing/src/attributes/link_attrs.rs | 10 ++++++++-- tests/ui/attributes/attr-on-mac-call.stderr | 2 +- .../issue-43106-gating-of-builtin-attrs.stderr | 12 ++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs index 04eaa485f736c..bceb8423eae79 100644 --- a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs +++ b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs @@ -466,8 +466,14 @@ impl SingleAttributeParser for LinkSectionParser { const PATH: &[Symbol] = &[sym::link_section]; const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost; const ON_DUPLICATE: OnDuplicate = OnDuplicate::WarnButFutureError; - const ALLOWED_TARGETS: AllowedTargets = - AllowedTargets::AllowListWarnRest(&[Allow(Target::Static), Allow(Target::Fn)]); + const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowListWarnRest(&[ + Allow(Target::Static), + Allow(Target::Fn), + Allow(Target::Method(MethodKind::Inherent)), + Allow(Target::Method(MethodKind::Trait { body: false })), + Allow(Target::Method(MethodKind::Trait { body: true })), + Allow(Target::Method(MethodKind::TraitImpl)), + ]); const TEMPLATE: AttributeTemplate = template!( NameValueStr: "name", "https://doc.rust-lang.org/reference/abi.html#the-link_section-attribute" diff --git a/tests/ui/attributes/attr-on-mac-call.stderr b/tests/ui/attributes/attr-on-mac-call.stderr index a08d305916856..02c0ec8ea1d6c 100644 --- a/tests/ui/attributes/attr-on-mac-call.stderr +++ b/tests/ui/attributes/attr-on-mac-call.stderr @@ -82,7 +82,7 @@ LL | #[link_section = "x"] | ^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_ordinal]` attribute cannot be used on macro calls --> $DIR/attr-on-mac-call.rs:33:5 diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr index 3c835be5cffab..2e149caf12b47 100644 --- a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr +++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr @@ -1219,7 +1219,7 @@ LL | #[link_section = "1800"] | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on modules --> $DIR/issue-43106-gating-of-builtin-attrs.rs:665:17 @@ -1228,7 +1228,7 @@ LL | mod inner { #![link_section="1800"] } | ^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on structs --> $DIR/issue-43106-gating-of-builtin-attrs.rs:673:5 @@ -1237,7 +1237,7 @@ LL | #[link_section = "1800"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on type aliases --> $DIR/issue-43106-gating-of-builtin-attrs.rs:679:5 @@ -1246,7 +1246,7 @@ LL | #[link_section = "1800"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on inherent impl blocks --> $DIR/issue-43106-gating-of-builtin-attrs.rs:685:5 @@ -1255,7 +1255,7 @@ LL | #[link_section = "1800"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[must_use]` attribute cannot be used on modules --> $DIR/issue-43106-gating-of-builtin-attrs.rs:746:1 @@ -1555,7 +1555,7 @@ LL | #![link_section = "1800"] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[must_use]` attribute cannot be used on crates --> $DIR/issue-43106-gating-of-builtin-attrs.rs:84:1 From 555abc18d79334b26f1f25bec72fe7bbc3cbf203 Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Tue, 7 Oct 2025 09:40:27 +0200 Subject: [PATCH 17/37] Add regression test for `link_section` targets (cherry picked from commit 1589c6c12d0f984343c6090c817e1dfbb9cf6d10) --- .../issue-43106-gating-of-builtin-attrs.rs | 26 +++ ...issue-43106-gating-of-builtin-attrs.stderr | 159 +++++++++--------- 2 files changed, 110 insertions(+), 75 deletions(-) diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs index 546aa4052d333..92fe512aef3c2 100644 --- a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs +++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs @@ -687,6 +687,32 @@ mod link_section { //~| WARN previously accepted //~| HELP can be applied to //~| HELP remove the attribute + + #[link_section = "1800"] + //~^ WARN attribute cannot be used on + //~| WARN previously accepted + //~| HELP can be applied to + //~| HELP remove the attribute + trait Tr { + #[link_section = "1800"] + fn inside_tr_no_default(&self); + + #[link_section = "1800"] + fn inside_tr_default(&self) { } + } + + impl S { + #[link_section = "1800"] + fn inside_abc_123(&self) { } + } + + impl Tr for S { + #[link_section = "1800"] + fn inside_tr_no_default(&self) { } + } + + #[link_section = "1800"] + fn should_always_link() { } } diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr index 2e149caf12b47..8a6102d7aa05c 100644 --- a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr +++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr @@ -210,7 +210,7 @@ LL | #![reexport_test_harness_main = "2900"] | + warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:695:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:721:1 | LL | #[link(name = "x")] | ^^^^^^^^^^^^^^^^^^^ @@ -226,7 +226,7 @@ LL | | } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:771:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:797:1 | LL | #[windows_subsystem = "windows"] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -237,7 +237,7 @@ LL | #![windows_subsystem = "windows"] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:821:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:847:1 | LL | #[crate_type = "0800"] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -248,7 +248,7 @@ LL | #![crate_type = "0800"] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:845:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:871:1 | LL | #[feature(x0600)] | ^^^^^^^^^^^^^^^^^ @@ -259,7 +259,7 @@ LL | #![feature(x0600)] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:870:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:896:1 | LL | #[no_main] | ^^^^^^^^^^ @@ -270,7 +270,7 @@ LL | #![no_main] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:894:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:920:1 | LL | #[no_builtins] | ^^^^^^^^^^^^^^ @@ -377,7 +377,7 @@ LL | #![reexport_test_harness_main = "2900"] impl S { } | + warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:727:17 | LL | mod inner { #![link(name = "x")] } | ------------^^^^^^^^^^^^^^^^^^^^-- not an `extern` block @@ -385,7 +385,7 @@ LL | mod inner { #![link(name = "x")] } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:706:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:732:5 | LL | #[link(name = "x")] fn f() { } | ^^^^^^^^^^^^^^^^^^^ ---------- not an `extern` block @@ -393,7 +393,7 @@ LL | #[link(name = "x")] fn f() { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:711:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:737:5 | LL | #[link(name = "x")] struct S; | ^^^^^^^^^^^^^^^^^^^ --------- not an `extern` block @@ -401,7 +401,7 @@ LL | #[link(name = "x")] struct S; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:716:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:742:5 | LL | #[link(name = "x")] type T = S; | ^^^^^^^^^^^^^^^^^^^ ----------- not an `extern` block @@ -409,7 +409,7 @@ LL | #[link(name = "x")] type T = S; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:721:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:747:5 | LL | #[link(name = "x")] impl S { } | ^^^^^^^^^^^^^^^^^^^ ---------- not an `extern` block @@ -417,7 +417,7 @@ LL | #[link(name = "x")] impl S { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:726:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:752:5 | LL | #[link(name = "x")] extern "Rust" {} | ^^^^^^^^^^^^^^^^^^^ @@ -425,13 +425,13 @@ LL | #[link(name = "x")] extern "Rust" {} = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:775:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:801:17 | LL | mod inner { #![windows_subsystem="windows"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:5 | LL | #[windows_subsystem = "windows"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -442,7 +442,7 @@ LL | #![windows_subsystem = "windows"] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:5 | LL | #[windows_subsystem = "windows"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -453,7 +453,7 @@ LL | #![windows_subsystem = "windows"] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:5 | LL | #[windows_subsystem = "windows"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -464,7 +464,7 @@ LL | #![windows_subsystem = "windows"] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:5 | LL | #[windows_subsystem = "windows"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -475,13 +475,13 @@ LL | #![windows_subsystem = "windows"] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:825:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:851:17 | LL | mod inner { #![crate_type="0800"] } | ^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:828:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:854:5 | LL | #[crate_type = "0800"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^ @@ -492,7 +492,7 @@ LL | #![crate_type = "0800"] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:832:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:858:5 | LL | #[crate_type = "0800"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^ @@ -503,7 +503,7 @@ LL | #![crate_type = "0800"] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:836:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:862:5 | LL | #[crate_type = "0800"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^ @@ -514,7 +514,7 @@ LL | #![crate_type = "0800"] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:840:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:866:5 | LL | #[crate_type = "0800"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ @@ -525,13 +525,13 @@ LL | #![crate_type = "0800"] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:849:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:875:17 | LL | mod inner { #![feature(x0600)] } | ^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:852:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:878:5 | LL | #[feature(x0600)] fn f() { } | ^^^^^^^^^^^^^^^^^ @@ -542,7 +542,7 @@ LL | #![feature(x0600)] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:856:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:882:5 | LL | #[feature(x0600)] struct S; | ^^^^^^^^^^^^^^^^^ @@ -553,7 +553,7 @@ LL | #![feature(x0600)] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:860:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:886:5 | LL | #[feature(x0600)] type T = S; | ^^^^^^^^^^^^^^^^^ @@ -564,7 +564,7 @@ LL | #![feature(x0600)] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:864:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:890:5 | LL | #[feature(x0600)] impl S { } | ^^^^^^^^^^^^^^^^^ @@ -575,13 +575,13 @@ LL | #![feature(x0600)] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:874:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:900:17 | LL | mod inner { #![no_main] } | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:877:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:903:5 | LL | #[no_main] fn f() { } | ^^^^^^^^^^ @@ -592,7 +592,7 @@ LL | #![no_main] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:881:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:907:5 | LL | #[no_main] struct S; | ^^^^^^^^^^ @@ -603,7 +603,7 @@ LL | #![no_main] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:885:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:911:5 | LL | #[no_main] type T = S; | ^^^^^^^^^^ @@ -614,7 +614,7 @@ LL | #![no_main] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:889:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:915:5 | LL | #[no_main] impl S { } | ^^^^^^^^^^ @@ -625,13 +625,13 @@ LL | #![no_main] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:898:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:924:17 | LL | mod inner { #![no_builtins] } | ^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:901:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:927:5 | LL | #[no_builtins] fn f() { } | ^^^^^^^^^^^^^^ @@ -642,7 +642,7 @@ LL | #![no_builtins] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:905:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:931:5 | LL | #[no_builtins] struct S; | ^^^^^^^^^^^^^^ @@ -653,7 +653,7 @@ LL | #![no_builtins] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:909:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:935:5 | LL | #[no_builtins] type T = S; | ^^^^^^^^^^^^^^ @@ -664,7 +664,7 @@ LL | #![no_builtins] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:913:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:939:5 | LL | #[no_builtins] impl S { } | ^^^^^^^^^^^^^^ @@ -1257,8 +1257,17 @@ LL | #[link_section = "1800"] impl S { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = help: `#[link_section]` can be applied to functions and statics +warning: `#[link_section]` attribute cannot be used on traits + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:691:5 + | +LL | #[link_section = "1800"] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = help: `#[link_section]` can be applied to functions and statics + warning: `#[must_use]` attribute cannot be used on modules - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:746:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:772:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -1267,7 +1276,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on modules - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:751:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:777:17 | LL | mod inner { #![must_use] } | ^^^^^^^^^^^^ @@ -1276,7 +1285,7 @@ LL | mod inner { #![must_use] } = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on type aliases - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:760:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5 | LL | #[must_use] type T = S; | ^^^^^^^^^^^ @@ -1285,7 +1294,7 @@ LL | #[must_use] type T = S; = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on inherent impl blocks - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:765:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:791:5 | LL | #[must_use] impl S { } | ^^^^^^^^^^^ @@ -1294,13 +1303,13 @@ LL | #[must_use] impl S { } = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:797:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:823:1 | LL | #[crate_name = "0900"] | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:799:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:825:1 | LL | / mod crate_name { LL | | @@ -1310,67 +1319,67 @@ LL | | } | |_^ warning: the `#![crate_name]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:801:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:827:17 | LL | mod inner { #![crate_name="0900"] } | ^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:830:5 | LL | #[crate_name = "0900"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:830:28 | LL | #[crate_name = "0900"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:834:5 | LL | #[crate_name = "0900"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:834:28 | LL | #[crate_name = "0900"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:838:5 | LL | #[crate_name = "0900"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:838:28 | LL | #[crate_name = "0900"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:842:5 | LL | #[crate_name = "0900"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:842:28 | LL | #[crate_name = "0900"] impl S { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:918:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:944:1 | LL | #[recursion_limit="0200"] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:920:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:946:1 | LL | / mod recursion_limit { LL | | @@ -1380,67 +1389,67 @@ LL | | } | |_^ warning: the `#![recursion_limit]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:922:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:948:17 | LL | mod inner { #![recursion_limit="0200"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:925:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:951:5 | LL | #[recursion_limit="0200"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:925:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:951:31 | LL | #[recursion_limit="0200"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:929:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:955:5 | LL | #[recursion_limit="0200"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:929:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:955:31 | LL | #[recursion_limit="0200"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:933:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:959:5 | LL | #[recursion_limit="0200"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:933:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:959:31 | LL | #[recursion_limit="0200"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:937:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:963:5 | LL | #[recursion_limit="0200"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:937:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:963:31 | LL | #[recursion_limit="0200"] impl S { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:942:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:968:1 | LL | #[type_length_limit="0100"] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:944:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:970:1 | LL | / mod type_length_limit { LL | | @@ -1450,55 +1459,55 @@ LL | | } | |_^ warning: the `#![type_length_limit]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:946:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:972:17 | LL | mod inner { #![type_length_limit="0100"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:949:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:975:5 | LL | #[type_length_limit="0100"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:949:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:975:33 | LL | #[type_length_limit="0100"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:953:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:979:5 | LL | #[type_length_limit="0100"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:953:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:979:33 | LL | #[type_length_limit="0100"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:957:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:983:5 | LL | #[type_length_limit="0100"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:957:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:983:33 | LL | #[type_length_limit="0100"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:961:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:987:5 | LL | #[type_length_limit="0100"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:961:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:987:33 | LL | #[type_length_limit="0100"] impl S { } | ^^^^^^^^^^ @@ -1566,5 +1575,5 @@ LL | #![must_use] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = help: `#[must_use]` can be applied to functions, data types, unions, and traits -warning: 173 warnings emitted +warning: 174 warnings emitted From 3222bef156f3ceccea73c15ab44664ac10b20751 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Mon, 6 Oct 2025 13:34:42 -0700 Subject: [PATCH 18/37] bootstrap: add `Builder::rustc_cmd` that includes the lib path When building with `rust.rpath = false`, every `rustc` invocation needs to include the library path as well. I particularly ran into this in `generate_target_spec_json_schema` when testing 1.91-beta in Fedora, where we do disable rpath for our system builds. The new helper function will hopefully encourage the right thing going forward. (cherry picked from commit 03cdcb5cd5383857b339af226471f96c46e26b47) --- src/bootstrap/src/core/build_steps/compile.rs | 2 +- src/bootstrap/src/core/build_steps/dist.rs | 2 +- src/bootstrap/src/core/build_steps/synthetic_targets.rs | 3 +-- src/bootstrap/src/core/builder/cargo.rs | 6 ++---- src/bootstrap/src/core/builder/mod.rs | 8 ++++++++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs index 1458b0beefa85..82fd1119c7fea 100644 --- a/src/bootstrap/src/core/build_steps/compile.rs +++ b/src/bootstrap/src/core/build_steps/compile.rs @@ -519,7 +519,7 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, cargo: &mut Car // Query rustc for the deployment target, and the associated env var. // The env var is one of the standard `*_DEPLOYMENT_TARGET` vars, i.e. // `MACOSX_DEPLOYMENT_TARGET`, `IPHONEOS_DEPLOYMENT_TARGET`, etc. - let mut cmd = command(builder.rustc(cargo.compiler())); + let mut cmd = builder.rustc_cmd(cargo.compiler()); cmd.arg("--target").arg(target.rustc_target_arg()); cmd.arg("--print=deployment-target"); let output = cmd.run_capture_stdout(builder).stdout(); diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 99a1062109adc..2453d442b6d02 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -625,7 +625,7 @@ fn generate_target_spec_json_schema(builder: &Builder<'_>, sysroot: &Path) { // We do this by using the stage 1 compiler, which is always compiled for the host, // even in a cross build. let stage1_host = builder.compiler(1, builder.host_target); - let mut rustc = command(builder.rustc(stage1_host)).fail_fast(); + let mut rustc = builder.rustc_cmd(stage1_host).fail_fast(); rustc .env("RUSTC_BOOTSTRAP", "1") .args(["--print=target-spec-json-schema", "-Zunstable-options"]); diff --git a/src/bootstrap/src/core/build_steps/synthetic_targets.rs b/src/bootstrap/src/core/build_steps/synthetic_targets.rs index 21733c5d9e3f7..2cc691832b5f0 100644 --- a/src/bootstrap/src/core/build_steps/synthetic_targets.rs +++ b/src/bootstrap/src/core/build_steps/synthetic_targets.rs @@ -10,7 +10,6 @@ use crate::Compiler; use crate::core::builder::{Builder, ShouldRun, Step}; use crate::core::config::TargetSelection; -use crate::utils::exec::command; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) struct MirOptPanicAbortSyntheticTarget { @@ -55,7 +54,7 @@ fn create_synthetic_target( return TargetSelection::create_synthetic(&name, path.to_str().unwrap()); } - let mut cmd = command(builder.rustc(compiler)); + let mut cmd = builder.rustc_cmd(compiler); cmd.arg("--target").arg(base.rustc_target_arg()); cmd.args(["-Zunstable-options", "--print", "target-spec-json"]); diff --git a/src/bootstrap/src/core/builder/cargo.rs b/src/bootstrap/src/core/builder/cargo.rs index 924bb4adb42d0..b7d2b72363632 100644 --- a/src/bootstrap/src/core/builder/cargo.rs +++ b/src/bootstrap/src/core/builder/cargo.rs @@ -722,10 +722,8 @@ impl Builder<'_> { // Build proc macros both for the host and the target unless proc-macros are not // supported by the target. if target != compiler.host && cmd_kind != Kind::Check { - let mut rustc_cmd = command(self.rustc(compiler)); - self.add_rustc_lib_path(compiler, &mut rustc_cmd); - - let error = rustc_cmd + let error = self + .rustc_cmd(compiler) .arg("--target") .arg(target.rustc_target_arg()) .arg("--print=file-names") diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs index 75c8ee365284e..b212373839741 100644 --- a/src/bootstrap/src/core/builder/mod.rs +++ b/src/bootstrap/src/core/builder/mod.rs @@ -1591,6 +1591,14 @@ Alternatively, you can set `build.local-rebuild=true` and use a stage0 compiler } } + /// Gets a command to run the compiler specified, including the dynamic library + /// path in case the executable has not been build with `rpath` enabled. + pub fn rustc_cmd(&self, compiler: Compiler) -> BootstrapCommand { + let mut cmd = command(self.rustc(compiler)); + self.add_rustc_lib_path(compiler, &mut cmd); + cmd + } + /// Gets the paths to all of the compiler's codegen backends. fn codegen_backends(&self, compiler: Compiler) -> impl Iterator { fs::read_dir(self.sysroot_codegen_backends(compiler)) From 73481bf395300960ea5210d554df16f9552d6130 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Fri, 10 Oct 2025 15:51:34 -0400 Subject: [PATCH 19/37] [beta-1.91] Update cargo submodule --- src/tools/cargo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/cargo b/src/tools/cargo index 785a383cf7154..ea2d97820c161 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 785a383cf715417fcd68c4a98a4523c2d082bb0f +Subproject commit ea2d97820c16195b0ca3fadb4319fe512c199a43 From 3f2437c4a4fddbc0f4494539e6d8d04f153a1397 Mon Sep 17 00:00:00 2001 From: dianqk Date: Wed, 24 Sep 2025 07:34:22 +0800 Subject: [PATCH 20/37] Update LLVM to 21.1.2 (cherry picked from commit 95ddfa102af7f841c36ab8b207eb42571716b1cd) --- src/llvm-project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm-project b/src/llvm-project index 333793696b0a0..8c30b9c5098bd 160000 --- a/src/llvm-project +++ b/src/llvm-project @@ -1 +1 @@ -Subproject commit 333793696b0a08002acac6af983adc7a5233fc56 +Subproject commit 8c30b9c5098bdff1d3d9a2d460ee091cd1171e60 From 5bef4363ab0a54702e77cfb9fde5f0fc3687a49f Mon Sep 17 00:00:00 2001 From: dianqk Date: Fri, 10 Oct 2025 20:29:59 +0800 Subject: [PATCH 21/37] Remove the temporary directory when a check ends (cherry picked from commit a3482d97c6442d00097b47c846a90d9688c56e2c) --- src/bootstrap/src/core/build_steps/test.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 723ba80eaf827..ce257edc5cc19 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -3263,6 +3263,8 @@ fn distcheck_plain_source_tarball(builder: &Builder<'_>, plain_src_dir: &Path) { .env("GITHUB_ACTIONS", "0") .current_dir(plain_src_dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(plain_src_dir); } /// Check that rust-src has all of libstd's dependencies @@ -3288,6 +3290,8 @@ fn distcheck_rust_src(builder: &Builder<'_>, src_dir: &Path) { .arg(&toml) .current_dir(src_dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(src_dir); } /// Check that rustc-dev's compiler crate source code can be loaded with `cargo metadata` @@ -3312,6 +3316,8 @@ fn distcheck_rustc_dev(builder: &Builder<'_>, dir: &Path) { .env("RUSTC", &builder.initial_rustc) .current_dir(dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(dir); } #[derive(Debug, Clone, PartialEq, Eq, Hash)] From 6c2246d9b3e726498adb705622e09b45f51a6f06 Mon Sep 17 00:00:00 2001 From: dianne Date: Sat, 20 Sep 2025 04:25:26 -0700 Subject: [PATCH 22/37] warn on future errors from temporary lifetimes shortening in Rust 1.92 --- .../rustc_borrowck/src/diagnostics/mod.rs | 29 +++ compiler/rustc_borrowck/src/lib.rs | 43 ++-- .../rustc_hir_analysis/src/check/region.rs | 168 ++++++++++++---- .../rustc_hir_typeck/src/rvalue_scopes.rs | 9 +- compiler/rustc_lint_defs/src/builtin.rs | 52 +++++ compiler/rustc_middle/src/middle/region.rs | 25 ++- compiler/rustc_middle/src/mir/syntax.rs | 4 + compiler/rustc_middle/src/thir.rs | 8 +- compiler/rustc_middle/src/ty/rvalue_scopes.rs | 27 ++- .../src/builder/expr/as_temp.rs | 9 +- compiler/rustc_mir_build/src/builder/scope.rs | 40 ++-- .../src/lint_tail_expr_drop_order.rs | 10 +- ...cro-extended-temporary-scopes.e2021.stderr | 92 +++++++++ ...cro-extended-temporary-scopes.e2024.stderr | 188 ++++++++++++++++++ .../macro-extended-temporary-scopes.rs | 45 +++-- .../non-extended.rs | 2 +- .../non-extended.stderr | 10 +- .../user-defined-macros.rs | 13 +- .../user-defined-macros.stderr | 60 ++++++ 19 files changed, 713 insertions(+), 121 deletions(-) create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr diff --git a/compiler/rustc_borrowck/src/diagnostics/mod.rs b/compiler/rustc_borrowck/src/diagnostics/mod.rs index 5642cdf87fded..e85945d633b66 100644 --- a/compiler/rustc_borrowck/src/diagnostics/mod.rs +++ b/compiler/rustc_borrowck/src/diagnostics/mod.rs @@ -21,6 +21,7 @@ use rustc_middle::ty::print::Print; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::{bug, span_bug}; use rustc_mir_dataflow::move_paths::{InitLocation, LookupResult, MoveOutIndex}; +use rustc_session::lint::builtin::MACRO_EXTENDED_TEMPORARY_SCOPES; use rustc_span::def_id::LocalDefId; use rustc_span::source_map::Spanned; use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span, Symbol, sym}; @@ -1580,4 +1581,32 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> { pub(crate) fn local_excluded_from_unused_mut_lint(&self, index: Local) -> bool { self.local_name(index).is_none_or(|name| name.as_str().starts_with('_')) } + + /// Report a temporary whose scope will shorten in Rust 1.92 due to #145838. + pub(crate) fn lint_macro_extended_temporary_scope( + &self, + future_drop: Location, + borrow: &BorrowData<'tcx>, + ) { + let tcx = self.infcx.tcx; + let temp_decl = &self.body.local_decls[borrow.borrowed_place.local]; + let temp_span = temp_decl.source_info.span; + let lint_root = self.body.source_scopes[temp_decl.source_info.scope] + .local_data + .as_ref() + .unwrap_crate_local() + .lint_root; + + let mut labels = MultiSpan::from_span(temp_span); + labels.push_span_label(temp_span, "this expression creates a temporary value..."); + labels.push_span_label( + self.body.source_info(future_drop).span, + "...which will be dropped at the end of this block in Rust 1.92", + ); + + tcx.node_span_lint(MACRO_EXTENDED_TEMPORARY_SCOPES, lint_root, labels, |diag| { + diag.primary_message("temporary lifetime will be shortened in Rust 1.92"); + diag.note("consider using a `let` binding to create a longer lived value"); + }); + } } diff --git a/compiler/rustc_borrowck/src/lib.rs b/compiler/rustc_borrowck/src/lib.rs index 5d2dda8b0e7cc..c00538755756c 100644 --- a/compiler/rustc_borrowck/src/lib.rs +++ b/compiler/rustc_borrowck/src/lib.rs @@ -843,8 +843,8 @@ impl<'a, 'tcx> ResultsVisitor<'tcx, Borrowck<'a, 'tcx>> for MirBorrowckCtxt<'a, | StatementKind::ConstEvalCounter | StatementKind::StorageLive(..) => {} // This does not affect borrowck - StatementKind::BackwardIncompatibleDropHint { place, reason: BackwardIncompatibleDropReason::Edition2024 } => { - self.check_backward_incompatible_drop(location, **place, state); + StatementKind::BackwardIncompatibleDropHint { place, reason } => { + self.check_backward_incompatible_drop(location, **place, state, *reason); } StatementKind::StorageDead(local) => { self.access_place( @@ -1386,6 +1386,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> { location: Location, place: Place<'tcx>, state: &BorrowckDomain, + reason: BackwardIncompatibleDropReason, ) { let tcx = self.infcx.tcx; // If this type does not need `Drop`, then treat it like a `StorageDead`. @@ -1412,21 +1413,29 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> { if matches!(borrow.kind, BorrowKind::Fake(_)) { return ControlFlow::Continue(()); } - let borrowed = this.retrieve_borrow_spans(borrow).var_or_use_path_span(); - let explain = this.explain_why_borrow_contains_point( - location, - borrow, - Some((WriteKind::StorageDeadOrDrop, place)), - ); - this.infcx.tcx.node_span_lint( - TAIL_EXPR_DROP_ORDER, - CRATE_HIR_ID, - borrowed, - |diag| { - session_diagnostics::TailExprDropOrder { borrowed }.decorate_lint(diag); - explain.add_explanation_to_diagnostic(&this, diag, "", None, None); - }, - ); + match reason { + BackwardIncompatibleDropReason::Edition2024 => { + let borrowed = this.retrieve_borrow_spans(borrow).var_or_use_path_span(); + let explain = this.explain_why_borrow_contains_point( + location, + borrow, + Some((WriteKind::StorageDeadOrDrop, place)), + ); + this.infcx.tcx.node_span_lint( + TAIL_EXPR_DROP_ORDER, + CRATE_HIR_ID, + borrowed, + |diag| { + session_diagnostics::TailExprDropOrder { borrowed } + .decorate_lint(diag); + explain.add_explanation_to_diagnostic(&this, diag, "", None, None); + }, + ); + } + BackwardIncompatibleDropReason::MacroExtendedScope => { + this.lint_macro_extended_temporary_scope(location, borrow); + } + } // We may stop at the first case ControlFlow::Break(()) }, diff --git a/compiler/rustc_hir_analysis/src/check/region.rs b/compiler/rustc_hir_analysis/src/check/region.rs index 2ba7ed46f92c4..294386c3531b9 100644 --- a/compiler/rustc_hir_analysis/src/check/region.rs +++ b/compiler/rustc_hir_analysis/src/check/region.rs @@ -38,7 +38,20 @@ struct ScopeResolutionVisitor<'tcx> { cx: Context, - extended_super_lets: FxHashMap>, + extended_super_lets: FxHashMap, +} + +#[derive(Copy, Clone)] +struct ExtendedTemporaryScope { + /// The scope of extended temporaries. + scope: Option, + /// Whether this lifetime originated from a regular `let` or a `super let` initializer. In the + /// latter case, this scope may shorten after #145838 if applied to temporaries within block + /// tail expressions. + let_kind: LetKind, + /// Whether this scope will shorten after #145838. If this is applied to a temporary value, + /// we'll emit the `macro_extended_temporary_scopes` lint. + compat: ScopeCompatibility, } /// Records the lifetime of a local variable as `cx.var_parent` @@ -467,37 +480,55 @@ fn resolve_local<'tcx>( // A, but the inner rvalues `a()` and `b()` have an extended lifetime // due to rule C. - if let_kind == LetKind::Super { - if let Some(scope) = visitor.extended_super_lets.remove(&pat.unwrap().hir_id.local_id) { - // This expression was lifetime-extended by a parent let binding. E.g. - // - // let a = { - // super let b = temp(); - // &b - // }; - // - // (Which needs to behave exactly as: let a = &temp();) - // - // Processing of `let a` will have already decided to extend the lifetime of this - // `super let` to its own var_scope. We use that scope. - visitor.cx.var_parent = scope; - } else { - // This `super let` is not subject to lifetime extension from a parent let binding. E.g. - // - // identity({ super let x = temp(); &x }).method(); - // - // (Which needs to behave exactly as: identity(&temp()).method();) - // - // Iterate up to the enclosing destruction scope to find the same scope that will also - // be used for the result of the block itself. - if let Some(inner_scope) = visitor.cx.var_parent { - (visitor.cx.var_parent, _) = visitor.scope_tree.default_temporary_scope(inner_scope) + let (source_let_kind, compat) = match let_kind { + // Normal `let` initializers are unaffected by #145838. + LetKind::Regular => { + (LetKind::Regular, ScopeCompatibility::FutureCompatible) + } + LetKind::Super => { + if let Some(scope) = visitor.extended_super_lets.remove(&pat.unwrap().hir_id.local_id) { + // This expression was lifetime-extended by a parent let binding. E.g. + // + // let a = { + // super let b = temp(); + // &b + // }; + // + // (Which needs to behave exactly as: let a = &temp();) + // + // Processing of `let a` will have already decided to extend the lifetime of this + // `super let` to its own var_scope. We use that scope. + visitor.cx.var_parent = scope.scope; + // Inherit compatibility from the original `let` statement. If the original `let` + // was regular, lifetime extension should apply as normal. If the original `let` was + // `super`, blocks within the initializer will be affected by #145838. + (scope.let_kind, scope.compat) + } else { + // This `super let` is not subject to lifetime extension from a parent let binding. E.g. + // + // identity({ super let x = temp(); &x }).method(); + // + // (Which needs to behave exactly as: identity(&temp()).method();) + // + // Iterate up to the enclosing destruction scope to find the same scope that will also + // be used for the result of the block itself. + if let Some(inner_scope) = visitor.cx.var_parent { + (visitor.cx.var_parent, _) = + visitor.scope_tree.default_temporary_scope(inner_scope) + } + // Blocks within the initializer will be affected by #145838. + (LetKind::Super, ScopeCompatibility::FutureCompatible) } } - } + }; if let Some(expr) = init { - record_rvalue_scope_if_borrow_expr(visitor, expr, visitor.cx.var_parent); + let scope = ExtendedTemporaryScope { + scope: visitor.cx.var_parent, + let_kind: source_let_kind, + compat, + }; + record_rvalue_scope_if_borrow_expr(visitor, expr, scope); if let Some(pat) = pat { if is_binding_pat(pat) { @@ -506,6 +537,7 @@ fn resolve_local<'tcx>( RvalueCandidate { target: expr.hir_id.local_id, lifetime: visitor.cx.var_parent, + compat: ScopeCompatibility::FutureCompatible, }, ); } @@ -607,50 +639,106 @@ fn resolve_local<'tcx>( fn record_rvalue_scope_if_borrow_expr<'tcx>( visitor: &mut ScopeResolutionVisitor<'tcx>, expr: &hir::Expr<'_>, - blk_id: Option, + scope: ExtendedTemporaryScope, ) { match expr.kind { hir::ExprKind::AddrOf(_, _, subexpr) => { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope); visitor.scope_tree.record_rvalue_candidate( subexpr.hir_id, - RvalueCandidate { target: subexpr.hir_id.local_id, lifetime: blk_id }, + RvalueCandidate { + target: subexpr.hir_id.local_id, + lifetime: scope.scope, + compat: scope.compat, + }, ); } hir::ExprKind::Struct(_, fields, _) => { for field in fields { - record_rvalue_scope_if_borrow_expr(visitor, field.expr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, field.expr, scope); } } hir::ExprKind::Array(subexprs) | hir::ExprKind::Tup(subexprs) => { for subexpr in subexprs { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope); } } hir::ExprKind::Cast(subexpr, _) => { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id) + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope) } hir::ExprKind::Block(block, _) => { if let Some(subexpr) = block.expr { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + let tail_expr_scope = + if scope.let_kind == LetKind::Super && block.span.at_least_rust_2024() { + // The tail expression will no longer be extending after #145838. + // Since tail expressions are temporary scopes in Rust 2024, lint on + // temporaries that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: subexpr.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, subexpr, tail_expr_scope); } for stmt in block.stmts { if let hir::StmtKind::Let(local) = stmt.kind && let Some(_) = local.super_ { - visitor.extended_super_lets.insert(local.pat.hir_id.local_id, blk_id); + visitor.extended_super_lets.insert(local.pat.hir_id.local_id, scope); } } } hir::ExprKind::If(_, then_block, else_block) => { - record_rvalue_scope_if_borrow_expr(visitor, then_block, blk_id); + let then_scope = if scope.let_kind == LetKind::Super { + // The then and else blocks will no longer be extending after #145838. + // Since `if` blocks are temporary scopes in all editions, lint on temporaries + // that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: then_block.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, then_block, then_scope); if let Some(else_block) = else_block { - record_rvalue_scope_if_borrow_expr(visitor, else_block, blk_id); + let else_scope = if scope.let_kind == LetKind::Super { + // The then and else blocks will no longer be extending after #145838. + // Since `if` blocks are temporary scopes in all editions, lint on temporaries + // that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: else_block.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, else_block, else_scope); } } hir::ExprKind::Match(_, arms, _) => { for arm in arms { - record_rvalue_scope_if_borrow_expr(visitor, arm.body, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, arm.body, scope); } } hir::ExprKind::Call(func, args) => { @@ -663,7 +751,7 @@ fn resolve_local<'tcx>( && let Res::SelfCtor(_) | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) = path.res { for arg in args { - record_rvalue_scope_if_borrow_expr(visitor, arg, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, arg, scope); } } } diff --git a/compiler/rustc_hir_typeck/src/rvalue_scopes.rs b/compiler/rustc_hir_typeck/src/rvalue_scopes.rs index 973dc7141e64d..9f5055f967f0e 100644 --- a/compiler/rustc_hir_typeck/src/rvalue_scopes.rs +++ b/compiler/rustc_hir_typeck/src/rvalue_scopes.rs @@ -2,7 +2,9 @@ use hir::Node; use hir::def_id::DefId; use rustc_hir as hir; use rustc_middle::bug; -use rustc_middle::middle::region::{RvalueCandidate, Scope, ScopeTree}; +use rustc_middle::middle::region::{ + ScopeCompatibility, RvalueCandidate, Scope, ScopeTree, +}; use rustc_middle::ty::RvalueScopes; use tracing::debug; @@ -29,6 +31,7 @@ fn record_rvalue_scope_rec( rvalue_scopes: &mut RvalueScopes, mut expr: &hir::Expr<'_>, lifetime: Option, + compat: ScopeCompatibility, ) { loop { // Note: give all the expressions matching `ET` with the @@ -37,7 +40,7 @@ fn record_rvalue_scope_rec( // into a temporary, we request the temporary scope of the // outer expression. - rvalue_scopes.record_rvalue_scope(expr.hir_id.local_id, lifetime); + rvalue_scopes.record_rvalue_scope(expr.hir_id.local_id, lifetime, compat); match expr.kind { hir::ExprKind::AddrOf(_, _, subexpr) @@ -58,7 +61,7 @@ fn record_rvalue_scope( candidate: &RvalueCandidate, ) { debug!("resolve_rvalue_scope(expr={expr:?}, candidate={candidate:?})"); - record_rvalue_scope_rec(rvalue_scopes, expr, candidate.lifetime) + record_rvalue_scope_rec(rvalue_scopes, expr, candidate.lifetime, candidate.compat) // FIXME(@dingxiangfei2009): handle the candidates in the function call arguments } diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index b79075ac09b9c..1036d85bacfbb 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -62,6 +62,7 @@ declare_lint_pass! { LONG_RUNNING_CONST_EVAL, LOSSY_PROVENANCE_CASTS, MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS, + MACRO_EXTENDED_TEMPORARY_SCOPES, MACRO_USE_EXTERN_CRATE, MALFORMED_DIAGNOSTIC_ATTRIBUTES, MALFORMED_DIAGNOSTIC_FORMAT_LITERALS, @@ -5195,3 +5196,54 @@ declare_lint! { Warn, r#"detects when a function annotated with `#[inline(always)]` and `#[target_feature(enable = "..")]` is inlined into a caller without the required target feature"#, } + +declare_lint! { + /// The `macro_extended_temporary_scopes` lint detects borrowed temporary + /// values in arguments to `pin!` and formatting macros which have longer + /// lifetimes than intended due to a bug in the compiler. For more + /// information on temporary scopes and lifetime extension, see the + /// [Rust Reference]. + /// + /// [Rust Reference]: https://doc.rust-lang.org/reference/destructors.html#temporary-scopes + /// + /// ### Example + /// + /// ```rust + /// # fn cond() -> bool { true } + /// # fn build_string() -> String { String::new() } + /// fn main() { + /// println!("{:?}{}", (), if cond() { &build_string() } else { "" }); + /// } + /// ``` + /// + /// {{produces}} + /// + /// ### Recommended fix + /// + /// To extend the lifetimes of temporaries borrowed in macro arguments, + /// create separate definitions for them with `let` statements. + /// + /// ```rust + /// # fn cond() -> bool { true } + /// # fn build_string() -> String { String::new() } + /// fn main() { + /// let string = if cond() { &build_string() } else { "" }; + /// println!("{:?}{}", (), string); + /// } + /// ``` + /// + /// ### Explanation + /// + /// Due to a compiler bug, `pin!` and formatting macros were able to extend + /// the lifetimes of temporaries borrowed in their arguments past their + /// usual scopes. The bug is fixed in future Rust versions, so we issue this + /// future-incompatibility warning for code that may stop compiling or may + /// change in behavior thereafter. + pub MACRO_EXTENDED_TEMPORARY_SCOPES, + Warn, + "detects when a lifetime-extended temporary borrowed in a macro argument has a future-incompatible scope.", + @future_incompatible = FutureIncompatibleInfo { + reason: FutureIncompatibilityReason::FutureReleaseError, + reference: "", + }; +} diff --git a/compiler/rustc_middle/src/middle/region.rs b/compiler/rustc_middle/src/middle/region.rs index 5367e5edd496a..bd8f06c30ecd4 100644 --- a/compiler/rustc_middle/src/middle/region.rs +++ b/compiler/rustc_middle/src/middle/region.rs @@ -16,6 +16,7 @@ use rustc_macros::{HashStable, TyDecodable, TyEncodable}; use rustc_span::{DUMMY_SP, Span}; use tracing::debug; +use crate::mir::BackwardIncompatibleDropReason; use crate::ty::TyCtxt; /// Represents a statically-describable scope that can be used to @@ -242,6 +243,19 @@ pub struct ScopeTree { pub struct RvalueCandidate { pub target: hir::ItemLocalId, pub lifetime: Option, + pub compat: ScopeCompatibility, +} + +/// Marks extended temporary scopes that will be shortened by #145838 and thus need to be linted on +/// by the `macro_extended_temporary_scopes` future-incompatibility warning. +#[derive(TyEncodable, TyDecodable, Clone, Copy, Debug, Eq, PartialEq, HashStable)] +pub enum ScopeCompatibility { + /// Marks a scope that was extended past a temporary destruction scope by a non-extending + /// `super let` initializer. + FutureIncompatible { shortens_to: Scope }, + /// Marks an extended temporary scope that was not extended by a non-extending `super let` + /// initializer. + FutureCompatible, } impl ScopeTree { @@ -303,7 +317,10 @@ impl ScopeTree { /// Returns the scope of non-lifetime-extended temporaries within a given scope, as well as /// whether we've recorded a potential backwards-incompatible change to lint on. /// Returns `None` when no enclosing temporary scope is found, such as for static items. - pub fn default_temporary_scope(&self, inner: Scope) -> (Option, Option) { + pub fn default_temporary_scope( + &self, + inner: Scope, + ) -> (Option, Option<(Scope, BackwardIncompatibleDropReason)>) { let mut id = inner; let mut backwards_incompatible = None; @@ -327,8 +344,10 @@ impl ScopeTree { // This is for now only working for cases where a temporary lifetime is // *shortened*. if backwards_incompatible.is_none() { - backwards_incompatible = - self.backwards_incompatible_scope.get(&p.local_id).copied(); + backwards_incompatible = self + .backwards_incompatible_scope + .get(&p.local_id) + .map(|&s| (s, BackwardIncompatibleDropReason::Edition2024)); } id = p } diff --git a/compiler/rustc_middle/src/mir/syntax.rs b/compiler/rustc_middle/src/mir/syntax.rs index 3b8def67f92d7..09a9102086597 100644 --- a/compiler/rustc_middle/src/mir/syntax.rs +++ b/compiler/rustc_middle/src/mir/syntax.rs @@ -989,17 +989,21 @@ pub enum TerminatorKind<'tcx> { #[derive( Clone, + Copy, Debug, TyEncodable, TyDecodable, Hash, HashStable, PartialEq, + Eq, TypeFoldable, TypeVisitable )] pub enum BackwardIncompatibleDropReason { Edition2024, + /// Used by the `macro_extended_temporary_scopes` lint. + MacroExtendedScope, } #[derive(Debug, Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq)] diff --git a/compiler/rustc_middle/src/thir.rs b/compiler/rustc_middle/src/thir.rs index f1d19800a7891..9fd5ee42fba7e 100644 --- a/compiler/rustc_middle/src/thir.rs +++ b/compiler/rustc_middle/src/thir.rs @@ -27,7 +27,9 @@ use tracing::instrument; use crate::middle::region; use crate::mir::interpret::AllocId; -use crate::mir::{self, AssignOp, BinOp, BorrowKind, FakeReadCause, UnOp}; +use crate::mir::{ + self, AssignOp, BackwardIncompatibleDropReason, BinOp, BorrowKind, FakeReadCause, UnOp, +}; use crate::thir::visit::for_each_immediate_subpat; use crate::ty::adjustment::PointerCoercion; use crate::ty::layout::IntegerExt; @@ -272,7 +274,7 @@ pub struct TempLifetime { pub temp_lifetime: Option, /// If `Some(lt)`, indicates that the lifetime of this temporary will change to `lt` in a future edition. /// If `None`, then no changes are expected, or lints are disabled. - pub backwards_incompatible: Option, + pub backwards_incompatible: Option<(region::Scope, BackwardIncompatibleDropReason)>, } #[derive(Clone, Debug, HashStable)] @@ -1125,7 +1127,7 @@ mod size_asserts { use super::*; // tidy-alphabetical-start static_assert_size!(Block, 48); - static_assert_size!(Expr<'_>, 72); + static_assert_size!(Expr<'_>, 80); static_assert_size!(ExprKind<'_>, 40); static_assert_size!(Pat<'_>, 64); static_assert_size!(PatKind<'_>, 48); diff --git a/compiler/rustc_middle/src/ty/rvalue_scopes.rs b/compiler/rustc_middle/src/ty/rvalue_scopes.rs index 8b92e48ed1a07..eef8b6bd26ed2 100644 --- a/compiler/rustc_middle/src/ty/rvalue_scopes.rs +++ b/compiler/rustc_middle/src/ty/rvalue_scopes.rs @@ -3,13 +3,14 @@ use rustc_hir::ItemLocalMap; use rustc_macros::{HashStable, TyDecodable, TyEncodable}; use tracing::debug; -use crate::middle::region::{Scope, ScopeData, ScopeTree}; +use crate::middle::region::{ScopeCompatibility, Scope, ScopeData, ScopeTree}; +use crate::mir::BackwardIncompatibleDropReason; /// `RvalueScopes` is a mapping from sub-expressions to _extended_ lifetime as determined by /// rules laid out in `rustc_hir_analysis::check::rvalue_scopes`. #[derive(TyEncodable, TyDecodable, Clone, Debug, Default, Eq, PartialEq, HashStable)] pub struct RvalueScopes { - map: ItemLocalMap>, + map: ItemLocalMap<(Option, Option<(Scope, BackwardIncompatibleDropReason)>)>, } impl RvalueScopes { @@ -24,11 +25,11 @@ impl RvalueScopes { &self, region_scope_tree: &ScopeTree, expr_id: hir::ItemLocalId, - ) -> (Option, Option) { + ) -> (Option, Option<(Scope, BackwardIncompatibleDropReason)>) { // Check for a designated rvalue scope. - if let Some(&s) = self.map.get(&expr_id) { + if let Some(&(s, future_scope)) = self.map.get(&expr_id) { debug!("temporary_scope({expr_id:?}) = {s:?} [custom]"); - return (s, None); + return (s, future_scope); } // Otherwise, locate the innermost terminating scope @@ -40,11 +41,23 @@ impl RvalueScopes { } /// Make an association between a sub-expression and an extended lifetime - pub fn record_rvalue_scope(&mut self, var: hir::ItemLocalId, lifetime: Option) { + pub fn record_rvalue_scope( + &mut self, + var: hir::ItemLocalId, + lifetime: Option, + compat: ScopeCompatibility, + ) { debug!("record_rvalue_scope(var={var:?}, lifetime={lifetime:?})"); if let Some(lifetime) = lifetime { assert!(var != lifetime.local_id); } - self.map.insert(var, lifetime); + let future_scope = + if let ScopeCompatibility::FutureIncompatible { shortens_to } = compat + { + Some((shortens_to, BackwardIncompatibleDropReason::MacroExtendedScope)) + } else { + None + }; + self.map.insert(var, (lifetime, future_scope)); } } diff --git a/compiler/rustc_mir_build/src/builder/expr/as_temp.rs b/compiler/rustc_mir_build/src/builder/expr/as_temp.rs index b0ce3527d8b3d..b9f09fadc5a74 100644 --- a/compiler/rustc_mir_build/src/builder/expr/as_temp.rs +++ b/compiler/rustc_mir_build/src/builder/expr/as_temp.rs @@ -129,8 +129,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.schedule_drop(expr_span, temp_lifetime, temp, DropKind::Value); } - if let Some(backwards_incompatible) = temp_lifetime.backwards_incompatible { - this.schedule_backwards_incompatible_drop(expr_span, backwards_incompatible, temp); + if let Some((backwards_incompatible, reason)) = temp_lifetime.backwards_incompatible { + this.schedule_backwards_incompatible_drop( + expr_span, + backwards_incompatible, + temp, + reason, + ); } block.and(temp) diff --git a/compiler/rustc_mir_build/src/builder/scope.rs b/compiler/rustc_mir_build/src/builder/scope.rs index 9665987362202..7fbc005967b8a 100644 --- a/compiler/rustc_mir_build/src/builder/scope.rs +++ b/compiler/rustc_mir_build/src/builder/scope.rs @@ -85,7 +85,7 @@ use std::mem; use interpret::ErrorHandled; use rustc_data_structures::fx::FxHashMap; -use rustc_hir::HirId; +use rustc_hir::{self as hir, HirId}; use rustc_index::{IndexSlice, IndexVec}; use rustc_middle::middle::region; use rustc_middle::mir::{self, *}; @@ -166,7 +166,7 @@ struct DropData { pub(crate) enum DropKind { Value, Storage, - ForLint, + ForLint(BackwardIncompatibleDropReason), } #[derive(Debug)] @@ -268,7 +268,7 @@ impl Scope { /// use of optimizations in the MIR coroutine transform. fn needs_cleanup(&self) -> bool { self.drops.iter().any(|drop| match drop.kind { - DropKind::Value | DropKind::ForLint => true, + DropKind::Value | DropKind::ForLint(_) => true, DropKind::Storage => false, }) } @@ -432,12 +432,12 @@ impl DropTree { }; cfg.terminate(block, drop_node.data.source_info, terminator); } - DropKind::ForLint => { + DropKind::ForLint(reason) => { let stmt = Statement::new( drop_node.data.source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(drop_node.data.local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ); cfg.push(block, stmt); @@ -1161,14 +1161,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ); block = next; } - DropKind::ForLint => { + DropKind::ForLint(reason) => { self.cfg.push( block, Statement::new( source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ), ); @@ -1395,7 +1395,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { drop_kind: DropKind, ) { let needs_drop = match drop_kind { - DropKind::Value | DropKind::ForLint => { + DropKind::Value | DropKind::ForLint(_) => { if !self.local_decls[local].ty.needs_drop(self.tcx, self.typing_env()) { return; } @@ -1492,6 +1492,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { span: Span, region_scope: region::Scope, local: Local, + reason: BackwardIncompatibleDropReason, ) { // Note that we are *not* gating BIDs here on whether they have significant destructor. // We need to know all of them so that we can capture potential borrow-checking errors. @@ -1499,13 +1500,24 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Since we are inserting linting MIR statement, we have to invalidate the caches scope.invalidate_cache(); if scope.region_scope == region_scope { - let region_scope_span = region_scope.span(self.tcx, self.region_scope_tree); + // We'll be using this span in diagnostics, so let's make sure it points to the end + // end of the block, not just the end of the tail expression. + let region_scope_span = if reason + == BackwardIncompatibleDropReason::MacroExtendedScope + && let Some(scope_hir_id) = region_scope.hir_id(self.region_scope_tree) + && let hir::Node::Expr(expr) = self.tcx.hir_node(scope_hir_id) + && let hir::Node::Block(blk) = self.tcx.parent_hir_node(expr.hir_id) + { + blk.span + } else { + region_scope.span(self.tcx, self.region_scope_tree) + }; let scope_end = self.tcx.sess.source_map().end_point(region_scope_span); scope.drops.push(DropData { source_info: SourceInfo { span: scope_end, scope: scope.source_scope }, local, - kind: DropKind::ForLint, + kind: DropKind::ForLint(reason), }); return; @@ -1902,7 +1914,7 @@ where ); block = next; } - DropKind::ForLint => { + DropKind::ForLint(reason) => { // As in the `DropKind::Storage` case below: // normally lint-related drops are not emitted for unwind, // so we can just leave `unwind_to` unmodified, but in some @@ -1931,7 +1943,7 @@ where source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ), ); @@ -1985,7 +1997,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> { let mut unwind_indices = IndexVec::from_elem_n(unwind_target, 1); for (drop_idx, drop_node) in drops.drop_nodes.iter_enumerated().skip(1) { match drop_node.data.kind { - DropKind::Storage | DropKind::ForLint => { + DropKind::Storage | DropKind::ForLint(_) => { if is_coroutine { let unwind_drop = self .scopes @@ -2024,7 +2036,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> { .coroutine_drops .add_drop(drop_data.data, dropline_indices[drop_data.next]); match drop_data.data.kind { - DropKind::Storage | DropKind::ForLint => {} + DropKind::Storage | DropKind::ForLint(_) => {} DropKind::Value => { if self.is_async_drop(drop_data.data.local) { self.scopes.coroutine_drops.add_entry_point( diff --git a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs index 61c9bbe31239e..58bc154fbdfde 100644 --- a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs +++ b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs @@ -13,8 +13,8 @@ use rustc_index::{IndexSlice, IndexVec}; use rustc_macros::{LintDiagnostic, Subdiagnostic}; use rustc_middle::bug; use rustc_middle::mir::{ - self, BasicBlock, Body, ClearCrossCrate, Local, Location, MirDumper, Place, StatementKind, - TerminatorKind, + self, BackwardIncompatibleDropReason, BasicBlock, Body, ClearCrossCrate, Local, Location, + MirDumper, Place, StatementKind, TerminatorKind, }; use rustc_middle::ty::significant_drop_order::{ extract_component_with_significant_dtor, ty_dtor_span, @@ -207,7 +207,11 @@ pub(crate) fn run_lint<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId, body: &Body< let mut ty_dropped_components = UnordMap::default(); for (block, data) in body.basic_blocks.iter_enumerated() { for (statement_index, stmt) in data.statements.iter().enumerate() { - if let StatementKind::BackwardIncompatibleDropHint { place, reason: _ } = &stmt.kind { + if let StatementKind::BackwardIncompatibleDropHint { + place, + reason: BackwardIncompatibleDropReason::Edition2024, + } = &stmt.kind + { let ty = place.ty(body, tcx).ty; if ty_dropped_components .entry(ty) diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr new file mode 100644 index 0000000000000..c7a7e1b3238e9 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr @@ -0,0 +1,92 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:33:43 + | +LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + | ^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:36:43 + | +LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + | ^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:39:43 + | +LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:58:17 + | +LL | &*&*smart_ptr_temp() + | ^^^^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:54:14 + | +LL | &struct_temp().field + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:50:14 + | +LL | &tuple_temp().0 + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:46:14 + | +LL | &array_temp()[0] + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: 7 warnings emitted + diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr new file mode 100644 index 0000000000000..0c61fd8d1b0e1 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr @@ -0,0 +1,188 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:26:29 + | +LL | println!("{:?}{:?}", { &temp() }, ()); + | ^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:33:43 + | +LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + | ^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:36:43 + | +LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + | ^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:39:43 + | +LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:58:17 + | +LL | &*&*smart_ptr_temp() + | ^^^^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:54:14 + | +LL | &struct_temp().field + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:50:14 + | +LL | &tuple_temp().0 + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:46:14 + | +LL | &array_temp()[0] + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:65:18 + | +LL | pin!(pin!({ &temp() })); + | ^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:96:13 + | +LL | pin!({ &(1 / 0) }); + | ^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:99:17 + | +LL | pin!({ &mut [()] }); + | ^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:102:13 + | +LL | pin!({ &Some(String::new()) }); + | ^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:105:13 + | +LL | pin!({ &(|| ())() }); + | ^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:108:13 + | +LL | pin!({ &|| &local }); + | ^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:111:13 + | +LL | pin!({ &CONST_STRING }); + | ^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: 15 warnings emitted + diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs index 0034b57c92e1d..b6ffa5247e30c 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs @@ -24,38 +24,47 @@ fn main() { // #145880 doesn't apply here, so this `temp()`'s lifetime is reduced by #145838 in Rust 2024. println!("{:?}{:?}", { &temp() }, ()); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! // In real-world projects, this breakage typically appeared in `if` expressions with a reference // to a `String` temporary in one branch's tail expression. This is edition-independent since // `if` expressions' blocks are temporary scopes in all editions. println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! // Make sure we catch indexed and dereferenced temporaries. pin!( if cond() { &array_temp()[0] - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } else if cond() { &tuple_temp().0 - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } else if cond() { &struct_temp().field - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } else { &*&*smart_ptr_temp() - // TODO: warn in all editions + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } ); // Test that `super let` extended by parent `super let`s in non-extending blocks are caught. pin!(pin!({ &temp() })); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! // We shouldn't warn when lifetime extension applies. let _ = format_args!("{:?}{:?}", { &temp() }, if cond() { &temp() } else { &temp() }); @@ -85,17 +94,23 @@ fn main() { // But we do warn on these temporaries, since they aren't promoted. pin!({ &(1 / 0) }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! pin!({ &mut [()] }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! pin!({ &Some(String::new()) }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! pin!({ &(|| ())() }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! pin!({ &|| &local }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! pin!({ &CONST_STRING }); - // TODO: warn in Rust 2024 + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! // This lint only catches future errors. Future dangling pointers do not produce warnings. pin!({ &raw const *&temp() }); diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs index 5b5a43c94735b..ba84489bab23e 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs @@ -1,6 +1,6 @@ //! Test that `macro_extended_temporary_scopes` doesn't warn on non-extended temporaries. //@ edition: 2024 -#![deny(macro_extended_temporary_scopes)] //~ WARN unknown lint +#![deny(macro_extended_temporary_scopes)] fn temp() {} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr index 6ea3dcacaefe7..9e981874651f9 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr @@ -1,11 +1,3 @@ -warning: unknown lint: `macro_extended_temporary_scopes` - --> $DIR/non-extended.rs:3:9 - | -LL | #![deny(macro_extended_temporary_scopes)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unknown_lints)]` on by default - error[E0716]: temporary value dropped while borrowed --> $DIR/non-extended.rs:9:25 | @@ -30,6 +22,6 @@ LL | println!("{:?}{:?}", (), { std::convert::identity(&temp()) }); | = note: consider using a `let` binding to create a longer lived value -error: aborting due to 2 previous errors; 1 warning emitted +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0716`. diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs index 24d12cf0d55f2..6290b0eab8dac 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs @@ -13,6 +13,8 @@ macro_rules! wrap { macro_rules! print_with_internal_wrap { () => { println!("{:?}{}", (), wrap!(String::new())) } + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } fn main() { @@ -27,12 +29,13 @@ fn main() { // This does not promote; warn. wrap!(String::new()) - // TODO: warn + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! ) ); print_with_internal_wrap!(); - // TODO: warn + //~^ NOTE in this expansion of print_with_internal_wrap! print!( "{:?}{:?}", @@ -42,9 +45,11 @@ fn main() { // This does not promote; warn. external_macros::wrap!(String::new()) - // TODO: warn + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! ); external_macros::print_with_internal_wrap!(); - // TODO: warn + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr new file mode 100644 index 0000000000000..b4996952f4f11 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr @@ -0,0 +1,60 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:31:19 + | +LL | ($arg:expr) => { { &$arg } } + | - ...which will be dropped at the end of this block in Rust 1.92 +... +LL | wrap!(String::new()) + | ^^^^^^^^^^^^^ this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:15:42 + | +LL | ($arg:expr) => { { &$arg } } + | - ...which will be dropped at the end of this block in Rust 1.92 +... +LL | () => { println!("{:?}{}", (), wrap!(String::new())) } + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | print_with_internal_wrap!(); + | --------------------------- in this macro invocation + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:47:32 + | +LL | external_macros::wrap!(String::new()) + | -----------------------^^^^^^^^^^^^^- + | | | + | | this expression creates a temporary value... + | ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:52:5 + | +LL | external_macros::print_with_internal_wrap!(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | this expression creates a temporary value... + | ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `external_macros::print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: 4 warnings emitted + From 9f7ad5ee77d88cd70a1ba95c6a888a36b26271e2 Mon Sep 17 00:00:00 2001 From: dianne Date: Sun, 28 Sep 2025 23:48:32 -0700 Subject: [PATCH 23/37] add a test for shortening `super let` binding lifetimes --- .../extended-super-let-bindings.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs new file mode 100644 index 0000000000000..950d1a4eaaa97 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs @@ -0,0 +1,11 @@ +//! Some temporaries are implemented as local variables bound with `super let`. These can be +//! lifetime-extended, and as such are subject to shortening after #145838. +//@ edition: 2024 +//@ check-pass + +fn main() { + // The `()` argument to the inner `format_args!` is promoted, but the lifetimes of the internal + // `super let` temporaries in its expansion shorten, making this an error in Rust 1.92. + println!("{:?}{}", (), { format_args!("{:?}", ()) }); + // TODO: warn +} From 164620feda080e2a88cf0e503b4f12e446e339e1 Mon Sep 17 00:00:00 2001 From: dianne Date: Mon, 29 Sep 2025 00:02:14 -0700 Subject: [PATCH 24/37] warn on shortening `super let` binding lifetimes --- .../rustc_hir_analysis/src/check/region.rs | 46 +++++++++++-------- .../rustc_hir_typeck/src/method/suggest.rs | 4 +- compiler/rustc_middle/src/middle/region.rs | 20 ++++++-- .../src/builder/matches/mod.rs | 23 +++++++--- .../src/loops/needless_range_loop.rs | 3 +- src/tools/clippy/clippy_lints/src/shadow.rs | 4 +- .../extended-super-let-bindings.rs | 3 +- .../extended-super-let-bindings.stderr | 15 ++++++ 8 files changed, 84 insertions(+), 34 deletions(-) create mode 100644 tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr diff --git a/compiler/rustc_hir_analysis/src/check/region.rs b/compiler/rustc_hir_analysis/src/check/region.rs index 294386c3531b9..eb5ce80cc0ea6 100644 --- a/compiler/rustc_hir_analysis/src/check/region.rs +++ b/compiler/rustc_hir_analysis/src/check/region.rs @@ -24,7 +24,7 @@ use tracing::debug; #[derive(Debug, Copy, Clone)] struct Context { /// The scope that contains any new variables declared. - var_parent: Option, + var_parent: (Option, ScopeCompatibility), /// Region parent of expressions, etc. parent: Option, @@ -56,7 +56,8 @@ struct ExtendedTemporaryScope { /// Records the lifetime of a local variable as `cx.var_parent` fn record_var_lifetime(visitor: &mut ScopeResolutionVisitor<'_>, var_id: hir::ItemLocalId) { - match visitor.cx.var_parent { + let (var_parent_scope, var_parent_compat) = visitor.cx.var_parent; + match var_parent_scope { None => { // this can happen in extern fn declarations like // @@ -64,6 +65,9 @@ fn record_var_lifetime(visitor: &mut ScopeResolutionVisitor<'_>, var_id: hir::It } Some(parent_scope) => visitor.scope_tree.record_var_scope(var_id, parent_scope), } + if let ScopeCompatibility::FutureIncompatible { shortens_to } = var_parent_compat { + visitor.scope_tree.record_future_incompatible_var_scope(var_id, shortens_to); + } } fn resolve_block<'tcx>( @@ -101,7 +105,7 @@ fn resolve_block<'tcx>( // itself has returned. visitor.enter_node_scope_with_dtor(blk.hir_id.local_id, terminating); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); { // This block should be kept approximately in sync with @@ -120,7 +124,8 @@ fn resolve_block<'tcx>( local_id: blk.hir_id.local_id, data: ScopeData::Remainder(FirstStatementIndex::new(i)), }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = + (visitor.cx.parent, ScopeCompatibility::FutureCompatible); visitor.visit_stmt(statement); // We need to back out temporarily to the last enclosing scope // for the `else` block, so that even the temporaries receiving @@ -144,7 +149,8 @@ fn resolve_block<'tcx>( local_id: blk.hir_id.local_id, data: ScopeData::Remainder(FirstStatementIndex::new(i)), }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = + (visitor.cx.parent, ScopeCompatibility::FutureCompatible); visitor.visit_stmt(statement) } hir::StmtKind::Item(..) => { @@ -208,7 +214,7 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir: let prev_cx = visitor.cx; visitor.enter_node_scope_with_dtor(arm.hir_id.local_id, true); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_pat(visitor, arm.pat); if let Some(guard) = arm.guard { @@ -216,7 +222,7 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir: // ensure they're dropped before the arm's pattern's bindings. This extends to the end of // the arm body and is the scope of its locals as well. visitor.enter_scope(Scope { local_id: arm.hir_id.local_id, data: ScopeData::MatchGuard }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, guard); } resolve_expr(visitor, arm.body, false); @@ -373,7 +379,7 @@ fn resolve_expr<'tcx>( ScopeData::IfThen }; visitor.enter_scope(Scope { local_id: then.hir_id.local_id, data }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, cond); resolve_expr(visitor, then, true); visitor.cx = expr_cx; @@ -388,7 +394,7 @@ fn resolve_expr<'tcx>( ScopeData::IfThen }; visitor.enter_scope(Scope { local_id: then.hir_id.local_id, data }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, cond); resolve_expr(visitor, then, true); visitor.cx = expr_cx; @@ -498,7 +504,7 @@ fn resolve_local<'tcx>( // // Processing of `let a` will have already decided to extend the lifetime of this // `super let` to its own var_scope. We use that scope. - visitor.cx.var_parent = scope.scope; + visitor.cx.var_parent = (scope.scope, scope.compat); // Inherit compatibility from the original `let` statement. If the original `let` // was regular, lifetime extension should apply as normal. If the original `let` was // `super`, blocks within the initializer will be affected by #145838. @@ -512,9 +518,11 @@ fn resolve_local<'tcx>( // // Iterate up to the enclosing destruction scope to find the same scope that will also // be used for the result of the block itself. - if let Some(inner_scope) = visitor.cx.var_parent { - (visitor.cx.var_parent, _) = - visitor.scope_tree.default_temporary_scope(inner_scope) + if let (Some(inner_scope), _) = visitor.cx.var_parent { + // NB(@dianne): This could use the incompatibility reported by + // `default_temporary_scope` to make `tail_expr_drop_order` more comprehensive. + visitor.cx.var_parent = + (visitor.scope_tree.default_temporary_scope(inner_scope).0, ScopeCompatibility::FutureCompatible); } // Blocks within the initializer will be affected by #145838. (LetKind::Super, ScopeCompatibility::FutureCompatible) @@ -524,7 +532,7 @@ fn resolve_local<'tcx>( if let Some(expr) = init { let scope = ExtendedTemporaryScope { - scope: visitor.cx.var_parent, + scope: visitor.cx.var_parent.0, let_kind: source_let_kind, compat, }; @@ -536,8 +544,8 @@ fn resolve_local<'tcx>( expr.hir_id, RvalueCandidate { target: expr.hir_id.local_id, - lifetime: visitor.cx.var_parent, - compat: ScopeCompatibility::FutureCompatible, + lifetime: visitor.cx.var_parent.0, + compat: visitor.cx.var_parent.1, }, ); } @@ -818,7 +826,7 @@ impl<'tcx> Visitor<'tcx> for ScopeResolutionVisitor<'tcx> { self.enter_body(body.value.hir_id, |this| { if this.tcx.hir_body_owner_kind(owner_id).is_fn_or_closure() { // The arguments and `self` are parented to the fn. - this.cx.var_parent = this.cx.parent; + this.cx.var_parent = (this.cx.parent, ScopeCompatibility::FutureCompatible); for param in body.params { this.visit_pat(param.pat); } @@ -844,7 +852,7 @@ impl<'tcx> Visitor<'tcx> for ScopeResolutionVisitor<'tcx> { // would *not* let the `f()` temporary escape into an outer scope // (i.e., `'static`), which means that after `g` returns, it drops, // and all the associated destruction scope rules apply. - this.cx.var_parent = None; + this.cx.var_parent = (None, ScopeCompatibility::FutureCompatible); this.enter_scope(Scope { local_id: body.value.hir_id.local_id, data: ScopeData::Destruction, @@ -896,7 +904,7 @@ pub(crate) fn region_scope_tree(tcx: TyCtxt<'_>, def_id: DefId) -> &ScopeTree { let mut visitor = ScopeResolutionVisitor { tcx, scope_tree: ScopeTree::default(), - cx: Context { parent: None, var_parent: None }, + cx: Context { parent: None, var_parent: (None, ScopeCompatibility::FutureCompatible) }, extended_super_lets: Default::default(), }; diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs index c8f6c06b720dc..559f354a3a7cf 100644 --- a/compiler/rustc_hir_typeck/src/method/suggest.rs +++ b/compiler/rustc_hir_typeck/src/method/suggest.rs @@ -441,8 +441,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Check scope of binding. fn is_sub_scope(&self, sub_id: hir::ItemLocalId, super_id: hir::ItemLocalId) -> bool { let scope_tree = self.fcx.tcx.region_scope_tree(self.fcx.body_id); - if let Some(sub_var_scope) = scope_tree.var_scope(sub_id) - && let Some(super_var_scope) = scope_tree.var_scope(super_id) + if let (Some(sub_var_scope), _) = scope_tree.var_scope(sub_id) + && let (Some(super_var_scope), _) = scope_tree.var_scope(super_id) && scope_tree.is_subscope_of(sub_var_scope, super_var_scope) { return true; diff --git a/compiler/rustc_middle/src/middle/region.rs b/compiler/rustc_middle/src/middle/region.rs index bd8f06c30ecd4..0c881bc3a3b54 100644 --- a/compiler/rustc_middle/src/middle/region.rs +++ b/compiler/rustc_middle/src/middle/region.rs @@ -222,6 +222,10 @@ pub struct ScopeTree { /// variable is declared. var_map: FxIndexMap, + /// Maps from bindings to their future scopes after #145838 for the + /// `macro_extended_temporary_scopes` lint. + var_compatibility_map: FxIndexMap, + /// Identifies expressions which, if captured into a temporary, ought to /// have a temporary whose lifetime extends to the end of the enclosing *block*, /// and not the enclosing *statement*. Expressions that are not present in this @@ -274,6 +278,11 @@ impl ScopeTree { self.var_map.insert(var, lifetime); } + pub fn record_future_incompatible_var_scope(&mut self, var: hir::ItemLocalId, lifetime: Scope) { + assert!(var != lifetime.local_id); + self.var_compatibility_map.insert(var, lifetime); + } + pub fn record_rvalue_candidate(&mut self, var: HirId, candidate: RvalueCandidate) { debug!("record_rvalue_candidate(var={var:?}, candidate={candidate:?})"); if let Some(lifetime) = &candidate.lifetime { @@ -287,9 +296,14 @@ impl ScopeTree { self.parent_map.get(&id).cloned() } - /// Returns the lifetime of the local variable `var_id`, if any. - pub fn var_scope(&self, var_id: hir::ItemLocalId) -> Option { - self.var_map.get(&var_id).cloned() + /// Returns the lifetime of the local variable `var_id`, if any, as well as whether it is + /// shortening after #145838. + pub fn var_scope(&self, var_id: hir::ItemLocalId) -> (Option, ScopeCompatibility) { + let compat = match self.var_compatibility_map.get(&var_id) { + Some(&shortens_to) => ScopeCompatibility::FutureIncompatible { shortens_to }, + None => ScopeCompatibility::FutureCompatible, + }; + (self.var_map.get(&var_id).cloned(), compat) } /// Returns `true` if `subscope` is equal to or is lexically nested inside `superscope`, and diff --git a/compiler/rustc_mir_build/src/builder/matches/mod.rs b/compiler/rustc_mir_build/src/builder/matches/mod.rs index d216c4ecd1155..9ba2f4db4f03a 100644 --- a/compiler/rustc_mir_build/src/builder/matches/mod.rs +++ b/compiler/rustc_mir_build/src/builder/matches/mod.rs @@ -15,7 +15,7 @@ use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_hir::{BindingMode, ByRef, LetStmt, LocalSource, Node}; use rustc_middle::bug; -use rustc_middle::middle::region; +use rustc_middle::middle::region::{self, ScopeCompatibility}; use rustc_middle::mir::*; use rustc_middle::thir::{self, *}; use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, ValTree, ValTreeKind}; @@ -807,10 +807,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.cfg.push(block, Statement::new(source_info, StatementKind::StorageLive(local_id))); // Although there is almost always scope for given variable in corner cases // like #92893 we might get variable with no scope. - if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) - && matches!(schedule_drop, ScheduleDrops::Yes) - { - self.schedule_drop(span, region_scope, local_id, DropKind::Storage); + if matches!(schedule_drop, ScheduleDrops::Yes) { + let (var_scope, var_scope_compat) = self.region_scope_tree.var_scope(var.0.local_id); + if let Some(region_scope) = var_scope { + self.schedule_drop(span, region_scope, local_id, DropKind::Storage); + } + if let ScopeCompatibility::FutureIncompatible { shortens_to } = var_scope_compat { + self.schedule_backwards_incompatible_drop( + span, + shortens_to, + local_id, + BackwardIncompatibleDropReason::MacroExtendedScope, + ); + } } Place::from(local_id) } @@ -822,7 +831,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { for_guard: ForGuard, ) { let local_id = self.var_local_id(var, for_guard); - if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) { + // We can ignore the var scope's future-compatibility information since we've already taken + // it into account when scheduling the storage drop in `storage_live_binding`. + if let (Some(region_scope), _) = self.region_scope_tree.var_scope(var.0.local_id) { self.schedule_drop(span, region_scope, local_id, DropKind::Value); } } diff --git a/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs b/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs index 11edb929d70b2..de162a12e47d3 100644 --- a/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs +++ b/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs @@ -64,7 +64,7 @@ pub(super) fn check<'tcx>( if let Some(indexed_extent) = indexed_extent { let parent_def_id = cx.tcx.hir_get_parent_item(expr.hir_id); let region_scope_tree = cx.tcx.region_scope_tree(parent_def_id); - let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id).unwrap(); + let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id).0.unwrap(); if region_scope_tree.is_subscope_of(indexed_extent, pat_extent) { return; } @@ -298,6 +298,7 @@ impl<'tcx> VarVisitor<'_, 'tcx> { .tcx .region_scope_tree(parent_def_id) .var_scope(hir_id.local_id) + .0 .unwrap(); if index_used_directly { self.indexed_directly.insert( diff --git a/src/tools/clippy/clippy_lints/src/shadow.rs b/src/tools/clippy/clippy_lints/src/shadow.rs index 14399867f3181..ee80e75a9d1f5 100644 --- a/src/tools/clippy/clippy_lints/src/shadow.rs +++ b/src/tools/clippy/clippy_lints/src/shadow.rs @@ -180,8 +180,8 @@ impl<'tcx> LateLintPass<'tcx> for Shadow { fn is_shadow(cx: &LateContext<'_>, owner: LocalDefId, first: ItemLocalId, second: ItemLocalId) -> bool { let scope_tree = cx.tcx.region_scope_tree(owner.to_def_id()); - if let Some(first_scope) = scope_tree.var_scope(first) - && let Some(second_scope) = scope_tree.var_scope(second) + if let Some(first_scope) = scope_tree.var_scope(first).0 + && let Some(second_scope) = scope_tree.var_scope(second).0 { return scope_tree.is_subscope_of(second_scope, first_scope); } diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs index 950d1a4eaaa97..c3f407633dcb8 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs @@ -7,5 +7,6 @@ fn main() { // The `()` argument to the inner `format_args!` is promoted, but the lifetimes of the internal // `super let` temporaries in its expansion shorten, making this an error in Rust 1.92. println!("{:?}{}", (), { format_args!("{:?}", ()) }); - // TODO: warn + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! } diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr new file mode 100644 index 0000000000000..4dee6f4fc3212 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr @@ -0,0 +1,15 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/extended-super-let-bindings.rs:9:30 + | +LL | println!("{:?}{}", (), { format_args!("{:?}", ()) }); + | ^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: 1 warning emitted + From 6b4f96d492e768a86e776310386f384a9b651951 Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Thu, 9 Oct 2025 19:00:21 -0400 Subject: [PATCH 25/37] Change int-to-ptr transmute lowering back to inttoptr (cherry picked from commit 029579d1770fb23c693b2ecbab724fe3af66349b) --- compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 4 ++-- tests/codegen-llvm/common_prim_int_ptr.rs | 2 +- tests/codegen-llvm/enum/enum-aggregate.rs | 2 +- .../int-ptr-int-enum-miscompile.rs | 22 +++++++++++++++++++ .../intrinsics/transmute-niched.rs | 2 +- tests/codegen-llvm/intrinsics/transmute.rs | 4 ++-- tests/codegen-llvm/transmute-scalar.rs | 2 +- 7 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 tests/codegen-llvm/int-ptr-int-enum-miscompile.rs diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index f6f2e3f2a3a3c..addd41dbd2b36 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -1048,14 +1048,14 @@ pub(super) fn transmute_scalar<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>( imm = match (from_scalar.primitive(), to_scalar.primitive()) { (Int(..) | Float(_), Int(..) | Float(_)) => bx.bitcast(imm, to_backend_ty), (Pointer(..), Pointer(..)) => bx.pointercast(imm, to_backend_ty), - (Int(..), Pointer(..)) => bx.ptradd(bx.const_null(bx.type_ptr()), imm), + (Int(..), Pointer(..)) => bx.inttoptr(imm, to_backend_ty), (Pointer(..), Int(..)) => { // FIXME: this exposes the provenance, which shouldn't be necessary. bx.ptrtoint(imm, to_backend_ty) } (Float(_), Pointer(..)) => { let int_imm = bx.bitcast(imm, bx.cx().type_isize()); - bx.ptradd(bx.const_null(bx.type_ptr()), int_imm) + bx.inttoptr(int_imm, to_backend_ty) } (Pointer(..), Float(_)) => { // FIXME: this exposes the provenance, which shouldn't be necessary. diff --git a/tests/codegen-llvm/common_prim_int_ptr.rs b/tests/codegen-llvm/common_prim_int_ptr.rs index 53716adccbf21..2c906e86bd736 100644 --- a/tests/codegen-llvm/common_prim_int_ptr.rs +++ b/tests/codegen-llvm/common_prim_int_ptr.rs @@ -11,7 +11,7 @@ #[no_mangle] pub fn insert_int(x: usize) -> Result> { // CHECK: start: - // CHECK-NEXT: %[[WO_PROV:.+]] = getelementptr i8, ptr null, [[USIZE:i[0-9]+]] %x + // CHECK-NEXT: %[[WO_PROV:.+]] = inttoptr [[USIZE:i[0-9]+]] %x to ptr // CHECK-NEXT: %[[R:.+]] = insertvalue { [[USIZE]], ptr } { [[USIZE]] 0, ptr poison }, ptr %[[WO_PROV]], 1 // CHECK-NEXT: ret { [[USIZE]], ptr } %[[R]] Ok(x) diff --git a/tests/codegen-llvm/enum/enum-aggregate.rs b/tests/codegen-llvm/enum/enum-aggregate.rs index f58d7ef12b661..e87f43b2e27b9 100644 --- a/tests/codegen-llvm/enum/enum-aggregate.rs +++ b/tests/codegen-llvm/enum/enum-aggregate.rs @@ -71,7 +71,7 @@ fn make_ok_ptr(x: NonNull) -> Result, usize> { fn make_ok_int(x: usize) -> Result> { // CHECK-LABEL: { i64, ptr } @make_ok_int(i64 %x) // CHECK-NEXT: start: - // CHECK-NEXT: %[[NOPROV:.+]] = getelementptr i8, ptr null, i64 %x + // CHECK-NEXT: %[[NOPROV:.+]] = inttoptr i64 %x to ptr // CHECK-NEXT: %[[R:.+]] = insertvalue { i64, ptr } { i64 0, ptr poison }, ptr %[[NOPROV]], 1 // CHECK-NEXT: ret { i64, ptr } %[[R]] Ok(x) diff --git a/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs b/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs new file mode 100644 index 0000000000000..299c3bf8847b2 --- /dev/null +++ b/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs @@ -0,0 +1,22 @@ +// This is a regression test for https://github.com/rust-lang/rust/issues/147265. + +//@ compile-flags: -Copt-level=3 + +#![crate_type = "lib"] + +#[no_mangle] +pub fn mk_result(a: usize) -> Result { + // CHECK-LABEL: @mk_result + // CHECK-NOT: unreachable + // CHECK: load i8, + // CHECK-NOT: unreachable + match g(a) { + Ok(b) => Ok(unsafe { *(b as *const u8) }), + Err(c) => Err(c), + } +} + +#[cold] +fn g(a: usize) -> Result { + Ok(a) +} diff --git a/tests/codegen-llvm/intrinsics/transmute-niched.rs b/tests/codegen-llvm/intrinsics/transmute-niched.rs index a886d9eee5909..8c647655f65bb 100644 --- a/tests/codegen-llvm/intrinsics/transmute-niched.rs +++ b/tests/codegen-llvm/intrinsics/transmute-niched.rs @@ -249,7 +249,7 @@ pub unsafe fn check_four_or_eight_to_nonnull(x: FourOrEight) -> NonNull { // OPT: call void @llvm.assume(i1 %1) // CHECK-NOT: icmp // CHECK-NOT: assume - // CHECK: %[[RET:.+]] = getelementptr i8, ptr null, i64 %x + // CHECK: %[[RET:.+]] = inttoptr i64 %x to ptr // CHECK-NEXT: ret ptr %[[RET]] transmute(x) diff --git a/tests/codegen-llvm/intrinsics/transmute.rs b/tests/codegen-llvm/intrinsics/transmute.rs index e327c100d7ddd..b86c6df3267e4 100644 --- a/tests/codegen-llvm/intrinsics/transmute.rs +++ b/tests/codegen-llvm/intrinsics/transmute.rs @@ -303,7 +303,7 @@ pub unsafe fn check_pair_with_bool(x: (u8, bool)) -> (bool, i8) { pub unsafe fn check_float_to_pointer(x: f64) -> *const () { // CHECK-NOT: alloca // CHECK: %0 = bitcast double %x to i64 - // CHECK: %_0 = getelementptr i8, ptr null, i64 %0 + // CHECK: %_0 = inttoptr i64 %0 to ptr // CHECK: ret ptr %_0 transmute(x) } @@ -378,7 +378,7 @@ pub unsafe fn check_issue_110005(x: (usize, bool)) -> Option> { // CHECK-LABEL: @check_pair_to_dst_ref( #[no_mangle] pub unsafe fn check_pair_to_dst_ref<'a>(x: (usize, usize)) -> &'a [u8] { - // CHECK: %_0.0 = getelementptr i8, ptr null, i64 %x.0 + // CHECK: %_0.0 = inttoptr i64 %x.0 to ptr // CHECK: %0 = icmp ne ptr %_0.0, null // CHECK: call void @llvm.assume(i1 %0) // CHECK: %1 = insertvalue { ptr, i64 } poison, ptr %_0.0, 0 diff --git a/tests/codegen-llvm/transmute-scalar.rs b/tests/codegen-llvm/transmute-scalar.rs index 21f7287047cf0..e1ce8e506066a 100644 --- a/tests/codegen-llvm/transmute-scalar.rs +++ b/tests/codegen-llvm/transmute-scalar.rs @@ -56,7 +56,7 @@ pub fn ptr_to_int(p: *mut u16) -> usize { } // CHECK: define{{.*}}ptr @int_to_ptr([[USIZE]] %i) -// CHECK: %_0 = getelementptr i8, ptr null, [[USIZE]] %i +// CHECK: %_0 = inttoptr [[USIZE]] %i to ptr // CHECK-NEXT: ret ptr %_0 #[no_mangle] pub fn int_to_ptr(i: usize) -> *mut u16 { From 00c06488ada8ae1e88b0273b695863ad72805ed1 Mon Sep 17 00:00:00 2001 From: Boxy Uwu Date: Fri, 10 Oct 2025 19:56:57 +0100 Subject: [PATCH 26/37] in opaque type handling lift region vars to static if they outlive placeholders (cherry picked from commit 30bedc74d4812d8618fb31dbf002f44346979fd6) --- .../rustc_borrowck/src/handle_placeholders.rs | 2 +- .../opaque_types/member_constraints.rs | 3 +- .../src/region_infer/opaque_types/mod.rs | 7 ++++ .../region_infer/opaque_types/region_ctxt.rs | 36 +++++++++++++++---- .../placeholders_lift_to_static.rs | 33 +++++++++++++++++ tests/ui/impl-trait/nested-rpit-hrtb.rs | 1 - tests/ui/impl-trait/nested-rpit-hrtb.stderr | 14 +++----- tests/ui/nll/ice-106874.stderr | 26 +++++++------- 8 files changed, 90 insertions(+), 32 deletions(-) create mode 100644 tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs diff --git a/compiler/rustc_borrowck/src/handle_placeholders.rs b/compiler/rustc_borrowck/src/handle_placeholders.rs index 94379cdebf730..90d5e5e4f23f9 100644 --- a/compiler/rustc_borrowck/src/handle_placeholders.rs +++ b/compiler/rustc_borrowck/src/handle_placeholders.rs @@ -348,7 +348,7 @@ pub(crate) fn compute_sccs_applying_placeholder_outlives_constraints<'tcx>( } } -fn rewrite_placeholder_outlives<'tcx>( +pub(crate) fn rewrite_placeholder_outlives<'tcx>( sccs: &Sccs, annotations: &SccAnnotations<'_, '_, RegionTracker>, fr_static: RegionVid, diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs index 667fc440ac002..a2e2b61ae2d35 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs @@ -39,7 +39,7 @@ pub(super) fn apply_member_constraints<'tcx>( debug!(?member_constraints); for scc_a in rcx.constraint_sccs.all_sccs() { debug!(?scc_a); - // Start by adding the region values required by outlives constraints. This + // Start by adding the region values required by outlives constraints. This // matches how we compute the final region values in `fn compute_regions`. // // We need to do this here to get a lower bound when applying member constraints. @@ -64,6 +64,7 @@ fn apply_member_constraint<'tcx>( // If the member region lives in a higher universe, we currently choose // the most conservative option by leaving it unchanged. if !rcx.max_placeholder_universe_reached(member).is_root() { + debug!("member region reached non root universe, bailing"); return; } diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs index 0af636aa734ca..0c35bec316694 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs @@ -254,6 +254,10 @@ fn collect_defining_uses<'tcx>( } } else { errors.push(DeferredOpaqueTypeError::InvalidOpaqueTypeArgs(err)); + debug!( + "collect_defining_uses: InvalidOpaqueTypeArgs for {:?} := {:?}", + non_nll_opaque_type_key, hidden_type + ); } continue; } @@ -277,6 +281,7 @@ fn collect_defining_uses<'tcx>( defining_uses } +#[instrument(level = "debug", skip(rcx, concrete_opaque_types, defining_uses, errors))] fn compute_concrete_types_from_defining_uses<'tcx>( rcx: &RegionCtxt<'_, 'tcx>, concrete_opaque_types: &mut ConcreteOpaqueTypes<'tcx>, @@ -288,6 +293,7 @@ fn compute_concrete_types_from_defining_uses<'tcx>( let mut decls_modulo_regions: FxIndexMap, (OpaqueTypeKey<'tcx>, Span)> = FxIndexMap::default(); for &DefiningUse { opaque_type_key, ref arg_regions, hidden_type } in defining_uses { + debug!(?opaque_type_key, ?arg_regions, ?hidden_type); // After applying member constraints, we now map all regions in the hidden type // to the `arg_regions` of this defining use. In case a region in the hidden type // ended up not being equal to any such region, we error. @@ -295,6 +301,7 @@ fn compute_concrete_types_from_defining_uses<'tcx>( match hidden_type.try_fold_with(&mut ToArgRegionsFolder::new(rcx, arg_regions)) { Ok(hidden_type) => hidden_type, Err(r) => { + debug!("UnexpectedHiddenRegion: {:?}", r); errors.push(DeferredOpaqueTypeError::UnexpectedHiddenRegion { hidden_type, opaque_type_key, diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs index 88326e4eebfc2..90b15cbdd2cc8 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs @@ -11,7 +11,9 @@ use crate::constraints::ConstraintSccIndex; use crate::handle_placeholders::{SccAnnotations, region_definitions}; use crate::region_infer::reverse_sccs::ReverseSccGraph; use crate::region_infer::values::RegionValues; -use crate::region_infer::{ConstraintSccs, RegionDefinition, RegionTracker, Representative}; +use crate::region_infer::{ + ConstraintSccs, OutlivesConstraintSet, RegionDefinition, RegionTracker, Representative, +}; use crate::type_check::MirTypeckRegionConstraints; use crate::type_check::free_region_relations::UniversalRegionRelations; use crate::universal_regions::UniversalRegions; @@ -39,16 +41,36 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> { location_map: Rc, constraints: &MirTypeckRegionConstraints<'tcx>, ) -> RegionCtxt<'a, 'tcx> { + let mut outlives_constraints = constraints.outlives_constraints.clone(); let universal_regions = &universal_region_relations.universal_regions; let (definitions, _has_placeholders) = region_definitions(infcx, universal_regions); + + let compute_sccs = + |outlives_constraints: &OutlivesConstraintSet<'tcx>, + annotations: &mut SccAnnotations<'_, 'tcx, RegionTracker>| { + ConstraintSccs::new_with_annotation( + &outlives_constraints + .graph(definitions.len()) + .region_graph(outlives_constraints, universal_regions.fr_static), + annotations, + ) + }; + let mut scc_annotations = SccAnnotations::init(&definitions); - let constraint_sccs = ConstraintSccs::new_with_annotation( - &constraints - .outlives_constraints - .graph(definitions.len()) - .region_graph(&constraints.outlives_constraints, universal_regions.fr_static), - &mut scc_annotations, + let mut constraint_sccs = compute_sccs(&outlives_constraints, &mut scc_annotations); + + let added_constraints = crate::handle_placeholders::rewrite_placeholder_outlives( + &constraint_sccs, + &scc_annotations, + universal_regions.fr_static, + &mut outlives_constraints, ); + + if added_constraints { + scc_annotations = SccAnnotations::init(&definitions); + constraint_sccs = compute_sccs(&outlives_constraints, &mut scc_annotations); + } + let scc_annotations = scc_annotations.scc_to_annotation; // Unlike the `RegionInferenceContext`, we only care about free regions diff --git a/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs b/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs new file mode 100644 index 0000000000000..ff52b70c2528d --- /dev/null +++ b/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs @@ -0,0 +1,33 @@ +//@ check-pass + +// We have some `RPIT` with an item bound of `for<'a> Outlives<'a>`. We +// infer a hidden type of `&'?x i32` where `'?x` is required to outlive +// some placeholder `'!a` due to the `for<'a> Outlives<'a>` item bound. +// +// We previously did not write constraints of the form `'?x: '!a` into +// `'?x: 'static`. This caused member constraints to bail and not consider +// `'?x` to be constrained to an arg region. + +pub trait Outlives<'a> {} +impl<'a, T: 'a> Outlives<'a> for T {} + +pub fn foo() -> impl for<'a> Outlives<'a> { + let x: &'static i32 = &1; + x +} + +// This *didn't* regress but feels like it's "the same thing" so +// test it anyway +pub fn bar() -> impl Sized { + let x: &'static i32 = &1; + hr_outlives(x) +} + +fn hr_outlives(v: T) -> T +where + for<'a> T: 'a +{ + v +} + +fn main() {} diff --git a/tests/ui/impl-trait/nested-rpit-hrtb.rs b/tests/ui/impl-trait/nested-rpit-hrtb.rs index f4ff13d6c20f9..11d79bcff7371 100644 --- a/tests/ui/impl-trait/nested-rpit-hrtb.rs +++ b/tests/ui/impl-trait/nested-rpit-hrtb.rs @@ -48,7 +48,6 @@ fn one_hrtb_mention_fn_trait_param_uses<'b>() -> impl for<'a> Bar<'a, Assoc = im // This should resolve. fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'b> {} //~^ ERROR implementation of `Bar` is not general enough -//~| ERROR lifetime may not live long enough // This should resolve. fn two_htrb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Qux<'b>> {} diff --git a/tests/ui/impl-trait/nested-rpit-hrtb.stderr b/tests/ui/impl-trait/nested-rpit-hrtb.stderr index 93cd7bd788f45..2e95ef370c7fd 100644 --- a/tests/ui/impl-trait/nested-rpit-hrtb.stderr +++ b/tests/ui/impl-trait/nested-rpit-hrtb.stderr @@ -1,5 +1,5 @@ error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/nested-rpit-hrtb.rs:57:77 + --> $DIR/nested-rpit-hrtb.rs:56:77 | LL | fn two_htrb_outlives() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Sized + 'b> {} | ^^ undeclared lifetime @@ -15,7 +15,7 @@ LL | fn two_htrb_outlives<'b>() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Siz | ++++ error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/nested-rpit-hrtb.rs:65:82 + --> $DIR/nested-rpit-hrtb.rs:64:82 | LL | fn two_htrb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Sized + 'b> {} | ^^ undeclared lifetime @@ -87,12 +87,6 @@ LL | fn one_hrtb_mention_fn_trait_param_uses<'b>() -> impl for<'a> Bar<'a, Assoc but trait `Qux<'_>` is implemented for `()` = help: for that trait implementation, expected `()`, found `&'a ()` -error: lifetime may not live long enough - --> $DIR/nested-rpit-hrtb.rs:49:93 - | -LL | fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'b> {} - | -- lifetime `'b` defined here ^^ opaque type requires that `'b` must outlive `'static` - error: implementation of `Bar` is not general enough --> $DIR/nested-rpit-hrtb.rs:49:93 | @@ -103,7 +97,7 @@ LL | fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = = note: ...but it actually implements `Bar<'0>`, for some specific lifetime `'0` error[E0277]: the trait bound `for<'a, 'b> &'a (): Qux<'b>` is not satisfied - --> $DIR/nested-rpit-hrtb.rs:61:64 + --> $DIR/nested-rpit-hrtb.rs:60:64 | LL | fn two_htrb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Qux<'b>> {} | ^^^^^^^^^^^^^^^^^^^^ the trait `for<'a, 'b> Qux<'b>` is not implemented for `&'a ()` @@ -112,7 +106,7 @@ LL | fn two_htrb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> but trait `Qux<'_>` is implemented for `()` = help: for that trait implementation, expected `()`, found `&'a ()` -error: aborting due to 10 previous errors +error: aborting due to 9 previous errors Some errors have detailed explanations: E0261, E0277, E0657. For more information about an error, try `rustc --explain E0261`. diff --git a/tests/ui/nll/ice-106874.stderr b/tests/ui/nll/ice-106874.stderr index 0edbd7b44ef1c..629570b602ed6 100644 --- a/tests/ui/nll/ice-106874.stderr +++ b/tests/ui/nll/ice-106874.stderr @@ -17,6 +17,20 @@ LL | A(B(C::new(D::new(move |st| f(st))))) = note: ...but it actually implements `FnOnce<(&'1 mut V,)>`, for some specific lifetime `'1` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` +error: higher-ranked subtype error + --> $DIR/ice-106874.rs:8:5 + | +LL | A(B(C::new(D::new(move |st| f(st))))) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/ice-106874.rs:8:5 + | +LL | A(B(C::new(D::new(move |st| f(st))))) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` + error: implementation of `FnOnce` is not general enough --> $DIR/ice-106874.rs:8:7 | @@ -75,17 +89,5 @@ LL | A(B(C::new(D::new(move |st| f(st))))) = note: ...but it actually implements `Fn<(&'2 mut V,)>`, for some specific lifetime `'2` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` -error: higher-ranked subtype error - --> $DIR/ice-106874.rs:8:7 - | -LL | A(B(C::new(D::new(move |st| f(st))))) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: higher-ranked subtype error - --> $DIR/ice-106874.rs:8:41 - | -LL | A(B(C::new(D::new(move |st| f(st))))) - | ^ - error: aborting due to 10 previous errors From 5b36a0a7b2cd49711464c24fa5d937d956869e95 Mon Sep 17 00:00:00 2001 From: dianqk Date: Sun, 12 Oct 2025 19:32:57 +0800 Subject: [PATCH 27/37] Add miscompiled test cases (cherry picked from commit 64c023bad80b8de5f2f711c30424cfbab4dda171) --- .../mir-opt/gvn_loop.loop_deref_mut.GVN.diff | 115 ++++++++++++++++++ tests/mir-opt/gvn_loop.rs | 31 +++++ tests/ui/mir/gvn-loop-miscompile.rs | 34 ++++++ 3 files changed, 180 insertions(+) create mode 100644 tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff create mode 100644 tests/mir-opt/gvn_loop.rs create mode 100644 tests/ui/mir/gvn-loop-miscompile.rs diff --git a/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff new file mode 100644 index 0000000000000..1a53667624aac --- /dev/null +++ b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff @@ -0,0 +1,115 @@ +- // MIR for `loop_deref_mut` before GVN ++ // MIR for `loop_deref_mut` after GVN + + fn loop_deref_mut(_1: &mut Value) -> Value { + debug val => _1; + let mut _0: Value; + let _2: &Value; + let _3: &Value; + let mut _4: &Value; + let mut _6: !; + let mut _8: isize; + let mut _9: !; + let mut _10: (); + let mut _12: i32; + let _13: (); + let mut _14: bool; + let mut _15: !; + let mut _16: Value; + scope 1 { + debug val_alias => _2; + let mut _5: bool; + scope 2 { + debug stop => _5; + let _7: i32; + scope 3 { + debug v => _7; + let _11: Value; + scope 4 { + debug v => _11; + } + } + } + } + + bb0: { + StorageLive(_2); +- StorageLive(_3); ++ nop; + StorageLive(_4); + _4 = &(*_1); + _3 = get::(move _4) -> [return: bb1, unwind unreachable]; + } + + bb1: { + _2 = &(*_3); + StorageDead(_4); +- StorageDead(_3); ++ nop; + StorageLive(_5); + _5 = const false; +- _8 = discriminant((*_2)); ++ _8 = discriminant((*_3)); + switchInt(move _8) -> [0: bb3, otherwise: bb2]; + } + + bb2: { + unreachable; + } + + bb3: { +- StorageLive(_7); +- _7 = copy (((*_2) as V0).0: i32); ++ nop; ++ _7 = copy (((*_3) as V0).0: i32); + StorageLive(_9); + goto -> bb4; + } + + bb4: { + StorageLive(_11); + StorageLive(_12); + _12 = copy _7; +- _11 = Value::V0(move _12); ++ _11 = copy (*_3); + StorageDead(_12); + StorageLive(_13); + StorageLive(_14); + _14 = copy _5; + switchInt(move _14) -> [0: bb6, otherwise: bb5]; + } + + bb5: { + _0 = move _11; + StorageDead(_14); + StorageDead(_13); + StorageDead(_11); + StorageDead(_9); +- StorageDead(_7); ++ nop; + StorageDead(_5); + StorageDead(_2); + return; + } + + bb6: { + _13 = const (); + StorageDead(_14); + StorageDead(_13); + _5 = const true; + StorageLive(_16); +- _16 = Value::V1; +- (*_1) = move _16; ++ _16 = const Value::V1; ++ (*_1) = const Value::V1; + StorageDead(_16); + _10 = const (); + StorageDead(_11); + goto -> bb4; + } ++ } ++ ++ ALLOC0 (size: 8, align: 4) { ++ 01 00 00 00 __ __ __ __ │ ....░░░░ + } + diff --git a/tests/mir-opt/gvn_loop.rs b/tests/mir-opt/gvn_loop.rs new file mode 100644 index 0000000000000..a993f9b53f839 --- /dev/null +++ b/tests/mir-opt/gvn_loop.rs @@ -0,0 +1,31 @@ +// skip-filecheck +//@ test-mir-pass: GVN + +#![crate_type = "lib"] +#![feature(core_intrinsics, rustc_attrs)] + +pub enum Value { + V0(i32), + V1, +} + +// EMIT_MIR gvn_loop.loop_deref_mut.GVN.diff +fn loop_deref_mut(val: &mut Value) -> Value { + let val_alias: &Value = get(val); + let mut stop = false; + let Value::V0(v) = *val_alias else { unsafe { core::intrinsics::unreachable() } }; + loop { + let v = Value::V0(v); + if stop { + return v; + } + stop = true; + *val = Value::V1; + } +} + +#[inline(never)] +#[rustc_nounwind] +fn get(v: &T) -> &T { + v +} diff --git a/tests/ui/mir/gvn-loop-miscompile.rs b/tests/ui/mir/gvn-loop-miscompile.rs new file mode 100644 index 0000000000000..f24858918b16c --- /dev/null +++ b/tests/ui/mir/gvn-loop-miscompile.rs @@ -0,0 +1,34 @@ +//@ compile-flags: -O +//@ run-fail + +pub enum Value { + V0(i32), + V1, +} + +fn set_discriminant(val: &mut Value) -> Value { + let val_alias: &Value = get(val); + let mut stop = false; + let Value::V0(v) = *val_alias else { + unreachable!(); + }; + loop { + let v = Value::V0(v); + if stop { + return v; + } + stop = true; + *val = Value::V1; + } +} + +fn main() { + let mut v = Value::V0(1); + let v = set_discriminant(&mut v); + assert!(matches!(v, Value::V0(1))); +} + +#[inline(never)] +fn get(v: &T) -> &T { + v +} From 408e09e77c9feaa6872671b3505416b357ddff02 Mon Sep 17 00:00:00 2001 From: dianqk Date: Sun, 12 Oct 2025 19:53:12 +0800 Subject: [PATCH 28/37] GVN: Invalidate derefs at loop headers (cherry picked from commit 2048b9c027c8c55d1a83be5d769bb65a855397d3) --- compiler/rustc_middle/src/mir/loops.rs | 29 +++++++++++++++++++ compiler/rustc_middle/src/mir/mod.rs | 1 + compiler/rustc_mir_transform/src/gvn.rs | 6 ++++ .../rustc_mir_transform/src/jump_threading.rs | 20 +------------ .../mir-opt/gvn_loop.loop_deref_mut.GVN.diff | 2 +- tests/mir-opt/gvn_loop.rs | 10 ++++++- tests/ui/mir/gvn-loop-miscompile.rs | 2 +- 7 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 compiler/rustc_middle/src/mir/loops.rs diff --git a/compiler/rustc_middle/src/mir/loops.rs b/compiler/rustc_middle/src/mir/loops.rs new file mode 100644 index 0000000000000..ae332913c6421 --- /dev/null +++ b/compiler/rustc_middle/src/mir/loops.rs @@ -0,0 +1,29 @@ +use rustc_index::bit_set::DenseBitSet; + +use super::*; + +/// Compute the set of loop headers in the given body. A loop header is usually defined as a block +/// which dominates one of its predecessors. This definition is only correct for reducible CFGs. +/// However, computing dominators is expensive, so we approximate according to the post-order +/// traversal order. A loop header for us is a block which is visited after its predecessor in +/// post-order. This is ok as we mostly need a heuristic. +pub fn maybe_loop_headers(body: &Body<'_>) -> DenseBitSet { + let mut maybe_loop_headers = DenseBitSet::new_empty(body.basic_blocks.len()); + let mut visited = DenseBitSet::new_empty(body.basic_blocks.len()); + for (bb, bbdata) in traversal::postorder(body) { + // Post-order means we visit successors before the block for acyclic CFGs. + // If the successor is not visited yet, consider it a loop header. + for succ in bbdata.terminator().successors() { + if !visited.contains(succ) { + maybe_loop_headers.insert(succ); + } + } + + // Only mark `bb` as visited after we checked the successors, in case we have a self-loop. + // bb1: goto -> bb1; + let _new = visited.insert(bb); + debug_assert!(_new); + } + + maybe_loop_headers +} diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index da2245b12d2c2..cfc2576756d22 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -51,6 +51,7 @@ mod statement; mod syntax; mod terminator; +pub mod loops; pub mod traversal; pub mod visit; diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs index bf6aa800d20f4..7795fac1941a4 100644 --- a/compiler/rustc_mir_transform/src/gvn.rs +++ b/compiler/rustc_mir_transform/src/gvn.rs @@ -126,6 +126,7 @@ impl<'tcx> crate::MirPass<'tcx> for GVN { let ssa = SsaLocals::new(tcx, body, typing_env); // Clone dominators because we need them while mutating the body. let dominators = body.basic_blocks.dominators().clone(); + let maybe_loop_headers = loops::maybe_loop_headers(body); let mut state = VnState::new(tcx, body, typing_env, &ssa, dominators, &body.local_decls); @@ -136,6 +137,11 @@ impl<'tcx> crate::MirPass<'tcx> for GVN { let reverse_postorder = body.basic_blocks.reverse_postorder().to_vec(); for bb in reverse_postorder { + // N.B. With loops, reverse postorder cannot produce a valid topological order. + // A statement or terminator from inside the loop, that is not processed yet, may have performed an indirect write. + if maybe_loop_headers.contains(bb) { + state.invalidate_derefs(); + } let data = &mut body.basic_blocks.as_mut_preserves_cfg()[bb]; state.visit_basic_block_data(bb, data); } diff --git a/compiler/rustc_mir_transform/src/jump_threading.rs b/compiler/rustc_mir_transform/src/jump_threading.rs index f9e642e28ebd7..fb2f82fcaf707 100644 --- a/compiler/rustc_mir_transform/src/jump_threading.rs +++ b/compiler/rustc_mir_transform/src/jump_threading.rs @@ -84,7 +84,7 @@ impl<'tcx> crate::MirPass<'tcx> for JumpThreading { body, arena, map: Map::new(tcx, body, Some(MAX_PLACES)), - loop_headers: loop_headers(body), + loop_headers: loops::maybe_loop_headers(body), opportunities: Vec::new(), }; @@ -832,21 +832,3 @@ enum Update { Incr, Decr, } - -/// Compute the set of loop headers in the given body. We define a loop header as a block which has -/// at least a predecessor which it dominates. This definition is only correct for reducible CFGs. -/// But if the CFG is already irreducible, there is no point in trying much harder. -/// is already irreducible. -fn loop_headers(body: &Body<'_>) -> DenseBitSet { - let mut loop_headers = DenseBitSet::new_empty(body.basic_blocks.len()); - let dominators = body.basic_blocks.dominators(); - // Only visit reachable blocks. - for (bb, bbdata) in traversal::preorder(body) { - for succ in bbdata.terminator().successors() { - if dominators.dominates(succ, bb) { - loop_headers.insert(succ); - } - } - } - loop_headers -} diff --git a/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff index 1a53667624aac..92e5ccabedf9e 100644 --- a/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff +++ b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff @@ -71,7 +71,7 @@ StorageLive(_12); _12 = copy _7; - _11 = Value::V0(move _12); -+ _11 = copy (*_3); ++ _11 = Value::V0(copy _7); StorageDead(_12); StorageLive(_13); StorageLive(_14); diff --git a/tests/mir-opt/gvn_loop.rs b/tests/mir-opt/gvn_loop.rs index a993f9b53f839..6e9df55a968dc 100644 --- a/tests/mir-opt/gvn_loop.rs +++ b/tests/mir-opt/gvn_loop.rs @@ -1,4 +1,3 @@ -// skip-filecheck //@ test-mir-pass: GVN #![crate_type = "lib"] @@ -9,8 +8,17 @@ pub enum Value { V1, } +// Check that we do not use the dereferenced value of `val_alias` when returning. + // EMIT_MIR gvn_loop.loop_deref_mut.GVN.diff fn loop_deref_mut(val: &mut Value) -> Value { + // CHECK-LABEL: fn loop_deref_mut( + // CHECK: [[VAL_REF:_.*]] = get::( + // CHECK: [[V:_.*]] = copy (((*[[VAL_REF]]) as V0).0: i32); + // CEHCK-NOT: copy (*[[VAL_REF]]); + // CHECK: [[RET:_*]] = Value::V0(copy [[V]]); + // CEHCK-NOT: copy (*[[VAL_REF]]); + // CHECK: _0 = move [[RET]] let val_alias: &Value = get(val); let mut stop = false; let Value::V0(v) = *val_alias else { unsafe { core::intrinsics::unreachable() } }; diff --git a/tests/ui/mir/gvn-loop-miscompile.rs b/tests/ui/mir/gvn-loop-miscompile.rs index f24858918b16c..8e987c5c94662 100644 --- a/tests/ui/mir/gvn-loop-miscompile.rs +++ b/tests/ui/mir/gvn-loop-miscompile.rs @@ -1,5 +1,5 @@ //@ compile-flags: -O -//@ run-fail +//@ run-pass pub enum Value { V0(i32), From b6d30faa798bcc42fbd1e9875e2b15d23b2fd11a Mon Sep 17 00:00:00 2001 From: ltdk Date: Wed, 22 Oct 2025 20:27:46 -0400 Subject: [PATCH 29/37] Revert inference failure from AsRef constification (cherry picked from commit cb7fb35ad1b567f02d8f2226df173736fba86850) --- library/alloc/src/borrow.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs index cb32896161e5c..4659fb2a8426d 100644 --- a/library/alloc/src/borrow.rs +++ b/library/alloc/src/borrow.rs @@ -441,11 +441,13 @@ where } } +// FIXME(inference): const bounds removed due to inference regressions found by crater; +// see https://github.com/rust-lang/rust/issues/147964 +// #[rustc_const_unstable(feature = "const_convert", issue = "143773")] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_convert", issue = "143773")] -impl const AsRef for Cow<'_, T> -where - T::Owned: [const] Borrow, +impl AsRef for Cow<'_, T> +// where +// T::Owned: [const] Borrow, { fn as_ref(&self) -> &T { self From 566809897fa37ae389c001c8ac26acb76f019da4 Mon Sep 17 00:00:00 2001 From: ltdk Date: Thu, 23 Oct 2025 03:22:56 -0400 Subject: [PATCH 30/37] Revert inference failure from Deref/Borrow constification (cherry picked from commit ebd5bea84fee777c5f79bb18e39f28b3f666206a) --- library/alloc/src/borrow.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs index 4659fb2a8426d..d2ab5412eeabc 100644 --- a/library/alloc/src/borrow.rs +++ b/library/alloc/src/borrow.rs @@ -16,12 +16,13 @@ use crate::fmt; #[cfg(not(no_global_oom_handling))] use crate::string::String; +// FIXME(inference): const bounds removed due to inference regressions found by crater; +// see https://github.com/rust-lang/rust/issues/147964 +// #[rustc_const_unstable(feature = "const_convert", issue = "143773")] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_convert", issue = "143773")] -impl<'a, B: ?Sized> const Borrow for Cow<'a, B> -where - B: ToOwned, - B::Owned: [const] Borrow, +impl<'a, B: ?Sized + ToOwned> Borrow for Cow<'a, B> +// where +// B::Owned: [const] Borrow, { fn borrow(&self) -> &B { &**self @@ -327,11 +328,13 @@ impl Cow<'_, B> { } } +// FIXME(inference): const bounds removed due to inference regressions found by crater; +// see https://github.com/rust-lang/rust/issues/147964 +// #[rustc_const_unstable(feature = "const_convert", issue = "143773")] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_convert", issue = "143773")] -impl const Deref for Cow<'_, B> -where - B::Owned: [const] Borrow, +impl Deref for Cow<'_, B> +// where +// B::Owned: [const] Borrow, { type Target = B; From 21ffe30cd5e9e8b5f03454ea0cae6dc4f8cfb33a Mon Sep 17 00:00:00 2001 From: ltdk Date: Thu, 23 Oct 2025 18:24:39 -0400 Subject: [PATCH 31/37] Add regression test for inference failures (cherry picked from commit 4a4f3b0e8e9609136c10a190c3f5572d70bb33ee) --- .../generic-cow-inference-regression.rs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/ui/traits/generic-cow-inference-regression.rs diff --git a/tests/ui/traits/generic-cow-inference-regression.rs b/tests/ui/traits/generic-cow-inference-regression.rs new file mode 100644 index 0000000000000..6fd4715f85bbd --- /dev/null +++ b/tests/ui/traits/generic-cow-inference-regression.rs @@ -0,0 +1,20 @@ +//@ run-pass + +// regression test for #147964: +// constification of these traits resulted in inference errors due to additional where clauses + +use std::borrow::{Cow, Borrow}; + +pub fn generic_deref<'a, T: ToOwned, U>(cow: Cow<'a, T>) { + let _: &T = &cow; +} + +pub fn generic_borrow<'a, T: ToOwned, U>(cow: Cow<'a, T>) { + let _: &T = cow.borrow(); +} + +pub fn generic_as_ref<'a, T: ToOwned, U>(cow: Cow<'a, T>) { + let _: &T = cow.as_ref(); +} + +fn main() {} From c956a76bd66cf702ed58f8c61e09712740279f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Rakic?= Date: Thu, 23 Oct 2025 16:10:53 +0000 Subject: [PATCH 32/37] Revert "Auto merge of #146121 - Muscraft:filter-suggestion-parts, r=petrochenkov" This reverts commit 99317ef14d0be42fa4039eea7c5ce50cb4e9aee7, reversing changes made to 9cd272dc85320e85a8c83a1a338870de52c005f3. (cherry picked from commit a2b48332bac36ede29a14e3fbbed6a45f1527677) --- compiler/rustc_errors/src/diagnostic.rs | 5 ++++ compiler/rustc_errors/src/emitter.rs | 1 + compiler/rustc_errors/src/lib.rs | 27 +++++++------------ .../tests/ui/bool_assert_comparison.stderr | 12 ++++++--- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index ae23ef1e25536..96a4ed3218fbf 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -945,6 +945,11 @@ impl<'a, G: EmissionGuarantee> Diag<'a, G> { None, "Span must not be empty and have no suggestion", ); + debug_assert_eq!( + parts.array_windows().find(|[a, b]| a.span.overlaps(b.span)), + None, + "suggestion must not have overlapping parts", + ); self.push_suggestion(CodeSuggestion { substitutions: vec![Substitution { parts }], diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs index 93b1e6b761520..b94370e8e9b40 100644 --- a/compiler/rustc_errors/src/emitter.rs +++ b/compiler/rustc_errors/src/emitter.rs @@ -2354,6 +2354,7 @@ impl HumanEmitter { .sum(); let underline_start = (span_start_pos + start) as isize + offset; let underline_end = (span_start_pos + start + sub_len) as isize + offset; + assert!(underline_start >= 0 && underline_end >= 0); let padding: usize = max_line_num_len + 3; for p in underline_start..underline_end { if let DisplaySuggestion::Underline = show_code_change diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index 8869799ce90d9..a56e0f3fae132 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -381,17 +381,6 @@ impl CodeSuggestion { // Assumption: all spans are in the same file, and all spans // are disjoint. Sort in ascending order. substitution.parts.sort_by_key(|part| part.span.lo()); - // Verify the assumption that all spans are disjoint - assert_eq!( - substitution.parts.array_windows().find(|[a, b]| a.span.overlaps(b.span)), - None, - "all spans must be disjoint", - ); - - // Account for cases where we are suggesting the same code that's already - // there. This shouldn't happen often, but in some cases for multipart - // suggestions it's much easier to handle it here than in the origin. - substitution.parts.retain(|p| is_different(sm, &p.snippet, p.span)); // Find the bounding span. let lo = substitution.parts.iter().map(|part| part.span.lo()).min()?; @@ -481,12 +470,16 @@ impl CodeSuggestion { _ => 1, }) .sum(); - - line_highlight.push(SubstitutionHighlight { - start: (cur_lo.col.0 as isize + acc) as usize, - end: (cur_lo.col.0 as isize + acc + len) as usize, - }); - + if !is_different(sm, &part.snippet, part.span) { + // Account for cases where we are suggesting the same code that's already + // there. This shouldn't happen often, but in some cases for multipart + // suggestions it's much easier to handle it here than in the origin. + } else { + line_highlight.push(SubstitutionHighlight { + start: (cur_lo.col.0 as isize + acc) as usize, + end: (cur_lo.col.0 as isize + acc + len) as usize, + }); + } buf.push_str(&part.snippet); let cur_hi = sm.lookup_char_pos(part.span.hi()); // Account for the difference between the width of the current code and the diff --git a/src/tools/clippy/tests/ui/bool_assert_comparison.stderr b/src/tools/clippy/tests/ui/bool_assert_comparison.stderr index 72aa6303a2026..f823f08f31dca 100644 --- a/src/tools/clippy/tests/ui/bool_assert_comparison.stderr +++ b/src/tools/clippy/tests/ui/bool_assert_comparison.stderr @@ -272,8 +272,10 @@ LL | assert_eq!(a!(), true); | help: replace it with `assert!(..)` | -LL - assert_eq!(a!(), true); -LL + assert!(a!()); +LL | true +... +LL | +LL ~ assert!(a!()); | error: used `assert_eq!` with a literal bool @@ -284,8 +286,10 @@ LL | assert_eq!(true, b!()); | help: replace it with `assert!(..)` | -LL - assert_eq!(true, b!()); -LL + assert!(b!()); +LL | true +... +LL | +LL ~ assert!(b!()); | error: used `debug_assert_eq!` with a literal bool From 1dda76181e5c05f7d3c59a1de9e946bd340b3afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Rakic?= Date: Thu, 23 Oct 2025 16:33:56 +0000 Subject: [PATCH 33/37] add `crashes` tests for overlapping spans (cherry picked from commit dd83c576749c66061c2109b96ebec050bb8de5de) --- tests/crashes/146261.rs | 13 +++++++++++++ tests/crashes/146706.rs | 15 +++++++++++++++ tests/crashes/147973.rs | 14 ++++++++++++++ .../crashes/auxiliary/overlapping_spans_helper.rs | 15 +++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 tests/crashes/146261.rs create mode 100644 tests/crashes/146706.rs create mode 100644 tests/crashes/147973.rs create mode 100644 tests/crashes/auxiliary/overlapping_spans_helper.rs diff --git a/tests/crashes/146261.rs b/tests/crashes/146261.rs new file mode 100644 index 0000000000000..f901497a769c2 --- /dev/null +++ b/tests/crashes/146261.rs @@ -0,0 +1,13 @@ +// This is part of series of regression tests for some diagnostics ICEs encountered in the wild with +// suggestions having overlapping parts under https://github.com/rust-lang/rust/pull/146121. + +//@ needs-rustc-debug-assertions +//@ known-bug: #146261 + +enum U { + B(), +} + +fn main() { + A(U::C) +} diff --git a/tests/crashes/146706.rs b/tests/crashes/146706.rs new file mode 100644 index 0000000000000..358ce3e8600a8 --- /dev/null +++ b/tests/crashes/146706.rs @@ -0,0 +1,15 @@ +// This is part of series of regression tests for some diagnostics ICEs encountered in the wild with +// suggestions having overlapping parts under https://github.com/rust-lang/rust/pull/146121. + +//@ needs-rustc-debug-assertions +//@ known-bug: #146706 + +type Alias<'a, T> = Foo; + +enum Foo { + Bar { t: T }, +} + +fn main() { + Alias::Bar:: { t: 0 }; +} diff --git a/tests/crashes/147973.rs b/tests/crashes/147973.rs new file mode 100644 index 0000000000000..7271c54846f15 --- /dev/null +++ b/tests/crashes/147973.rs @@ -0,0 +1,14 @@ +// This is part of series of regression tests for some diagnostics ICEs encountered in the wild with +// suggestions having overlapping parts under https://github.com/rust-lang/rust/pull/146121. +// This is one MCVE from the beta crater run regressions from issue 147973. + +//@ needs-rustc-debug-assertions +//@ known-bug: #147973 + +//@ aux-build: overlapping_spans_helper.rs +extern crate overlapping_spans_helper; + +fn main() { + let _name = Some(1); + overlapping_spans_helper::do_loop!(_name); +} diff --git a/tests/crashes/auxiliary/overlapping_spans_helper.rs b/tests/crashes/auxiliary/overlapping_spans_helper.rs new file mode 100644 index 0000000000000..e449fcd36c376 --- /dev/null +++ b/tests/crashes/auxiliary/overlapping_spans_helper.rs @@ -0,0 +1,15 @@ +// Auxiliary lib for the issue 147973 regression test with ICEs due to overlapping spans. + +#[macro_export] +macro_rules! identity { + ($x:ident) => { + $x + }; +} + +#[macro_export] +macro_rules! do_loop { + ($x:ident) => { + for $crate::identity!($x) in $x {} + }; +} From 4bc789b5b1fbbbf1d448abcdd17970e97ae70c28 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 23 Oct 2025 12:23:30 -0700 Subject: [PATCH 34/37] Add a regression test for rust-lang/rust#147971 (cherry picked from commit a81ed52f5830b6a305ad8e8547196744d460afa0) --- library/std/tests/ambiguous-hash_map.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 library/std/tests/ambiguous-hash_map.rs diff --git a/library/std/tests/ambiguous-hash_map.rs b/library/std/tests/ambiguous-hash_map.rs new file mode 100644 index 0000000000000..bd5ae5a8957b5 --- /dev/null +++ b/library/std/tests/ambiguous-hash_map.rs @@ -0,0 +1,17 @@ +//! Make sure that a `std` macro `hash_map!` does not cause ambiguity +//! with a local glob import with the same name. +//! +//! See regression https://github.com/rust-lang/rust/issues/147971 + +mod module { + macro_rules! hash_map { + () => {}; + } + pub(crate) use hash_map; +} + +use module::*; + +fn main() { + hash_map! {} +} From 912aba687477596b3a83c93805ae9565650d5e5e Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 23 Oct 2025 12:23:59 -0700 Subject: [PATCH 35/37] Revert "feat: implement `hash_map!` macro" This reverts commit 066023e47c0c92e7edefd60831ce7d6f15f23750. (cherry picked from commit c01682ebf603355795e870afdc28bd0c3bfe2ef5) --- library/std/src/lib.rs | 2 -- library/std/src/macros.rs | 74 --------------------------------------- 2 files changed, 76 deletions(-) diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs index 33e3bf0c085da..39c76ddba568f 100644 --- a/library/std/src/lib.rs +++ b/library/std/src/lib.rs @@ -294,8 +294,6 @@ #![feature(ffi_const)] #![feature(formatting_options)] #![feature(funnel_shifts)] -#![feature(hash_map_internals)] -#![feature(hash_map_macro)] #![feature(if_let_guard)] #![feature(intra_doc_pointers)] #![feature(iter_advance_by)] diff --git a/library/std/src/macros.rs b/library/std/src/macros.rs index 254570ae9c836..25e2b7ea13703 100644 --- a/library/std/src/macros.rs +++ b/library/std/src/macros.rs @@ -379,77 +379,3 @@ macro_rules! dbg { ($($crate::dbg!($val)),+,) }; } - -#[doc(hidden)] -#[macro_export] -#[allow_internal_unstable(hash_map_internals)] -#[unstable(feature = "hash_map_internals", issue = "none")] -macro_rules! repetition_utils { - (@count $($tokens:tt),*) => {{ - [$($crate::repetition_utils!(@replace $tokens => ())),*].len() - }}; - - (@replace $x:tt => $y:tt) => { $y } -} - -/// Creates a [`HashMap`] containing the arguments. -/// -/// `hash_map!` allows specifying the entries that make -/// up the [`HashMap`] where the key and value are separated by a `=>`. -/// -/// The entries are separated by commas with a trailing comma being allowed. -/// -/// It is semantically equivalent to using repeated [`HashMap::insert`] -/// on a newly created hashmap. -/// -/// `hash_map!` will attempt to avoid repeated reallocations by -/// using [`HashMap::with_capacity`]. -/// -/// # Examples -/// -/// ```rust -/// #![feature(hash_map_macro)] -/// -/// let map = hash_map! { -/// "key" => "value", -/// "key1" => "value1" -/// }; -/// -/// assert_eq!(map.get("key"), Some(&"value")); -/// assert_eq!(map.get("key1"), Some(&"value1")); -/// assert!(map.get("brrrrrrooooommm").is_none()); -/// ``` -/// -/// And with a trailing comma -/// -///```rust -/// #![feature(hash_map_macro)] -/// -/// let map = hash_map! { -/// "key" => "value", // notice the , -/// }; -/// -/// assert_eq!(map.get("key"), Some(&"value")); -/// ``` -/// -/// The key and value are moved into the HashMap. -/// -/// [`HashMap`]: crate::collections::HashMap -/// [`HashMap::insert`]: crate::collections::HashMap::insert -/// [`HashMap::with_capacity`]: crate::collections::HashMap::with_capacity -#[macro_export] -#[allow_internal_unstable(hash_map_internals)] -#[unstable(feature = "hash_map_macro", issue = "144032")] -macro_rules! hash_map { - () => {{ - $crate::collections::HashMap::new() - }}; - - ( $( $key:expr => $value:expr ),* $(,)? ) => {{ - let mut map = $crate::collections::HashMap::with_capacity( - const { $crate::repetition_utils!(@count $($key),*) } - ); - $( map.insert($key, $value); )* - map - }} -} From 1e668e089dcc294fcc33daab6f0c4d40f0585aec Mon Sep 17 00:00:00 2001 From: Pierre Tardy Date: Thu, 23 Oct 2025 10:06:59 +0200 Subject: [PATCH 36/37] fix panic when rustc tries to reduce intermediate filenames length with multi byte chars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The issue cannot be reproduced with the former testcase of creating external crates because rust refuses to use "external crate 28_找出字符串中第一个匹配项的下标" because it is not a valid indentifier (starts with number, and contain non ascii chars) But still using 28_找出字符串中第一个匹配项的下标.rs as a filename is accepted by previous rustc releases So we consider it valid, and add an integration test for it to catch any regression on other code related to non ascii filenames. (cherry picked from commit c6acffeb785e3efa2909f5ec4a4452cb38ddde17) --- compiler/rustc_session/src/config.rs | 15 ++++++++--- compiler/rustc_session/src/lib.rs | 1 + tests/run-make/lto-long-filenames/rmake.rs | 2 -- tests/run-make/lto-long-filenames_cn/rmake.rs | 25 +++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 tests/run-make/lto-long-filenames_cn/rmake.rs diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index 297df7c2c9765..5e47559847e00 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -1207,13 +1207,22 @@ fn maybe_strip_file_name(mut path: PathBuf) -> PathBuf { if path.file_name().map_or(0, |name| name.len()) > MAX_FILENAME_LENGTH { let filename = path.file_name().unwrap().to_string_lossy(); let hash_len = 64 / 4; // Hash64 is 64 bits encoded in hex - let stripped_len = filename.len() - MAX_FILENAME_LENGTH + hash_len; + let hyphen_len = 1; // the '-' we insert between hash and suffix + + // number of bytes of suffix we can keep so that "hash-" fits + let allowed_suffix = MAX_FILENAME_LENGTH.saturating_sub(hash_len + hyphen_len); + + // number of bytes to remove from the start + let stripped_bytes = filename.len().saturating_sub(allowed_suffix); + + // ensure we don't cut in a middle of a char + let split_at = filename.ceil_char_boundary(stripped_bytes); let mut hasher = StableHasher::new(); - filename[..stripped_len].hash(&mut hasher); + filename[..split_at].hash(&mut hasher); let hash = hasher.finish::(); - path.set_file_name(format!("{:x}-{}", hash, &filename[stripped_len..])); + path.set_file_name(format!("{:x}-{}", hash, &filename[split_at..])); } path } diff --git a/compiler/rustc_session/src/lib.rs b/compiler/rustc_session/src/lib.rs index 5e5872ee06815..ac11e792fc2e3 100644 --- a/compiler/rustc_session/src/lib.rs +++ b/compiler/rustc_session/src/lib.rs @@ -1,5 +1,6 @@ // tidy-alphabetical-start #![allow(internal_features)] +#![cfg_attr(bootstrap, feature(round_char_boundary))] #![feature(default_field_values)] #![feature(iter_intersperse)] #![feature(rustc_attrs)] diff --git a/tests/run-make/lto-long-filenames/rmake.rs b/tests/run-make/lto-long-filenames/rmake.rs index 9e0ba63e9f5b8..98ce54e5efc82 100644 --- a/tests/run-make/lto-long-filenames/rmake.rs +++ b/tests/run-make/lto-long-filenames/rmake.rs @@ -9,8 +9,6 @@ //@ ignore-cross-compile -use std::fs; - use run_make_support::{rfs, rustc}; // This test make sure we don't get such following error: diff --git a/tests/run-make/lto-long-filenames_cn/rmake.rs b/tests/run-make/lto-long-filenames_cn/rmake.rs new file mode 100644 index 0000000000000..fc25a2ac166b2 --- /dev/null +++ b/tests/run-make/lto-long-filenames_cn/rmake.rs @@ -0,0 +1,25 @@ +//@ ignore-cross-compile +// gnu ld is confused with intermediate files having multibytes characters in their names: +// = note: ld.exe: cannot find f0d5ff18d6510ebc-???_???_??????????_?_?????_?_???????.d50c2 \ +// 4c0c4ea93cc-cgu.0.rcgu.o: Invalid argument +// as this is not something rustc can fix by itself, +// we just skip the test on windows-gnu for now. Hence: +//@ ignore-windows-gnu + +use run_make_support::{rfs, rustc}; + +// This test make sure we don't crash when lto creates output files with long names. +// cn characters can be multi-byte and thus trigger the long filename reduction code more easily. +// we need to make sure that the code is properly generating names at char boundaries. +// as reported in issue #147975 +fn main() { + let lto_flags = ["-Clto", "-Clto=yes", "-Clto=off", "-Clto=thin", "-Clto=fat"]; + for prefix_len in 0..4 { + let prefix: String = std::iter::repeat("_").take(prefix_len).collect(); + let main_file = format!("{}ⵅⴻⵎⵎⴻⵎ_ⴷⵉⵎⴰ_ⵖⴻⴼ_ⵢⵉⵙⴻⴽⴽⵉⵍⴻⵏ_ⵏ_ⵡⴰⵟⴰⵙ_ⵏ_ⵢⵉⴱⵢⵜⴻⵏ.rs", prefix); + rfs::write(&main_file, "fn main() {}\n"); + for flag in lto_flags { + rustc().input(&main_file).arg(flag).run(); + } + } +} From 6ab240d3299b4b6953dc8140f1f40d62beee7fab Mon Sep 17 00:00:00 2001 From: Theemathas Chirananthavat Date: Mon, 27 Oct 2025 21:49:39 +0700 Subject: [PATCH 37/37] [beta-1.91] Add more context to the temporary lifetime extension FCW Mention in the FCW that the lifetime extension behavior was wrong since 1.88/1.89. --- compiler/rustc_borrowck/src/diagnostics/mod.rs | 1 + .../extended-super-let-bindings.stderr | 1 + .../macro-extended-temporary-scopes.e2021.stderr | 7 +++++++ .../macro-extended-temporary-scopes.e2024.stderr | 15 +++++++++++++++ .../user-defined-macros.stderr | 4 ++++ 5 files changed, 28 insertions(+) diff --git a/compiler/rustc_borrowck/src/diagnostics/mod.rs b/compiler/rustc_borrowck/src/diagnostics/mod.rs index e85945d633b66..3827c7268c228 100644 --- a/compiler/rustc_borrowck/src/diagnostics/mod.rs +++ b/compiler/rustc_borrowck/src/diagnostics/mod.rs @@ -1607,6 +1607,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> { tcx.node_span_lint(MACRO_EXTENDED_TEMPORARY_SCOPES, lint_root, labels, |diag| { diag.primary_message("temporary lifetime will be shortened in Rust 1.92"); diag.note("consider using a `let` binding to create a longer lived value"); + diag.note("some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()`"); }); } } diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr index 4dee6f4fc3212..038839eb92409 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr @@ -9,6 +9,7 @@ LL | println!("{:?}{}", (), { format_args!("{:?}", ()) }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default warning: 1 warning emitted diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr index c7a7e1b3238e9..1c890daeaa52b 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr @@ -9,6 +9,7 @@ LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -23,6 +24,7 @@ LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:39:43 @@ -35,6 +37,7 @@ LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:58:17 @@ -48,6 +51,7 @@ LL | } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:54:14 @@ -61,6 +65,7 @@ LL | } else { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:50:14 @@ -74,6 +79,7 @@ LL | } else if cond() { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:46:14 @@ -87,6 +93,7 @@ LL | } else if cond() { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: 7 warnings emitted diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr index 0c61fd8d1b0e1..bd086e08956fd 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr @@ -9,6 +9,7 @@ LL | println!("{:?}{:?}", { &temp() }, ()); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default warning: temporary lifetime will be shortened in Rust 1.92 @@ -22,6 +23,7 @@ LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) warning: temporary lifetime will be shortened in Rust 1.92 @@ -35,6 +37,7 @@ LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:39:43 @@ -47,6 +50,7 @@ LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:58:17 @@ -60,6 +64,7 @@ LL | } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:54:14 @@ -73,6 +78,7 @@ LL | } else { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:50:14 @@ -86,6 +92,7 @@ LL | } else if cond() { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:46:14 @@ -99,6 +106,7 @@ LL | } else if cond() { = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:65:18 @@ -111,6 +119,7 @@ LL | pin!(pin!({ &temp() })); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:96:13 @@ -123,6 +132,7 @@ LL | pin!({ &(1 / 0) }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:99:17 @@ -135,6 +145,7 @@ LL | pin!({ &mut [()] }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:102:13 @@ -147,6 +158,7 @@ LL | pin!({ &Some(String::new()) }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:105:13 @@ -159,6 +171,7 @@ LL | pin!({ &(|| ())() }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:108:13 @@ -171,6 +184,7 @@ LL | pin!({ &|| &local }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/macro-extended-temporary-scopes.rs:111:13 @@ -183,6 +197,7 @@ LL | pin!({ &CONST_STRING }); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: 15 warnings emitted diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr index b4996952f4f11..313f7a6638150 100644 --- a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr @@ -10,6 +10,7 @@ LL | wrap!(String::new()) = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default warning: temporary lifetime will be shortened in Rust 1.92 @@ -27,6 +28,7 @@ LL | print_with_internal_wrap!(); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: this warning originates in the macro `print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) warning: temporary lifetime will be shortened in Rust 1.92 @@ -41,6 +43,7 @@ LL | external_macros::wrap!(String::new()) = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` warning: temporary lifetime will be shortened in Rust 1.92 --> $DIR/user-defined-macros.rs:52:5 @@ -54,6 +57,7 @@ LL | external_macros::print_with_internal_wrap!(); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see = note: consider using a `let` binding to create a longer lived value + = note: some temporaries were previously incorrectly lifetime-extended since Rust 1.89 in formatting macros, and since Rust 1.88 in `pin!()` = note: this warning originates in the macro `external_macros::print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) warning: 4 warnings emitted