From 60ab31a80dd16720b2ea7b805b16607b66ffd2d0 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sun, 5 Jul 2026 16:55:05 -0400 Subject: [PATCH 1/5] replace-version-placeholder --- compiler/rustc_feature/src/removed.rs | 2 +- compiler/rustc_feature/src/unstable.rs | 18 +++++------ library/alloc/src/boxed.rs | 4 +-- library/alloc/src/string.rs | 8 ++--- library/core/src/bool.rs | 4 +-- library/core/src/fmt/mod.rs | 2 +- library/core/src/fmt/num.rs | 8 ++--- library/core/src/fmt/num_buffer.rs | 14 ++++---- library/core/src/num/f32.rs | 20 ++++++------ library/core/src/num/f64.rs | 20 ++++++------ library/core/src/num/nonzero.rs | 4 +-- library/core/src/option.rs | 2 +- library/core/src/range.rs | 4 +-- library/core/src/range/legacy.rs | 2 +- library/core/src/result.rs | 2 +- library/core/src/slice/mod.rs | 4 +-- library/core/src/str/mod.rs | 4 +-- library/core/src/sync/atomic.rs | 18 +++++------ library/std/src/env.rs | 4 +-- library/std/src/path.rs | 4 +-- .../src/arm_shared/neon/generated.rs | 32 +++++++++---------- .../crates/core_arch/src/loongarch64/mod.rs | 16 +++++----- .../spec/neon/arm_shared.spec.yml | 8 ++--- 23 files changed, 102 insertions(+), 102 deletions(-) diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index ab24b0ed37d22..5320f46c8c314 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -107,7 +107,7 @@ declare_features! ( /// Allows deriving traits as per `SmartPointer` specification (removed, derive_smart_pointer, "1.84.0", Some(123430), Some("replaced by `CoercePointee`"), 131284), /// Allows macros to customize macro argument matcher diagnostics. - (removed, diagnostic_on_unmatch_args, "CURRENT_RUSTC_VERSION", Some(155642), Some("renamed to `diagnostic_on_unmatched_args`"), 157887), + (removed, diagnostic_on_unmatch_args, "1.98.0", Some(155642), Some("renamed to `diagnostic_on_unmatched_args`"), 157887), /// Tells rustdoc to automatically generate `#[doc(cfg(...))]`. (removed, doc_auto_cfg, "1.92.0", Some(43781), Some("merged into `doc_cfg`"), 138907), /// Allows `#[doc(cfg_hide(...))]`. diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 123e89e297034..01a4a7c499da0 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -457,7 +457,7 @@ declare_features! ( /// Allows to use the `#[cfi_encoding = ""]` attribute. (unstable, cfi_encoding, "1.71.0", Some(89653)), /// The `clflushopt` target feature on x86. - (unstable, clflushopt_target_feature, "CURRENT_RUSTC_VERSION", Some(157096)), + (unstable, clflushopt_target_feature, "1.98.0", Some(157096)), /// Allows `for<...>` on closures and coroutines. (unstable, closure_lifetime_binder, "1.64.0", Some(97362)), /// Allows `#[track_caller]` on closures and coroutines. @@ -515,7 +515,7 @@ declare_features! ( /// Allows giving on-move borrowck custom diagnostic messages for a type (unstable, diagnostic_on_move, "1.96.0", Some(154181)), /// Allows giving custom types diagnostic messages on type errors - (unstable, diagnostic_on_type_error, "CURRENT_RUSTC_VERSION", Some(155382)), + (unstable, diagnostic_on_type_error, "1.98.0", Some(155382)), /// Allows giving unresolved imports a custom diagnostic message (unstable, diagnostic_on_unknown, "1.96.0", Some(152900)), /// Allows macros to customize macro argument matcher diagnostics. @@ -600,7 +600,7 @@ declare_features! ( /// Allows associated types in inherent impls. (incomplete, inherent_associated_types, "1.52.0", Some(8995)), /// Enable #[instrument_fn] on function. - (unstable, instrument_fn, "CURRENT_RUSTC_VERSION", Some(157081)), + (unstable, instrument_fn, "1.98.0", Some(157081)), /// Allows using `pointer` and `reference` in intra-doc links (unstable, intra_doc_pointers, "1.51.0", Some(80896)), /// lahfsahf target feature on x86. @@ -615,7 +615,7 @@ declare_features! ( /// Target features on loongarch. (unstable, loongarch_target_feature, "1.73.0", Some(150252)), /// Allows use of loop optimization hints via attributes. - (unstable, loop_hints, "CURRENT_RUSTC_VERSION", Some(156874)), + (unstable, loop_hints, "1.98.0", Some(156874)), /// Allows fused `loop`/`match` for direct intraprocedural jumps. (incomplete, loop_match, "1.90.0", Some(132306)), /// Target features on m68k. @@ -659,7 +659,7 @@ declare_features! ( /// Allows `mut ref` and `mut ref mut` identifier patterns. (incomplete, mut_ref, "1.79.0", Some(123076)), /// Allows `mut(crate) field: Type` restrictions. - (incomplete, mut_restriction, "CURRENT_RUSTC_VERSION", Some(105077)), + (incomplete, mut_restriction, "1.98.0", Some(105077)), /// Allows using `#[naked]` on `extern "Rust"` functions. (unstable, naked_functions_rustic_abi, "1.88.0", Some(138997)), /// Allows using `#[target_feature(enable = "...")]` on `#[naked]` on functions. @@ -720,7 +720,7 @@ declare_features! ( /// Allows `extern "rust-preserve-none"`. (unstable, rust_preserve_none_cc, "1.95.0", Some(151401)), /// Allows `extern "tail"`. - (unstable, rust_tail_cc, "CURRENT_RUSTC_VERSION", Some(157427)), + (unstable, rust_tail_cc, "1.98.0", Some(157427)), /// Target features on s390x. (unstable, s390x_target_feature, "1.82.0", Some(150259)), /// Allows the use of the `sanitize` attribute. @@ -733,7 +733,7 @@ declare_features! ( (incomplete, specialization, "1.7.0", Some(31844)), /// Experimental "splatting" of function call arguments at the call site. /// e.g. `foo(a, b, c)` calls `#[splat] fn foo((a: A, b: B, c: C))`. - (incomplete, splat, "CURRENT_RUSTC_VERSION", Some(153629)), + (incomplete, splat, "1.98.0", Some(153629)), /// Allows using `#[rustc_align_static(...)]` on static items. (unstable, static_align, "1.91.0", Some(146177)), /// Allows attributes on expressions and non-item statements. @@ -764,7 +764,7 @@ declare_features! ( /// not changed from prior instances of the same struct (RFC #2528) (unstable, type_changing_struct_update, "1.58.0", Some(86555)), /// Allows using `_ = ` enum variants. - (incomplete, unnamed_enum_variants, "CURRENT_RUSTC_VERSION", Some(156628)), + (incomplete, unnamed_enum_variants, "1.98.0", Some(156628)), /// Allows using `unsafe<'a> &'a T` unsafe binder types. (incomplete, unsafe_binders, "1.85.0", Some(130516)), /// Allows declaring fields `unsafe`. @@ -789,7 +789,7 @@ declare_features! ( /// Allows use of the `xop` target-feature (unstable, xop_target_feature, "1.81.0", Some(127208)), /// Allows use of the Xtensa target-features - (unstable, xtensa_target_feature, "CURRENT_RUSTC_VERSION", Some(157063)), + (unstable, xtensa_target_feature, "1.98.0", Some(157063)), /// Allows `do yeet` expressions (unstable, yeet_expr, "1.62.0", Some(96373)), (unstable, yield_expr, "1.87.0", Some(43122)), diff --git a/library/alloc/src/boxed.rs b/library/alloc/src/boxed.rs index 58da047da8e20..4ee41bc807243 100644 --- a/library/alloc/src/boxed.rs +++ b/library/alloc/src/boxed.rs @@ -1780,7 +1780,7 @@ impl Box { /// [`as_ptr`]: Self::as_ptr /// [`as_non_null`]: Self::as_non_null #[must_use] - #[stable(feature = "box_as_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "box_as_ptr", since = "1.98.0")] #[rustc_never_returns_null_ptr] #[rustc_as_ptr] #[inline] @@ -1829,7 +1829,7 @@ impl Box { /// [`as_ptr`]: Self::as_ptr /// [`as_non_null`]: Self::as_non_null #[must_use] - #[stable(feature = "box_as_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "box_as_ptr", since = "1.98.0")] #[rustc_never_returns_null_ptr] #[rustc_as_ptr] #[inline] diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index eb00db4568b63..1dd6963e3b64a 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -787,7 +787,7 @@ impl String { /// assert!(String::from_utf16le(v).is_err()); /// ``` #[cfg(not(no_global_oom_handling))] - #[stable(feature = "str_from_utf16_endian", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "str_from_utf16_endian", since = "1.98.0")] pub fn from_utf16le(v: &[u8]) -> Result { let (chunks, []) = v.as_chunks::<2>() else { return Err(FromUtf16Error { kind: FromUtf16ErrorKind::OddBytes }); @@ -825,7 +825,7 @@ impl String { /// String::from_utf16le_lossy(v)); /// ``` #[cfg(not(no_global_oom_handling))] - #[stable(feature = "str_from_utf16_endian", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "str_from_utf16_endian", since = "1.98.0")] pub fn from_utf16le_lossy(v: &[u8]) -> String { match (cfg!(target_endian = "little"), unsafe { v.align_to::() }) { (true, ([], v, [])) => Self::from_utf16_lossy(v), @@ -860,7 +860,7 @@ impl String { /// assert!(String::from_utf16be(v).is_err()); /// ``` #[cfg(not(no_global_oom_handling))] - #[stable(feature = "str_from_utf16_endian", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "str_from_utf16_endian", since = "1.98.0")] pub fn from_utf16be(v: &[u8]) -> Result { let (chunks, []) = v.as_chunks::<2>() else { return Err(FromUtf16Error { kind: FromUtf16ErrorKind::OddBytes }); @@ -898,7 +898,7 @@ impl String { /// String::from_utf16be_lossy(v)); /// ``` #[cfg(not(no_global_oom_handling))] - #[stable(feature = "str_from_utf16_endian", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "str_from_utf16_endian", since = "1.98.0")] pub fn from_utf16be_lossy(v: &[u8]) -> String { match (cfg!(target_endian = "big"), unsafe { v.align_to::() }) { (true, ([], v, [])) => Self::from_utf16_lossy(v), diff --git a/library/core/src/bool.rs b/library/core/src/bool.rs index 751b8d0f1b762..10ef8e3b33b53 100644 --- a/library/core/src/bool.rs +++ b/library/core/src/bool.rs @@ -93,7 +93,7 @@ impl bool { /// // evaluated eagerly. /// assert_eq!(a, 2); /// ``` - #[stable(feature = "bool_to_result", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "bool_to_result", since = "1.98.0")] #[rustc_const_unstable(feature = "const_bool", issue = "151531")] #[inline] pub const fn ok_or(self, err: E) -> Result<(), E> { @@ -120,7 +120,7 @@ impl bool { /// // `ok_or_else`. /// assert_eq!(a, 1); /// ``` - #[stable(feature = "bool_to_result", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "bool_to_result", since = "1.98.0")] #[rustc_const_unstable(feature = "const_bool", issue = "151531")] #[inline] pub const fn ok_or_else E + [const] Destruct>( diff --git a/library/core/src/fmt/mod.rs b/library/core/src/fmt/mod.rs index 4671e04062fb0..4d000691b8b5f 100644 --- a/library/core/src/fmt/mod.rs +++ b/library/core/src/fmt/mod.rs @@ -36,7 +36,7 @@ pub enum Alignment { Center, } -#[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "int_format_into", since = "1.98.0")] pub use num_buffer::NumBuffer; #[unstable(feature = "fmt_internals", issue = "none")] pub use num_buffer::NumBufferTrait; diff --git a/library/core/src/fmt/num.rs b/library/core/src/fmt/num.rs index 050822da8f12a..61c9cd7923e5f 100644 --- a/library/core/src/fmt/num.rs +++ b/library/core/src/fmt/num.rs @@ -272,7 +272,7 @@ macro_rules! impl_Display { #[doc = concat!("let n2 = ", stringify!($Signed::MAX), ";")] #[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($Signed::MAX), ".to_string());")] /// ``` - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] pub fn format_into(self, buf: &mut NumBuffer) -> &str { let mut offset; @@ -316,7 +316,7 @@ macro_rules! impl_Display { #[doc = concat!("let n2 = ", stringify!($Unsigned::MAX), ";")] #[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($Unsigned::MAX), ".to_string());")] /// ``` - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] pub fn format_into(self, buf: &mut NumBuffer) -> &str { let offset; @@ -756,7 +756,7 @@ impl u128 { /// let mut buf2 = NumBuffer::new(); /// assert_eq!(n2.format_into(&mut buf2), u128::MAX.to_string()); /// ``` - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] pub fn format_into(self, buf: &mut NumBuffer) -> &str { let diff = buf.buf.len() - U128_MAX_DEC_N; // FIXME: Once const generics are better, use `NumberBufferTrait::BUF_SIZE` as generic const @@ -788,7 +788,7 @@ impl i128 { /// let n2 = i128::MAX; /// assert_eq!(n2.format_into(&mut buf), i128::MAX.to_string()); /// ``` - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] pub fn format_into(self, buf: &mut NumBuffer) -> &str { let diff = buf.buf.len() - U128_MAX_DEC_N; // FIXME: Once const generics are better, use `NumberBufferTrait::BUF_SIZE` as generic const diff --git a/library/core/src/fmt/num_buffer.rs b/library/core/src/fmt/num_buffer.rs index 624a953062332..7d42091b05086 100644 --- a/library/core/src/fmt/num_buffer.rs +++ b/library/core/src/fmt/num_buffer.rs @@ -14,13 +14,13 @@ pub trait NumBufferTrait { macro_rules! impl_NumBufferTrait { ($($signed:ident, $unsigned:ident,)*) => { $( - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] impl NumBufferTrait for $signed { // `+ 2` and not `+ 1` to include the `-` character. const DEFAULT: Self::Buf = [MaybeUninit::::uninit(); $signed::MAX.ilog10() as usize + 2]; type Buf = [MaybeUninit; $signed::MAX.ilog10() as usize + 2]; } - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] impl NumBufferTrait for $unsigned { const DEFAULT: Self::Buf = [MaybeUninit::::uninit(); $unsigned::MAX.ilog10() as usize + 1]; type Buf = [MaybeUninit; $unsigned::MAX.ilog10() as usize + 1]; @@ -55,24 +55,24 @@ impl_NumBufferTrait! { /// let n2 = -1972i32; /// assert_eq!(n2.format_into(&mut buf), "-1972"); /// ``` -#[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "int_format_into", since = "1.98.0")] pub struct NumBuffer { pub(crate) buf: T::Buf, phantom: core::marker::PhantomData, } -#[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "int_format_into", since = "1.98.0")] impl core::fmt::Debug for NumBuffer { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_struct("NumBuffer").finish() } } -#[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "int_format_into", since = "1.98.0")] impl NumBuffer { /// Initializes internal buffer. - #[stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "int_format_into", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "int_format_into", since = "1.98.0")] + #[rustc_const_stable(feature = "int_format_into", since = "1.98.0")] pub const fn new() -> Self { NumBuffer { buf: T::DEFAULT, phantom: core::marker::PhantomData } } diff --git a/library/core/src/num/f32.rs b/library/core/src/num/f32.rs index 92ecabc581839..97bf54ecde47a 100644 --- a/library/core/src/num/f32.rs +++ b/library/core/src/num/f32.rs @@ -1694,8 +1694,8 @@ impl f32 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_add(self, rhs: f32) -> f32 { intrinsics::fadd_algebraic(self, rhs) @@ -1705,8 +1705,8 @@ impl f32 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_sub(self, rhs: f32) -> f32 { intrinsics::fsub_algebraic(self, rhs) @@ -1716,8 +1716,8 @@ impl f32 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_mul(self, rhs: f32) -> f32 { intrinsics::fmul_algebraic(self, rhs) @@ -1727,8 +1727,8 @@ impl f32 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_div(self, rhs: f32) -> f32 { intrinsics::fdiv_algebraic(self, rhs) @@ -1738,8 +1738,8 @@ impl f32 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_rem(self, rhs: f32) -> f32 { intrinsics::frem_algebraic(self, rhs) diff --git a/library/core/src/num/f64.rs b/library/core/src/num/f64.rs index 6470658d3ea35..15ad61fe3e6e3 100644 --- a/library/core/src/num/f64.rs +++ b/library/core/src/num/f64.rs @@ -1674,8 +1674,8 @@ impl f64 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_add(self, rhs: f64) -> f64 { intrinsics::fadd_algebraic(self, rhs) @@ -1685,8 +1685,8 @@ impl f64 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_sub(self, rhs: f64) -> f64 { intrinsics::fsub_algebraic(self, rhs) @@ -1696,8 +1696,8 @@ impl f64 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_mul(self, rhs: f64) -> f64 { intrinsics::fmul_algebraic(self, rhs) @@ -1707,8 +1707,8 @@ impl f64 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_div(self, rhs: f64) -> f64 { intrinsics::fdiv_algebraic(self, rhs) @@ -1718,8 +1718,8 @@ impl f64 { /// /// See [algebraic operators](primitive@f32#algebraic-operators) for more info. #[must_use = "method returns a new number and does not mutate the original value"] - #[stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "float_algebraic", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "float_algebraic", since = "1.98.0")] + #[rustc_const_stable(feature = "float_algebraic", since = "1.98.0")] #[inline] pub const fn algebraic_rem(self, rhs: f64) -> f64 { intrinsics::frem_algebraic(self, rhs) diff --git a/library/core/src/num/nonzero.rs b/library/core/src/num/nonzero.rs index 5863fd57e71e6..011ca94411b24 100644 --- a/library/core/src/num/nonzero.rs +++ b/library/core/src/num/nonzero.rs @@ -1390,8 +1390,8 @@ macro_rules! nonzero_integer { /// # #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str_radix(\"1 \", 10).is_err());")] /// ``` - #[stable(feature = "nonzero_from_str_radix", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "nonzero_from_str_radix", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "nonzero_from_str_radix", since = "1.98.0")] + #[rustc_const_stable(feature = "nonzero_from_str_radix", since = "1.98.0")] #[inline] pub const fn from_str_radix(src: &str, radix: u32) -> Result { Self::from_ascii_radix(src.as_bytes(), radix) diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 9e7a8d4472d81..5d86f851dbd1d 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -1293,7 +1293,7 @@ impl Option { /// /// [default value]: Default::default #[inline] - #[stable(feature = "result_option_map_or_default", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "result_option_map_or_default", since = "1.98.0")] #[rustc_const_unstable(feature = "const_option_ops", issue = "143956")] pub const fn map_or_default(self, f: F) -> U where diff --git a/library/core/src/range.rs b/library/core/src/range.rs index 07f423edcfea1..557587b4e9a88 100644 --- a/library/core/src/range.rs +++ b/library/core/src/range.rs @@ -20,7 +20,7 @@ use crate::hash::Hash; mod iter; -#[stable(feature = "new_range_api_legacy", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "new_range_api_legacy", since = "1.98.0")] pub mod legacy; use core::ops::Bound::{self, Excluded, Included, Unbounded}; @@ -40,7 +40,7 @@ use crate::iter::Step; // FIXME(range_into_bounds): Ditto. Also consider re-exporting `RangeBounds` and related. use crate::ops::{IntoBounds, OneSidedRange, OneSidedRangeBound, RangeBounds}; #[doc(inline)] -#[stable(feature = "new_range_api_exports", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "new_range_api_exports", since = "1.98.0")] pub use crate::ops::{RangeFull, RangeTo}; /// A (half-open) range bounded inclusively below and exclusively above. diff --git a/library/core/src/range/legacy.rs b/library/core/src/range/legacy.rs index 03f024354479d..c1bac705f80b3 100644 --- a/library/core/src/range/legacy.rs +++ b/library/core/src/range/legacy.rs @@ -7,5 +7,5 @@ //! The types here are equivalent to those in [`core::ops`]. #[doc(inline)] -#[stable(feature = "new_range_api_legacy", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "new_range_api_legacy", since = "1.98.0")] pub use crate::ops::{Range, RangeFrom, RangeInclusive, RangeToInclusive}; diff --git a/library/core/src/result.rs b/library/core/src/result.rs index a1915fb2a792c..867b4d1a8eb88 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -921,7 +921,7 @@ impl Result { /// /// [default value]: Default::default #[inline] - #[stable(feature = "result_option_map_or_default", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "result_option_map_or_default", since = "1.98.0")] #[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")] pub const fn map_or_default(self, f: F) -> U where diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index 25889994be977..c050f240f2dce 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -2759,7 +2759,7 @@ impl [T] { /// assert_eq!(v.strip_circumfix(&[10, 50, 40], &[50, 40, 30]), None); /// ``` #[must_use = "returns the subslice without modifying the original"] - #[stable(feature = "strip_circumfix", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strip_circumfix", since = "1.98.0")] pub fn strip_circumfix(&self, prefix: &P, suffix: &S) -> Option<&[T]> where T: PartialEq, @@ -5321,7 +5321,7 @@ impl [T] { /// assert_eq!(iter.next(), Some(Range { start: 5, end: 6 })); /// ``` #[must_use] - #[stable(feature = "substr_range", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "substr_range", since = "1.98.0")] pub fn subslice_range(&self, subslice: &[T]) -> Option> { if T::IS_ZST { panic!("elements are zero-sized"); diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index 2128ce328a9c6..c465e3cb0a230 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -2519,7 +2519,7 @@ impl str { /// ``` #[must_use = "this returns the remaining substring as a new slice, \ without modifying the original"] - #[stable(feature = "strip_circumfix", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strip_circumfix", since = "1.98.0")] pub fn strip_circumfix(&self, prefix: P, suffix: S) -> Option<&str> where for<'a> S::Searcher<'a>: ReverseSearcher<'a>, @@ -3207,7 +3207,7 @@ impl str { /// assert_eq!(iter.next(), Some(Range { start: 9, end: 10 })); /// ``` #[must_use] - #[stable(feature = "substr_range", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "substr_range", since = "1.98.0")] pub fn substr_range(&self, substr: &str) -> Option> { self.as_bytes().subslice_range(substr.as_bytes()) } diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index 802d38e3994b3..37b800df94758 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -617,7 +617,7 @@ impl AtomicBool { /// ``` #[inline] #[cfg(target_has_atomic_primitive_alignment = "8")] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut(v: &mut bool) -> &mut Self { // SAFETY: the mutable reference guarantees unique ownership, and // alignment of both `bool` and `Self` is 1. @@ -651,7 +651,7 @@ impl AtomicBool { /// }); /// ``` #[inline] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn get_mut_slice(this: &mut [Self]) -> &mut [bool] { // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *(this as *mut [Self] as *mut [bool]) } @@ -675,7 +675,7 @@ impl AtomicBool { /// ``` #[inline] #[cfg(target_has_atomic_primitive_alignment = "8")] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut_slice(v: &mut [bool]) -> &mut [Self] { // SAFETY: the mutable reference guarantees unique ownership, and // alignment of both `bool` and `Self` is 1. @@ -1585,7 +1585,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic_primitive_alignment = "ptr")] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut(v: &mut *mut T) -> &mut Self { let [] = [(); align_of::>() - align_of::<*mut ()>()]; // SAFETY: @@ -1628,7 +1628,7 @@ impl AtomicPtr { /// }); /// ``` #[inline] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn get_mut_slice(this: &mut [Self]) -> &mut [*mut T] { // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *(this as *mut [Self] as *mut [*mut T]) } @@ -1662,7 +1662,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic_primitive_alignment = "ptr")] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut_slice(v: &mut [*mut T]) -> &mut [Self] { // SAFETY: // - the mutable reference guarantees unique ownership. @@ -2725,7 +2725,7 @@ macro_rules! atomic_int { /// #[inline] #[$cfg_align] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut(v: &mut $int_type) -> &mut Self { let [] = [(); align_of::() - align_of::<$int_type>()]; // SAFETY: @@ -2764,7 +2764,7 @@ macro_rules! atomic_int { /// }); /// ``` #[inline] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn get_mut_slice(this: &mut [Self]) -> &mut [$int_type] { // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *(this as *mut [Self] as *mut [$int_type]) } @@ -2798,7 +2798,7 @@ macro_rules! atomic_int { /// ``` #[inline] #[$cfg_align] - #[stable(feature = "atomic_from_mut", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "atomic_from_mut", since = "1.98.0")] pub fn from_mut_slice(v: &mut [$int_type]) -> &mut [Self] { let [] = [(); align_of::() - align_of::<$int_type>()]; // SAFETY: diff --git a/library/std/src/env.rs b/library/std/src/env.rs index fa5dfd8b76ec1..f5c60f7562d4a 100644 --- a/library/std/src/env.rs +++ b/library/std/src/env.rs @@ -101,10 +101,10 @@ pub struct VarsOs { inner: env_imp::Env, } -#[stable(feature = "env_vars_unimpl_send_sync", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "env_vars_unimpl_send_sync", since = "1.98.0")] impl !Send for VarsOs {} -#[stable(feature = "env_vars_unimpl_send_sync", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "env_vars_unimpl_send_sync", since = "1.98.0")] impl !Sync for VarsOs {} /// Returns an iterator of (variable, value) pairs of strings, for all the diff --git a/library/std/src/path.rs b/library/std/src/path.rs index b3e2c2bd6c6a3..be216d87f3241 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -1809,7 +1809,7 @@ impl PathBuf { /// let string = path_buf.into_string(); /// assert_eq!(string, Ok(String::from("foo"))); /// ``` - #[stable(feature = "pathbuf_into_string", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "pathbuf_into_string", since = "1.98.0")] pub fn into_string(self) -> Result { self.into_os_string().into_string().map_err(PathBuf::from) } @@ -2864,7 +2864,7 @@ impl Path { /// let path = Path::new("."); /// assert!(!path.is_empty()); /// ``` - #[stable(feature = "path_is_empty", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_is_empty", since = "1.98.0")] pub fn is_empty(&self) -> bool { self.as_os_str().is_empty() } diff --git a/library/stdarch/crates/core_arch/src/arm_shared/neon/generated.rs b/library/stdarch/crates/core_arch/src/arm_shared/neon/generated.rs index 7c0c7985da31e..b3715308c9736 100644 --- a/library/stdarch/crates/core_arch/src/arm_shared/neon/generated.rs +++ b/library/stdarch/crates/core_arch/src/arm_shared/neon/generated.rs @@ -9597,7 +9597,7 @@ pub fn vcvtq_u32_f32(a: float32x4_t) -> uint32x4_t { #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9622,7 +9622,7 @@ pub fn vdot_lane_s32(a: int32x2_t, b: int8x8_t, c: int8x8_t) -> #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9647,7 +9647,7 @@ pub fn vdotq_lane_s32(a: int32x4_t, b: int8x16_t, c: int8x8_t) #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9672,7 +9672,7 @@ pub fn vdot_lane_u32(a: uint32x2_t, b: uint8x8_t, c: uint8x8_t) #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9697,7 +9697,7 @@ pub fn vdotq_lane_u32(a: uint32x4_t, b: uint8x16_t, c: uint8x8_ #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9722,7 +9722,7 @@ pub fn vdot_laneq_s32(a: int32x2_t, b: int8x8_t, c: int8x16_t) #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9747,7 +9747,7 @@ pub fn vdotq_laneq_s32(a: int32x4_t, b: int8x16_t, c: int8x16_t #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9772,7 +9772,7 @@ pub fn vdot_laneq_u32(a: uint32x2_t, b: uint8x8_t, c: uint8x16_ #[rustc_legacy_const_generics(3)] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9797,7 +9797,7 @@ pub fn vdotq_laneq_u32(a: uint32x4_t, b: uint8x16_t, c: uint8x1 )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9827,7 +9827,7 @@ pub fn vdot_s32(a: int32x2_t, b: int8x8_t, c: int8x8_t) -> int32x2_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9863,7 +9863,7 @@ pub fn vdot_s32(a: int32x2_t, b: int8x8_t, c: int8x8_t) -> int32x2_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9893,7 +9893,7 @@ pub fn vdotq_s32(a: int32x4_t, b: int8x16_t, c: int8x16_t) -> int32x4_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9931,7 +9931,7 @@ pub fn vdotq_s32(a: int32x4_t, b: int8x16_t, c: int8x16_t) -> int32x4_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9961,7 +9961,7 @@ pub fn vdot_u32(a: uint32x2_t, b: uint8x8_t, c: uint8x8_t) -> uint32x2_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -9997,7 +9997,7 @@ pub fn vdot_u32(a: uint32x2_t, b: uint8x8_t, c: uint8x8_t) -> uint32x2_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", @@ -10027,7 +10027,7 @@ pub fn vdotq_u32(a: uint32x4_t, b: uint8x16_t, c: uint8x16_t) -> uint32x4_t { )] #[cfg_attr( not(target_arch = "arm"), - stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION") + stable(feature = "stdarch_neon_dotprod", since = "1.98.0") )] #[cfg_attr( target_arch = "arm", diff --git a/library/stdarch/crates/core_arch/src/loongarch64/mod.rs b/library/stdarch/crates/core_arch/src/loongarch64/mod.rs index ffaa4225ba99d..44c8f1d28e0d8 100644 --- a/library/stdarch/crates/core_arch/src/loongarch64/mod.rs +++ b/library/stdarch/crates/core_arch/src/loongarch64/mod.rs @@ -62,56 +62,56 @@ unsafe extern "unadjusted" { /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crc_w_b_w(a: i8, b: i32) -> i32 { unsafe { __crc_w_b_w(a as i32, b) } } /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crc_w_h_w(a: i16, b: i32) -> i32 { unsafe { __crc_w_h_w(a as i32, b) } } /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crc_w_w_w(a: i32, b: i32) -> i32 { unsafe { __crc_w_w_w(a, b) } } /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crc_w_d_w(a: i64, b: i32) -> i32 { unsafe { __crc_w_d_w(a, b) } } /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crcc_w_b_w(a: i8, b: i32) -> i32 { unsafe { __crcc_w_b_w(a as i32, b) } } /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crcc_w_h_w(a: i16, b: i32) -> i32 { unsafe { __crcc_w_h_w(a as i32, b) } } /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crcc_w_w_w(a: i32, b: i32) -> i32 { unsafe { __crcc_w_w_w(a, b) } } /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78) #[inline(always)] -#[stable(feature = "stdarch_loongarch_crc", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "stdarch_loongarch_crc", since = "1.98.0")] pub fn crcc_w_d_w(a: i64, b: i32) -> i32 { unsafe { __crcc_w_d_w(a, b) } } diff --git a/library/stdarch/crates/stdarch-gen-arm/spec/neon/arm_shared.spec.yml b/library/stdarch/crates/stdarch-gen-arm/spec/neon/arm_shared.spec.yml index 12055cc4bc63b..7473742a963fa 100644 --- a/library/stdarch/crates/stdarch-gen-arm/spec/neon/arm_shared.spec.yml +++ b/library/stdarch/crates/stdarch-gen-arm/spec/neon/arm_shared.spec.yml @@ -14,9 +14,9 @@ neon-stable: &neon-stable neon-stable-fp16: &neon-stable-fp16 FnCall: [stable, ['feature = "stdarch_neon_fp16"', 'since = "1.94.0"']] -# #[stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION")] +# #[stable(feature = "stdarch_neon_dotprod", since = "1.98.0")] neon-stable-dotprod: &neon-stable-dotprod - FnCall: [stable, ['feature = "stdarch_neon_dotprod"', 'since = "CURRENT_RUSTC_VERSION"']] + FnCall: [stable, ['feature = "stdarch_neon_dotprod"', 'since = "1.98.0"']] # #[cfg_attr(target_arch = "arm", unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800"))] neon-cfg-arm-unstable: &neon-cfg-arm-unstable @@ -63,9 +63,9 @@ neon-not-arm-stable: &neon-not-arm-stable neon-not-arm-stable-fp16: &neon-not-arm-stable-fp16 FnCall: [cfg_attr, [{ FnCall: [not, ['target_arch = "arm"']]}, {FnCall: [stable, ['feature = "stdarch_neon_fp16"', 'since = "1.94.0"']]}]] -# #[cfg_attr(not(target_arch = "arm"), stable(feature = "stdarch_neon_dotprod", since = "CURRENT_RUSTC_VERSION"))] +# #[cfg_attr(not(target_arch = "arm"), stable(feature = "stdarch_neon_dotprod", since = "1.98.0"))] neon-not-arm-stable-dotprod: &neon-not-arm-stable-dotprod - FnCall: [cfg_attr, [{ FnCall: [not, ['target_arch = "arm"']]}, {FnCall: [stable, ['feature = "stdarch_neon_dotprod"', 'since = "CURRENT_RUSTC_VERSION"']]}]] + FnCall: [cfg_attr, [{ FnCall: [not, ['target_arch = "arm"']]}, {FnCall: [stable, ['feature = "stdarch_neon_dotprod"', 'since = "1.98.0"']]}]] # #[cfg_attr(all(test, not(target_env = "msvc"))] msvc-disabled: &msvc-disabled From b59cd74f69042487c8a65188180b0adee00fa11b Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Mon, 6 Jul 2026 20:16:25 -0400 Subject: [PATCH 2/5] Bump stage0 compiler --- src/stage0 | 1158 ++++++++++++++++++++++++++-------------------------- 1 file changed, 590 insertions(+), 568 deletions(-) diff --git a/src/stage0 b/src/stage0 index 0c1f8dd6e4bbd..8240fcda3b90d 100644 --- a/src/stage0 +++ b/src/stage0 @@ -13,574 +13,596 @@ nightly_branch=main # All changes below this comment will be overridden the next time the # tool is executed. -compiler_channel_manifest_hash=e0c64bdcc0840d6f5fcfad29b2782e4e06ec600cd1104f81d8b7cfd82299179e -compiler_git_commit_hash=0417c25868d6dfbd1c291dfeae950504faa6f790 -compiler_date=2026-05-31 +compiler_channel_manifest_hash=efb16000a699abf8506629acdce80b73b7e2fd616e7351929444f96559f28a30 +compiler_git_commit_hash=6b3fa26749ab40e159b2dd5cf577acaaf5902772 +compiler_date=2026-07-06 compiler_version=beta -rustfmt_channel_manifest_hash=d4101af9bbf8d0ee88fbf1f82794fa0269b185bcb4cbfe0ea8cacc542cb0abc4 -rustfmt_git_commit_hash=f8a08b688cbe60acc386ed1fbd1b7cbaaf5576b1 -rustfmt_date=2026-05-31 +rustfmt_channel_manifest_hash=fe81dce4d9d38e61a47150d974961a778b868e6ffe21bf9eb2b34626fac1ead3 +rustfmt_git_commit_hash=3659db0d3e2cd634c766fcda79ed118eca31a9fd +rustfmt_date=2026-07-06 rustfmt_version=nightly -dist/2026-05-31/rustc-beta-aarch64-apple-darwin.tar.gz=34f24131e52a4532854ec59757921f57319d0a24cd567a949fe3ebfef28ff510 -dist/2026-05-31/rustc-beta-aarch64-apple-darwin.tar.xz=6926e56a75676d509c668ff80d8fbc96e15d4cfbbc7fd3ad9d55b731f4032c49 -dist/2026-05-31/rustc-beta-aarch64-pc-windows-gnullvm.tar.gz=341a7131f6f24c06645c5cc5941885c6f9494e7660e945a5822bf55b0d1c2ee2 -dist/2026-05-31/rustc-beta-aarch64-pc-windows-gnullvm.tar.xz=e3df15b81702e760935c6496dc3b31eb86c876ec8a20590d3517000d71c62831 -dist/2026-05-31/rustc-beta-aarch64-pc-windows-msvc.tar.gz=6876f60d0b1c53f1ee72655483f57280e41b7c3209857448ef00da66fa985d2c -dist/2026-05-31/rustc-beta-aarch64-pc-windows-msvc.tar.xz=6fdbac65a3798818278ab722587367176c28fc4085186d85ec1f521b90e75a8f -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-gnu.tar.gz=2b28557ef7433d0fd307eb2da64fa2e56a0fa4704698e66b219b003ebf6997af -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-gnu.tar.xz=48bfaa33fd3382c5cfd1b06bea061b1e7594528fb06e1ff522af7d16ce41ebb2 -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-musl.tar.gz=1bcaf05d6a21d2fa98dcbcd51bf0799f7a6a115fadca29133f9f10fb498513fb -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-musl.tar.xz=0198b65d94ca7a18000f4f759efff39080b0f02d95d5ccea521c5d2f2ac85b90 -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-ohos.tar.gz=053f3c069b5b1cf482d4febeab6c71875b32f227887a4b1176c103564bc918fa -dist/2026-05-31/rustc-beta-aarch64-unknown-linux-ohos.tar.xz=f0e7aa55795fe7706177c553b7071991d3804d9e3c48e4dd9e8fa09aa6caa137 -dist/2026-05-31/rustc-beta-arm-unknown-linux-gnueabi.tar.gz=76cb17c7125cae2b45ac5205a307ef69a43c3d1a7a0e5895df6f68f00cba190b -dist/2026-05-31/rustc-beta-arm-unknown-linux-gnueabi.tar.xz=4ae18f7a4bf12b00ffb92eb7a7242c02e2137e3a9843bba0dc00093d4e0c7db3 -dist/2026-05-31/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz=474439ee8b363b2a84e1af1f71b501f4b06d1f86c0a92ffd1f97d34715cc8b3e -dist/2026-05-31/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz=e3e4fceb93b25230361b29ed86f8ee241394827c36eaf4f50650bafac7d81684 -dist/2026-05-31/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz=7a66c4ee6c4e617fe9df2162d38a60bda5750793c17be23ad65eac620d15e489 -dist/2026-05-31/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz=961d89af06130ccd32600bb1b0def20d0047767dac3c53ac5e2f92a4af57171e -dist/2026-05-31/rustc-beta-i686-pc-windows-gnu.tar.gz=e23f9ca62e0c9e23acd9b184de348f6d9555bfe9756dc68a8eae5d69f1771a19 -dist/2026-05-31/rustc-beta-i686-pc-windows-gnu.tar.xz=38439a3c87744fd0c68c8558ad3bebf280985a5147b95d02b3d6f3bed98cb820 -dist/2026-05-31/rustc-beta-i686-pc-windows-msvc.tar.gz=18eacda07c4f5c31429871eef3ddd00bbce67171b8fd528d82e8f2a9961757c2 -dist/2026-05-31/rustc-beta-i686-pc-windows-msvc.tar.xz=783293ec4f38c0d3e9f08320047df95c5da6d1447a4a31ae253f6f2b75c28211 -dist/2026-05-31/rustc-beta-i686-unknown-linux-gnu.tar.gz=1ad6204effe8cf74032aaef59b9132fc91a9a0b7e9cb67e262c2b81aa20853b5 -dist/2026-05-31/rustc-beta-i686-unknown-linux-gnu.tar.xz=a71499a05ff4dc01c036d93d122eb144611f3cca6cdd25e4610abf8ba94febc7 -dist/2026-05-31/rustc-beta-loongarch64-unknown-linux-gnu.tar.gz=581f157002aa5d4be653a6e083db9b010f6f0993aeeedb5a2eb132f1bab2031a -dist/2026-05-31/rustc-beta-loongarch64-unknown-linux-gnu.tar.xz=49c5b0aa877458b5aacfa85a4501992c9998748d808ebeb4ffcd7368ced97b70 -dist/2026-05-31/rustc-beta-loongarch64-unknown-linux-musl.tar.gz=4fafe68738ff6e16a5de64406b961fc8faf541a08faf80d0bff8370f8c2e1d20 -dist/2026-05-31/rustc-beta-loongarch64-unknown-linux-musl.tar.xz=f945962368279584106eb7a2847334824c035c9dab9a31044f484b5e4e04c502 -dist/2026-05-31/rustc-beta-powerpc-unknown-linux-gnu.tar.gz=371773cfdc02c3cf8f40db27765590b5fbfd741b11476ad6aa49935869404ead -dist/2026-05-31/rustc-beta-powerpc-unknown-linux-gnu.tar.xz=d68d372479e779cb63a3738b8c1ae0b5299fcac56e83c3c4ef16279dee34b5a6 -dist/2026-05-31/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz=1211dfef6caaf023c5952fd43cf87e7f8242426c914cdafbdd5b1139f02919bc -dist/2026-05-31/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz=532a4dadc849f9cb86cacd7fa2387c9ec783a3a06169d822bb74f7154acfd683 -dist/2026-05-31/rustc-beta-powerpc64-unknown-linux-musl.tar.gz=3d43c0602d6290adef323f6ffe1c4604f58a32a8764f007d9601c4d37c18dac9 -dist/2026-05-31/rustc-beta-powerpc64-unknown-linux-musl.tar.xz=94e389e5627030707b86a39d872a9fde191e802b644a180f3ee5cde3ac8bbd2a -dist/2026-05-31/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz=a91480097de9fb4b36449f5a0dbbb696a69a26e5443d7689f9cf58cede0d8814 -dist/2026-05-31/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz=c9227a2b7a81829ab0786c857dcb85f7d1ceb0f42579be825b0e6c5e1bd96999 -dist/2026-05-31/rustc-beta-powerpc64le-unknown-linux-musl.tar.gz=96fda34e1b2c0f83a1f2f0a69633f05c6af669298555b652961645049a827829 -dist/2026-05-31/rustc-beta-powerpc64le-unknown-linux-musl.tar.xz=329b1e9366c79d1e8ebaeabd2a3b8a630b607d9dd3f497ff6eea8e1ebb5a7534 -dist/2026-05-31/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz=546e44e9d89b05229bf0718b3dd63d42f1bb53f26068dcd67a9eb2d64b679f12 -dist/2026-05-31/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz=93d32baaf69d55ab684d5bad63e80a1ef836669c7bc868277f084c32aa5feb9a -dist/2026-05-31/rustc-beta-s390x-unknown-linux-gnu.tar.gz=41543dbe54924e1da679547f8c57191d4d87f98fc72222b7090804482f31b4b5 -dist/2026-05-31/rustc-beta-s390x-unknown-linux-gnu.tar.xz=3d27774a545afa047876d7709a064e13f5e72feab093e8cd9e140b2573b6445a -dist/2026-05-31/rustc-beta-sparcv9-sun-solaris.tar.gz=d0f9f5ecf9024dda2f3873375354f5bf4263adaaf9ef335c47e391e69e03ed5c -dist/2026-05-31/rustc-beta-sparcv9-sun-solaris.tar.xz=027ad46bb5b849a836e97a23ef17f2caac2763e8a958b72609bb7986a57a44f1 -dist/2026-05-31/rustc-beta-x86_64-apple-darwin.tar.gz=6dbe69125e221dbe6c83617f3b9d319a2deaa4fe3a00d27898e84c7988fdca41 -dist/2026-05-31/rustc-beta-x86_64-apple-darwin.tar.xz=ac060156191336af7a6a1e0d4fd4a49c095442981149f36543b4accf55f54cf3 -dist/2026-05-31/rustc-beta-x86_64-pc-solaris.tar.gz=dd56565609d3995e63024e4052094179f905502837a4ec8b8cdfce17694a673e -dist/2026-05-31/rustc-beta-x86_64-pc-solaris.tar.xz=e41810bf9bcfdb4fac0fea0b07820ae9b2d73b2b6751bda97f59a0ee61bdde62 -dist/2026-05-31/rustc-beta-x86_64-pc-windows-gnu.tar.gz=6398a55ff7e14b390342fce1d8aba0c08e7ad6f5db62a60b184f8a00d9e31dca -dist/2026-05-31/rustc-beta-x86_64-pc-windows-gnu.tar.xz=54453ee4b6a20e817fad213afb4f03ae22c3c028fb505837f7e9bc38c7247e98 -dist/2026-05-31/rustc-beta-x86_64-pc-windows-gnullvm.tar.gz=f6490dafe8fc300aa1d5860b5ca5c23cb5b6365f5d0c93c2f94e4a3e68323ee1 -dist/2026-05-31/rustc-beta-x86_64-pc-windows-gnullvm.tar.xz=9eba0cfd987e9e0d302fdfc1a8e346e2dbf181551b995f6427b0eae953eede0e -dist/2026-05-31/rustc-beta-x86_64-pc-windows-msvc.tar.gz=305f5cda5e0270149b506df694f5edacaf6c231d0e130235d9ea7df475fee280 -dist/2026-05-31/rustc-beta-x86_64-pc-windows-msvc.tar.xz=21a824d4fb0388a1ad4cabc34624a51a54c4649fba18cd3d971d371980cd6462 -dist/2026-05-31/rustc-beta-x86_64-unknown-freebsd.tar.gz=b66546833e986bb7e5f8fa0be20004896bfdc592d6d5f2bb597aea3814e2f544 -dist/2026-05-31/rustc-beta-x86_64-unknown-freebsd.tar.xz=0dccc47a20e0a19542991f09413c8be3340bb763b866861f84450d48e14cd4f3 -dist/2026-05-31/rustc-beta-x86_64-unknown-illumos.tar.gz=d7beec032683ac638d5e8781200dbd2f667dc59496241fbc411b7ebea9281336 -dist/2026-05-31/rustc-beta-x86_64-unknown-illumos.tar.xz=9286ff0ca05c307ca9871cbb9dc8101100338124a8af08f3bcaf38bebc60e018 -dist/2026-05-31/rustc-beta-x86_64-unknown-linux-gnu.tar.gz=6ba6876645586ae2730eb87d29f057a80760e30bf79074e20c0cdb53b98d60ca -dist/2026-05-31/rustc-beta-x86_64-unknown-linux-gnu.tar.xz=660b1974618b830ea396379b8adc3ce77fc8632510bbd60caddffb0b0173d130 -dist/2026-05-31/rustc-beta-x86_64-unknown-linux-musl.tar.gz=54497899f700e39dcd9f9654dce5d7f11bde6e2326cb42e42a9ff522047cd88e -dist/2026-05-31/rustc-beta-x86_64-unknown-linux-musl.tar.xz=03f66fde2672e7317df403b687390197e76e620a57c569a28dccbcc3b4d48985 -dist/2026-05-31/rustc-beta-x86_64-unknown-netbsd.tar.gz=9d6341d1d2fba2b5da9ea7c7b1a6efb7cf80055654e09bcfd361bdc75c12e3f2 -dist/2026-05-31/rustc-beta-x86_64-unknown-netbsd.tar.xz=784f4f29cc0f621726841742b09101496142a0013d1836e3b7f027cf5e79d4a1 -dist/2026-05-31/rust-std-beta-aarch64-apple-darwin.tar.gz=6277ea79b49e886debd4cc9601ff69ad5eced57417b0f3a7d0108cd0e6fb9c03 -dist/2026-05-31/rust-std-beta-aarch64-apple-darwin.tar.xz=994b401e71fead4fb2eafe10a4ea5f81966c4320301524f9d2dd60e3f30aea51 -dist/2026-05-31/rust-std-beta-aarch64-apple-ios.tar.gz=6f77194e77932c54e8bec920544481e83ea84b5e4180a2ab3332c5162b1f43a9 -dist/2026-05-31/rust-std-beta-aarch64-apple-ios.tar.xz=a3d369824b8837a6deaac735a989110a8a94803f90d8bc0d8b410530a3fd4b59 -dist/2026-05-31/rust-std-beta-aarch64-apple-ios-macabi.tar.gz=86d6fee9f0042a732e0da47ce288797fbbc06087d8ef23d58d78e781da35d7bb -dist/2026-05-31/rust-std-beta-aarch64-apple-ios-macabi.tar.xz=624b2028d019bba1d13f0ff26961775c9ba8ec7a7f26b61878aa40cf7613ebeb -dist/2026-05-31/rust-std-beta-aarch64-apple-ios-sim.tar.gz=6ea722e2c1e7adf11b29db66c016778442213818f3dd86679bd1d05e85cae589 -dist/2026-05-31/rust-std-beta-aarch64-apple-ios-sim.tar.xz=8f3329daa8743896f8d33633adf9e3799c5432a25ddeaed1f57ac4f9081834d8 -dist/2026-05-31/rust-std-beta-aarch64-apple-tvos.tar.gz=b3a762d804fbeeb2f68d95a736faf460d251c6d1622bbd00588cc58f4385478b -dist/2026-05-31/rust-std-beta-aarch64-apple-tvos.tar.xz=135313b93c57cc7ee2a04387da01ce9b2610c64bf1d93c2aa27ea650c5f6ec32 -dist/2026-05-31/rust-std-beta-aarch64-apple-tvos-sim.tar.gz=78991aad24b18b476a92b42ec3c158693ccea9699d91991a296b85a046c454ac -dist/2026-05-31/rust-std-beta-aarch64-apple-tvos-sim.tar.xz=f107dedc09aee14d06f2da844a4e1f6acb88f54721f19386dac6833b5d7a86b6 -dist/2026-05-31/rust-std-beta-aarch64-apple-visionos.tar.gz=cd6dee7e0f6fdd7a41b88604dd52b9d03903e7b8a08826cde7d08e75a430e159 -dist/2026-05-31/rust-std-beta-aarch64-apple-visionos.tar.xz=8a317391a40cc0b062b2cfc9059c782c0b4381d3fba3220e879afd23ac9b6fd5 -dist/2026-05-31/rust-std-beta-aarch64-apple-visionos-sim.tar.gz=ae876e432df02b397605f77d2fc79ecd1f3b296315e3caecbc97561bfb9ac144 -dist/2026-05-31/rust-std-beta-aarch64-apple-visionos-sim.tar.xz=cd4a27a1924f75e98a3ca0b62962bc4581c5998fc30f68b056e21ebacc67c3a1 -dist/2026-05-31/rust-std-beta-aarch64-apple-watchos.tar.gz=3e637f5bfe95caecf91a93b1df01d1330772f8f791b61508c86dadded086ab50 -dist/2026-05-31/rust-std-beta-aarch64-apple-watchos.tar.xz=17cc0d4434c763b63bf5868f5e56a7d595d0872e75e1f49fcd3f572ddc309e69 -dist/2026-05-31/rust-std-beta-aarch64-apple-watchos-sim.tar.gz=3424b12aa735a6add668d89c033cad7c8222a08c56ebe9111b2db29f1e53f28a -dist/2026-05-31/rust-std-beta-aarch64-apple-watchos-sim.tar.xz=fbbd0539393fe1f031a2aa48e68fde2a4f3f68de94196c81c0b140741682cd80 -dist/2026-05-31/rust-std-beta-aarch64-linux-android.tar.gz=67b5183097b7a514743e6ef23a476749af76bd5094eac023d9cf428f61e83730 -dist/2026-05-31/rust-std-beta-aarch64-linux-android.tar.xz=9654ed32908883d83bdaaca6350a88e5e69a4e95f0165723c8c2e9e08cde6cf2 -dist/2026-05-31/rust-std-beta-aarch64-pc-windows-gnullvm.tar.gz=6a847b41e08219b50469aedba2594a0a66b3c35083f261e9ccbee51bbaef140d -dist/2026-05-31/rust-std-beta-aarch64-pc-windows-gnullvm.tar.xz=bc59bf7d1b2cb0460828fbb115f8f54b334b26e353ed2bfdbf83fbc1184af486 -dist/2026-05-31/rust-std-beta-aarch64-pc-windows-msvc.tar.gz=0e7706e33b4b38abc1daf5fbbd19f93b385ba9d83ec6dc1485e07c9152574dc4 -dist/2026-05-31/rust-std-beta-aarch64-pc-windows-msvc.tar.xz=ee252e3fcda22d824fd4eb9f8beca05ed630e45a8e9d233be4be0b25079ac51f -dist/2026-05-31/rust-std-beta-aarch64-unknown-fuchsia.tar.gz=2238924f0dd1070f5c140028fbbe5d9798e0ae15016ec9a923aa676c826e08dc -dist/2026-05-31/rust-std-beta-aarch64-unknown-fuchsia.tar.xz=144270b13ee0b9158384ec423b1bb49fc87a2309f5dac015a79591c5b743c19f -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz=d43084c16b7332fea665cfcbecff3818bdddcdec429ed4546e151aa8bf2ab4b7 -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz=46edeb803e1bc7d08046b979aaae648fc69e1459d74aa62ff8fd5639dee1dbf7 -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-musl.tar.gz=3c595fab996d75d6eb3f804910a57557438aaa63ea865c3f4b4bbeebc4655ede -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-musl.tar.xz=8ecee597bdb0389e359ca41048819f2568ee5db94509242d9aa92cd0bc2f6016 -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-ohos.tar.gz=05e80e252ba2339e61082fbf7072d3d2842d292dad3351e25f927e0e54f15ba8 -dist/2026-05-31/rust-std-beta-aarch64-unknown-linux-ohos.tar.xz=ea0ca1f0e4717f92666643a5572879aa12b32cc35d145cfca4795411553206f7 -dist/2026-05-31/rust-std-beta-aarch64-unknown-none.tar.gz=202c8b8ff1e9dd60eb53be7db155e35e082fd43034db10f48735edd44bb40856 -dist/2026-05-31/rust-std-beta-aarch64-unknown-none.tar.xz=b4275504cd0c8fa6ee3ac45f33ffd215c70e8db230a3d3461a269f752d1a1121 -dist/2026-05-31/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz=a48a9810a1c3ba52536bd22a3d82dcd12faa6296d890c6a1c128231638817acc -dist/2026-05-31/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz=499ddbb6cff60c0b81dcacae1f25eb080e6d7b7fd00ce360cf2bf99f3113f20d -dist/2026-05-31/rust-std-beta-aarch64-unknown-uefi.tar.gz=3d809d88548bd3d7c89dad1fe071455570cc10e4b390b8b722606755c093ac27 -dist/2026-05-31/rust-std-beta-aarch64-unknown-uefi.tar.xz=c990843580fcda9a9925bd29cd28302e0f5362fedf5b8f5be1fdc4bf68be5da5 -dist/2026-05-31/rust-std-beta-arm-linux-androideabi.tar.gz=01157bfac833961057b1e384b126c84eaade8ee4083af16f6921abd0a908bb68 -dist/2026-05-31/rust-std-beta-arm-linux-androideabi.tar.xz=c00a8f228e4e96c158a23dcf6ce4e8c8d206b29603473c8a14201549a61c0181 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz=8c7277ae77501921f6704eec131c9b5a8c230f177fc627dcdc30bdfaae7c5905 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz=32dbb018e7924a87d1b98e1f9033a0dff0405cb1ef1fd8b0ef98012ae5baa008 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz=d09f2980e154a8fd9903581d5b9899c894a9563796a4fa86899ddeb66863b000 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz=511235d1285a42c98c72c2d63545aefdfdc2ca1bd6ebc1908fcd8550230abdc6 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-musleabi.tar.gz=782a0684b7fee0d44f97cc754b2780ac28582011b4554fa4dc14761be1ec6033 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-musleabi.tar.xz=0337204b3d28e95763657701b04613748e9c2e287e84c557fd94b131a31f88b3 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz=29f920a5a449d7022ed2f0df1405e806ed13d1fb9ab409f0bea22c3449c0c038 -dist/2026-05-31/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz=04536c647ac4dd045ad0fcd765d8232fbc2f34ade54b785e5138d8cf0864de6b -dist/2026-05-31/rust-std-beta-arm64ec-pc-windows-msvc.tar.gz=50d5ab9266bafedde5f0570b1fd1507a214d33a90ff27b5d13ed89c7c794c6aa -dist/2026-05-31/rust-std-beta-arm64ec-pc-windows-msvc.tar.xz=71b22f58c8610cc93b5aeb0a9b3d63067c94579d5ed9838a095d96059d68fd72 -dist/2026-05-31/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz=2610d7fd2fc002f48e5c6e9308dfdeb1dbc54ebb2887f1d9bfd674f41dc41081 -dist/2026-05-31/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz=7029d90f70a8c200b5588762a4c5b6b65b0a9e8ffe602487250db987fdb7a530 -dist/2026-05-31/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz=de9ea71b7ddac45b08c2e6f4c69c6dc3d9e810db0de200c75093ab82e82b2ced -dist/2026-05-31/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz=20bedb469371694034b03f5bd95496b5a143567061eb09b05259ae0b229488ed -dist/2026-05-31/rust-std-beta-armv7-linux-androideabi.tar.gz=04c75235a0a1777bd9e3cef1628d10963c3238d9231e3486c997436581e097c7 -dist/2026-05-31/rust-std-beta-armv7-linux-androideabi.tar.xz=eb2da650b78a081f32780f55d73ffeb6bb06dd3475fafe19c473ab3ce251f55c -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz=d35a5fe89502dd275507ff0b47bb9e14af830bd6ec08cd2c8b54479351521581 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz=186b0f50eaffe82aa2859baac7d018043586dcd2a8372268d792d557d91623c0 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz=e5012e3c3a9a9dc22b82c5d8626398472f68809a27bf574bac300f71d3b99f39 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz=b6a6ed0c00d460b616722cbcc43bb6899c582d8b66b50f9c717391a35b2332b6 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz=13216e65baf6e6bee603965497f0c3b2e4600a48f3636a006e6b738c4a683f1f -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz=2c2060e5ded3bd47343d7137d80572041c5e45f9cf5696fe97eb1eb21bef2038 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz=003cced8c4a87e1fb7caa521c7ae22d0a6564df527609e2147a03eaa804197ba -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz=b77598c3475e8fe001d9288e6e012bb40bc0dd5babf2d318b160891c5b21cf7a -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-ohos.tar.gz=383f90d6748cca6a15440091328d2c26dbff98ed9b248e43f03d91b46bdba486 -dist/2026-05-31/rust-std-beta-armv7-unknown-linux-ohos.tar.xz=c3cb5264989ba04d3e6c5974339ed236833bb10a6844db22d804c08747ed816a -dist/2026-05-31/rust-std-beta-armv7a-none-eabi.tar.gz=38fc5126dfdf224bc4e367c1e7fcce8738b8c1a5dc2b1f8676fac9123902a71b -dist/2026-05-31/rust-std-beta-armv7a-none-eabi.tar.xz=992519a5e91ea68ea530b64c4ea44f16d01b02410503b8d98e31875de1b44b19 -dist/2026-05-31/rust-std-beta-armv7a-none-eabihf.tar.gz=5a78c4eb815c5920d8f1ed9c7112134cf7885da58b49e7038851a9a2b2489811 -dist/2026-05-31/rust-std-beta-armv7a-none-eabihf.tar.xz=e1e4015921e7dce969e545e8ebf3184e30c9e0b9b2defefdbe8182838e948169 -dist/2026-05-31/rust-std-beta-armv7r-none-eabi.tar.gz=d393f8fc7bc7a0bcee21751cb475026fd4f9ab3677365629b750a12aeed5ba40 -dist/2026-05-31/rust-std-beta-armv7r-none-eabi.tar.xz=db0a0a83d2b367249d99f36c82c3216bc87ace2a06218eb58a6998369e9ff9a6 -dist/2026-05-31/rust-std-beta-armv7r-none-eabihf.tar.gz=aeb46e64f66cf3dd08388fad373781e4acedd9936a645ee4d63ad43d2f188591 -dist/2026-05-31/rust-std-beta-armv7r-none-eabihf.tar.xz=f252b53ab4443f2c647d4de64e00cfddbb72eb8c1167f1b50415d9c6b7b2f366 -dist/2026-05-31/rust-std-beta-armv8r-none-eabihf.tar.gz=a97a003a9ebd3122b311fb2e6baffb28f8ad830b93235eb4b161e6a856502c60 -dist/2026-05-31/rust-std-beta-armv8r-none-eabihf.tar.xz=97d4320614650f0043fc24c96230552b462772f5490cd903a025fd1912205eab -dist/2026-05-31/rust-std-beta-i586-unknown-linux-gnu.tar.gz=0a69f51d712b9417f9aa0ebe0f053fb2881562fcaa97408970b83d2676fe81d7 -dist/2026-05-31/rust-std-beta-i586-unknown-linux-gnu.tar.xz=7490e25399242aab980859f7fed3ac60fd9c67d560b533f208c187eddb174dab -dist/2026-05-31/rust-std-beta-i586-unknown-linux-musl.tar.gz=e8b9f0baf6b8e0ce9d2489da619ec80ae4ca36ee9eeb6383b5a433e8396a2b16 -dist/2026-05-31/rust-std-beta-i586-unknown-linux-musl.tar.xz=3020a63efb7b4f99654d11011909596348c11e2bb46eec8d0e24f1180079c831 -dist/2026-05-31/rust-std-beta-i686-linux-android.tar.gz=7665e67f8d29844e1b70ca22c5fae2d197238d53270c99c3bdddf99666c66a31 -dist/2026-05-31/rust-std-beta-i686-linux-android.tar.xz=f7544f9f68a8dfca72a26d55429fb18c9a3f09fc44a1d3069f3797540c9f7339 -dist/2026-05-31/rust-std-beta-i686-pc-windows-gnu.tar.gz=c715e39143af479723e5a5edc4e5ce5bad30a6a746f443cebbc1ee477d5902b4 -dist/2026-05-31/rust-std-beta-i686-pc-windows-gnu.tar.xz=b2c4a3401ba40b984cdec962cd2ad95a3e677ba911e9caae5f8db400be8be123 -dist/2026-05-31/rust-std-beta-i686-pc-windows-gnullvm.tar.gz=5c842c9b691ff6a3c2a950ab85f08e5df7046874df1ac748a3bdaace630110af -dist/2026-05-31/rust-std-beta-i686-pc-windows-gnullvm.tar.xz=92a9be1eb8504ec4a3991231b51386499a054ee963ed4f55238ceae09af01515 -dist/2026-05-31/rust-std-beta-i686-pc-windows-msvc.tar.gz=066cf09763e1e389c4a26f31c1c0a251ca5407e77bc91cc69ced826d17824049 -dist/2026-05-31/rust-std-beta-i686-pc-windows-msvc.tar.xz=d0efc08346b0f0ec81698997d9b823f2a386cf57490beef4bfd5fa5c2c83db39 -dist/2026-05-31/rust-std-beta-i686-unknown-freebsd.tar.gz=a15817a1488da28f298d0c849a19c7103c15fc4ecefc9e9f2c3a9784300ef661 -dist/2026-05-31/rust-std-beta-i686-unknown-freebsd.tar.xz=715a1cdf09ad6b1837a40fba4e8c97cca38d39b3903c155978c97307ed294715 -dist/2026-05-31/rust-std-beta-i686-unknown-linux-gnu.tar.gz=bf00e0df238fce1e89bce8d425ae11e5578816d99e603b5d13ae3e5a36328567 -dist/2026-05-31/rust-std-beta-i686-unknown-linux-gnu.tar.xz=80ae8c730567a32e5fc7edd33e59cc7d9c921448d9867b654afad3ef834ab13c -dist/2026-05-31/rust-std-beta-i686-unknown-linux-musl.tar.gz=8a700d1df78b9ff7ab8cf9d807799c63abe672d2aea3250feec5062b8ea8e1dc -dist/2026-05-31/rust-std-beta-i686-unknown-linux-musl.tar.xz=e385fc1087d67358e3a402c826b6b27f97d2c85140caa49f7ec2cbedf2e25ada -dist/2026-05-31/rust-std-beta-i686-unknown-uefi.tar.gz=6cbb40c805f8cacaea3afcd410cf69f6ba1e5052109897ecbff44249c8f08a8e -dist/2026-05-31/rust-std-beta-i686-unknown-uefi.tar.xz=0956009592fe270d24459c4d17cf18911a5911a09c9ad3089d9c25c26a5b7dcb -dist/2026-05-31/rust-std-beta-loongarch64-unknown-linux-gnu.tar.gz=f56888bd6915515c4b7579804fc4157e3c1360b4a47553e78ecd320d597ef106 -dist/2026-05-31/rust-std-beta-loongarch64-unknown-linux-gnu.tar.xz=996cd2e7e258faae0d11cac51482af31c561a8bbe83ff9253b459cd92f3b171e -dist/2026-05-31/rust-std-beta-loongarch64-unknown-linux-musl.tar.gz=16fe3890a06e98c64f1da200a6d30296d1eb8ef03f98e3ccdbe985797f759216 -dist/2026-05-31/rust-std-beta-loongarch64-unknown-linux-musl.tar.xz=b1607ee88f215767b0120371af91221bea65d512d90ed8470547a3ba9f61dabe -dist/2026-05-31/rust-std-beta-loongarch64-unknown-none.tar.gz=d9cb12e0fed1a06d04121bd710bfed12f13c6fc37bdb80f7b4db7c03bea97fe6 -dist/2026-05-31/rust-std-beta-loongarch64-unknown-none.tar.xz=78d5b40299a84fc00402f76ae91ae6e4a8269d20539174f61afe833a1ec207ee -dist/2026-05-31/rust-std-beta-loongarch64-unknown-none-softfloat.tar.gz=48adba20b71d67fa0f1b2f17cb94393f07a00898a0c22d86468afd3b8140c088 -dist/2026-05-31/rust-std-beta-loongarch64-unknown-none-softfloat.tar.xz=5d997a888b9483d1955bcd2907e082ab90ddbedfe6f5c83725bf5b7bf3d10611 -dist/2026-05-31/rust-std-beta-nvptx64-nvidia-cuda.tar.gz=e20441a4ec1724bcffb131bf089bb77dfedfd5538f9c2d9927a3fc780cae55dc -dist/2026-05-31/rust-std-beta-nvptx64-nvidia-cuda.tar.xz=2cb9a7b3c6583eddb228eb2f999f9c0643559ca0960dc99f24126637ce140067 -dist/2026-05-31/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz=4afd5406142597569f79908ad55f1b4e0291d9129b63b32fd2b4469210af54f4 -dist/2026-05-31/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz=b2bb5bb8f570d77d47e2bd52b28ac97d3bf1ac2d88ed0ddf9972bc2816bef14c -dist/2026-05-31/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz=8f21e01cf4d9b81a6b720e4d4d564cfbfab3918090aa95b1a5c02f128def95c3 -dist/2026-05-31/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz=49778b0b6444509b543c1ca1c8b966b4f1ab67be5a9ce789045cc02f00051fae -dist/2026-05-31/rust-std-beta-powerpc64-unknown-linux-musl.tar.gz=082183af170536d7e4838d1c18e6afbdebdf9bacff9bf392d3ff7a9604310f38 -dist/2026-05-31/rust-std-beta-powerpc64-unknown-linux-musl.tar.xz=374d0a18c451dc113be50c05edee17be3285cc269bcae59eb798eebc95b6d1f3 -dist/2026-05-31/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz=6fc86c3cecf1b5ccdb93669210bec92200ddcbcb0ccb69def3109394e82d1ad7 -dist/2026-05-31/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz=0e1b9dc2103a8d930844ee337f8f15829cf6b931e87b4af2731901a5331f1278 -dist/2026-05-31/rust-std-beta-powerpc64le-unknown-linux-musl.tar.gz=b6ce0c1b526bc91afc766e12ad00cf27a005f7d1334daa22962b4fd0fb0fc30e -dist/2026-05-31/rust-std-beta-powerpc64le-unknown-linux-musl.tar.xz=55355071659f646be2c51a69d50668ed43c6a7abbb9b446a0ad176c8b8c5e409 -dist/2026-05-31/rust-std-beta-riscv32i-unknown-none-elf.tar.gz=1e85fc0936b667f5c896043c0c6ca9c264eb3a7134c832f710baab978639c707 -dist/2026-05-31/rust-std-beta-riscv32i-unknown-none-elf.tar.xz=f4977fa1085d827cd2cee3b595d0f021a472b6625d311df5cdbc9816fdba4a47 -dist/2026-05-31/rust-std-beta-riscv32im-unknown-none-elf.tar.gz=352e8f5612fb5fcd65e0dc3534bb0a44ca9c4213cf8f1b9f3f324896a1487fc4 -dist/2026-05-31/rust-std-beta-riscv32im-unknown-none-elf.tar.xz=357f218f42c7daf84a1e4ca415660096d352a17c0945fe400c42c07f92f2a7ab -dist/2026-05-31/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz=79e5f7654be86dd00578d43ae21cc8783a41b8f427fe68a15e6a114c249a4db8 -dist/2026-05-31/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz=10c3a6b527040790ac364d1ae9bf33f2f3d182108ec2f913491f96d3a5e25c65 -dist/2026-05-31/rust-std-beta-riscv32imafc-unknown-none-elf.tar.gz=fef14a79671ca99d47a80a81982464da71b9efb4766d18e705c8e706afafe164 -dist/2026-05-31/rust-std-beta-riscv32imafc-unknown-none-elf.tar.xz=6d409ec81ddac2ad63757e7f2081033477ccf7e0ec35622f0649110654d95d3f -dist/2026-05-31/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz=d1e3beb29aaba18c4dccd2b819c46677080ab42556501754bf9adce602c9c66f -dist/2026-05-31/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz=72f9bcae4a99d611a8f2fa8094c4093beae5f03a96210fb76a1a3d13e203185b -dist/2026-05-31/rust-std-beta-riscv64a23-unknown-linux-gnu.tar.gz=c9d025ee108ef9ae057fc9a8a65a00d645ceea09e305d7072373cca1ba9a703d -dist/2026-05-31/rust-std-beta-riscv64a23-unknown-linux-gnu.tar.xz=929395398ca07755591a216eb180b759594cbcfe7b3a1a291484866fc1cad30f -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz=a7560e666897a1bc73350e568dc972141372a1da6957e42d347ce54cf77a49b6 -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz=237048ca73ed24877d5c8669f7dd2fcd6ea6da00d3b4ba64ad3d350bb3b0fdbe -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-linux-musl.tar.gz=52caa0f69f2c5a3b18e79044cf54873711c606c850dc619650670f29ca9298b6 -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-linux-musl.tar.xz=3fbc8ef68e0045236a45994c4d629ccc5cd673a526767df3200e1ecba0f59424 -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz=9c08157f38cc93f5acaffef14878ed5aa2940d856e6f6933ff0cdaec9f976025 -dist/2026-05-31/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz=88276d8767e8dbd0d9e5c07e1e7b9d0c0c2ca8810c0a79a23a5d355e1266ece4 -dist/2026-05-31/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz=54cc920299bb182b0b9840ec2323c190d8b412926d675374d80e1177674641e1 -dist/2026-05-31/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz=903d87c8745aa146df20c933e1af6b744d1baec6b944ee7a5bca229993addf36 -dist/2026-05-31/rust-std-beta-s390x-unknown-linux-gnu.tar.gz=f2a6eed8c1a8b2d4d63be9932b6438d5a7e0ecf2534491334ca523df8f5b63f7 -dist/2026-05-31/rust-std-beta-s390x-unknown-linux-gnu.tar.xz=a6035fe5eb7f235e2e4f1e238665d302e7e3b2a462b2eeddafcfab7ed51156bc -dist/2026-05-31/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz=f2dc3d960db0c1ef7e7523274e4cc3f06068ab058b6750be2526b99de694748c -dist/2026-05-31/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz=3c03c76ce458524490f71266f807f2e54238b23b7d8c2f56070c27d577daf321 -dist/2026-05-31/rust-std-beta-sparcv9-sun-solaris.tar.gz=26e35b5d3b104825532c7875f12760343bcde48d4652d39dbd7b7f6748eeb4ed -dist/2026-05-31/rust-std-beta-sparcv9-sun-solaris.tar.xz=82438f074014eb1040bec07334afa1e5218e63468815f1fd3856e0d63a2020da -dist/2026-05-31/rust-std-beta-thumbv6m-none-eabi.tar.gz=9d4b04b7874057a38b2b0abe1912af8fd149e402ba783433717fc76e317f65a5 -dist/2026-05-31/rust-std-beta-thumbv6m-none-eabi.tar.xz=e20dc700f450d3641e8db2f03f542136eff0e8dfe904a54da864b37a0b3507f0 -dist/2026-05-31/rust-std-beta-thumbv7em-none-eabi.tar.gz=8b250c320120d2bb450576395f1e7e4500c4983ef5ffe5b01a1f44a012e903d8 -dist/2026-05-31/rust-std-beta-thumbv7em-none-eabi.tar.xz=8fd0476356c4157ee45c90e9cbadcaa65148a7e230769cd0af91ba2f84c40324 -dist/2026-05-31/rust-std-beta-thumbv7em-none-eabihf.tar.gz=6ebc0e0bc5698434b1f182f0d08414a8574874c6650e6216408ecfc7bedf76d9 -dist/2026-05-31/rust-std-beta-thumbv7em-none-eabihf.tar.xz=be5e3f4d470339242cee9691e2f3dacad182620c8372ddca50d8a75c7c1a995f -dist/2026-05-31/rust-std-beta-thumbv7m-none-eabi.tar.gz=1158ba54404fac9f73d3a8692d53719b5d0fc7922c2c2b83f1e299eb82091a26 -dist/2026-05-31/rust-std-beta-thumbv7m-none-eabi.tar.xz=d569465b06aa8f760069b18f81186f0e0ecbd2c24b1f12aaa79f2cd9c26e90b2 -dist/2026-05-31/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz=43c3f73803fd2d28a4b7536654ba6b6b72edea68a7ab32877205c0547dfad2c1 -dist/2026-05-31/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz=d9fdfb9a500447a6981e016cc974618633b49eaf543a763487e2c55cc8507ce7 -dist/2026-05-31/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz=a4ca69fbb4aaca0716d20acc07914565b51bc861c4e7ce02ca3ecc731e872b56 -dist/2026-05-31/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz=34cb7a58573fc691177e7375c4447bae7708c258937246d8f657d7c2addbef76 -dist/2026-05-31/rust-std-beta-thumbv8m.base-none-eabi.tar.gz=a4117f22d6bb2addde5aad12d3e10402fd6bf25c32ab4d58cae5fb90d5a09614 -dist/2026-05-31/rust-std-beta-thumbv8m.base-none-eabi.tar.xz=aed0e1540a0074ac92ce365a695e09e3a2adb98adce48fa80d5054914450e863 -dist/2026-05-31/rust-std-beta-thumbv8m.main-none-eabi.tar.gz=a5fee984a814ecd123b464df42c716d8750e1e9d6b941a33266c716ef721a672 -dist/2026-05-31/rust-std-beta-thumbv8m.main-none-eabi.tar.xz=7d6b58c8f8e093d4dbb22a2f5e6865042771d646f7d2ced1bf97ea2a576eb4a7 -dist/2026-05-31/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz=6d61b99cfab733f42a011d0966779facc656c9df9d614f0461aef91701eaf80f -dist/2026-05-31/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz=0016cb035770e29324980bfad83d784640f42b4366056e004da3176f1208b319 -dist/2026-05-31/rust-std-beta-wasm32-unknown-emscripten.tar.gz=916163b3d13c051bbfd6f0f5586a017a1c0caead5ea0286f1b2a9823d728d702 -dist/2026-05-31/rust-std-beta-wasm32-unknown-emscripten.tar.xz=ddaf50ffb33797a83435eb386592948bbcf982959656b996deb869e7f0e14bc6 -dist/2026-05-31/rust-std-beta-wasm32-unknown-unknown.tar.gz=b3dd42b05bedf9c6309279d8c14af4d88cf470f3304af0233931544b611dfafa -dist/2026-05-31/rust-std-beta-wasm32-unknown-unknown.tar.xz=1f6a038ae4fbc3dfa925d948b63d8de5b15d4cfa350420f89caf6c1b77a0f342 -dist/2026-05-31/rust-std-beta-wasm32-wasip1.tar.gz=45748a59b117bc94e3990adebf05e44503e53d7ea9a433b59196a4ea5d98ea6e -dist/2026-05-31/rust-std-beta-wasm32-wasip1.tar.xz=3850d5226483c1f1facbd756df8a6243d86f470390c93b9f108c3308866950fc -dist/2026-05-31/rust-std-beta-wasm32-wasip1-threads.tar.gz=040ebfc13e209396b7ad1be1b4fc787cc00e6325f387fa6b07e62fd0872707ca -dist/2026-05-31/rust-std-beta-wasm32-wasip1-threads.tar.xz=d65469a04e580a62f2dad81e49aef3f9d38333212d6f7b7f32b2c69f68e119be -dist/2026-05-31/rust-std-beta-wasm32-wasip2.tar.gz=3c7eada5c22596ec506690f07f1c740374dac9663b3d77e8bc3a764a3564a604 -dist/2026-05-31/rust-std-beta-wasm32-wasip2.tar.xz=6eb9ecf63c600975bed7391243579068bd7a826ef9abd39b8d85a45c2f09b6f3 -dist/2026-05-31/rust-std-beta-wasm32v1-none.tar.gz=6938ceeda493d602c3ff3f6f4b71db30772e1a78eec0f1acea8f24aa175210cc -dist/2026-05-31/rust-std-beta-wasm32v1-none.tar.xz=0252a1345238ad9e6ffa3eccb5f3213f82097f3e83cd7f4d3a065a4bafe42fe8 -dist/2026-05-31/rust-std-beta-x86_64-apple-darwin.tar.gz=82ce494e1499cd0881cc1778388f9531bfa26c7d2692c0eaaee37df0095dc602 -dist/2026-05-31/rust-std-beta-x86_64-apple-darwin.tar.xz=42e843d1cdee6bcd3fb5da8ab79cfb09437516060878654a6913292c0ffa0d95 -dist/2026-05-31/rust-std-beta-x86_64-apple-ios.tar.gz=24e3af3f960fec1531bea89794763fb26a5b3ae926293c29c66ba0e4538d03d8 -dist/2026-05-31/rust-std-beta-x86_64-apple-ios.tar.xz=f6b9ca4f29f764041b621df402528c8ba7cd7aca22d72c5dffcfde62bc47ac5f -dist/2026-05-31/rust-std-beta-x86_64-apple-ios-macabi.tar.gz=9ea44810f3486cf3367ab5e0f046a91b80028a3cd2ac7ce21cad54267bf5fd72 -dist/2026-05-31/rust-std-beta-x86_64-apple-ios-macabi.tar.xz=ff12073d3ea95f694e0a7bb0aeb266fea8a0f0f6dd718aed337b867e09f0ca73 -dist/2026-05-31/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz=f661cbaf71b2708c60af67b784c8b5ec9ba8e2c58406c78e54e5060043dd17fb -dist/2026-05-31/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz=1dccd346264eff7a18a8a970a2e0f6302eede7abaa70492ced9e9062e2874685 -dist/2026-05-31/rust-std-beta-x86_64-linux-android.tar.gz=ed444f3b8a40231cdb5f15d390c30c6429ec36171424b27e6b17e1e66435a76a -dist/2026-05-31/rust-std-beta-x86_64-linux-android.tar.xz=d20b095d5ded63ab85c56808d384023654f0637631c4dadf9c4e579c2e4731d4 -dist/2026-05-31/rust-std-beta-x86_64-pc-solaris.tar.gz=6e627ce0b32b1cf44c3295676b173ba5cbc6c04acc4a5285b0a0c28cf12c5313 -dist/2026-05-31/rust-std-beta-x86_64-pc-solaris.tar.xz=138c3f578d484f0f25a214327d1c3fb3b1ae21b35b92bd1f6fd53babf1931634 -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-gnu.tar.gz=d0751477f19baabd0464c162408f206c218fb1d51b5b07dc8117010902fa275d -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-gnu.tar.xz=8cde4ff1a3f74b5bf7d6cd5d6e82764cf40bf147108fd9cc2d1bc7e97ba69c5f -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-gnullvm.tar.gz=a179839a623682445dff140cf7ee52e10099a62bd533dcbcb5dfec0bfbbdbd09 -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-gnullvm.tar.xz=d7aa76321c3fb05aa8a2c35524cb9394587327eb59be376bcd8c3066ad1e2599 -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-msvc.tar.gz=4060f1a20649937eb2debbb86b167e6eda095c59e01064b2a57d579cfcb6f144 -dist/2026-05-31/rust-std-beta-x86_64-pc-windows-msvc.tar.xz=6ef9f6e9a60afb480418160243eeb37dfbff336dd0e3b5a67287efbb467f9f47 -dist/2026-05-31/rust-std-beta-x86_64-unknown-freebsd.tar.gz=158b877a47220ae229c1f8eca1ef3d9284dc96a10f9445ee88e788568eec0149 -dist/2026-05-31/rust-std-beta-x86_64-unknown-freebsd.tar.xz=77b21d734a10feeaf5d42e864079c3623e30027f22cd60a324856479c47e44e3 -dist/2026-05-31/rust-std-beta-x86_64-unknown-fuchsia.tar.gz=19fca9cf6205a9f61dc36e41467895c3903bc55a10721a44e5c505f76239df2c -dist/2026-05-31/rust-std-beta-x86_64-unknown-fuchsia.tar.xz=b488ac15b80437d227e1364d86b2053f0b046d206faa30b10041175fb4757283 -dist/2026-05-31/rust-std-beta-x86_64-unknown-illumos.tar.gz=739941e626b216c5dfe8b81026e1b7f86286bd31dba51ed4fb1bb8a465f56575 -dist/2026-05-31/rust-std-beta-x86_64-unknown-illumos.tar.xz=3ba5b93f735574f527c9ab2d7f1a91314b30c6735a7b328f32b40155cb750e57 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz=e5effbc8ff54a318ce2dcf187bdfcf33b4e3c28d130f68725165c7e1c68f1816 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz=ebe326c6bcdd77399cc451dcb999dc61c0175ede55ec1153c9693bdbdabfb7db -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnuasan.tar.gz=052b996b23da17b3dbb87eb9146852c6408904d6730605f0ed700ea3846aad0d -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnuasan.tar.xz=6afa47a4a44edfa739dc3a0efae39a414b9cc25bc15e164c3330ec60dc61962f -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnumsan.tar.gz=08e5c7fff840c4042ed92512bdf7762421ffb99815ec3ac6a4a6e1151f8de512 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnumsan.tar.xz=cbf16acce5235bffa65024e71c13da0e56153659997086abd97953a097e76675 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnutsan.tar.gz=e5cbe002a1efded21a7f170ef1b3822d86f54d773ce8f05789cb3e248d5a8419 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnutsan.tar.xz=a62657cbde4bab3edd76d2a4dd14ca0a6347eb8c3c2b3a0be15adf2cc3a8d82e -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz=1f3f6d8623597c89b542a5a7526e1231fb4386f1ebb96281e4a23700d579949c -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz=a9a6ed95e11328ae9be2664dc9e5cda06c524cd9a830192eacc6e212e5412370 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-musl.tar.gz=9c869cf57773c4f0790df55535b97262a8bb9ba3ed3fef06a29c45fafda671c7 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-musl.tar.xz=91417e7a121b8e5b1d906c0fce37ed8c02a3a97b1f8a8f3e60f1102b38ba3216 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-ohos.tar.gz=1ad7fc6eff07a0bbe7f141720e71e27e6cc08dd219ca9a225c4adf6de88209f7 -dist/2026-05-31/rust-std-beta-x86_64-unknown-linux-ohos.tar.xz=4dd2c2ad749da32b90d1cbde4b4e160f83c0d1c973badec47f1435f98049e688 -dist/2026-05-31/rust-std-beta-x86_64-unknown-netbsd.tar.gz=6e98efadf54a09e83993dadcb7eeb803fb2182fb68262fc1de7e026b70cf7a35 -dist/2026-05-31/rust-std-beta-x86_64-unknown-netbsd.tar.xz=29d2762d0eafb8167081cb9f3cc119c08faba1c5590ea25bf0f4e14afe2ca73e -dist/2026-05-31/rust-std-beta-x86_64-unknown-none.tar.gz=be21df6336d5b53ed82cfa4ff47e8170cbfdb64632657097e0f905cd69f30eb3 -dist/2026-05-31/rust-std-beta-x86_64-unknown-none.tar.xz=e626563d7bee3d38d62c563273a3fa0b5baffc14f41600e1f61ee5488ebd07f1 -dist/2026-05-31/rust-std-beta-x86_64-unknown-redox.tar.gz=f5b6fbb78b85f9df67078c383d8109a6a4b90e714b2375c21a4aa4cfd9933bfa -dist/2026-05-31/rust-std-beta-x86_64-unknown-redox.tar.xz=65b7176f5c06513e1f36dcf31470ebb2de20eb68520bee5366e110ad4595bc3b -dist/2026-05-31/rust-std-beta-x86_64-unknown-uefi.tar.gz=e732d76443090b133a1b9d451c79d5fe49dc7fb225a12d0da1316fcd954c0bbd -dist/2026-05-31/rust-std-beta-x86_64-unknown-uefi.tar.xz=df8bb3f70f9fb22a7d084386f8872a620070da1535f02d335d25341c60a095e5 -dist/2026-05-31/cargo-beta-aarch64-apple-darwin.tar.gz=1c900db5f022cb3f95392e7856d1b1e3511b75f821ac77e1cb8a6d655d30de94 -dist/2026-05-31/cargo-beta-aarch64-apple-darwin.tar.xz=53e0f2cf674fe3b753833997df6344250c02f9f83b50ea8c3771b3286fc1024e -dist/2026-05-31/cargo-beta-aarch64-pc-windows-gnullvm.tar.gz=58f632902a71caa0818bf4838a7cc9e0555b29e49b81025d3be8913ac21969c1 -dist/2026-05-31/cargo-beta-aarch64-pc-windows-gnullvm.tar.xz=c18dac963e3ad7c1b40676cbc8a0667407c8e9e877abfb744551d5b393e57b1f -dist/2026-05-31/cargo-beta-aarch64-pc-windows-msvc.tar.gz=20407421bbb671cc7ae833da5f4b7ec75c18bab571f085069b5507c10eee8b0e -dist/2026-05-31/cargo-beta-aarch64-pc-windows-msvc.tar.xz=be0dcbb902f6798cda78e5d4f59da0e1710da93f2f7fd3c68fd9a15a84d518c6 -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-gnu.tar.gz=db8ba59332d2d9b1b8992112727a2e33210e12b990cb8620cb149023ba9d0ab0 -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-gnu.tar.xz=4e4fc9d07fa80d591605e969d87981e27d37fea7533152b2f9a65e2001658f93 -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-musl.tar.gz=2c454d3d4f13fb3bb8d50b64641f31e1fd6c9cc36e5d252b693d0675142240d5 -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-musl.tar.xz=6b8bbbdac787dc7d7fdf65287ac6836ec01fc22b875546989f62b9263ab26aec -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-ohos.tar.gz=0e81dd209c80ebecfe693f5c88cf1dfaea50f82d6a427b9c7685ae30b5c5882c -dist/2026-05-31/cargo-beta-aarch64-unknown-linux-ohos.tar.xz=8caae8dcddbdf62ff3927a905c7405e0bcf0d4cf11dced8c51a5edd6cc62b4ce -dist/2026-05-31/cargo-beta-arm-unknown-linux-gnueabi.tar.gz=0e756c44c07cf9a31c3f07402416e96cbeaff9287a8d823144fe15fb7b8a914d -dist/2026-05-31/cargo-beta-arm-unknown-linux-gnueabi.tar.xz=1fcd0adaddb4270c49a284be5fdfc81dcb4ebfd65cca21aa790d162a4486e60e -dist/2026-05-31/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz=1d195cb636ee8915fe6dc57111f373d3281a963660ab9ad01bf63821a3bfee4b -dist/2026-05-31/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz=3add2f1f39bdf40aaabf755b0e91bb8872519d2feab30f039f6ba6f15f500f2b -dist/2026-05-31/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz=38247e44a39eb60651ff707d7605ccaf5bfaf0557d9093fa27097e84478b67f0 -dist/2026-05-31/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz=08cf61296a7153440b1daf6c16c1fba703eb191c0686104999848c752f2b44e7 -dist/2026-05-31/cargo-beta-i686-pc-windows-gnu.tar.gz=3966d33b73cbc721068ac6d89703083478eb292d8e7b22296365c1bae1af8181 -dist/2026-05-31/cargo-beta-i686-pc-windows-gnu.tar.xz=d6cd37f8f84b7e2ef29edac542f2bf62f3d7ff25a5b57f88457ff2c9b40278b9 -dist/2026-05-31/cargo-beta-i686-pc-windows-msvc.tar.gz=36f9fae072a21a32ce6aa66d6ebb45c25175ab9bd54fa128e582a2f51e76e35a -dist/2026-05-31/cargo-beta-i686-pc-windows-msvc.tar.xz=1aeee058c51fccb4ae53e9472d39ba6369e5a7f7cf95c3ff8232d9bb5aaeec41 -dist/2026-05-31/cargo-beta-i686-unknown-linux-gnu.tar.gz=21e989ace70f785dc6b0753078d720461643a523be923a01f3a11de435ddb3a7 -dist/2026-05-31/cargo-beta-i686-unknown-linux-gnu.tar.xz=48074a8ce5ed2a7d1ea2a18f7b96099b270806df116c61a3738829f084c6dd80 -dist/2026-05-31/cargo-beta-loongarch64-unknown-linux-gnu.tar.gz=f5f052145d530efde4518c2fd60f608cda568539246ac93698236d920edc081d -dist/2026-05-31/cargo-beta-loongarch64-unknown-linux-gnu.tar.xz=40408fcd941c5b90b93ea2d5b23fbad053823b9861791e85322bfcac19782215 -dist/2026-05-31/cargo-beta-loongarch64-unknown-linux-musl.tar.gz=b067654cf1bd26cacbac609718eed59b1bd74d99c326929a7995325676062d4d -dist/2026-05-31/cargo-beta-loongarch64-unknown-linux-musl.tar.xz=8df33ecb473c500cde55dd861976150c1d5d28b11c23c37b6db0adf013df8e55 -dist/2026-05-31/cargo-beta-powerpc-unknown-linux-gnu.tar.gz=818ffafcde74771ff6439dc66819f7040cecd9eca2f6dbca3af0b0066a218a8c -dist/2026-05-31/cargo-beta-powerpc-unknown-linux-gnu.tar.xz=3563ff89159fa199546e91d3b297c8fc71c8b0c48896bf91d8d643cf7a178c3d -dist/2026-05-31/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz=406b5c772125746c258f3ffc317135929c8cefd4489e556319f86045bca4d19a -dist/2026-05-31/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz=4dd7d8b879274428eaf580c2b077a668cd02ba41356354a59fbcc3b4f76c8b5f -dist/2026-05-31/cargo-beta-powerpc64-unknown-linux-musl.tar.gz=2fdb37111cd53aec01ca50db4e50058f4f5318fd44e6c464adbeb3820d009f13 -dist/2026-05-31/cargo-beta-powerpc64-unknown-linux-musl.tar.xz=68586a1e2eed2f87778eb956a9ee0da9032a76808a54155c3af4b7a615edac80 -dist/2026-05-31/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz=ecfed65ca58521c441ba9a53522eadf121e1fa89390594f5d73a95906c7a7e56 -dist/2026-05-31/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz=9d14fe65382427e672cbbef50a90e8a0229849090fbe27019df2a7c4f621ab14 -dist/2026-05-31/cargo-beta-powerpc64le-unknown-linux-musl.tar.gz=23f4357111b4af9f6b8759f2e3ce84428e571787287d637a4fa1e6ce31cf51f4 -dist/2026-05-31/cargo-beta-powerpc64le-unknown-linux-musl.tar.xz=6b31a49219259a20366646b21b7c6ea3d3968bf9639d698bb9e374b8ede298e1 -dist/2026-05-31/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz=48f1d385b802edf5abe455f899d8c2df52d7f0c906976d4905e3e37db6cbace6 -dist/2026-05-31/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz=9ec55313368199793de5af8167095aa03af60b86999dbb9715effe25270b3e26 -dist/2026-05-31/cargo-beta-s390x-unknown-linux-gnu.tar.gz=070ee86f9ab2e14962f4bfd6a9c820021056164cb2993f8e821f967f48e4fcfe -dist/2026-05-31/cargo-beta-s390x-unknown-linux-gnu.tar.xz=87cde65ae28b9490c4991a388928a763f4dd546f86b6e4f496c3521f9e73f09a -dist/2026-05-31/cargo-beta-sparcv9-sun-solaris.tar.gz=46c8d673e363cb85cf96d694b4a4db791262d6b8a9f668effb7c1dd76d809026 -dist/2026-05-31/cargo-beta-sparcv9-sun-solaris.tar.xz=4fe556875b35f2b6f3088dc1f6527fe4b512934dc918559f914a5f05d47e88ba -dist/2026-05-31/cargo-beta-x86_64-apple-darwin.tar.gz=4296494d43955daeab2a9eb1ecd0a4b901c57680399e4c9874a7eaef7cedd99c -dist/2026-05-31/cargo-beta-x86_64-apple-darwin.tar.xz=4830b4d2b90f4134d6dd1fb1ca7b0b2804b38d2d2c2474df1479ff7ae37b4e82 -dist/2026-05-31/cargo-beta-x86_64-pc-solaris.tar.gz=793c5192918045305bc542ac676b4cd31814e6bdc0104054884f2979e3eca118 -dist/2026-05-31/cargo-beta-x86_64-pc-solaris.tar.xz=356efef4c2620d5a44010cc76f2a1d67c3b8abe022c8d70a45b82b06fcfbf992 -dist/2026-05-31/cargo-beta-x86_64-pc-windows-gnu.tar.gz=dbd3b6db322da4d9757a09e66dc7c5a941defe4b1dab68e2a5f1795bb6d8c45c -dist/2026-05-31/cargo-beta-x86_64-pc-windows-gnu.tar.xz=a749691fd83d687d59c2985dfe6930d9de1ec675e4e40e097bea99800f4427dd -dist/2026-05-31/cargo-beta-x86_64-pc-windows-gnullvm.tar.gz=fc907f16bd9a0335ee2321ed3224d032ccb2b1ca6ecea30bbd068de5d9f861a3 -dist/2026-05-31/cargo-beta-x86_64-pc-windows-gnullvm.tar.xz=ad5b9130c4cd28a370f47f1f56b9d6a9cdcb5b020f5ed4d9f50117e13dcd24e2 -dist/2026-05-31/cargo-beta-x86_64-pc-windows-msvc.tar.gz=bc00b88edc99b2df3e949061e750c52c3e5d35e790ebf9394daee35b85830a30 -dist/2026-05-31/cargo-beta-x86_64-pc-windows-msvc.tar.xz=65900ca0ea4a2bd6a0652a384976837852ba652d615033d9e66f1cb1ac3eb549 -dist/2026-05-31/cargo-beta-x86_64-unknown-freebsd.tar.gz=84876aa77f233d3a444f8799b0dcff010d66f58ac737064c374258d6c8da7d37 -dist/2026-05-31/cargo-beta-x86_64-unknown-freebsd.tar.xz=7a105782f5152c52b8e7e9dd57e2c65b762b851c4b69486eb2cffe5d3eaa25a3 -dist/2026-05-31/cargo-beta-x86_64-unknown-illumos.tar.gz=e7d7618a7751304e5c566b7252492e173c4245c342c1824cadc661431057ca32 -dist/2026-05-31/cargo-beta-x86_64-unknown-illumos.tar.xz=dfc578416acd49116b928995d5d15c6084e36428ec834cefe5697676f7cafd83 -dist/2026-05-31/cargo-beta-x86_64-unknown-linux-gnu.tar.gz=92707c779a57b060935e613398a89e757afa88e41af9913ac1f220b8e4aa9aeb -dist/2026-05-31/cargo-beta-x86_64-unknown-linux-gnu.tar.xz=53a486f2e75ac6a05497181ef7a2c2c58ace6e5be401f1be0c1e8c9d3c9d306a -dist/2026-05-31/cargo-beta-x86_64-unknown-linux-musl.tar.gz=49327822da061abab51833426c050b3d929c929efd8799bf893e868073034881 -dist/2026-05-31/cargo-beta-x86_64-unknown-linux-musl.tar.xz=e21a7d7c92b0415b4ac31ae281a492ce8f32d2c3163700c76d54c3f621fa7fbe -dist/2026-05-31/cargo-beta-x86_64-unknown-netbsd.tar.gz=f1ee55d99c157d1a3b1d2fad0663696c909aad33c69b0f329e7015b3d45ce95c -dist/2026-05-31/cargo-beta-x86_64-unknown-netbsd.tar.xz=f89f8a5e49fa6f8d094b462abe9e98dcedf89943bfe09be9a84578f9d2e50e8e -dist/2026-05-31/clippy-beta-aarch64-apple-darwin.tar.gz=03bf7914cce99504f7208e6692f0c40131176c74e8fa5d8afa1099b5415404d9 -dist/2026-05-31/clippy-beta-aarch64-apple-darwin.tar.xz=2ba04f76ebeaae175f35b97d24604cafd5fe8bf5775a008bf61821f59fa138ac -dist/2026-05-31/clippy-beta-aarch64-pc-windows-gnullvm.tar.gz=5adea05303c1b1ed4722ad76e1374fad62f0288a4d0d606ed9fbd50326a656bd -dist/2026-05-31/clippy-beta-aarch64-pc-windows-gnullvm.tar.xz=98b203708d28f69f72fb54278a57ffc31db6a98c359fceba646c9d5e1f21bca2 -dist/2026-05-31/clippy-beta-aarch64-pc-windows-msvc.tar.gz=67a87985180739f66655a1c2142c1f910baf2c3ea0ff96b72edee4020811beb6 -dist/2026-05-31/clippy-beta-aarch64-pc-windows-msvc.tar.xz=d41494ccef3467b0c99728a574c9340046e77c418f982a2f638ac3d9876a9f6d -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-gnu.tar.gz=7ed41d42d8381300415783ae79c1c8e603d386d72087887b667d4c31e22078c1 -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-gnu.tar.xz=b6ee14b1909ec4165a086696e3a99f69c877285831bc9bc1eb9af0188897f8ad -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-musl.tar.gz=970ac19de12bba3c8de4eed9bf8c886aa3cfd95006d9b29e8c9b1f1eb142e41e -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-musl.tar.xz=0128005591dc0bf88f61e4598c6ae29f9f644e1a9fcb20ce2f790fb2366906d7 -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-ohos.tar.gz=0154d57504d5b8fbd9a6890ac4ba209de9ad2c190d4ce7feaf28898166e18fef -dist/2026-05-31/clippy-beta-aarch64-unknown-linux-ohos.tar.xz=640a089ff8e818235a57080e96e8e6dd079a7678f708ffb190b7dfb709dffbce -dist/2026-05-31/clippy-beta-arm-unknown-linux-gnueabi.tar.gz=c4427a48c50a61a69a3af0fca8c9e192b6af25417fe7ebebc48db63233ce15fd -dist/2026-05-31/clippy-beta-arm-unknown-linux-gnueabi.tar.xz=e13b6b309378a111f122b43c51253947c66121bdb854640aff776f938217634a -dist/2026-05-31/clippy-beta-arm-unknown-linux-gnueabihf.tar.gz=81bf0d76529c051b85f662c854b8b1c0aa0d171d6886f42067eaa3df4c5c679d -dist/2026-05-31/clippy-beta-arm-unknown-linux-gnueabihf.tar.xz=9cde407ef664b330c4f3cb1abe71cc8e093e3425e81e93f693b93ff364a62852 -dist/2026-05-31/clippy-beta-armv7-unknown-linux-gnueabihf.tar.gz=4e7d043ba1ce22f3125b3077e0ebb1f0e5784026b17ef7eee6f9f3fb9e71f168 -dist/2026-05-31/clippy-beta-armv7-unknown-linux-gnueabihf.tar.xz=c628fdb9f73d5ac90bbccf0584d266646b798c4a47076785b3bffb1d9dddd27f -dist/2026-05-31/clippy-beta-i686-pc-windows-gnu.tar.gz=74c9cb6870baec95a190d04290292d52604103a26c3ff23bf58cc57a3ec3a684 -dist/2026-05-31/clippy-beta-i686-pc-windows-gnu.tar.xz=6d8494d3ec111c6747e53d63cceddc79c9c85f18f882bcfccf44c941194088c8 -dist/2026-05-31/clippy-beta-i686-pc-windows-msvc.tar.gz=19f70d7b1fca8c89955490a783aa013384158ecf11d738c5e3e92ef6f4da0889 -dist/2026-05-31/clippy-beta-i686-pc-windows-msvc.tar.xz=a02e16a60761aa49357661219d21633ccc6f955f3776b5543873e0e0e9dfe55c -dist/2026-05-31/clippy-beta-i686-unknown-linux-gnu.tar.gz=3506ad8d1224b418e2e31019e134eefdbb5785143053351e5ef25de097ebc004 -dist/2026-05-31/clippy-beta-i686-unknown-linux-gnu.tar.xz=ca8898139d60944c65b145e1488606a440f21138cc71b1926eae5af045a23380 -dist/2026-05-31/clippy-beta-loongarch64-unknown-linux-gnu.tar.gz=89885d77c76c846faae60773b85806ebedc4a2331ba2b53aae6bd9b7e845057b -dist/2026-05-31/clippy-beta-loongarch64-unknown-linux-gnu.tar.xz=e0a9d861575b488f74c5f57b20a66392ae2614cc48c691502e5b91528fe16d70 -dist/2026-05-31/clippy-beta-loongarch64-unknown-linux-musl.tar.gz=a929da7c2dfe11bdde2198d51f0237e279db488d67f54d1300a13372e1d33ddf -dist/2026-05-31/clippy-beta-loongarch64-unknown-linux-musl.tar.xz=7240afdb080f28dfc7b3a67eead8a334ebfb99f105af7ef63ce7bde920865fdb -dist/2026-05-31/clippy-beta-powerpc-unknown-linux-gnu.tar.gz=5cd081b5bb591c0efd4d5eb60d73c639b510f9d72b34180bb468302dd90c32f5 -dist/2026-05-31/clippy-beta-powerpc-unknown-linux-gnu.tar.xz=afa4dcb192eba24166ae2ab88f9f58acdff32bb4227084b3ad466dde8e120811 -dist/2026-05-31/clippy-beta-powerpc64-unknown-linux-gnu.tar.gz=32fa368bedd0c0daf428c1f445e2078f2829d5cf6277035997d64a917db2b6ed -dist/2026-05-31/clippy-beta-powerpc64-unknown-linux-gnu.tar.xz=ffe7d27a8eeceab74473d59ebfd4f1f989416e58bb465bf94d43de6184b9eb34 -dist/2026-05-31/clippy-beta-powerpc64-unknown-linux-musl.tar.gz=aca70525b41759e6f19710e8eba254ed103646cede478532949e04a7027342e2 -dist/2026-05-31/clippy-beta-powerpc64-unknown-linux-musl.tar.xz=163c545a90372fda13fd943d134574ef825e385200ae457960c9aa8e2a29004b -dist/2026-05-31/clippy-beta-powerpc64le-unknown-linux-gnu.tar.gz=f811c0ace4f085eaadd3d77d760f5d6140ccbd7c9da4ef872ad641d5ac6533c2 -dist/2026-05-31/clippy-beta-powerpc64le-unknown-linux-gnu.tar.xz=2471cca5ed2e2ad9017f02607f265e879362d7c988eac4644e68fadd1240ecbe -dist/2026-05-31/clippy-beta-powerpc64le-unknown-linux-musl.tar.gz=abe1dac9162d49429250169e574ccca1007a562f7b1e495062d03a00f4231e3b -dist/2026-05-31/clippy-beta-powerpc64le-unknown-linux-musl.tar.xz=acf0b8777d4a9d6fadacb41e36a7759b7c601a09d9836009d06d29a5f888acd2 -dist/2026-05-31/clippy-beta-riscv64gc-unknown-linux-gnu.tar.gz=04bd419b04f3a4a6a413d55744f8b9f272ad692b288db22f14c261347f93d04d -dist/2026-05-31/clippy-beta-riscv64gc-unknown-linux-gnu.tar.xz=6e4a17d917aa0c9af399021780658ecc40b029fb651950a38bce29292510982b -dist/2026-05-31/clippy-beta-s390x-unknown-linux-gnu.tar.gz=cff3fa61dec3aba56e257d976527d3d02325a553852a83a479588f8f459ea476 -dist/2026-05-31/clippy-beta-s390x-unknown-linux-gnu.tar.xz=595c2021637c76ffaa4d3f894b0b4543a36d4fd428f7346401f8939b71bb8a99 -dist/2026-05-31/clippy-beta-sparcv9-sun-solaris.tar.gz=4f348b56a47f5c0ab479dea0b21d66ed50bd6a650866c27608a7372a5ce5ef9c -dist/2026-05-31/clippy-beta-sparcv9-sun-solaris.tar.xz=dba9344309b302e3502fd8c8e7a83550828e7f60c31a6b0e60034fff4b625918 -dist/2026-05-31/clippy-beta-x86_64-apple-darwin.tar.gz=af80ff15d68325e10be4c38801139201bfa6827ae281f9f52aa2f3b012d2d9d5 -dist/2026-05-31/clippy-beta-x86_64-apple-darwin.tar.xz=60faf6befae389fb3a125c35b6631254e3cae412f1a782ac5c201a8d92a29d07 -dist/2026-05-31/clippy-beta-x86_64-pc-solaris.tar.gz=378c4b2fd68ccb79c06fe559e2fc0a86e3f919af70a1f2e95ec0c6ed208e9ecb -dist/2026-05-31/clippy-beta-x86_64-pc-solaris.tar.xz=8e0192565709dc60ed548ac8b8ccdae84c7cfe3055d1b627cb4e5dbbf0041687 -dist/2026-05-31/clippy-beta-x86_64-pc-windows-gnu.tar.gz=b038826ca7655ef42a3f8164a0314481824226dedeee35fc1a5e79a22ca45764 -dist/2026-05-31/clippy-beta-x86_64-pc-windows-gnu.tar.xz=df9e7951003975e7688b8cefe9d0876623ddb0d583bd781e542209b5108d82b3 -dist/2026-05-31/clippy-beta-x86_64-pc-windows-gnullvm.tar.gz=89f05e8e4af3354ac52e10008671edaf32399cd584d8bb880feaf8df60f21c5a -dist/2026-05-31/clippy-beta-x86_64-pc-windows-gnullvm.tar.xz=c08b4891ea22e0be76bc3d4a83b5da927a333df0700dc00e005852419a66dbf9 -dist/2026-05-31/clippy-beta-x86_64-pc-windows-msvc.tar.gz=71312f07a8f4740a427c50a774fa8df9fe8f6ea92f0b3c81774c4d20b3246b35 -dist/2026-05-31/clippy-beta-x86_64-pc-windows-msvc.tar.xz=f5177c9be79db7cadc374c5ee402bfccd7c97164774e7adb73205e03f940dd24 -dist/2026-05-31/clippy-beta-x86_64-unknown-freebsd.tar.gz=6579b6ae0f5ae8b00acb0ea434a05d54ac31672eb041edbfe5a04b6e7b7dd599 -dist/2026-05-31/clippy-beta-x86_64-unknown-freebsd.tar.xz=3433e211efbeb473fb852bd1a3380b89e6b5328bf6497cd5deee33d3b7b0d424 -dist/2026-05-31/clippy-beta-x86_64-unknown-illumos.tar.gz=bac54b25472f58174749f96b278b754d3123b51a9b1953c73e70fb451b0ed5f2 -dist/2026-05-31/clippy-beta-x86_64-unknown-illumos.tar.xz=9604da4bd585b9ca90028d2495357061e5b879eb3e067b6e67f3a3b3f4c79cca -dist/2026-05-31/clippy-beta-x86_64-unknown-linux-gnu.tar.gz=43ca95afd64c5b7de748d1718950e81c4bdc7240b96b956853285c07df560f8a -dist/2026-05-31/clippy-beta-x86_64-unknown-linux-gnu.tar.xz=eaa27bd3c1f3967f4abd65c13c8f194b6882895e3f72a44010e64fc3d77fddb9 -dist/2026-05-31/clippy-beta-x86_64-unknown-linux-musl.tar.gz=4f6af8894db329227bd7e18a33902074bfedcc8094efd054947eff9a8f8b5b1d -dist/2026-05-31/clippy-beta-x86_64-unknown-linux-musl.tar.xz=9efd36d821bf77220dde5e579920de3dfd9c8a77c7d7dc56b68dce85325ed1e1 -dist/2026-05-31/clippy-beta-x86_64-unknown-netbsd.tar.gz=6612095b10ec432613e4a6016e66b1766ea5986ad7cbb7f3b5f9f40eaa6db1de -dist/2026-05-31/clippy-beta-x86_64-unknown-netbsd.tar.xz=26fcca04e88fd6b8246281f0492c0890f8d2b75bd9ae5cabfee8e7b6e21a9448 -dist/2026-05-31/rust-beta-aarch64-pc-windows-gnullvm.msi=4e6361603d237f4308016d19b120e3fb6a4a8fd4cf1d311d5a5384142882d55c -dist/2026-05-31/rust-beta-aarch64-pc-windows-msvc.msi=9cf05def9b998abcf5a1276316a2a5ce527636b29837fef7559fe3220ed212be -dist/2026-05-31/rust-beta-i686-pc-windows-gnu.msi=43cfa1da9086e0089552a3b1377b36197b7117c3bffefbe434744f221a95de8d -dist/2026-05-31/rust-beta-i686-pc-windows-msvc.msi=01f7600b4ddd2045e6112a3d52e7978622de881dc084d8be6cb070ebf3329d3a -dist/2026-05-31/rust-beta-x86_64-pc-windows-gnu.msi=d0aab810281771b90636029c8c02185773acee1baef7f89c82b828105586d58d -dist/2026-05-31/rust-beta-x86_64-pc-windows-gnullvm.msi=9065b660d61a57a24df8fc703927d45e2903a8c14909f1392f1d6984892cda68 -dist/2026-05-31/rust-beta-x86_64-pc-windows-msvc.msi=061e4275ce0fee329e85df242af9445f57aeb4e4387d7673b78086684e347713 -dist/2026-05-31/rust-beta-aarch64-apple-darwin.pkg=fe0c51c6410b68058a6afdf0df0888c1aab0423e33f9195c2b8b593519b879a4 -dist/2026-05-31/rust-beta-x86_64-apple-darwin.pkg=4bdd11ed0d11b072cae4ea46229edc9a31ee74e985b782d497f3e696da28b8ec -dist/2026-05-31/rustc-beta-src.tar.gz=218f419ec231e359c26d2f460d87edbc4554a58577c6fb9846a4b5fdeeb697db -dist/2026-05-31/rustc-beta-src.tar.xz=a16f707bed3e23e7d386fb68e0d8a5e140cf87962f20e616fd35b365cf556f8c -dist/2026-05-31/rustfmt-nightly-aarch64-apple-darwin.tar.gz=7ef7abcc5cbb1323bc21922e08db55acd0d2aca6de0507d350325abd3da45cfd -dist/2026-05-31/rustfmt-nightly-aarch64-apple-darwin.tar.xz=b19fe339eed9e0848052f4b96624ee57beb7e99f32ecfb2c8d603be6226167db -dist/2026-05-31/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.gz=1f4d3d5c03f1c757414f71c5b389b66cdf45ffb032d2f1acd9b3a8515ddd1397 -dist/2026-05-31/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.xz=a79a8ef4a557c68f310adf5a8559a018b0a689ff44149ec25e5fdc2518ad49b5 -dist/2026-05-31/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz=b4ebb1d61a066f2a382b30635e660982d9bef94ac61d183fe5462caee5530f65 -dist/2026-05-31/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz=721baffda8df4216be1e5ce85ddbc288df40e467c14720e0792277f4dea34eb1 -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz=1155ad522b0e18f8e7cf2a1719ca9ba9b1ebe01d6351a3a38ea20f5427a14756 -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz=0c8269188672669fdd6e42ac032c3be94c8efad8bd71e53dc6b1518ffab170f4 -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz=99722c75048a61a2eb8d4907202b75c142713075ec91493c64d521299563b4da -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz=0e2544760db1e15083774357a7a4138279706785ed830bb3a64f6a2d5ff3d9c7 -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-ohos.tar.gz=98112e47d93ef38f8a1014d5cde3c412645ce62b64ac05778fb21dbfb1ece284 -dist/2026-05-31/rustfmt-nightly-aarch64-unknown-linux-ohos.tar.xz=da3771725571b276baf36574c6b0e4b540096e1a05839a995223d3a8f7f95ea5 -dist/2026-05-31/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz=46aa7b65b86c6d3dcd8536cc2d136c379d2c0a15dfa51c2b30f0422d29bff6bc -dist/2026-05-31/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz=e6cb1a5444b613d8dfc83908626a90c5d7946aea5372d55937a7be11cc0139a6 -dist/2026-05-31/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz=41e8276e0e379e479a037ff9992e9099cb5fb712aae538583cdf4a0c62fd0b95 -dist/2026-05-31/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz=e8de286da7aea2dcfa8eff8a4d258c88b10b676639f8c6656c7a2cf82a2cb224 -dist/2026-05-31/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz=cd8ee346b95773f4c85eb7ed9309d4630992cb85948f328404ebbc2bb72e653d -dist/2026-05-31/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz=e2da42681fcb37a20ab4b80d8087ea703bb0b7968f768715589380f0853608f9 -dist/2026-05-31/rustfmt-nightly-i686-pc-windows-gnu.tar.gz=d6beb0c1e789497a86623c6762125dffc67507c22de8ab2fbcd9a30b6226e711 -dist/2026-05-31/rustfmt-nightly-i686-pc-windows-gnu.tar.xz=cab762357d6b3ef5c1196602d3c9aac72e24babdf9effd189b3d55578adc7426 -dist/2026-05-31/rustfmt-nightly-i686-pc-windows-msvc.tar.gz=21dcc5cb65001eec0adbadd4e9b3c94dbb8609436423b8387f410f6b6bbfa09e -dist/2026-05-31/rustfmt-nightly-i686-pc-windows-msvc.tar.xz=76d66710bf2222099370e31f31c7f84542329d38b4bbb0ac1d31776c20f7bdd3 -dist/2026-05-31/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz=2b331926d04adb029c06496f83a64e4fa977c6567dd18db5a4c25844235f2466 -dist/2026-05-31/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz=ff8070bfc0563d148dce52d167e834c58f39a7c169986db5cd95eb2e69a236c0 -dist/2026-05-31/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.gz=6c70c4fe99121fbf83bea7c0aa20b399baed50334631ba64c3a4b65fd3be3504 -dist/2026-05-31/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.xz=a55fe92ef4fe6cf8f38464c1b7333e30555a30dc4a7344dd27bd8d6fde8e1c01 -dist/2026-05-31/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.gz=fb86b3dccaa12991853e6672ad8b06e06caeaa215173597d92d3c3b08f2707ab -dist/2026-05-31/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.xz=e9b73f4b77fd6197e22c9d78390c1ae9ed082cee61fedf8ba873f4a1ade75fd7 -dist/2026-05-31/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz=8de504772cf86a4ef64b754f93d2ad37ffa7c21a4d02ab22650f29b4db0fac5d -dist/2026-05-31/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz=944f518fac7880aecc862a1fc530051339fb400eaef82570b2be800acf89b03b -dist/2026-05-31/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz=02a2218c1535bdfcf8b354d1ef282563292791e6db7b5959e289af59d708f0c0 -dist/2026-05-31/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz=c9b000a2b632fc1203ae3499c59716615707dbdc14ba1a2a11ed4522af0bd10e -dist/2026-05-31/rustfmt-nightly-powerpc64-unknown-linux-musl.tar.gz=f667f7b4b1221a6ec54aac2ae28e4f1b2cd78043d6be9313e3b464b40b876a2c -dist/2026-05-31/rustfmt-nightly-powerpc64-unknown-linux-musl.tar.xz=a3243f16753ea345107f0c6b982eb67c5c1491f3d158d019e10dce0e29a1b50a -dist/2026-05-31/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz=6fc4a673875384aaa6f5e1528e88b8d2d4eb080e2d2da1e921d466f105c50b00 -dist/2026-05-31/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz=8b2ccf65a543a19b818abbff38ea52284f46a0bf88fc543d6438b37613941684 -dist/2026-05-31/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.gz=0530be30dbe6d248114ede9b8b2b5010b58239c069c772d20829d390bef4ef43 -dist/2026-05-31/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.xz=419ee44daad1cdd35215efd019671c75641ee3227611f8a2a7804ef587211275 -dist/2026-05-31/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz=9ee29dec86368d195c38e89ebca6756e3212fb2757887b0dbf761f09d4514d50 -dist/2026-05-31/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz=2196928b6dd22f8b8c306628e8b9a0a34f295b4f17e776c662a5933c756e4627 -dist/2026-05-31/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz=13dd2bce3ce3e44af85133d33093f2f81d13d59946e784414d63184ce7cfa550 -dist/2026-05-31/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz=4b53598ea77d5de5f11ad3510d387c43af52578f0e1485a9ee8507ddccc2a953 -dist/2026-05-31/rustfmt-nightly-sparcv9-sun-solaris.tar.gz=77cb5086f5c06fc7371ad2df69887cd4214ebd520ccf7ac29be566af282b49ee -dist/2026-05-31/rustfmt-nightly-sparcv9-sun-solaris.tar.xz=86589cd9d0999dde31bcfaf816c0116002e981886e80aa3d77949ba555671579 -dist/2026-05-31/rustfmt-nightly-x86_64-apple-darwin.tar.gz=28dc9324e5c3376df220c8363763c7e547d0fe69b54dfc4cb095d57643c6b4d7 -dist/2026-05-31/rustfmt-nightly-x86_64-apple-darwin.tar.xz=e16bb80d1b2ff1c15d5bb8840a10b855b913968b693beecb6122f32738204233 -dist/2026-05-31/rustfmt-nightly-x86_64-pc-solaris.tar.gz=05897234f66823dfb8c9e441210e0956cece4e60217831f8ac07f1a181950df7 -dist/2026-05-31/rustfmt-nightly-x86_64-pc-solaris.tar.xz=a52ea8f5b8ea5441170663dffde68613032d07e9cc57c11a6f964dfd7f87e76a -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz=ffcac357f10efecb3bf15516ae1f56034ac73005e361ee9ef4cf5091fae228fd -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz=af825aecbf9ac84a0a0196341d2a0e8a154a05e4f3716e1ff3b664654af41245 -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.gz=81276ffc7a9f51deb156b8f4c15e72d2811c8a4791f4143783a63d0ac0ac75ae -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.xz=7a3f739815996d3b48030034192dd3f09be7422d27fa3c39b756444d00bc2c40 -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz=aad35435802d476c5e08542e5779eaf0d2560282b36f8cf1e9128d9348992d6b -dist/2026-05-31/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz=2bd3fe07f04c8bcdf8958953e6263b282ae467618121da64d3fb30eabdd0ce89 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz=815d52dcc657c8ad79800b7d178c76b8375faa7744f6e6f570db7774b9b1d886 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz=035d8abfc3f81a2a3171fc446b2954cd83963cdf09b3a08fbdc4182a4b413664 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-illumos.tar.gz=49754b9cfb03063fd4b43109bbe1c7f1cf0e2d2583c79eac7f017bc1b8641b76 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-illumos.tar.xz=11c4bc5b10fcc7a80776d6781c25e8d61b0f1f0c02885a4a7b73b8b29cb699d4 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz=2f5805a998ec16092dc96083053848c986a3205da189e53dd7635137df0a2128 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz=adf8b6f2dd54c37fa8567b2e51aaac4a2b05d0f707f6a49166326478a4fd3cc2 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz=2980b7e2db4226119e28aa1b9cb80f985d4849723406f4e98795ca47e8380995 -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz=820a029ad73d4fb25daed611e53519e8af98d2cdb6c1d9fbbb6cfe2474e7352e -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz=d051cfa9ff99043e78beec3370db15aeb5751380cae9f8f85e95443774f3b5fa -dist/2026-05-31/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz=ae7f39dc77f115bbc1b2227f78eca146cd29da3a65ee60ea2e6c9f9375bd43f9 -dist/2026-05-31/rustc-nightly-aarch64-apple-darwin.tar.gz=f64a94faec87e7221e988c48fdb7097b8f17da78e97af32b441615cccae33976 -dist/2026-05-31/rustc-nightly-aarch64-apple-darwin.tar.xz=8fa187c933c2e135bc0cd43febbad7becfb227aae4fcfad50dbeb8b108821e8a -dist/2026-05-31/rustc-nightly-aarch64-pc-windows-gnullvm.tar.gz=669ca8966f8d3254967cf20259443448b0071a73c9be117e847a76b5afef8951 -dist/2026-05-31/rustc-nightly-aarch64-pc-windows-gnullvm.tar.xz=228065e4a422c437a69556795bad4ca1cd6e432b1feadca0456ea9da50faae47 -dist/2026-05-31/rustc-nightly-aarch64-pc-windows-msvc.tar.gz=8e58bb4c479c5e7646ba477f1bd3831c26eeaf09d00efa1e295e4c792c0ab483 -dist/2026-05-31/rustc-nightly-aarch64-pc-windows-msvc.tar.xz=70a241124b464d0055a862529d50c59c990b05387b578857fba17a5f83113527 -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-gnu.tar.gz=76cc8b6e3c089635cf621e5e0b63f5815c8a166b9c93eabc6ef998a896bcbc3e -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz=cdb6ab3a77b8983debde49073a8e86c2312a021e4a435e2043dd86fc6e921793 -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-musl.tar.gz=3aff40200c2a2e400942070e9dd0515a2f6a85fcbd8526ed1288572412513aee -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-musl.tar.xz=b2043b343fce0f62bd3f41a5398df2223d97b6f7c76814c72f1cf6df19c02228 -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-ohos.tar.gz=3ea57a254ed6debc3f3b2af4df16ee0b85d069b36d318c4afc948d1c772d7999 -dist/2026-05-31/rustc-nightly-aarch64-unknown-linux-ohos.tar.xz=a72f39844e55c5f1555083c6901671a4a0aa6fc4e6359d118785d29fbffd7fc8 -dist/2026-05-31/rustc-nightly-arm-unknown-linux-gnueabi.tar.gz=e5f00ab08d6c8b88938b351deecd445be00f588483ecb7c38af7b68675378d8d -dist/2026-05-31/rustc-nightly-arm-unknown-linux-gnueabi.tar.xz=71de91cd3052ddc6c0ef6bdc4ba9f64d95c9772784fc81f6d70dd4179a9c7087 -dist/2026-05-31/rustc-nightly-arm-unknown-linux-gnueabihf.tar.gz=877661a8fbc6a2d65f238e7704e235bf801f0dd84c6e12588d795586646da1f8 -dist/2026-05-31/rustc-nightly-arm-unknown-linux-gnueabihf.tar.xz=07bce3f19daaacb4af680a8b223fc5f9737de6921de867de21e56d2248e7e43c -dist/2026-05-31/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.gz=68606d7a7e2c5afbd342f45044c2db1bb1183930308113d73d076c753e6795ac -dist/2026-05-31/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.xz=984ca8deaeb6d555a41698de83743452954cc7d55f93494ce2ca1f0f4a68f421 -dist/2026-05-31/rustc-nightly-i686-pc-windows-gnu.tar.gz=827b546af3b19b59966c7781c7c7b1549b6fe3d2dfd1327b1a40c6c9cbc109ae -dist/2026-05-31/rustc-nightly-i686-pc-windows-gnu.tar.xz=558ace34ab751d5ac55d66e6fa2faeca61dba29cf1a3dad83e12572490030972 -dist/2026-05-31/rustc-nightly-i686-pc-windows-msvc.tar.gz=fec033ac85f13820a1c6a4e977094682431c8ab0855e9066333ef8fbe1e79f62 -dist/2026-05-31/rustc-nightly-i686-pc-windows-msvc.tar.xz=ca6a712ae1fc9a71b71a32e954bd3fa4d1397388fe891048e94e6e202d3958c7 -dist/2026-05-31/rustc-nightly-i686-unknown-linux-gnu.tar.gz=65399a15ee91b71ab984e943894ec4c3bf55797b3447e1748f2ee08d61be9c1e -dist/2026-05-31/rustc-nightly-i686-unknown-linux-gnu.tar.xz=4230f0c6e76cae9afb70f99a1a35847e4f409d1965aedde2077fd822d2814f16 -dist/2026-05-31/rustc-nightly-loongarch64-unknown-linux-gnu.tar.gz=7a9876c80fe5d1a49148b4a00770f4a68c4beb8a84c99bae2e674b59971a8deb -dist/2026-05-31/rustc-nightly-loongarch64-unknown-linux-gnu.tar.xz=4c923ea2b5cd10e8a4e59bdb5dfee38e949aa0e99daaa1873001cde017d865e7 -dist/2026-05-31/rustc-nightly-loongarch64-unknown-linux-musl.tar.gz=422791db69cd1c5ee724e7facef2911e98ff0c4d53cc1f2e6e90507990412b3e -dist/2026-05-31/rustc-nightly-loongarch64-unknown-linux-musl.tar.xz=b54065508ea14e258d666572177eb15fa5bb52fc8c2b7690df8cf8ffcad448a9 -dist/2026-05-31/rustc-nightly-powerpc-unknown-linux-gnu.tar.gz=f9113f3a98999b382702ebb373c4b1cfd1ba1e0fff8878ebb1d5d58a3fe7fe68 -dist/2026-05-31/rustc-nightly-powerpc-unknown-linux-gnu.tar.xz=0708702033d4acf822eb394f19dc4c8cbcb46f18c6bb56e4d5fb3a421633ed6b -dist/2026-05-31/rustc-nightly-powerpc64-unknown-linux-gnu.tar.gz=02b6f3471fd4c05c92e9db51a4c8832230aacbfb8e66d71824509cfd8dfccd2f -dist/2026-05-31/rustc-nightly-powerpc64-unknown-linux-gnu.tar.xz=362ca90cf2d2cc5e106282124e2874f53436cf250b5afed6756b78d3eaa7b950 -dist/2026-05-31/rustc-nightly-powerpc64-unknown-linux-musl.tar.gz=c0fcf14b566e451a30806ddeecf14c8e52258aea425a85ffad48cdb2ec1b1136 -dist/2026-05-31/rustc-nightly-powerpc64-unknown-linux-musl.tar.xz=04ad70f3e20339221525114fe2c31ebcf21deee097b5a1ba0366ffa7c741025e -dist/2026-05-31/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.gz=12174c0eab7baac2c83a557f58ca74edc073f409da73c395a01a960c44f14e9b -dist/2026-05-31/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.xz=b4e38aea2fbfe4e950f29cfd9ec95ad8d38dfdaa2c450834278bc4f62db8017a -dist/2026-05-31/rustc-nightly-powerpc64le-unknown-linux-musl.tar.gz=682823a1d65e4206dd40c72dd9a55506e768cf7807fc9db2c2a5692f0dd6f254 -dist/2026-05-31/rustc-nightly-powerpc64le-unknown-linux-musl.tar.xz=05e44578ae389d810ce384df607139a238292a49720b0ae240f26d828f5062a7 -dist/2026-05-31/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.gz=12ed400a30df16c3301edb61a5621751e0f3fe46c6cd4a6f0d961c9822addde9 -dist/2026-05-31/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.xz=4c23be664e79351fa9a5870da59e243cf6ed66808dbb9bba149f60820dcddb77 -dist/2026-05-31/rustc-nightly-s390x-unknown-linux-gnu.tar.gz=5a74d07a33f032ea9a945e1b659709900fd0c2e5cdeee23de990129cecd59676 -dist/2026-05-31/rustc-nightly-s390x-unknown-linux-gnu.tar.xz=8297d3d59dfbe395f512ccae3d3080b12be40639d15bb053ea437caa9a559caf -dist/2026-05-31/rustc-nightly-sparcv9-sun-solaris.tar.gz=17c673f3f2ea3a3e0b6659292ad9087f821d18adf46cb7a9a0a9df3658fc94bd -dist/2026-05-31/rustc-nightly-sparcv9-sun-solaris.tar.xz=e4582238380badead24a2bf1657cbebce9e5f40bb304ceba3f3cf25554120213 -dist/2026-05-31/rustc-nightly-x86_64-apple-darwin.tar.gz=e4c17c5fffe4a4d064744a37fc9c5bbe47ab9c2d96d08e45bac01546531ea7ef -dist/2026-05-31/rustc-nightly-x86_64-apple-darwin.tar.xz=441b0dca028e7ed8768cba07e6892eca12df8db44a943eceb93eb9f04f99c2a7 -dist/2026-05-31/rustc-nightly-x86_64-pc-solaris.tar.gz=594af7051ba69174fc4c5d7e8a9d8ef3a2e9073fe9cc2820fd326c797ccc0307 -dist/2026-05-31/rustc-nightly-x86_64-pc-solaris.tar.xz=f95417fbc5f32792718bcb27699a38dbc70465c7d3625f390dc5cdecf6e272ed -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-gnu.tar.gz=29127efeb8975a5b9c9bd0608684970e0df41d21902a1b73b11d8339e73a56ff -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-gnu.tar.xz=3e947d6fd4e0153458b2bb155fc6e75d55a0bd57649590f054f6e34c689a06cb -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-gnullvm.tar.gz=ea52c3e92f26fbb839c2e76bdd96ad2fac757568a387ae9a13e9dd9b5303e414 -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-gnullvm.tar.xz=e9a92f60037bbdbe7fc4ae4ca2d498d2f33ecb598ed4ec06890105961394c963 -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-msvc.tar.gz=f4b3f5c239932293296b2f5ff8fd262f4457c3a274b413f63077d88f6289e196 -dist/2026-05-31/rustc-nightly-x86_64-pc-windows-msvc.tar.xz=df15abc80b1249954fd4668f5abcd2de04e3274f24813db76de8dc673c64dd76 -dist/2026-05-31/rustc-nightly-x86_64-unknown-freebsd.tar.gz=fbee62d3d9db30b5c42afe1b6067cf8d44df8f569a43c72da9f865e6efeaff09 -dist/2026-05-31/rustc-nightly-x86_64-unknown-freebsd.tar.xz=b4941bca65b416c1f7254a7afc18c208c3bbf7b47f06c81ab83a5f323e0e97ce -dist/2026-05-31/rustc-nightly-x86_64-unknown-illumos.tar.gz=214a91ce3ff3eaf62d05b60c7c43fd35ad817aa526a82e3e4d3943cc1a7b396a -dist/2026-05-31/rustc-nightly-x86_64-unknown-illumos.tar.xz=bcde414eeb270fd1ce7bdcbafaa6aa3ce94edca2f7ac0c914433d67b9033eeb5 -dist/2026-05-31/rustc-nightly-x86_64-unknown-linux-gnu.tar.gz=c57dd5dc0d0bc85d59dca541f20cf04250e9b2f210550ce1425e97b401714131 -dist/2026-05-31/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz=9e6ac5e346606f4245930ff868e187d339a1ad5c2e60557bfacdd25a51689bf4 -dist/2026-05-31/rustc-nightly-x86_64-unknown-linux-musl.tar.gz=b57e6d4aee9066c2446907b3e76fecd406367424bb8148b3f3fd0a7b524ef0c8 -dist/2026-05-31/rustc-nightly-x86_64-unknown-linux-musl.tar.xz=01ed8e2e055a2c458aab74da6b1a7fbaba671127b56cc27448ef6b449eaf21a0 -dist/2026-05-31/rustc-nightly-x86_64-unknown-netbsd.tar.gz=857213a5e914b564999ee822f89d4e7001647010bde5965ea0acd9176a5c139a -dist/2026-05-31/rustc-nightly-x86_64-unknown-netbsd.tar.xz=d03bcfb657873fadca8dbcfb4992eb3d493ee03b870d48ab8a56acb567fe6e7e -dist/2026-05-31/rust-nightly-aarch64-pc-windows-gnullvm.msi=084b4cda2fa73ed97c3590391b11cf4c08a6c2863df9f7caacd1acb43641f61d -dist/2026-05-31/rust-nightly-aarch64-pc-windows-msvc.msi=c1fc78a40bcd8fc5c1ea96bd7ccba626c84b753c41073af646c058053d4d04ac -dist/2026-05-31/rust-nightly-i686-pc-windows-gnu.msi=9a904617784e8fa219350b2612f6e7d190ab40b95f5d5cb4acf293b10a2e86f2 -dist/2026-05-31/rust-nightly-i686-pc-windows-msvc.msi=e5044302a4e2e0ac33027478c60d0620364603820c18f0f5d1cef9750e354727 -dist/2026-05-31/rust-nightly-x86_64-pc-windows-gnu.msi=b43cf69de39e26aba92531dcdb5a97c567ed68ac91f0852a657073ddff4eec94 -dist/2026-05-31/rust-nightly-x86_64-pc-windows-gnullvm.msi=33476b08c55dddada9c80c82320dfde599248882d42c9c2e10fbb8d5aa207b9d -dist/2026-05-31/rust-nightly-x86_64-pc-windows-msvc.msi=4a1534f3e442d0f0e305a793794981c75be08817578ad9a7231f7bf62b07ea5b -dist/2026-05-31/rust-nightly-aarch64-apple-darwin.pkg=454b5dba457745e975e2bf128e9302f4724b7b0a20731feb7071a2858e557ad1 -dist/2026-05-31/rust-nightly-x86_64-apple-darwin.pkg=fcb32eab11dd7fd0afd5dc84e38e12fda8e364d154c7768507af3a3566b0dc4a -dist/2026-05-31/rustc-nightly-src.tar.gz=c1bdee6cc2db9b7f620ba00c00218b9766080064ac4b7cf9ca92fc05450b8b90 -dist/2026-05-31/rustc-nightly-src.tar.xz=7ff0812c7e90b03a1dcc5ae87722d71e9295d4505f33cdb1f17f5487f2320c95 +dist/2026-07-06/rustc-beta-aarch64-apple-darwin.tar.gz=8ccd60e6a7e99c74a7a915b8ef7d4d85753861c1dd714c768e81b92ff65cef96 +dist/2026-07-06/rustc-beta-aarch64-apple-darwin.tar.xz=d69e8f5dfcd03b523c6e6906cf49683fa43c42c402b040c8906407c0f3971279 +dist/2026-07-06/rustc-beta-aarch64-pc-windows-gnullvm.tar.gz=b341cbf89bc90162bc751de9115166b5f31463a4fd2d46c55793a0a7496b7220 +dist/2026-07-06/rustc-beta-aarch64-pc-windows-gnullvm.tar.xz=74b62125614a26c5be9f44e6a62a29e6b8258728e2b7ba65245583da1eccbfd4 +dist/2026-07-06/rustc-beta-aarch64-pc-windows-msvc.tar.gz=f413242b994c19471b521d15846ccaecad98018dca487e14b9586824b893db12 +dist/2026-07-06/rustc-beta-aarch64-pc-windows-msvc.tar.xz=55a84a36eeaf621f0cb394b089cfc223fde13d6398dc951bedf06b833c26c476 +dist/2026-07-06/rustc-beta-aarch64-unknown-freebsd.tar.gz=b3c361cae13cfac231d28dc6f962765c03ac6d7baa62c5bd0fcc3fba23650d00 +dist/2026-07-06/rustc-beta-aarch64-unknown-freebsd.tar.xz=0afccf8685d99240979e3fdd2d2efaa91ed8ee8dc694fb64a60ae28bf111f123 +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-gnu.tar.gz=b178b4be976ac5207df150ddd4f4d9b635752513116f3df05f6890aacbdacecd +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-gnu.tar.xz=5d8905133ef3c55241325a6f4a8dfa8a346cfae73b2bac96b9a3a72f18dcc262 +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-musl.tar.gz=d02536f6fb500d36df3ded7ec8b27ed2bca6e249fa66c65e02d024af5d1a89df +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-musl.tar.xz=232645af07d18d90ed941419b1c4f3e09dc93e42f684c438b59937cc1eda4d88 +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-ohos.tar.gz=ed99bc7be6ce0b4d11cd6e19846252dcf1690f99d0691cec21fe4e6a18266eb2 +dist/2026-07-06/rustc-beta-aarch64-unknown-linux-ohos.tar.xz=dc3c14a85c34cf633d74329ac7ee695bf986dda01648efb0b6eb9a57d95ca84f +dist/2026-07-06/rustc-beta-arm-unknown-linux-gnueabi.tar.gz=8d17a2c086ec1acc56909e9ad16cb480e6d9bb8b4ba26753257f078cb2327abc +dist/2026-07-06/rustc-beta-arm-unknown-linux-gnueabi.tar.xz=f21a70f40d1c3904edac568f14040439fb34d472be2616d2217928cbe9e80c76 +dist/2026-07-06/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz=0f446cdd36a8821e83219c70da054c5c25deb9056f3d1824e1bda8652191fb77 +dist/2026-07-06/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz=4dee35299b8ea25def26d02dfdadd363831c2f0ad52f000cb0ddd34b85ee7741 +dist/2026-07-06/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz=3c851698edf94d3e748cb25b1cc20b8d23c3c1c2b6147dbd7f2018ec9215f4f7 +dist/2026-07-06/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz=3e1b88c79f79900748996f32f93eb4ba7eeae995ed31b72439fcfbc55c2e1c66 +dist/2026-07-06/rustc-beta-i686-pc-windows-gnu.tar.gz=70833b2ea15c7e72f1615b8eb29c9fc16fcce64e18a4ac60e8742873bdbdf8c8 +dist/2026-07-06/rustc-beta-i686-pc-windows-gnu.tar.xz=671ba457e551a5a63c669034755e8037ca770042ed6b32e0a39dae07a500506a +dist/2026-07-06/rustc-beta-i686-pc-windows-msvc.tar.gz=368f830d45e17424113b3dde96492e66b8e54940e11d8c158b84da1984d23364 +dist/2026-07-06/rustc-beta-i686-pc-windows-msvc.tar.xz=bef66b25697a505c75ce4a4e8a6da960971806a89995fdcdaf3d562fa5fd78a5 +dist/2026-07-06/rustc-beta-i686-unknown-linux-gnu.tar.gz=79bdfaf7afffbdd6bb903d0d54d11ba66a0a12d02ed841116f0724aaaab2c49f +dist/2026-07-06/rustc-beta-i686-unknown-linux-gnu.tar.xz=0568cdbfec18982fbf15b8f6a8f5f729128b7f9c99c05885014abdfa8a5183f5 +dist/2026-07-06/rustc-beta-loongarch64-unknown-linux-gnu.tar.gz=beddf186d44e9410b8693b88c4b203cec866fe2b45882ee758677e9811417d68 +dist/2026-07-06/rustc-beta-loongarch64-unknown-linux-gnu.tar.xz=b925b243b1938a7f9c7f62bfa9cc6d180196b5a86d981bdefa3675d0966de771 +dist/2026-07-06/rustc-beta-loongarch64-unknown-linux-musl.tar.gz=ba61a631f8e9a2170e8567cbbcfbd8f9a7da54489a0a7fac06800518dc19a639 +dist/2026-07-06/rustc-beta-loongarch64-unknown-linux-musl.tar.xz=826bb70f9244f3daa54a9b4800aaad27b57f7db8eb1a70bbbd211eddd3663bef +dist/2026-07-06/rustc-beta-powerpc-unknown-linux-gnu.tar.gz=066d079b8e15dea68ec9b42f62ee66609ae1e870eed600c564a57e9bce8d2ccc +dist/2026-07-06/rustc-beta-powerpc-unknown-linux-gnu.tar.xz=5c68bf1814340a244c89e57c7f03cf4d726dc83551a105189a04afa926275be3 +dist/2026-07-06/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz=6254854415e61d89b0823474bcee714756371371ca113a54313c191fb848d155 +dist/2026-07-06/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz=423ac3dfd1d24bddbb1c44822bb2932d31114f1af9f22216b4634a4cc37f2771 +dist/2026-07-06/rustc-beta-powerpc64-unknown-linux-musl.tar.gz=74d00021d9eefc39dd3bb1ab80c5aef470adbb514f3e80e95492146b945fbbbd +dist/2026-07-06/rustc-beta-powerpc64-unknown-linux-musl.tar.xz=c12424e92e53f31e893ee31b480d8e54aeb731d40e0b32f7324f040d8e9e4cc8 +dist/2026-07-06/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz=99928b89118bc7351bf082b1d710921b7c26460a525edd1191dbc37c6dea4f5e +dist/2026-07-06/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz=341886bb7c2295f89dc6c1c864414b56e4ca9cbfa922db6bf62744cffb229c14 +dist/2026-07-06/rustc-beta-powerpc64le-unknown-linux-musl.tar.gz=5234c168fd73411e8e4c45ddfee0648591f43907537c732988c417ef8a52b487 +dist/2026-07-06/rustc-beta-powerpc64le-unknown-linux-musl.tar.xz=7f2b44ae430694188d101757cc82eda47fe7389be0025f5d8ee8981ab21efbf7 +dist/2026-07-06/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz=f832280cfcb0d37beb87419d4162de7fcfca59011e56ca14bb86926e10b24e66 +dist/2026-07-06/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz=81d159d6c090a220836ad35ba13afc7b1bb9669c576f230678cd6926191aaab9 +dist/2026-07-06/rustc-beta-s390x-unknown-linux-gnu.tar.gz=de8b9ae7159c7c823b22e3e5ee6fab7eeddd4d3ad9bd1031d7d9edadd0d505dc +dist/2026-07-06/rustc-beta-s390x-unknown-linux-gnu.tar.xz=f18cc360c4886f1df1e85d54159dfe0bc60f2623f0055d37becbbdb53085001d +dist/2026-07-06/rustc-beta-sparcv9-sun-solaris.tar.gz=e0c7fbdb2086d8fc4d87d4593ad269c706f688c96aca9a1fae5004fba0a3d326 +dist/2026-07-06/rustc-beta-sparcv9-sun-solaris.tar.xz=8d0cd129f50b3642dab1e4a7c9dc73d3250e10779457fba4a4d3ef1e223a1346 +dist/2026-07-06/rustc-beta-x86_64-apple-darwin.tar.gz=896bce56eeb91fa2f2428e29b0c54c1ba827fedad8004b7b2c50942cfe561b07 +dist/2026-07-06/rustc-beta-x86_64-apple-darwin.tar.xz=9b0ba94fb6d5cc3275565c1f09bc5161e164a1febd89bac9ae0bc4dd70b7a007 +dist/2026-07-06/rustc-beta-x86_64-pc-solaris.tar.gz=3edba6704e22e2ae8e56305297426813b5d1dfd9d4133162af488d5e54e63e27 +dist/2026-07-06/rustc-beta-x86_64-pc-solaris.tar.xz=3d084ce963556dd94677acfdf3c6a8fa0d7a7351776278967b70502f066d3c82 +dist/2026-07-06/rustc-beta-x86_64-pc-windows-gnu.tar.gz=72289bd9d3a0ffc1577ab5c1c809d5b138a92beebe63b208719778f1e8ccf624 +dist/2026-07-06/rustc-beta-x86_64-pc-windows-gnu.tar.xz=32c0913c1a1e87adb0fcd44dc848a79ee65669dfc70b7cd18539f5d760eef7e7 +dist/2026-07-06/rustc-beta-x86_64-pc-windows-gnullvm.tar.gz=42a4848b30348c50c079e5d4c1a1f9727fd17fa872dc7066b9e15306215c7136 +dist/2026-07-06/rustc-beta-x86_64-pc-windows-gnullvm.tar.xz=799dec2e22de38512d02cbbcfd00db925a51c41e0bb7d3e1d44dd82f856c44fd +dist/2026-07-06/rustc-beta-x86_64-pc-windows-msvc.tar.gz=84e7f774cef9123a35b9a176da61d022fa43427f61a8be06a600d247173b6fcb +dist/2026-07-06/rustc-beta-x86_64-pc-windows-msvc.tar.xz=11a25c61507b165b8456ffc871334c09da27ddf14ad623a978c2e7fa19107407 +dist/2026-07-06/rustc-beta-x86_64-unknown-freebsd.tar.gz=8f6bae44b58dc26e93c9b5d0f11288b5a3abaacca25221f53986b0422daf7287 +dist/2026-07-06/rustc-beta-x86_64-unknown-freebsd.tar.xz=07494aefb20137284b39f49f16a8d28eef5feec68567a02a3f5d18b7776b9217 +dist/2026-07-06/rustc-beta-x86_64-unknown-illumos.tar.gz=5e68052a88c4cf5713482518ca4b00bf0c67681c4bd8e2aae606114f114ad2d1 +dist/2026-07-06/rustc-beta-x86_64-unknown-illumos.tar.xz=f09896cabc3ea2af1ad140b346a7e151422485961cdbac5adf1e929c407ba9f0 +dist/2026-07-06/rustc-beta-x86_64-unknown-linux-gnu.tar.gz=830bec126c7dde21847eef74108112ee234a78cf57ddb7f09c9a7d505f5d29ac +dist/2026-07-06/rustc-beta-x86_64-unknown-linux-gnu.tar.xz=9555303c5e51c935aebb34887ac1c933dd3678f7444d2be9d54bc5738a798b34 +dist/2026-07-06/rustc-beta-x86_64-unknown-linux-musl.tar.gz=8fbc2208ff4a193e1048015ffc55f2edd1b246db06d1b63332dcfb11b2548bfc +dist/2026-07-06/rustc-beta-x86_64-unknown-linux-musl.tar.xz=04227a9721ea1132324ebb7c9f76da832ec4ed6b975103f3332f0c9af7045f0a +dist/2026-07-06/rustc-beta-x86_64-unknown-netbsd.tar.gz=a0efbd286373a0d4044b1ccb96188216441ac6bbd7dedf2d3bca1423cedc7d20 +dist/2026-07-06/rustc-beta-x86_64-unknown-netbsd.tar.xz=18cb7ed2f33fbbf36b2274581be90b88eebc47df4869f1f1f74bf9dc1559259e +dist/2026-07-06/rust-std-beta-aarch64-apple-darwin.tar.gz=7a0bb7303f4966986b4dea012851472c488e496691c769613c37836434fa8d10 +dist/2026-07-06/rust-std-beta-aarch64-apple-darwin.tar.xz=9fd5f1c0029ca6eba5308bd98f1239fb57699b925104a70a7f52d2e2a9633ca1 +dist/2026-07-06/rust-std-beta-aarch64-apple-ios.tar.gz=6b4128ecf3391c170c34d9ef6f1806dcdf89f0e0a9c39b4f0fd12758945c641e +dist/2026-07-06/rust-std-beta-aarch64-apple-ios.tar.xz=7357eee043b400a163c75180ea86ba32870f1fb6483e50062dd22a8ae0875ab6 +dist/2026-07-06/rust-std-beta-aarch64-apple-ios-macabi.tar.gz=28658a074e6caeccd2d62e5c94af378d945fc3ee5cc08db411a3e815dbbc1755 +dist/2026-07-06/rust-std-beta-aarch64-apple-ios-macabi.tar.xz=e4d323b8a08c07866f092e17d2cf4a621b246b49b5287284ed5c77b0ac7a5e58 +dist/2026-07-06/rust-std-beta-aarch64-apple-ios-sim.tar.gz=11554c6fcd649cf5e788fd40feded4948d6117e4bf17d3a96d4ff41f8e5d0ea5 +dist/2026-07-06/rust-std-beta-aarch64-apple-ios-sim.tar.xz=0e567b69cdeed018bd7819d594cd3a6636a9541d9be531cc1765f06bb90cd57a +dist/2026-07-06/rust-std-beta-aarch64-apple-tvos.tar.gz=838774d57b04af2db8f844f26361932a2cca33a8f248b75b29e43db9abd68d08 +dist/2026-07-06/rust-std-beta-aarch64-apple-tvos.tar.xz=819b8cc38a7c8d694436b5b0a8384f69087f54deed7c9cb1155cfd6ee02362bd +dist/2026-07-06/rust-std-beta-aarch64-apple-tvos-sim.tar.gz=b5486c55a539ceb046ec1eab2d8fb2c4ba573a77a2b5f274cc996fa3cc04e7ac +dist/2026-07-06/rust-std-beta-aarch64-apple-tvos-sim.tar.xz=a2a7e8b0d7abedeee9e02069977a4e4d93ae425d481edc8c367bd0a247d04c4c +dist/2026-07-06/rust-std-beta-aarch64-apple-visionos.tar.gz=2001237d2b4022235388ec629ac4dd1a7fd3fc18845ee93a21cfb890f35f74f3 +dist/2026-07-06/rust-std-beta-aarch64-apple-visionos.tar.xz=4eae195cda16f8fbac4001c1d3053a5d6e3bae8abf988dfc4041d2e26a29d5c2 +dist/2026-07-06/rust-std-beta-aarch64-apple-visionos-sim.tar.gz=e3833795bcc00eb6161828fef3dbac2912a1a515e190861a611102ad9e2368ac +dist/2026-07-06/rust-std-beta-aarch64-apple-visionos-sim.tar.xz=45b7b9a2d151d34c913b552484d348041a6f02d1566b70d755017254cd68a22b +dist/2026-07-06/rust-std-beta-aarch64-apple-watchos.tar.gz=12145a761e9100dc3d583e081c26fe293b4a17c4fa93e553ba2d019534a5b3a0 +dist/2026-07-06/rust-std-beta-aarch64-apple-watchos.tar.xz=f0693f79833bdfdd3348a8cbd25d89cb5ce5ce1a45fe1583cc17bde8f78e1cc1 +dist/2026-07-06/rust-std-beta-aarch64-apple-watchos-sim.tar.gz=1df95af7c093408ce80ae1c4c6173d650118390537a2e3ac76d8c2940b1d97c7 +dist/2026-07-06/rust-std-beta-aarch64-apple-watchos-sim.tar.xz=ba1d45781864394d3a6b7d6c95ca3857d33dcb415893e738b1046791529b7340 +dist/2026-07-06/rust-std-beta-aarch64-linux-android.tar.gz=dabdc57332ee299e7881b40e704cf2e9d84ac918babd9bedfdea2233a28447d6 +dist/2026-07-06/rust-std-beta-aarch64-linux-android.tar.xz=6caecc5a92334b0604afcb8e118e6144aaa8a483f671f6e5d4439d6ce50bf5e8 +dist/2026-07-06/rust-std-beta-aarch64-pc-windows-gnullvm.tar.gz=fa9dadf564177a2bce47a399e29a8428595aae4b7e37f574851ccd128fe193a6 +dist/2026-07-06/rust-std-beta-aarch64-pc-windows-gnullvm.tar.xz=66dc8e37fce0733221ede81f21a0e1b793ac0400977c67f9799484c3d4212a52 +dist/2026-07-06/rust-std-beta-aarch64-pc-windows-msvc.tar.gz=9a875be106a9613059a9287acf7abb035dc37aafe4fd067707b0752174b2c655 +dist/2026-07-06/rust-std-beta-aarch64-pc-windows-msvc.tar.xz=26ef730aa933859dcd772a274b072836c76a91f9a62d4ae81539d60caef76fff +dist/2026-07-06/rust-std-beta-aarch64-unknown-freebsd.tar.gz=8765545a078d4b481538bb725471e9c6be32d98e1a3519cc0d0d7c2fe7979d8c +dist/2026-07-06/rust-std-beta-aarch64-unknown-freebsd.tar.xz=cfc09d68fa6429578927cbe83d2036c5c4d8b4c455c1f6b80d289ee9355aad18 +dist/2026-07-06/rust-std-beta-aarch64-unknown-fuchsia.tar.gz=4e08cf560987518403ba0300ba3b08293020ed1650fc05d91e9884b37c0c3f05 +dist/2026-07-06/rust-std-beta-aarch64-unknown-fuchsia.tar.xz=9196171708568eed4eb6395a70bc325fb3a14b090685951ed16dee4da846b0f9 +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz=6eeff6486e105cfddcff111004e1dbad35db62bd592dc7fcf294cc775bcac4da +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz=c84a0351a4ab5db8391be2cf625991a629356877b83fe5e2314a02a708a0c41a +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-musl.tar.gz=dbfecbabcad8e372cf4571491ae66e1610dc84f2ba9eb3d6c9738ba19830f271 +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-musl.tar.xz=0938b96191c216fd48c0101f743d21b7e985fb402914a3d5a0a30d6f51598cbd +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-ohos.tar.gz=a69d19b4f3a681867a7d85bfd82aaaeabeb8082eab30c7bf9e6f6aa8943f076a +dist/2026-07-06/rust-std-beta-aarch64-unknown-linux-ohos.tar.xz=02d36c8a54062b0d804529e028ba8aa718f3ef4ca3a1de1f0458787f05498e09 +dist/2026-07-06/rust-std-beta-aarch64-unknown-none.tar.gz=0b2128be20adc8a33310e7fff2fe25bd7d495c719d09b05ca64c15657bfd7243 +dist/2026-07-06/rust-std-beta-aarch64-unknown-none.tar.xz=2180901104b533e61b6744c4635e8872fbdfeb9240fec7bf512321e33ec8c19f +dist/2026-07-06/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz=b37d8c18dae575b96b0092d2e9b2ee8d3516a32d92d0e21456427c77ffbdace0 +dist/2026-07-06/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz=300e0a815249c5162612007f1d6cbccf4328257d73fcaf7001f9e316d3a9293c +dist/2026-07-06/rust-std-beta-aarch64-unknown-uefi.tar.gz=7a7c8835bd1899381fabfe939c7dfd893628588933354cc1eaf75cff4777deff +dist/2026-07-06/rust-std-beta-aarch64-unknown-uefi.tar.xz=12fa4dfba83e9c5fe5e0d8f892ce21c6f02ad9fdb53ba6478880c3961821379c +dist/2026-07-06/rust-std-beta-arm-linux-androideabi.tar.gz=52cf10438fcf9f2a9a7fd86e60b2153378b074dbdd72f48c05f54ec649529880 +dist/2026-07-06/rust-std-beta-arm-linux-androideabi.tar.xz=8078373216929a986ffcb04b1e42516a6000bcf0e0fd0fc5b73535f09cb00410 +dist/2026-07-06/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz=1e9a83e2cacb9d80bec23b222d9a0e3fe381259ca842b620177b1706c1b2f980 +dist/2026-07-06/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz=6412f21704b52097960e73748fffe908c1429eeb81121ab3504df675f47fcadb +dist/2026-07-06/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz=d3419c21f06d456e511c4d811c7e961002806b353ece455465c4e5a7a24bb10a +dist/2026-07-06/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz=3fd7e561fdcf0647b914a090e76fa514d4d225c640e1e2d32e5d7644e85c1f3c +dist/2026-07-06/rust-std-beta-arm-unknown-linux-musleabi.tar.gz=0960ffbeb2140940502c260dcd737345c6ce8c5099f0572b5f6342b66f1f35a9 +dist/2026-07-06/rust-std-beta-arm-unknown-linux-musleabi.tar.xz=ab6537aec0be284c10925b5d4c810bcfa49119d6fbb614ae12da933cffeea4f6 +dist/2026-07-06/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz=ce7e38b99a12c6771873e7ed9de03e03cd7a7516b5ac22319ad4f879ffc91db8 +dist/2026-07-06/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz=9980ed20b074369114191b2f9ecbec7deb9ea625762c35293eeac9016bbaccb8 +dist/2026-07-06/rust-std-beta-arm64ec-pc-windows-msvc.tar.gz=e386c307f32bce39bf4e405f5983227304cbe26217b4e85b9b9901cdcfc6eb9d +dist/2026-07-06/rust-std-beta-arm64ec-pc-windows-msvc.tar.xz=bb937e434cc52bf7eaa7e312437054f7725f73b44845d2fa4604416a96bf482f +dist/2026-07-06/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz=3834f9a23fe61ecc16435a5d6f37ffdfe0ebfea1bf0ce5c88df7f858b931eebf +dist/2026-07-06/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz=66fee8291fc608f7749b47ed3fceb742505b9a098d800525dda91cde67c2c989 +dist/2026-07-06/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz=90ec146b848e7b62dd7497da1c811481a2005dc226e737431b20072242f118d5 +dist/2026-07-06/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz=42ec43b0c21771115d694ee089d50b5dda6d5296ba1ba0e390925f620fc4e091 +dist/2026-07-06/rust-std-beta-armv7-linux-androideabi.tar.gz=510dcd8dd7abf61b3ad1833ed9c70f9ad9e065a79fa875691cc94899f485837b +dist/2026-07-06/rust-std-beta-armv7-linux-androideabi.tar.xz=7ec4e4d3c8109577ea4a621ac79fda09abe73eb70846a1cc25da3dc75ce19781 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz=5937419ff8db54e00c121eac801ee10679f43e7b29fdccd096930c78c63f6c7a +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz=44bc8400b28e14195cffcc293e1d683c566e77ebfe78899e47fbdf69ef9cf9bf +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz=8ee52c257ee4dc06ff82a1060fff49d445856bb224ca4d47bf3df5224e6fe911 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz=ec6a55ef18c84d8a46e18360c2b70bc2bcc4744f18f8ad8e1fd542a926fde339 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz=230809d7a585b8b2e33641effe0ed52262c391c5cfaa0f6d66b093a03c96d4ef +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz=c63d2f8ac9cdd3b2fc52416f961e3ff114eb683396a9899e88d36e24117d697c +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz=abf70c570d02646c2618c2bbeb0dfab990cb6a4a2f0deb9d7a9cc9a91e85f9d7 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz=995e0d82b0506a58b137ecefe45bd9ee96487eca977650d648289e3e632634a3 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-ohos.tar.gz=2891b0a8f221e56d88778e8079a8a8035748317613f8d7f17985a355999c8490 +dist/2026-07-06/rust-std-beta-armv7-unknown-linux-ohos.tar.xz=8ec280a17cc2afcc0761178ac61c2527f45bbaf786e549b57e6401f7838517fe +dist/2026-07-06/rust-std-beta-armv7a-none-eabi.tar.gz=3d1968021ca2a4a6224ed384f2279c65b2aa06b41b2ff3c21e12d653f77f1bd0 +dist/2026-07-06/rust-std-beta-armv7a-none-eabi.tar.xz=0861d6a19f68502a567e83c13afd6b60b8a245f991f10a680bedb1cc4d1605b0 +dist/2026-07-06/rust-std-beta-armv7a-none-eabihf.tar.gz=9f47d18fb992d072a45dd2a9308ca0a0e571789e04b95298e6fa9b74d04b78f4 +dist/2026-07-06/rust-std-beta-armv7a-none-eabihf.tar.xz=ee4540075df4a14a6ef1cc7e151611e5efd0990b96135aeba7ed40c950dd1c42 +dist/2026-07-06/rust-std-beta-armv7r-none-eabi.tar.gz=854104d4b06e9baf4973e69b376625a8a3176b36e2f2bffe16c0d27dd3027067 +dist/2026-07-06/rust-std-beta-armv7r-none-eabi.tar.xz=91acc999be489951d32fb70c7d20b255367417c79e83b2009aeeee4c09d6fd11 +dist/2026-07-06/rust-std-beta-armv7r-none-eabihf.tar.gz=5892c5ae729211ec19b34c7271263ef97bd5243432d6fc4b0ba371f53dde4923 +dist/2026-07-06/rust-std-beta-armv7r-none-eabihf.tar.xz=e16306e4256820d2388b5ab753c040253471600074d000985af88edaf8499abd +dist/2026-07-06/rust-std-beta-armv8r-none-eabihf.tar.gz=81db02f1c4a4a8c151fafedb6285986213710a187f7a7d0bcdcd106fd5e0c5ea +dist/2026-07-06/rust-std-beta-armv8r-none-eabihf.tar.xz=0070c9e57aabf92fadfd9fbcc1b0f95d4ede736c8b05a1a15f8e7df59c404171 +dist/2026-07-06/rust-std-beta-i586-unknown-linux-gnu.tar.gz=adc73e11c4feb514d4cd09b47b0524e4d918195a99283c78c6a5bfcb254ec9ac +dist/2026-07-06/rust-std-beta-i586-unknown-linux-gnu.tar.xz=7054a55fd6580181404d0f6608c3e64e50b285358549af791c4dee4a4463fa98 +dist/2026-07-06/rust-std-beta-i586-unknown-linux-musl.tar.gz=5426d8052510d49da9c6a4b1e8a46473fe3eb545c979bfbc7481ab2ccda095b0 +dist/2026-07-06/rust-std-beta-i586-unknown-linux-musl.tar.xz=c80f7befa12bd75e2a80bd620d0d8db7e67cd289645ed810f2789c913a708cf8 +dist/2026-07-06/rust-std-beta-i686-linux-android.tar.gz=9d38a779ec683b27cd300c3fff51bdd35b87a0dcedaadd46c8dc4895d4ac83a0 +dist/2026-07-06/rust-std-beta-i686-linux-android.tar.xz=acc98629ab369170a0b20034e5ffc722d61872aed7a654bdd08e27c835ea36b4 +dist/2026-07-06/rust-std-beta-i686-pc-windows-gnu.tar.gz=5786a85ef45d429095ea09ad863f85d8de80b4d1890605009c5ad9b83704c3f5 +dist/2026-07-06/rust-std-beta-i686-pc-windows-gnu.tar.xz=1ed7d1a98848c9e45f58bad2f74f55ccf03106339762589b9a2c949959f973c7 +dist/2026-07-06/rust-std-beta-i686-pc-windows-gnullvm.tar.gz=60900ad7be079e803c2ce9c1f5f65fe4d8cb7bf5d752c3ae7443bfa249d9b375 +dist/2026-07-06/rust-std-beta-i686-pc-windows-gnullvm.tar.xz=9747eddf4fca0884439c32467315ef8d4dd7626adb4ac69da676de4833ad779a +dist/2026-07-06/rust-std-beta-i686-pc-windows-msvc.tar.gz=c6a57637ab05de4c7a826d5c0e6a1c35696786226584e83312d7149ef0a29ad2 +dist/2026-07-06/rust-std-beta-i686-pc-windows-msvc.tar.xz=fb4bd784714ac616c40e5131b75b867f52cdd9bec368ccde2b847811556a857a +dist/2026-07-06/rust-std-beta-i686-unknown-freebsd.tar.gz=8f7c8095c0f45bca0409204fdb5a104f860151427536de617756381d04d1f47a +dist/2026-07-06/rust-std-beta-i686-unknown-freebsd.tar.xz=1a4d1069c7d0ac064fc8bf6abc58f578afa9cb86877ea73b1b1e0f46a9ccde2f +dist/2026-07-06/rust-std-beta-i686-unknown-linux-gnu.tar.gz=81ceea0b6760bc9783f5134fe6a00cb87a2ddca48887792f1d3109fe25a6aaa6 +dist/2026-07-06/rust-std-beta-i686-unknown-linux-gnu.tar.xz=53161094f17b2b53a266dd152fb80bcc07acb5802768dce79bff67114d9b07e8 +dist/2026-07-06/rust-std-beta-i686-unknown-linux-musl.tar.gz=7e71fce6d9d785e304962104fd1569896246d5116b6b3f2fe11e89dc35c38a09 +dist/2026-07-06/rust-std-beta-i686-unknown-linux-musl.tar.xz=15f1a6ec28ee39e1266dbcb7effdd24eb1a914f4b04c849f48f018463af8728f +dist/2026-07-06/rust-std-beta-i686-unknown-uefi.tar.gz=ac580649b552d84525832fec346b7e2ba02d24a38cc3cc577dfe01558f712787 +dist/2026-07-06/rust-std-beta-i686-unknown-uefi.tar.xz=22c12f72b5f77022df0b06aae44a266816f492c26a1141a2cb150c96a550c159 +dist/2026-07-06/rust-std-beta-loongarch64-unknown-linux-gnu.tar.gz=b6f3a42a0e015b4440cf47e5292faa850ba27f2ee82b4dc7eb53177bee0ebbbc +dist/2026-07-06/rust-std-beta-loongarch64-unknown-linux-gnu.tar.xz=349d399c098fa523f7c9ecdc598338d95b9363ceb5bc0bc3c81fa855f3b0d03d +dist/2026-07-06/rust-std-beta-loongarch64-unknown-linux-musl.tar.gz=732698fcf01f43b77abf4a2def50b7c6576ba366eedcda94249fffb8d3307f3d +dist/2026-07-06/rust-std-beta-loongarch64-unknown-linux-musl.tar.xz=d53d5e2b6a2e9b3dde7ea3c8ca152a75b8c4b34bbb195caaaa7d4d856b8665a4 +dist/2026-07-06/rust-std-beta-loongarch64-unknown-none.tar.gz=3856daf9851dd3aeecbec5d69e1848f305395fe516da691467192a77d515afdb +dist/2026-07-06/rust-std-beta-loongarch64-unknown-none.tar.xz=8527f86a40825c3d3a66c51ebf9ce0dbe5f1b4e950b9d3b8a35afc8eb7c9f090 +dist/2026-07-06/rust-std-beta-loongarch64-unknown-none-softfloat.tar.gz=436815846b10b710aa7442648d2f9397cc8b62d20b2b4d9f3773d7a40685d987 +dist/2026-07-06/rust-std-beta-loongarch64-unknown-none-softfloat.tar.xz=c0d1f80d2b06342675881d9fe97f09822211e018d02692cdc46e8f18ba069976 +dist/2026-07-06/rust-std-beta-nvptx64-nvidia-cuda.tar.gz=ce55f7678034859c63b17ba2878859a10525e12ac98ec629d773ea2834ac89a9 +dist/2026-07-06/rust-std-beta-nvptx64-nvidia-cuda.tar.xz=2e73c2f8054db7231db83ec01b45f4ccd5bf33418243219f5bb26dc8ec382575 +dist/2026-07-06/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz=070bfc73142f5fe6bf2962981da56a0273d7d338286a036bfc35007d2f1d4383 +dist/2026-07-06/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz=9553ac0464c25c9e423fc16d0dad72d56d392d66f4c197ab44bdaead08e79ad0 +dist/2026-07-06/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz=82f0925143a3642b703164e3ec7b764fd5ffa53f685cfd8aa44969112c46b93e +dist/2026-07-06/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz=748400b4d562b224a1e4ab6a7d219898d73b2c00f6042231a365c61511aa1bd3 +dist/2026-07-06/rust-std-beta-powerpc64-unknown-linux-musl.tar.gz=3e4af6ebb1f8c32b205e649ade96f0917bb1f3cfb14b76704c2e64751d77093c +dist/2026-07-06/rust-std-beta-powerpc64-unknown-linux-musl.tar.xz=2f0fc8012bd98ee78c6e3ec32de8cff1aa81d11f93f477309b2b13d3f061074a +dist/2026-07-06/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz=56e9ce948d93e466370ac33a1e0a88349592bb01b0c35bb9071c1ffcd70e32b2 +dist/2026-07-06/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz=350fc6d7d03cf71e80a8aa8dc1a67fc7db505030e676a6f5423957fdf2a4dffe +dist/2026-07-06/rust-std-beta-powerpc64le-unknown-linux-musl.tar.gz=62f2f56ddb117b59967a5bbc26a3403cb7b5c2b5d86fe0c63da2a49b9647b320 +dist/2026-07-06/rust-std-beta-powerpc64le-unknown-linux-musl.tar.xz=c1ca8577eea51165c090dc5d25cc8b53c60cbf73e9bb33ebdcb030b74c50e8a5 +dist/2026-07-06/rust-std-beta-riscv32i-unknown-none-elf.tar.gz=bdf5eae783b792da229942f4f64cf264652162a2a0d7383999fe8ed279ab6ea0 +dist/2026-07-06/rust-std-beta-riscv32i-unknown-none-elf.tar.xz=d2e63c1b55300adb7b7deeef40f9eeb75bcf9b88663208967e246d8947d34120 +dist/2026-07-06/rust-std-beta-riscv32im-unknown-none-elf.tar.gz=bea0c96388f6c338b0bb25f52ea6d9982a98030fbb2ed7f854b645ce98109432 +dist/2026-07-06/rust-std-beta-riscv32im-unknown-none-elf.tar.xz=40ad60accce615e142ee2ddd3342d57868632b0b37eece12a004219b3fa860ba +dist/2026-07-06/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz=1c8e2cc68398fc749318a2ec08ce1d61fd3a8a2cb67d1860636e454f9480bf6e +dist/2026-07-06/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz=2bfdb57123e26bfed884181e323910b41da9a628ffd444f4f6c8fc44113290ad +dist/2026-07-06/rust-std-beta-riscv32imafc-unknown-none-elf.tar.gz=5f357243786a6cd010a8490ac831bf2eab3842349c6845a10ab9cd1c059565bc +dist/2026-07-06/rust-std-beta-riscv32imafc-unknown-none-elf.tar.xz=2779bf1ede773978683b7b1fc4ea05e59ebff7a84389391401ad065f8991e9ef +dist/2026-07-06/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz=f90f7f6e5c6c02c95b9c722445b7214cf79bb6dbc2830b06d5dae475403885a6 +dist/2026-07-06/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz=54be542da1284f00a25d8b5ebe96bcfddb414e779ce8a5bca32cc6d9e0a72dd4 +dist/2026-07-06/rust-std-beta-riscv64a23-unknown-linux-gnu.tar.gz=d3fa7c57d0dc6d498246ccccee89925bdc348cb329113ca691fd8f8d4cb58caf +dist/2026-07-06/rust-std-beta-riscv64a23-unknown-linux-gnu.tar.xz=cdf1b72e146cb716180aba4a06d4d2bc47b614876b595a3e76140a6388c03b08 +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz=bf1281e051e8227c6d935b908495e5f797f27f6d35bbdd786ee772f8436c5716 +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz=2bce1a44120b3e013d40bab136fc6d1948d4761de549ad1f4e5d5aae6822be9b +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-linux-musl.tar.gz=77fcfe9522adee91d3797339869c13fd85a0a4305e16ea8d48a2a36789925d08 +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-linux-musl.tar.xz=a288fc2bf83461d212b4454bbdfa31f1a15a2ea2564bfd2cea694baa4b214f67 +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz=7375caf98ea06b03f764a261b9ffbdf262575dc688810d9a7193a23fab2287e6 +dist/2026-07-06/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz=cf7ed9d7c1c102e7f055e76ce3dd0f8e56b519817d79fe258f36ad9e605d0e40 +dist/2026-07-06/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz=5208329dd9304f6ccfd07feee576849b2d3750af0071b0d3fe07a52d8f76cc41 +dist/2026-07-06/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz=961d33e186c165dfe3590e4a1142f87bd5c95b3fc18434de1165c093a13218d1 +dist/2026-07-06/rust-std-beta-s390x-unknown-linux-gnu.tar.gz=73028fc3d9ccaf79725a16593ddfb7729394cb60bc78970ba7d03ef306d943ff +dist/2026-07-06/rust-std-beta-s390x-unknown-linux-gnu.tar.xz=135b78d4a98508dcf6fc2fa119a410f955f9e91a81eb67ab24948c8ee7235083 +dist/2026-07-06/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz=37837df263281a5deb66fad72217da46f99931f1b038e3a3bf42a05f68584787 +dist/2026-07-06/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz=3844f5428dcf591a162a4b418e54cc7b66a08f25ff84d05a37f9ab55eae18ef1 +dist/2026-07-06/rust-std-beta-sparcv9-sun-solaris.tar.gz=63ce1e567b1dd1c249bc8a0329c0cfcc5380401cb72a263737260c6beb18f27e +dist/2026-07-06/rust-std-beta-sparcv9-sun-solaris.tar.xz=0c7a3bf77ec25942dd46fb3a68710951567e8480033336d9bd24808a41939e48 +dist/2026-07-06/rust-std-beta-thumbv6m-none-eabi.tar.gz=739016dc5413cd23b06c704be50248db90a8903b362650ce782e7ebf629d4009 +dist/2026-07-06/rust-std-beta-thumbv6m-none-eabi.tar.xz=0abef0940a16dfad1b748581a1134889a46d1b8126a76f39f4aa47064e25ff5d +dist/2026-07-06/rust-std-beta-thumbv7a-none-eabi.tar.gz=c65aa2d1d3770e77d5b0abae1ce0d28d7275232310c97f2bac82045b2bf5d820 +dist/2026-07-06/rust-std-beta-thumbv7a-none-eabi.tar.xz=caf3fffb82fe4d20828ab6b8aeff776673eef591c935c07f0bda2b65a4417945 +dist/2026-07-06/rust-std-beta-thumbv7a-none-eabihf.tar.gz=a5235b29de511d70edceff1de8c0299b2b7d8c8cace64368bc1b0a729160aa3e +dist/2026-07-06/rust-std-beta-thumbv7a-none-eabihf.tar.xz=469b65c598667f5a5a1cacbf1f2ce0c6a94629e80dc939d71be55f808b96c10a +dist/2026-07-06/rust-std-beta-thumbv7em-none-eabi.tar.gz=eb72b09b94e27c9f04e49530d29b3ef4150f1d76503c97cd9169a34e33af1374 +dist/2026-07-06/rust-std-beta-thumbv7em-none-eabi.tar.xz=9738d0dc2b58ecc0c654e6ed9290d962e3648f9f320747df0a273b667305929f +dist/2026-07-06/rust-std-beta-thumbv7em-none-eabihf.tar.gz=af7996650513e904057532e2f1614b99c1fe955419e5cfae696eec64d59d6e56 +dist/2026-07-06/rust-std-beta-thumbv7em-none-eabihf.tar.xz=e0fb02ae08f972533cf87e61228632460394c3415c62f2717dadd5082a36c149 +dist/2026-07-06/rust-std-beta-thumbv7m-none-eabi.tar.gz=77e2a5f803a955e71422b5d06739677c7e3c165b555ca28e817f2d3f6f712b87 +dist/2026-07-06/rust-std-beta-thumbv7m-none-eabi.tar.xz=20b53d076cb70f400994fe0e5a0ca87a8557589fbb2c44310aee3248ac9bad4b +dist/2026-07-06/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz=1345558f6056e5e527bca7221d31e7be8c7b68e8d15745548c1425434938611d +dist/2026-07-06/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz=376c6c0d69877430bcf9dc9ac42a4b98f12449e0b87368db1f995dc083bee4b1 +dist/2026-07-06/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz=608ac451af2b916bfc9f2a421213d36dfc88fca45c03d473efc920ef15af4949 +dist/2026-07-06/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz=f699591760ac65c15aee0c83c872adbb562f334f7e9c15d13ec99615954f5e0a +dist/2026-07-06/rust-std-beta-thumbv7r-none-eabi.tar.gz=5a07116be095bef55572710865efb642fdbdde30eebd01cb7d4f55abac839466 +dist/2026-07-06/rust-std-beta-thumbv7r-none-eabi.tar.xz=670ff477faa5a36fca797c0affbe1c69477327c0aa81f34f9126675e65661b11 +dist/2026-07-06/rust-std-beta-thumbv7r-none-eabihf.tar.gz=4f903d555e8a33e5c19a9841a490765b9c521ab65c5986be9ec7bcf18ca2772f +dist/2026-07-06/rust-std-beta-thumbv7r-none-eabihf.tar.xz=3ab3e8e5143ce9976b71b41798f034f6c0d7d0701296de52c787fa9efe434a4d +dist/2026-07-06/rust-std-beta-thumbv8m.base-none-eabi.tar.gz=9c0416a99897bdf14002c3cb76ab034727bc3390bf6393415b78ae30e980e327 +dist/2026-07-06/rust-std-beta-thumbv8m.base-none-eabi.tar.xz=7fb075c25606cc1eb917829650db3dc3674387168ec60571e5a890db26986942 +dist/2026-07-06/rust-std-beta-thumbv8m.main-none-eabi.tar.gz=8e7a130a53b5178d30fd7acede5b8ac41063eb478199ff9788e52c6813c693de +dist/2026-07-06/rust-std-beta-thumbv8m.main-none-eabi.tar.xz=c0a8a5ad783baee19ec05881b140f993141a5ab0cccc6f9466c7f9898ea88521 +dist/2026-07-06/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz=0b86aa146c63d8692b254c6acb2cb6bb9bd92aa9bad0dee351dc97af7737cc6a +dist/2026-07-06/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz=066d69ef304f9ab42794cc59bcae0c5b0fe69f973d885734490c0448e978a978 +dist/2026-07-06/rust-std-beta-thumbv8r-none-eabihf.tar.gz=42ff41319011bfea909772479076c75fe4fa5cfb26b99ee5c927ddc8e5f1b25d +dist/2026-07-06/rust-std-beta-thumbv8r-none-eabihf.tar.xz=d03f39b426254f58a985b4b039c79f4f2a286bc6d1371b54e461339aa5e622c5 +dist/2026-07-06/rust-std-beta-wasm32-unknown-emscripten.tar.gz=82ceb1e9800dd3729555bd2bba695255972aba421b8cebce16eed44366039985 +dist/2026-07-06/rust-std-beta-wasm32-unknown-emscripten.tar.xz=0fe34fe3d3513f54bea2309565c9ddbe1d3a09a3c7c1130b352fe9dac19c15e2 +dist/2026-07-06/rust-std-beta-wasm32-unknown-unknown.tar.gz=c0b47e8843af6b0fb2cdb76d86a78fea939f6a290ee71092f5c792bf5aa14c67 +dist/2026-07-06/rust-std-beta-wasm32-unknown-unknown.tar.xz=3a7e946b0efc1edb666f1bb76f03d37c30456d59d649afdbd7c0549043694e76 +dist/2026-07-06/rust-std-beta-wasm32-wasip1.tar.gz=6e638b1a07abbbb57b799fef5ab8e5632f983d2320c652176eaf1360e757966d +dist/2026-07-06/rust-std-beta-wasm32-wasip1.tar.xz=5c98b6d6c758553254273f06023ffad54afa8307dc7bd46f3b12b57193e8cf70 +dist/2026-07-06/rust-std-beta-wasm32-wasip1-threads.tar.gz=3785a2461563e811db867712ba010c6e695a81a87c312cedb0b3df65450721d3 +dist/2026-07-06/rust-std-beta-wasm32-wasip1-threads.tar.xz=59487cf2b326280e45e0ec7434e762416895b9d52c524622704ec5818487aae4 +dist/2026-07-06/rust-std-beta-wasm32-wasip2.tar.gz=9ed9d278dc3cf7cb57fe60153547e0292b35d3e71724c939d033019d71f1a794 +dist/2026-07-06/rust-std-beta-wasm32-wasip2.tar.xz=05acf145393b12aebb7af24aaa150a4be7c6d8f6bd1cffe6af4c642cbd7daff1 +dist/2026-07-06/rust-std-beta-wasm32v1-none.tar.gz=4bdb2976c59ee2630aecd51ee0582784bd65c8415fde147a7cf19c0228efc3f4 +dist/2026-07-06/rust-std-beta-wasm32v1-none.tar.xz=9cb65da345b10954b1e7592c7269a0d963defb23543780b221f952d1efa187d7 +dist/2026-07-06/rust-std-beta-x86_64-apple-darwin.tar.gz=d6fcca8182665d8a8f231d77b02902e0867f2c9963db4d4b7e0cc66c89b9335f +dist/2026-07-06/rust-std-beta-x86_64-apple-darwin.tar.xz=6b1bcbf546245601c5a2bc76b4c79dbab64cf64c48c81a54488b8cfa168b3f98 +dist/2026-07-06/rust-std-beta-x86_64-apple-ios.tar.gz=c2fd9698f2d19e49b506bb1bb8960f54ca85e490930e5d40bf523d99ba1fc559 +dist/2026-07-06/rust-std-beta-x86_64-apple-ios.tar.xz=83fbb5a464f00fc640474a3f33f093fbd2404bc2a328ad38a80fd7165f824fe4 +dist/2026-07-06/rust-std-beta-x86_64-apple-ios-macabi.tar.gz=9c26bb518d91cf9d86983ce7e92a4eef21ad600dc857c4f5532458d4a8bd0d26 +dist/2026-07-06/rust-std-beta-x86_64-apple-ios-macabi.tar.xz=8b1402c34e4e00be34aead9fe7944635949233c45e72c52f58a90543e30959f7 +dist/2026-07-06/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz=5247d4e20295c62c9f8a961a3bab2b2f2ed3a1f7d8a49140a585ff90efe0317a +dist/2026-07-06/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz=588a6dba5cc6fe1908ad3cf47c559b331cc82dbf65bcdae8c990e996e4639667 +dist/2026-07-06/rust-std-beta-x86_64-linux-android.tar.gz=7faa8b5cd4b0c303e9ab27f9120bd4fb672b5f7ad7b4d11ea071595f1e075a27 +dist/2026-07-06/rust-std-beta-x86_64-linux-android.tar.xz=0c44b83ad618a169d645f9c9792c649ad5c20ddad8e34c52d0583f73aae4e54f +dist/2026-07-06/rust-std-beta-x86_64-pc-solaris.tar.gz=25a308f9a284104d295c6d48d6c2b9912f79291b2b72989d4b54cba6da1e133b +dist/2026-07-06/rust-std-beta-x86_64-pc-solaris.tar.xz=9bb1a0c6cb125dd60e269a02fbec5b31993cb55b169c36d9d79647ab4a5d8887 +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-gnu.tar.gz=91b7ebee839dc069aa28220b1da53a48a14fa9d772e691de5a57f625c8ea9754 +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-gnu.tar.xz=7d718f7c99d65efe339226fd2cb54f18a220ed9304e0a9feff4c9cba5d7d7aa1 +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-gnullvm.tar.gz=17d3be11f1b088ea96c49f4a6c6b166bfe73385072985556ad23a2f8dd7e0417 +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-gnullvm.tar.xz=8019ffc876aa81aafe1cf9233fde1dca3c0fdd5a570860e3163aa4d48c9a27fb +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-msvc.tar.gz=3fd9c62ab20dde1e86f09b2b9f68fff4377b0ec03a809d4bb0729cf3cd05353b +dist/2026-07-06/rust-std-beta-x86_64-pc-windows-msvc.tar.xz=4b261b5f7d0b508df21aef7c23352082659ee6fd2feef997e240fd6e9b537d2c +dist/2026-07-06/rust-std-beta-x86_64-unknown-freebsd.tar.gz=222b9a371f89a51e3593009a44c7dfdc006f6dcfa1190cbc1d9a2709fbcbf5ea +dist/2026-07-06/rust-std-beta-x86_64-unknown-freebsd.tar.xz=77dacfb4622525d45d097af03d876107b92a2a5914ed1cdf95bfbe9b683ee239 +dist/2026-07-06/rust-std-beta-x86_64-unknown-fuchsia.tar.gz=5d9d804289107a94c7a97fa4373b692301fe4c9921785cb088c3601bd7ecb6a9 +dist/2026-07-06/rust-std-beta-x86_64-unknown-fuchsia.tar.xz=8150dc64d628bca6b21fb970431f17f2c8e58d28a60863a7b887e8f6f12abe3e +dist/2026-07-06/rust-std-beta-x86_64-unknown-illumos.tar.gz=95591f5eb1926d3fe586c6ea003d79133e7b6f8f997efddd2ef9a342a6d7f605 +dist/2026-07-06/rust-std-beta-x86_64-unknown-illumos.tar.xz=e74f372fb75c1e0b4511199f9f5614787de695e6546315314a4d43797f00de58 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz=be46b316c917fe156ae99a995e5367cdc04e1107135c343c53d2af6fe6bd0ed9 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz=70ae80e46956622824e8daf20676b250d8fe31d7ce84bdf2247938d3a375950f +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnuasan.tar.gz=53f4fd06590b24f51f2d0ef69e2e40233679e622d0f978b7e1a2697186a81f05 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnuasan.tar.xz=5084793b6fdfade74da0b0f0b768ef14723a93e889842c53f37f5b8a30eddac2 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnumsan.tar.gz=1204b525e65b6e229bc3b8378b3dedb7a896b0099b4d3a41570684b6a4f0cf18 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnumsan.tar.xz=0a5aff96be79efae747bbcf9e935ad0ebc5ced2482a632177bd19f366f66455a +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnutsan.tar.gz=7231a1917dd87c10e2f51d8773ed6edfd29cc631384ea677ed188ce8ba39f674 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnutsan.tar.xz=2a2ad092177a82048355407298dbb40f0dd6d52eb06e44d068830e27756d7759 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz=b03c83d0ac48d4ea6d740990abed9b95c663362a8fdd9a351212ce9291d5f2a1 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz=8ab0ce3e2a67357779be72ae89abf81ea39b673042fdfc05e1ef6ad625fa96ea +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-musl.tar.gz=676f081ddf98aaf4cfe35b04aa95f08e437d727d9e6dd6bebdc2411c75aaee80 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-musl.tar.xz=34628b4b122691b1828a299ffe9b2acc737decdccde61c6b591c92d0c9949e58 +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-ohos.tar.gz=2fd98d3410a7e4af0587a53ed931a8270959de2d3300bafa01152e6c9a232b2d +dist/2026-07-06/rust-std-beta-x86_64-unknown-linux-ohos.tar.xz=d62bd6b26e2cdc7ab1bc932e4e2c52ee38b831a8ba1bb056b6dffa061624ccd1 +dist/2026-07-06/rust-std-beta-x86_64-unknown-netbsd.tar.gz=512e99ba4831262b0cd702d74533cc447a9d650287e7667a781ce91b5f057d88 +dist/2026-07-06/rust-std-beta-x86_64-unknown-netbsd.tar.xz=23c0aa0a507da5d9e1bbb78a9b77f4c4b3adc172b05d2ec1d970560e6646ebf6 +dist/2026-07-06/rust-std-beta-x86_64-unknown-none.tar.gz=288e8096d58ab6697e2d0b0e7e7e5658e0754fa0b42a2d793cd65f9f1b85a744 +dist/2026-07-06/rust-std-beta-x86_64-unknown-none.tar.xz=fa4d70330b6f7e29bf43658180a9790510001f342100bf053fa96e80e7b13b65 +dist/2026-07-06/rust-std-beta-x86_64-unknown-redox.tar.gz=a37fd46b14785847a2ac8a4be967a20fc1d634a7058840caaf784091a907e0c1 +dist/2026-07-06/rust-std-beta-x86_64-unknown-redox.tar.xz=dbdaa1b165617ee70964ff78a7a3ec937454bd43f2c58400f62ace2bc0eebd39 +dist/2026-07-06/rust-std-beta-x86_64-unknown-uefi.tar.gz=26f3915a5ce23c1b0b04d8d1aaa4f904497cefe745897bf37ef891c48036231c +dist/2026-07-06/rust-std-beta-x86_64-unknown-uefi.tar.xz=43590e28f848b80d77eb8d8e46136bb857d0a38e94bf5c9ac3d8d200e98a702c +dist/2026-07-06/cargo-beta-aarch64-apple-darwin.tar.gz=ffb2f2e3e5e50529597b3a71bf2b25f77b98334baef1a83a205350ae1067e595 +dist/2026-07-06/cargo-beta-aarch64-apple-darwin.tar.xz=c0702b3309403cb2efcd5ab8ec7d0afac8216562c26e41464fa241709bbe8567 +dist/2026-07-06/cargo-beta-aarch64-pc-windows-gnullvm.tar.gz=066d65ce85a9806f83e648ac8d35e3a8a907f660d2f1e398c1793b7d66367da9 +dist/2026-07-06/cargo-beta-aarch64-pc-windows-gnullvm.tar.xz=23333d436bd204f57e642d487e35ee626ce56c074316b3b980da2d0fcf092b1a +dist/2026-07-06/cargo-beta-aarch64-pc-windows-msvc.tar.gz=0a934197f9eb3e5c8f90c67bcbebdc71ccbcc65a94fda3067c2d9f9753aa3999 +dist/2026-07-06/cargo-beta-aarch64-pc-windows-msvc.tar.xz=744ad82674f9b7b02da05c616f30e3cfd36f25b1498811919d9ea11ce805ff67 +dist/2026-07-06/cargo-beta-aarch64-unknown-freebsd.tar.gz=77f2da011ddf00e90bc87ac2e7af5a87162afda49697b1fcf0bb0b5a0e01a752 +dist/2026-07-06/cargo-beta-aarch64-unknown-freebsd.tar.xz=9f9f80421543843409ec5058df22f43d9121c599f731c16d231bfe25d64f550e +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-gnu.tar.gz=85f43af4c93216a500a3ae68ff628f9694d51ea9c0b317de39ed734ff9e047ed +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-gnu.tar.xz=f203b3d41723ac2e7e393ab8f83238be6842c0bd060062c708de28fcf214952a +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-musl.tar.gz=94aee0b018e550f9497dcc45d94669f94e0b725e9f7ce8493430b47edfa1dbb4 +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-musl.tar.xz=8342748878330bb8a10ec0ea4df6ee7a652f27556f39d8f1364f00555af47032 +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-ohos.tar.gz=4fe34142b5d7af3d9a6597784b4fe9fbd52006c47267c0178cc7258e35915533 +dist/2026-07-06/cargo-beta-aarch64-unknown-linux-ohos.tar.xz=cb6b92a3863ad55165f6737ed27e9c8e861d2acb47245279cd6c1d339732e0c9 +dist/2026-07-06/cargo-beta-arm-unknown-linux-gnueabi.tar.gz=826ffcded60b33c8c320c292980427f9b3966efc39e20ea541100575441c68e8 +dist/2026-07-06/cargo-beta-arm-unknown-linux-gnueabi.tar.xz=ea8ceff1619fdc553223a2ade73db52272be2508ba0d9c9a23963bef43bf565c +dist/2026-07-06/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz=8b842b0e3dbddcb568394016d09eb2585acb1e0d89b4d6579fdb668d0eecf27f +dist/2026-07-06/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz=6138dfe627b0d0f3714dd6d911bc622717cb9f7d99d0b834570e9acc8122c8b6 +dist/2026-07-06/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz=2a43baaa76a39b32fa0797be5e84fb32ed2b8eab5e145dfbd7b91943b6b0afb4 +dist/2026-07-06/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz=d2db264ed93dcc9c34f0404efbeff329700dadc5d70db093071c97d302b1b107 +dist/2026-07-06/cargo-beta-i686-pc-windows-gnu.tar.gz=b082e6494f9509ecf86beb8587e6654e28dd27575ac50bf61019477c6ccb0415 +dist/2026-07-06/cargo-beta-i686-pc-windows-gnu.tar.xz=9b7df4c5ff604aad61be0a61cb1522762b90d887a7b174bfd74c0969ab9fd797 +dist/2026-07-06/cargo-beta-i686-pc-windows-msvc.tar.gz=e6a8fb61e591c410f4a5a42af1c2e92b4ffe64886784a4a0a84f51bf34ab1d74 +dist/2026-07-06/cargo-beta-i686-pc-windows-msvc.tar.xz=849fafe5761a9a08efd3006f629a29f50763fd6c580f03761a812a344f913561 +dist/2026-07-06/cargo-beta-i686-unknown-linux-gnu.tar.gz=6935c02a95777f7660e8c6d41a5e082dca4b82369d6e5c17b45e00d1e2ab188b +dist/2026-07-06/cargo-beta-i686-unknown-linux-gnu.tar.xz=b7b7c936b7472196da855462d8647d7c6e768d9aaf5d7034ab2a9ea58d9b7723 +dist/2026-07-06/cargo-beta-loongarch64-unknown-linux-gnu.tar.gz=c5f0f455a95355e76ebf26a56b81d8024ce7243acd912066a6aa4db656854075 +dist/2026-07-06/cargo-beta-loongarch64-unknown-linux-gnu.tar.xz=e0b32d8abb0c82df2560ae61e50933040e68b15dd0e78dff0735c3b4d42398d5 +dist/2026-07-06/cargo-beta-loongarch64-unknown-linux-musl.tar.gz=d3a74cb34d5679959759855711089207e05d191bd1ad7aa9704306f15bba7119 +dist/2026-07-06/cargo-beta-loongarch64-unknown-linux-musl.tar.xz=6eeab4922af30314ab25f16e51c94d038d6fcfc640f65fc7fe2ba3760093206a +dist/2026-07-06/cargo-beta-powerpc-unknown-linux-gnu.tar.gz=9351483d9e316306d23e0b23c7dc463e7fcff00a4558911b13f71116624b2482 +dist/2026-07-06/cargo-beta-powerpc-unknown-linux-gnu.tar.xz=c5b8c68626fd20da1e42e2bd44efa3ae0490213631b096e6d6d6f4ff7cfb3471 +dist/2026-07-06/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz=413f75b66306228e294c3e234b4bf4068b9fa957e2fce85d0ce8d54d3024b1f4 +dist/2026-07-06/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz=a5bde037fb2e97755696524ffba6247664283ea1ad9eacec89516406fc19bcda +dist/2026-07-06/cargo-beta-powerpc64-unknown-linux-musl.tar.gz=38349d390cb71f69343c5731b078d9000cdc9ffd24556fe36ed1612f07a0007c +dist/2026-07-06/cargo-beta-powerpc64-unknown-linux-musl.tar.xz=c6b7202203d5dfc55b6d595dcab8e23a35f0902dff598cbafe0588dfa17c5f77 +dist/2026-07-06/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz=afc46c679b411384e28a77b269527e6dad92d373818984794da3d46ba50f0393 +dist/2026-07-06/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz=3cc5d2f60e6666473fe9a29be1bb9cf85f5ba5d2ea068f644ef1cb62f20a5ec8 +dist/2026-07-06/cargo-beta-powerpc64le-unknown-linux-musl.tar.gz=a95220a14de840baa99f8dcd191b8d275869a31e9453b8426dc0012d509b0f7d +dist/2026-07-06/cargo-beta-powerpc64le-unknown-linux-musl.tar.xz=6a67a9ad7c74d80cedcc2cc1696195f71f26a70abb4a82584afbd93289948c23 +dist/2026-07-06/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz=ade5da910e3da7ef3ec19b4ce6a429cb34e1e69ce84dacdff2fea95997cca693 +dist/2026-07-06/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz=4af90618d6e35c80d47524d2e265716bbdd14cd89484c1f648ffe06f68c47f1a +dist/2026-07-06/cargo-beta-s390x-unknown-linux-gnu.tar.gz=df63da15257d5fa1cba9b193c1011dd2cd8bf10c839791b88a7568026022b345 +dist/2026-07-06/cargo-beta-s390x-unknown-linux-gnu.tar.xz=e9d669b5e42490d74e8863f78edec64cc7a90cabeb76ca807d53314ee4c0a401 +dist/2026-07-06/cargo-beta-sparcv9-sun-solaris.tar.gz=977ce1d436363c59126d7ec0976136506b457fc5e3aa14898d4eed41756b6a62 +dist/2026-07-06/cargo-beta-sparcv9-sun-solaris.tar.xz=292c53c5f804264992b0dd9dd0ea0a83b4df896753aaff06dd4a5f23dfdb3fa7 +dist/2026-07-06/cargo-beta-x86_64-apple-darwin.tar.gz=44e7ec0406a9e89b3d5894932260847b8ff925a95cca8cd6f8059fff9b1f1345 +dist/2026-07-06/cargo-beta-x86_64-apple-darwin.tar.xz=dd4f5cce2e44d4c4dc86c32925578c3e9104cb42673a94ee85149901c96339a2 +dist/2026-07-06/cargo-beta-x86_64-pc-solaris.tar.gz=2b5fb60d0b5887e7b457cf97bbe2d1bca4cea34ddb2db4c10905fe1fe5413042 +dist/2026-07-06/cargo-beta-x86_64-pc-solaris.tar.xz=cf7450af094c773a287bd6186007f870ecb2bb16223550f36fcd98cab3f79c64 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-gnu.tar.gz=2541bafe5700cd210d098f6a539eb7792fe35ef74ec151b0017dba48814c8c53 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-gnu.tar.xz=fff9fa0788e1b8b2cc94dedc80e747d94f9a5aabedbd82151c1915502e59cfe4 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-gnullvm.tar.gz=e73941c23e4e96fc01a17c63d6974f463188a9a576653d9b1b9f81cd0a4cc970 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-gnullvm.tar.xz=31988fdd81d4bf51bda4bb6332b6f45cc8882a89444c5a260f24a9573b0fec67 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-msvc.tar.gz=687aa5f556d239b05d36232f5a90a3eeb3380939e5f5f9a12e2acf9dc89fbc74 +dist/2026-07-06/cargo-beta-x86_64-pc-windows-msvc.tar.xz=8ab9f009ded7dc0ae1b4353dc29f4418be3940147dcceb577153bef23c5db775 +dist/2026-07-06/cargo-beta-x86_64-unknown-freebsd.tar.gz=159236bdfe8ba15137a01bb30f0662001bda4c07298136a836f165e39f42d1b8 +dist/2026-07-06/cargo-beta-x86_64-unknown-freebsd.tar.xz=111adc2fbd986b360caeffee04d90d3299ff7745026377230955b741fdb89832 +dist/2026-07-06/cargo-beta-x86_64-unknown-illumos.tar.gz=84f7f7cdbed2879ba72ebed798b8ad92a70d30f5b8cf2248bf80be063d02abdc +dist/2026-07-06/cargo-beta-x86_64-unknown-illumos.tar.xz=f56be391b819e62cf1e4d1bee88362b26f32942fc9d2a5bed5d62c9b52c65708 +dist/2026-07-06/cargo-beta-x86_64-unknown-linux-gnu.tar.gz=1865e397e46dca6a10c93aa02ac34259fe286137359885d1b105b1c6215658cb +dist/2026-07-06/cargo-beta-x86_64-unknown-linux-gnu.tar.xz=51d35258450c4b61ed16ec120c17352707990730bff21de4958f29056dbfd90c +dist/2026-07-06/cargo-beta-x86_64-unknown-linux-musl.tar.gz=83afafcd5da1cf00bcb433bc50fef2737eb323b3f10e3a9db92841fb5be47784 +dist/2026-07-06/cargo-beta-x86_64-unknown-linux-musl.tar.xz=8bd7c3641df57795bbfd2f9507e052cc024afb290821250309250399064c1e14 +dist/2026-07-06/cargo-beta-x86_64-unknown-netbsd.tar.gz=9e2dba9c52affdff845d4a0e3f81ce6088ff173af9bd18f41ff1c55b609cf762 +dist/2026-07-06/cargo-beta-x86_64-unknown-netbsd.tar.xz=17a029a9ccdbe3979ff2491b6769bfc8059d9e33afbc45e1c2d3fe349a7bb301 +dist/2026-07-06/clippy-beta-aarch64-apple-darwin.tar.gz=f9442992ab83b6b635d0eba604b829a050623f1ca3593446c4efacd1891b6f93 +dist/2026-07-06/clippy-beta-aarch64-apple-darwin.tar.xz=22ac791847c326cffbe781e70115c5447aed0ba51d8bd507e43da2ac1e367438 +dist/2026-07-06/clippy-beta-aarch64-pc-windows-gnullvm.tar.gz=a0e750be3c20d5c655985f301bde859bd823ec60966bac5b94b900d36e38553f +dist/2026-07-06/clippy-beta-aarch64-pc-windows-gnullvm.tar.xz=0f6875718ab6f1dadbc1f354b6d70672e95d87637fd6789025558e9dbe845334 +dist/2026-07-06/clippy-beta-aarch64-pc-windows-msvc.tar.gz=f12551db2ba920ec124fe73cdfbd4344ce94a849ecda31f633f0d066c8952fcc +dist/2026-07-06/clippy-beta-aarch64-pc-windows-msvc.tar.xz=89f9b6449e95c12ad35d6892ee7883d3465c5bc2305caea17631789a30d5a20b +dist/2026-07-06/clippy-beta-aarch64-unknown-freebsd.tar.gz=0a965149ad8fe7bd7597e659b8364e1feb39403526c1e2af2f1831a9394a5fc1 +dist/2026-07-06/clippy-beta-aarch64-unknown-freebsd.tar.xz=aedbd5c2eace2d31c81416aca115dcc83da4bf36861597fee47364294bacce1d +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-gnu.tar.gz=e3cfb936841f706b534c8e022c821e3b92669b4c2d3464e957acf9f1ef6027b5 +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-gnu.tar.xz=fd6609c3c098392fcf47010a74e590aca7ac261338a3e7c4b27adb8c52294f1d +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-musl.tar.gz=7bc78bcb91788d3590a4d0c05d925c0b3caeb64ec7890b3e06b4cdf3033a83a7 +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-musl.tar.xz=7152989c498214cb6e9a1b82ab0a69205f954a5cf5dbdbe3077b2409a2a632bf +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-ohos.tar.gz=cf12683807268a6a0bdd5c82fcf31ba836abc3f3d32ff09f4aa7c5e24329f8ab +dist/2026-07-06/clippy-beta-aarch64-unknown-linux-ohos.tar.xz=fcc26ce81f9c65d75b09c9822bc9d63d5baa15d05c513441e4a1c932d4b85b5d +dist/2026-07-06/clippy-beta-arm-unknown-linux-gnueabi.tar.gz=3a7e2f4b827a92bdf8cf30fb23c9ecddf65ff60027becc75669708b6c6b32f74 +dist/2026-07-06/clippy-beta-arm-unknown-linux-gnueabi.tar.xz=dd5aa51d3d20a78096ab2dbebf2f2a6d6d5e276d9ad82a1bd5cff5e6cec52c88 +dist/2026-07-06/clippy-beta-arm-unknown-linux-gnueabihf.tar.gz=13b057df324168a6bd60adb939b76f94cf556732c4c721ccd24678d51238073e +dist/2026-07-06/clippy-beta-arm-unknown-linux-gnueabihf.tar.xz=92de44d182d25e2b530b1abac2d13a42acd7c87733e1a6f42315995d9cd50666 +dist/2026-07-06/clippy-beta-armv7-unknown-linux-gnueabihf.tar.gz=9a66e8eaf6909f50ce4c24bf139c5b1c9c82a24a015ffaa46c82305753f4856c +dist/2026-07-06/clippy-beta-armv7-unknown-linux-gnueabihf.tar.xz=fc8adc913734cb5eed271bf5979779b0639a65d0abb3db39edd772ee53feeea3 +dist/2026-07-06/clippy-beta-i686-pc-windows-gnu.tar.gz=dca2e5b13364c407ad2c51e340a256239a82fdc52c97cdb61a9ce9828b16e799 +dist/2026-07-06/clippy-beta-i686-pc-windows-gnu.tar.xz=81b24d95aded0e5b4981523ab528cc36f94f1d4a338c8db2f073642ca4e5c1d0 +dist/2026-07-06/clippy-beta-i686-pc-windows-msvc.tar.gz=aecb8d9fbe7f04b9804cc5c7ed93a95a2ba46f64572e5b517802e11305205d5d +dist/2026-07-06/clippy-beta-i686-pc-windows-msvc.tar.xz=05f441a4a896c2ea4dcfdc6bdbf5e108626ebad3aee1d6b5f44849139054ec68 +dist/2026-07-06/clippy-beta-i686-unknown-linux-gnu.tar.gz=ae36bf1fbf48c49369310f5554d3deb83c6a1a3b0c2f433eb073706b2db584ba +dist/2026-07-06/clippy-beta-i686-unknown-linux-gnu.tar.xz=75eeb5251bf9c2ead019037f182a9b4d11c861380da2211b3eba289bba674490 +dist/2026-07-06/clippy-beta-loongarch64-unknown-linux-gnu.tar.gz=b200bbe78346caec6bc170a90ecdd98c329de7a03cd0e688f17b74e9f57a9aef +dist/2026-07-06/clippy-beta-loongarch64-unknown-linux-gnu.tar.xz=36192a98467eb1b12c400e0967d8a35fcb103459f490f0cc712c61ae2bdb4565 +dist/2026-07-06/clippy-beta-loongarch64-unknown-linux-musl.tar.gz=cda062465f06453c30fd39a9dc8c45709783e42c505a45e2754f9f1fed455a5b +dist/2026-07-06/clippy-beta-loongarch64-unknown-linux-musl.tar.xz=37f529adead7ae32a1c26e77fb95a93ef7ddaeb00da9b9dc2bd69428921753d3 +dist/2026-07-06/clippy-beta-powerpc-unknown-linux-gnu.tar.gz=84442bdbcb4d4df8ebd97bed58b0700c7a68992edb800e26d312d7925e778d6c +dist/2026-07-06/clippy-beta-powerpc-unknown-linux-gnu.tar.xz=69d91b91e5d6f0eae0dd2f11e029a24538e932e58bc3cdc6a3f01d41639b6241 +dist/2026-07-06/clippy-beta-powerpc64-unknown-linux-gnu.tar.gz=bc66bc9bc49d906758487591f3f6a55a6bf44c314294e5f40222d63c1a8246b0 +dist/2026-07-06/clippy-beta-powerpc64-unknown-linux-gnu.tar.xz=e2971c085f7701f3ba7f9177b4295bd024d4a6dcc31d2a7c7091181a161b9ecc +dist/2026-07-06/clippy-beta-powerpc64-unknown-linux-musl.tar.gz=fa9ee1b4f7761e80bddc91cbe5a3872745b3a9769f1166505937ff712b4b334c +dist/2026-07-06/clippy-beta-powerpc64-unknown-linux-musl.tar.xz=77d770c1efc6e7a04f5f08c55a2412836ac90a4a913528052990d96825791a0b +dist/2026-07-06/clippy-beta-powerpc64le-unknown-linux-gnu.tar.gz=5c1590bd2c7b3f22e0182c806a0f311796b17d3fa90cce42bcf83e8c8b15afb4 +dist/2026-07-06/clippy-beta-powerpc64le-unknown-linux-gnu.tar.xz=06c2179d17c023558221b3c5d6edb99f7a8d7d00d6a1d81777ea59755e3ae1f6 +dist/2026-07-06/clippy-beta-powerpc64le-unknown-linux-musl.tar.gz=683429068bba2aed79ccaae44905e3615f90b3e0b9756b68b8049913c1d4e4ad +dist/2026-07-06/clippy-beta-powerpc64le-unknown-linux-musl.tar.xz=bafa12b9c1769272849d9f7da5ee77fb35e2d8f9dec4fb6b62e9ffd07e2e62c6 +dist/2026-07-06/clippy-beta-riscv64gc-unknown-linux-gnu.tar.gz=99effdf4a70477d1f67e98468c2511b3e28ea4546e99c0eaced675378a611871 +dist/2026-07-06/clippy-beta-riscv64gc-unknown-linux-gnu.tar.xz=67b95a7e9ca9695688aededec4eb348931190db4b0efa5de0736a86b42a50fb2 +dist/2026-07-06/clippy-beta-s390x-unknown-linux-gnu.tar.gz=a2026f43d7ea4d03c48c72830e6795679263cc3a5999614c7ab2a978958d8185 +dist/2026-07-06/clippy-beta-s390x-unknown-linux-gnu.tar.xz=fa6fc2ad24e666ae18e680b3defecc953249a4d56b9f136162af786e63c5b620 +dist/2026-07-06/clippy-beta-sparcv9-sun-solaris.tar.gz=371fb847b671e3d3308944cd5f0b4a340e9a4d0c05fdf0e440b1a4d5664220ba +dist/2026-07-06/clippy-beta-sparcv9-sun-solaris.tar.xz=3c70e3278fb5d03c48f5612ef2a66b45dbb817ad18c8e4f0bce583d3a482bd89 +dist/2026-07-06/clippy-beta-x86_64-apple-darwin.tar.gz=344bf15dd415aabb441c6b57224170163971f565602a87f603d3ea3cfd9509b8 +dist/2026-07-06/clippy-beta-x86_64-apple-darwin.tar.xz=041fb8c23080e780161d5b1a5da82e2f0c1cdf60559be29bff00518a32c4371f +dist/2026-07-06/clippy-beta-x86_64-pc-solaris.tar.gz=c4e8317ab720ab85ad2a440f7acf0e09758e8641cbf0c6b52406e798ce9bf23d +dist/2026-07-06/clippy-beta-x86_64-pc-solaris.tar.xz=94547e32a1302010b155a21dd72cd5bd5df5e86d9d0931c4611241ba0648aa7d +dist/2026-07-06/clippy-beta-x86_64-pc-windows-gnu.tar.gz=fe6e75fd2aff37244072b3bc99fb314b01d23b17a72467efdd0bf2c41f742195 +dist/2026-07-06/clippy-beta-x86_64-pc-windows-gnu.tar.xz=d586c349eae70fee0c824e6c86f0dfb0183479e7264ba044e8b9536fe815f848 +dist/2026-07-06/clippy-beta-x86_64-pc-windows-gnullvm.tar.gz=a958b1d53b6f56579b8495110c44089d3a79554c755f20b1e82457f2b3edaf1c +dist/2026-07-06/clippy-beta-x86_64-pc-windows-gnullvm.tar.xz=80690d687c01cc01dde95a72ab39d06358912e00dd586e81ff20d8a4108d4b92 +dist/2026-07-06/clippy-beta-x86_64-pc-windows-msvc.tar.gz=c38d21fa6f295a7f8161f67ef966424768d0ae2aa7084dfbd4ff10f29474d42d +dist/2026-07-06/clippy-beta-x86_64-pc-windows-msvc.tar.xz=a581f05c9bfbcae304002d30de2c1e236990c895417e83c5ce65460ade39c60e +dist/2026-07-06/clippy-beta-x86_64-unknown-freebsd.tar.gz=b988e879d9b5ee88b426d3af2a860e48c251b71b83f5a5c92d610e870f474b46 +dist/2026-07-06/clippy-beta-x86_64-unknown-freebsd.tar.xz=a5d89857a415da68b02f474fdfd23b8f52822ed1709056b3e6a0f6dee90a9ef6 +dist/2026-07-06/clippy-beta-x86_64-unknown-illumos.tar.gz=d542d002e60f29e7598b47dc2fa18fb8d157c503f3dbdbc73623f3718ecc3d5b +dist/2026-07-06/clippy-beta-x86_64-unknown-illumos.tar.xz=0477e8047f98ebfb9690323b1d9817d3b62590070446fab1637bf8d8ed8615e5 +dist/2026-07-06/clippy-beta-x86_64-unknown-linux-gnu.tar.gz=97eb8c57816765aa13ce7d6103906dc88b79e79425cf5bcd1645f8e47c6723e2 +dist/2026-07-06/clippy-beta-x86_64-unknown-linux-gnu.tar.xz=67d4c30469010c74e18939e6e1ff755cbbb1736c74e3cc09e546c09a7b211d08 +dist/2026-07-06/clippy-beta-x86_64-unknown-linux-musl.tar.gz=8c4898c08532c5cb63b9d2d1e1b1cdf78e34fe067fb71e35bc27910d6c59e494 +dist/2026-07-06/clippy-beta-x86_64-unknown-linux-musl.tar.xz=89539692a5a3124a82e7a811e16df6ce63138fd6833f801bba3ca5fd4fce3eab +dist/2026-07-06/clippy-beta-x86_64-unknown-netbsd.tar.gz=e603ce6fe7accae461b8bd1dcf0239dd93ad90434cf8bcc7c5de12f80e8e30b7 +dist/2026-07-06/clippy-beta-x86_64-unknown-netbsd.tar.xz=732db0830e3b62fc89e6007398a3e2f76f709df320ee0ba5e2af82b6e282ea87 +dist/2026-07-06/rust-beta-aarch64-pc-windows-gnullvm.msi=7b28fcd5c3c1c3cdfa85ff0e6586d2d46d8632929ed344a74d1d141ba94af646 +dist/2026-07-06/rust-beta-aarch64-pc-windows-msvc.msi=2ee656cee05fa6abe0646274cad6b64980ff0515aac9809bc59479ccb15b7557 +dist/2026-07-06/rust-beta-i686-pc-windows-gnu.msi=b557f92bfd2f091a960c5a918744b73ed4ed090e6b54fe4368238989f5c418f0 +dist/2026-07-06/rust-beta-i686-pc-windows-msvc.msi=9b6e111c5ea1981f71af0505e5e35d37ed2e8bf9b9be5baebcb7abd1aaca28c9 +dist/2026-07-06/rust-beta-x86_64-pc-windows-gnu.msi=8c20b02c0a17b608124deff1f9d7af486ab683d99e50b7afffff195dd12440d1 +dist/2026-07-06/rust-beta-x86_64-pc-windows-gnullvm.msi=0edbe99a1b020c0592109f9022b921e1285a5699956835b433a193333636b2ae +dist/2026-07-06/rust-beta-x86_64-pc-windows-msvc.msi=093a7eabe65835863fa9aa66395eb57092a1957f9eeff71cca6012338f4311c8 +dist/2026-07-06/rust-beta-aarch64-apple-darwin.pkg=1261d253ba090e4f023b6ef0c7509648728a87954bbb75f153f9f77dd9c951c3 +dist/2026-07-06/rust-beta-x86_64-apple-darwin.pkg=acd312cfe34480881c7ac0143123ba04964713a7b2eb7310e372e31e1f710ed7 +dist/2026-07-06/rustc-beta-src.tar.gz=cff0d5592c0be90dc421d234710d76e1f5b993fcf0104c25d9825f95773f6da4 +dist/2026-07-06/rustc-beta-src.tar.xz=4f18ec59aae962e39f29ab5342d7c6351a384e59011740e7c747b5c1f492c0c7 +dist/2026-07-06/rustfmt-nightly-aarch64-apple-darwin.tar.gz=e88422cbf58441d17cf9b19be96ee2bae946ef63e03e91f448e79b9c08be8d05 +dist/2026-07-06/rustfmt-nightly-aarch64-apple-darwin.tar.xz=895e4fe911645d7507829ccf7b0bba0a8c8262146deb5eac47c50d3a44bca07e +dist/2026-07-06/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.gz=47e8788a26c8356ad6fbb0f9806902a4c04d629e9f8ab9c5eaf943ac37c9b7d5 +dist/2026-07-06/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.xz=195feca9e3abeb41337f36f6c99cb755957cff0c992c21df91fa1fdde7ea8e84 +dist/2026-07-06/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz=2d51d5af6ad64b2b15a7e9881aa9c20f14394b81f0da644ecfbb138da40baf4c +dist/2026-07-06/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz=00766ae44f4c3de4bd39ff5dc57006018402ea39e608105d86c63fdbdd6aec58 +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-freebsd.tar.gz=200d1b23184d9348ba0a9dc8adc3123aa0301633d838a9493ab9a93a369ab1f7 +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-freebsd.tar.xz=19726ef62073c0e9d6da83ab0c4f7528ad9d548ef39059be9240301d728079d1 +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz=644cdf910beafc88015b9991e55ad6e93dca8211cecc0bfa8e9a3977094485e2 +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz=c79fd8bb0d0d0d5c37a374a35c6aa99a55050d63550fa756f2143326a15d2b6c +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz=9e57c5da13623aafb70944007bd7991e2df96b2dc336ffc3cedfad8f238ec742 +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz=aaeb7cbf79608206d786e500f7eea86c4d7d8687f49d7ac4f2c4b5f0485ff14e +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-ohos.tar.gz=77d29bae113ad6a5de91cfe408d4475d36a00f2066d95125c5843e4d2bb0ec0c +dist/2026-07-06/rustfmt-nightly-aarch64-unknown-linux-ohos.tar.xz=1043b6b18d692e3b892b1631b9c2bcfbdf190cb43fd370d4c917fc3431324818 +dist/2026-07-06/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz=b7e0df22e444abf97ee1014398d6e73947e1fab7054686839e8472025554bef1 +dist/2026-07-06/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz=12ce9dfe119d2eeca469fad905f95c1667b54b5d9fb5be44fb93883b0f57790c +dist/2026-07-06/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz=f65900ad93097b066a40218b67523cc4460d4b7b27fecb011de2654a2090fe56 +dist/2026-07-06/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz=53de1c22ea06dc0694b1a5a84e12a0c00f25afd435155ba8c9804a146cbaa36a +dist/2026-07-06/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz=bc0da31ddf93af8835c582c0812689f1997daad32081273f12392f8629d08d95 +dist/2026-07-06/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz=5bd80467f04238a0b529b2b9b2543534a5c5145986d7284de462b9b5ea7dd3c5 +dist/2026-07-06/rustfmt-nightly-i686-pc-windows-gnu.tar.gz=53d626dddd3d9ef108307d17ff5a26613567e38e1217b54ca60ac5afafd47a6f +dist/2026-07-06/rustfmt-nightly-i686-pc-windows-gnu.tar.xz=165c2d50f7066128bc85cd011bbc0347ed2614204ed1552c1d97efd55b4ddcee +dist/2026-07-06/rustfmt-nightly-i686-pc-windows-msvc.tar.gz=8380f379d4b4ee2e631213a95be0f220f545d2309d4cfcd086fffceebf84cd0d +dist/2026-07-06/rustfmt-nightly-i686-pc-windows-msvc.tar.xz=d091ae298a13c0335cd7ebebcaa0da28c1c0c5c789f875ecf078fff111b9398d +dist/2026-07-06/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz=21d916981edf868b91cf097b54b4cb725f0ecb94ad6bcc4adc5396186719a0da +dist/2026-07-06/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz=84f95142fb62b9b9ac863617366942b7f4a53c361e99ef05d63df0a8c7e63c54 +dist/2026-07-06/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.gz=72461eb3f51b2ea75f3ec4e24fc6c18cb91f3af57649968a70a76916e3c9ffc6 +dist/2026-07-06/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.xz=72c2950a973ae844273b727968e2355264e69ff262908079670d7ab9d22e4eea +dist/2026-07-06/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.gz=51f5a817e363d6d28cd616a1a85b411e8f3830ffc9bddef8a529502322223c9f +dist/2026-07-06/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.xz=2328bfd79b3e2580c80679df4b96959aab56110881f687f9cff080b83184f458 +dist/2026-07-06/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz=1ab592659e5660acff7f77f296233e4466b95fdecf94614b8c67fa957c2f34de +dist/2026-07-06/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz=d042250527b8ec59ea292e641a8e8538018aeb2c189798386a5f0ee54e1e545d +dist/2026-07-06/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz=3580ce8f930de74cc6fe12bb6911725e80523647efc4c59e7d81da1045950f96 +dist/2026-07-06/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz=32ff5cf8f6289e8053b49c42ac075f2e150082e58cdb40384053087cd78f3ef7 +dist/2026-07-06/rustfmt-nightly-powerpc64-unknown-linux-musl.tar.gz=4157e498edfb663df3f748f57f1c57c61a0a5d272e1493623bd6390e92618566 +dist/2026-07-06/rustfmt-nightly-powerpc64-unknown-linux-musl.tar.xz=8107243bd1639f6547fb2bc15931e417933b04bd575cde4a9084e0eae3ef6c7f +dist/2026-07-06/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz=0d0bcab6fab9a917f81bcad0a538841ffea3883447da32281996b0c34011fa22 +dist/2026-07-06/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz=f72d5e45982c803963bb9594ab511767479c8f3082d7c85c625d90131b6422ce +dist/2026-07-06/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.gz=535165670777f6e555fb742da724e7c81b2f5816272e48daa2e74cea4de95df8 +dist/2026-07-06/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.xz=25beac6261957d35a37d7294a5de92c6c98dcec9fb148ae529cc76dd146966c9 +dist/2026-07-06/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz=311eceafc35dd7ee8cefabd6b22b5048fcaea9fa8790bb1415f4a3fc3ad8f878 +dist/2026-07-06/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz=fbfabddca5b152273b3a5a8a3ef1e2e9c0cce6b1ace7ff03b15c866434102dce +dist/2026-07-06/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz=0fd503d21c3193c0bedc1ca29d8630b3d929671d06c14936263d4ff01402624b +dist/2026-07-06/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz=8961d8a84a1830cef4568af8282ccd4dc0e97e04bc9566396df22cbf76d074a9 +dist/2026-07-06/rustfmt-nightly-sparcv9-sun-solaris.tar.gz=2faa9d735a9b9e3f797cbbf042d8a6c873a2e28634046dd009c5773ba19646de +dist/2026-07-06/rustfmt-nightly-sparcv9-sun-solaris.tar.xz=a2cdb3dec375cafa926bda20c0f30d7df0d306354827135b70be78b4f0af5cfa +dist/2026-07-06/rustfmt-nightly-x86_64-apple-darwin.tar.gz=b539a9b773a0e2e0cc433a76f3b2fd827a701202475a3f0de63e5332c3b81df4 +dist/2026-07-06/rustfmt-nightly-x86_64-apple-darwin.tar.xz=1bcf6ce7bb30c17745dfdd325efbdd22e6399f6e68ab4e3b30fc83dc05553ecb +dist/2026-07-06/rustfmt-nightly-x86_64-pc-solaris.tar.gz=bcb062fea7dc22f051f9ab84cb8d4249a11244fa43c9214fb524bf80b10e5fe0 +dist/2026-07-06/rustfmt-nightly-x86_64-pc-solaris.tar.xz=0006b5bb09ff297dbf99069b5488799cd6d6d50f94e286b8bb943262fa108750 +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz=ca2339739bf11652e7e67571efb6c8acc6c4bb72643014e5be5fec960e051dc3 +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz=7caf19d81b49dd49155f462eef4a92d74c33fe898e3d82cfb4c8aba791e5bb8d +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.gz=9f6d84ebe9e21ee0767b63fdcd72b12a5e41aa3693693f711126605b3c2d4b4f +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.xz=370c8df1bce4449c29fe4c8aa9356c28f585d7525a25780fc3049710c2f212a4 +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz=3b71146674877498b6344d2eba10e1df30c30b2abcf4d2970badfe8d02b9f40e +dist/2026-07-06/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz=c8e27c7f5c5b25251e3bf23bb17a2cae434ac8885b937cfe010833e98c083ee3 +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz=b91b9ad8fe100d01b3e2dc6a1e39fabf577f6b47553fdfab7d6bc0e5562de5cb +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz=84ce144a06303e05a2f723f6db5672b813b5eba37cac5b4c969bb0ed1fa6a925 +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-illumos.tar.gz=a2ce84f3d9ce754d049fc17881b85092b99077ed7f47758de3fa9b6a7f266e2a +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-illumos.tar.xz=5dbeb02d3fd9ea695ca022710c8b7d441e9a4fe4bf91e935cd99aca25151e0fc +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz=c7b96932cf9c8107a9f30d371994373608169fbe5c81e0dce445fd43bcde68af +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz=34e0f3d79d6a72243fef92e965dcc12cbba18de25bfc0da76ca2299f1ebbd5b9 +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz=fc6b5bc3afae08c95336ed23f6cd0bec53633844a03abc949cd88f1622297ae3 +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz=8b11b548651d33e63c44fd5f29ecf02a36ec8f995e7d81c0a785d3e75fbc2ab4 +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz=1c15753450f5c7ff98302adb3acf622223fa9c714c6c5921a94531cb9f37eccb +dist/2026-07-06/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz=b7f016d8052017057204d4a8e1505ec67f8dd26f1b6397a8c734ba925eddc6d3 +dist/2026-07-06/rustc-nightly-aarch64-apple-darwin.tar.gz=0e5c19bf61838ffec81b080ab0d323abf959760d7ead7eb9f3e8e6f1973c8d63 +dist/2026-07-06/rustc-nightly-aarch64-apple-darwin.tar.xz=f9b1743f224224e9645e28652fd04bcc42ac7ab4a29e9354301bae4df209140a +dist/2026-07-06/rustc-nightly-aarch64-pc-windows-gnullvm.tar.gz=04aaa9946adc35251168db2e09d72ec47b30f31823d6b59b9a36ad4f02073819 +dist/2026-07-06/rustc-nightly-aarch64-pc-windows-gnullvm.tar.xz=f00c5a93fc061505245317cdf781c433350a9a6eea70c98995fb7dfc3aca216f +dist/2026-07-06/rustc-nightly-aarch64-pc-windows-msvc.tar.gz=5244e38f0ddd847da82877a6e74afd5c5f84049dcf9181ce318ce39a8cabe8e9 +dist/2026-07-06/rustc-nightly-aarch64-pc-windows-msvc.tar.xz=e2aa6d7e8b417db3d293dba105d58f28200667b0a56ada28b0498c589b394373 +dist/2026-07-06/rustc-nightly-aarch64-unknown-freebsd.tar.gz=e2d8651fa41ad742173e2e86d5d8cdf94513d748178e21f394b310a7700ad96e +dist/2026-07-06/rustc-nightly-aarch64-unknown-freebsd.tar.xz=05ceb57202b537f58c4cdc3d9eb128d6065f21b457acc55c4942ea23e4a9a809 +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-gnu.tar.gz=f7c839498e29742be012cc9fd44aee0f5652ec14e19bafa7fb8be38628ab876a +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz=6400494d43f754647935506da8c00143de9eee42897b00afdf1d18823d789bee +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-musl.tar.gz=da3b93f10a9e70a55bd37db018e470e3cc469d9866058ad65409fec7e59e0795 +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-musl.tar.xz=890f8bdc52e5a35a5dc90538ed3bf597b1e3abec6d13630404dc1570912b2976 +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-ohos.tar.gz=930fa24891db48ec56fab70ce2b7507d057c4800a9960f0ac1ef0b8e6bbcc187 +dist/2026-07-06/rustc-nightly-aarch64-unknown-linux-ohos.tar.xz=fd9f2a3ec624981cc0bfda52100e173c772062fe3bb82e7053e6faa99444593f +dist/2026-07-06/rustc-nightly-arm-unknown-linux-gnueabi.tar.gz=9e59e0ec4af58f494b32a16dbe83d5d435af3a3d070a1877c77e56d301fe0338 +dist/2026-07-06/rustc-nightly-arm-unknown-linux-gnueabi.tar.xz=c59c14445eadc136c61e1465e90d5d0cd1f04f3a8e9cab065aa02a7cc26bea11 +dist/2026-07-06/rustc-nightly-arm-unknown-linux-gnueabihf.tar.gz=8f1a3515aee3c2a796dadf93533fafa95949bacc641e7a5966fb4221ad99afd6 +dist/2026-07-06/rustc-nightly-arm-unknown-linux-gnueabihf.tar.xz=f12f3ba56e9edccd24a6bcb606d890702c7669060798492ff857b94bebe248b2 +dist/2026-07-06/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.gz=715049d3773ecc6c3e15e447dc96d16c0bd85d8df8812b2484c6297e9653f80f +dist/2026-07-06/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.xz=44ebc3b636efea435b708b6239cbe507aaccaf3fb57605655a457029b3c5949d +dist/2026-07-06/rustc-nightly-i686-pc-windows-gnu.tar.gz=2a7df4ffcfe8ddce9d8a5b175fff63b0ab7954b6f9e734ef6494cb144adb6c24 +dist/2026-07-06/rustc-nightly-i686-pc-windows-gnu.tar.xz=08eb6296a3e2f72049a8052e93eb117453135ceedaf0e1b9caab5503aebc128b +dist/2026-07-06/rustc-nightly-i686-pc-windows-msvc.tar.gz=df1027a147dae62b6f4a3b38b627aaa352bddec90173de920f6e8fc679d2b469 +dist/2026-07-06/rustc-nightly-i686-pc-windows-msvc.tar.xz=cd692b7be68461bb8922dfb5caaa7216f0b8db49247e63977c76a0f01ce611c4 +dist/2026-07-06/rustc-nightly-i686-unknown-linux-gnu.tar.gz=e8248a43eb3ecdaa5396615d346ece5464351b7515233743a5d8547308542ac9 +dist/2026-07-06/rustc-nightly-i686-unknown-linux-gnu.tar.xz=c3f347fa0efc39d098587aec7d8a5a95e7be39cdd2e0fa9a975c7367c4316d59 +dist/2026-07-06/rustc-nightly-loongarch64-unknown-linux-gnu.tar.gz=f29bec601cc60cbda49736fa40c017aa760073cb023cf894eb0be80eea1181b3 +dist/2026-07-06/rustc-nightly-loongarch64-unknown-linux-gnu.tar.xz=41a6ca3a2991d81275de4c12e0ab9b87eeb1b8f1eb04c04a3c3450aa35ee9247 +dist/2026-07-06/rustc-nightly-loongarch64-unknown-linux-musl.tar.gz=eb3717e6553ee110d83a803c799dfd73f929b7017ac245a71b1794c3e5f59548 +dist/2026-07-06/rustc-nightly-loongarch64-unknown-linux-musl.tar.xz=a3b665037ed330434ef4c5d43b16b7119577dba40235c9788c72d1407008dcb0 +dist/2026-07-06/rustc-nightly-powerpc-unknown-linux-gnu.tar.gz=91e186fc5803333fbba203239915c9bf536becc9e3c62f239abc849d30b817ed +dist/2026-07-06/rustc-nightly-powerpc-unknown-linux-gnu.tar.xz=2b3d28ea965a3c13ea93c7cdfd2068e37fc6f7c748a133a5ac40372b38d74fd0 +dist/2026-07-06/rustc-nightly-powerpc64-unknown-linux-gnu.tar.gz=1ec24166b8da4945c93ae9f8d58eb4aa30dc53080af4815de0df0b50f0d858ff +dist/2026-07-06/rustc-nightly-powerpc64-unknown-linux-gnu.tar.xz=edad85086020691a962d090713ceb7edff2dd915f30d92f19d93d97b26a73d63 +dist/2026-07-06/rustc-nightly-powerpc64-unknown-linux-musl.tar.gz=8f7ee6e2ee007dbb72c7dc0cd1b72c2c2aeb0a5f4d50177b73cb1183877cdb26 +dist/2026-07-06/rustc-nightly-powerpc64-unknown-linux-musl.tar.xz=c33deb2ac31bcc7b7fc077da4bb725965f0c6c4e8d4efce660d0687aed2e2134 +dist/2026-07-06/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.gz=6fe2034a2ee0dafd781fb2c1965724b203bd095ca59d7d2c02c538dd218ae137 +dist/2026-07-06/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.xz=bcb728735ca43ad1e3b73242d0928781a23938a6ea411b424b6ec3eb92b12ad0 +dist/2026-07-06/rustc-nightly-powerpc64le-unknown-linux-musl.tar.gz=d967a31dc9682abc36d29e07c772b486890a3c05149c23f803f39f3696eb2368 +dist/2026-07-06/rustc-nightly-powerpc64le-unknown-linux-musl.tar.xz=e45b3ee6133381b260979218a0b4dea5de5233f45effbd28a738c49236571311 +dist/2026-07-06/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.gz=f1e2797647a0c92015eeda8ebaf7d7860b3308f6a555986920394c9b99b8db55 +dist/2026-07-06/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.xz=eefc0a30d69bfa108874260a3545aff91510764b578c7a1597986c5138653044 +dist/2026-07-06/rustc-nightly-s390x-unknown-linux-gnu.tar.gz=299295e8bf60b37869fd20dfcd864685502e21fb2632e1e864dd1bcae753d0e8 +dist/2026-07-06/rustc-nightly-s390x-unknown-linux-gnu.tar.xz=4c3fe42420ef9cb4e4702a11791ee468bc98b6289eca6cd23d5404f9f94b3182 +dist/2026-07-06/rustc-nightly-sparcv9-sun-solaris.tar.gz=95ab013ed1619e28e009f71fa250061d689ab8cd5f2f35a3ba738e66077c5dbd +dist/2026-07-06/rustc-nightly-sparcv9-sun-solaris.tar.xz=193fafa343dd8d4abd89fd02a7edcbf64e1e7b3bedf61b2cc632a3b7a787646c +dist/2026-07-06/rustc-nightly-x86_64-apple-darwin.tar.gz=8c96dceb4ea71ce85a9e8f4ab0c2d98429b2095b19960f08d0e2fe8913a1f4fe +dist/2026-07-06/rustc-nightly-x86_64-apple-darwin.tar.xz=ce958b6f607e575247201926e12e15d30c5e6719c7e37c3fb719bff0b8ce4901 +dist/2026-07-06/rustc-nightly-x86_64-pc-solaris.tar.gz=91679f976beea80b9fcd668ebd663805d19ad03c930e6a91ecece9c54fe6fe83 +dist/2026-07-06/rustc-nightly-x86_64-pc-solaris.tar.xz=2d12b388291820e4cdd87b852dd4cd13ca36d8b582d3fb3a3b6615770b4c8c45 +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-gnu.tar.gz=54cdfc069e505bf53bc402abbac0edade1dcc2febd254c893b35666c86aeed18 +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-gnu.tar.xz=f9b2233346000ff7aac37571e934b427337e75d48a96dec1e0dba849efacc678 +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-gnullvm.tar.gz=46baf33084457877c3a2cc846dbba2238f1f455e1c219126be1eac8091d9f098 +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-gnullvm.tar.xz=b4d0cdd5888fce957647d8ba5140b12b689b50fc82f1eb833afce6aecf6e1ac2 +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-msvc.tar.gz=d2d3e547e317e456ed19c8f300ee6f11df7cc2b5e4c1822467020a9956b66e6c +dist/2026-07-06/rustc-nightly-x86_64-pc-windows-msvc.tar.xz=ec20ed572b0d32cbebb7b5fb5d0a5eea4590319226a5cdb4e7ae7922f9ed9e46 +dist/2026-07-06/rustc-nightly-x86_64-unknown-freebsd.tar.gz=a9371f822120bcfadb604cfd5b76e1e3ae431a63e3844e46e78a8abe0dbf7ac8 +dist/2026-07-06/rustc-nightly-x86_64-unknown-freebsd.tar.xz=f19f08bc798489917a9a14e0dbe05a6389931d6797f8d353e92be9f5c31750f9 +dist/2026-07-06/rustc-nightly-x86_64-unknown-illumos.tar.gz=baa0914036558477ac3a8c3a77a453eb96c03399d281e42303c68e2f3686e372 +dist/2026-07-06/rustc-nightly-x86_64-unknown-illumos.tar.xz=d867df6c38fb2124235de9d1bcf06d29c8ef544a696c351c281094fdfe92c0bf +dist/2026-07-06/rustc-nightly-x86_64-unknown-linux-gnu.tar.gz=69504b718eba7493ed5d5283b8d9eb2b6b9677f4e665e80c2be3a08954f17c34 +dist/2026-07-06/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz=ee54c04967a4e240a379800ee44a2c07b1d3b58e32c83a33a142633feefa4710 +dist/2026-07-06/rustc-nightly-x86_64-unknown-linux-musl.tar.gz=b52e3518c9f49b578acfcee2b82203d6dd5d482938165556881ce0d9d291f17d +dist/2026-07-06/rustc-nightly-x86_64-unknown-linux-musl.tar.xz=25a3d5f1ba9752b1137f06c946bcf1fdb6a1ec404bf2f0caa1a5a8ed9496a73d +dist/2026-07-06/rustc-nightly-x86_64-unknown-netbsd.tar.gz=b846c90ea1c82998e086a126f2ad05c62954ad602866952a6447a8ba97974ed1 +dist/2026-07-06/rustc-nightly-x86_64-unknown-netbsd.tar.xz=bee9e78b5f7fb433c1d274e16c1edffef9c19a8e14c37af52f8b53eed76cb7de +dist/2026-07-06/rust-nightly-aarch64-pc-windows-gnullvm.msi=ba991d53e9ee645958528a1d536287d6f53867d81247e9f272fdfda7597197b4 +dist/2026-07-06/rust-nightly-aarch64-pc-windows-msvc.msi=8aa66ccf720a6d14839cbee2790da4b820a70ab2412285614ce1ffe005728d1d +dist/2026-07-06/rust-nightly-i686-pc-windows-gnu.msi=8bfef23853561636c14e4f4b86718f550ef4486ea6490fe7ef35d751363f918c +dist/2026-07-06/rust-nightly-i686-pc-windows-msvc.msi=03e7059e208f79f2eb7e1d74e2af4d22e99dd11cbfa3f9278bdf864006f432d6 +dist/2026-07-06/rust-nightly-x86_64-pc-windows-gnu.msi=2685b33d07826dd355a8c58d15bc556a80c630d5ff31636eb9fa74d63146dffe +dist/2026-07-06/rust-nightly-x86_64-pc-windows-gnullvm.msi=ec837e8715f616a0d9b3f2f9aa11345fedd37f8f5833ed5d1c3bbd5cb8b5f5e3 +dist/2026-07-06/rust-nightly-x86_64-pc-windows-msvc.msi=bc8442fe07673653e09e7d3f78c17dbe89b6f259ff440d98553a362eee5e9674 +dist/2026-07-06/rust-nightly-aarch64-apple-darwin.pkg=b408fc514c4d2882f35a6ec144584732bc04165fb1f85f89f506070a54b94f8d +dist/2026-07-06/rust-nightly-x86_64-apple-darwin.pkg=6b734aa04c216a4003e891f3dde9c6f5b74724842815b3c8f417686726da1593 +dist/2026-07-06/rustc-nightly-src.tar.gz=41feb9d114d6c6cb6b46bc82cf98b54e6780dc50d6dacaba83167258c76699a9 +dist/2026-07-06/rustc-nightly-src.tar.xz=a8b330a49fc96bdd858cda8019e7b8b6cc1fad471041af9833cc1a086bec93c0 From a01d23db21fb23a680b4618e46bffb504d40b4ae Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Mon, 6 Jul 2026 20:16:34 -0400 Subject: [PATCH 3/5] Step cfg(bootstrap) --- compiler/rustc_lint/src/runtime_symbols.rs | 9 ++++----- compiler/rustc_metadata/src/lib.rs | 2 -- compiler/rustc_middle/src/lib.rs | 1 - compiler/rustc_trait_selection/src/lib.rs | 1 - src/bootstrap/src/core/sanity.rs | 4 ---- src/tools/miri/src/shims/files.rs | 8 -------- src/tools/miri/src/shims/windows/fs.rs | 3 +-- 7 files changed, 5 insertions(+), 23 deletions(-) diff --git a/compiler/rustc_lint/src/runtime_symbols.rs b/compiler/rustc_lint/src/runtime_symbols.rs index a583ee70074b6..5f987f9ab29cc 100644 --- a/compiler/rustc_lint/src/runtime_symbols.rs +++ b/compiler/rustc_lint/src/runtime_symbols.rs @@ -17,11 +17,10 @@ declare_lint! { /// /// ### Example /// - #[cfg_attr(bootstrap, doc = "```rust")] - #[cfg_attr(not(bootstrap), doc = "```rust,compile_fail")] - #[cfg_attr(not(bootstrap), doc = "#[unsafe(no_mangle)]")] + /// ```rust,compile_fail + /// #[unsafe(no_mangle)] /// pub fn strlen() {} // invalid definition of the `strlen` function - #[doc = "```"] + /// ``` /// /// {{produces}} /// @@ -47,7 +46,7 @@ declare_lint! { /// ### Example /// /// ```rust,no_run,standalone_crate - #[cfg_attr(not(bootstrap), doc = "#[unsafe(no_mangle)]")] + /// #[unsafe(no_mangle)] /// pub extern "C" fn strlen(ptr: *mut f32) -> usize { 0 } /// // suspicious definition of the `strlen` function /// // `ptr` should be `*const std::ffi::c_char` diff --git a/compiler/rustc_metadata/src/lib.rs b/compiler/rustc_metadata/src/lib.rs index 9ef9422a9e5a0..3e9b0c95423b8 100644 --- a/compiler/rustc_metadata/src/lib.rs +++ b/compiler/rustc_metadata/src/lib.rs @@ -1,7 +1,5 @@ // tidy-alphabetical-start #![allow(internal_features)] -#![cfg_attr(bootstrap, feature(result_option_map_or_default))] -#![cfg_attr(bootstrap, feature(strip_circumfix))] #![feature(error_iter)] #![feature(file_buffered)] #![feature(gen_blocks)] diff --git a/compiler/rustc_middle/src/lib.rs b/compiler/rustc_middle/src/lib.rs index da7ad32ae9dc0..69c2e099080c9 100644 --- a/compiler/rustc_middle/src/lib.rs +++ b/compiler/rustc_middle/src/lib.rs @@ -27,7 +27,6 @@ // tidy-alphabetical-start #![allow(internal_features)] #![allow(rustc::direct_use_of_rustc_type_ir)] -#![cfg_attr(bootstrap, feature(box_as_ptr))] #![cfg_attr(doc, feature(intra_doc_pointers))] #![feature(allocator_api)] #![feature(associated_type_defaults)] diff --git a/compiler/rustc_trait_selection/src/lib.rs b/compiler/rustc_trait_selection/src/lib.rs index 463555c456264..44fa3ea59ac50 100644 --- a/compiler/rustc_trait_selection/src/lib.rs +++ b/compiler/rustc_trait_selection/src/lib.rs @@ -11,7 +11,6 @@ //! This API is completely unstable and subject to change. // tidy-alphabetical-start -#![cfg_attr(bootstrap, feature(strip_circumfix))] #![feature(associated_type_defaults)] #![feature(default_field_values)] #![feature(deref_patterns)] diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index 99d9c8a04c5c1..330be66ddebd6 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -37,10 +37,6 @@ pub struct Finder { /// when the newly-bumped stage 0 compiler now knows about the formerly-missing targets. const STAGE0_MISSING_TARGETS: &[&str] = &[ // just a dummy comment so the list doesn't get onelined - "powerpc64-unknown-linux-gnuelfv2", - "aarch64-unknown-linux-pauthtest", // Stage 0 compiler is not guaranteed to see the target yet. - "aarch64-unknown-qnx", - "x86_64-pc-qnx", ]; /// Minimum version threshold for libstdc++ required when using prebuilt LLVM diff --git a/src/tools/miri/src/shims/files.rs b/src/tools/miri/src/shims/files.rs index 25dca7b8bb85b..b1c85cbf7d8cd 100644 --- a/src/tools/miri/src/shims/files.rs +++ b/src/tools/miri/src/shims/files.rs @@ -4,7 +4,6 @@ use std::fs::{Dir, File}; use std::io::{ErrorKind, IsTerminal, Read, Seek, SeekFrom, Write}; use std::marker::CoercePointee; use std::ops::Deref; -use std::path::PathBuf; use std::rc::{Rc, Weak}; use std::{fs, io}; @@ -476,11 +475,7 @@ impl FileDescription for FileHandle { #[derive(Debug)] pub struct DirHandle { - #[cfg_attr(bootstrap, allow(unused))] pub(crate) dir: Dir, - /// Fallback used under `cfg(bootstrap)`. - #[cfg_attr(not(bootstrap), allow(unused))] - pub(crate) path: PathBuf, } impl FileDescription for DirHandle { @@ -491,10 +486,7 @@ impl FileDescription for DirHandle { fn metadata<'tcx>( &self, ) -> InterpResult<'tcx, Either, &'static str>> { - #[cfg(not(bootstrap))] return interp_ok(Either::Left(self.dir.metadata())); - #[cfg(bootstrap)] - return interp_ok(Either::Left(std::fs::metadata(&self.path))); } fn destroy<'tcx>( diff --git a/src/tools/miri/src/shims/windows/fs.rs b/src/tools/miri/src/shims/windows/fs.rs index 6c5610ea07705..c6a16a082f2ee 100644 --- a/src/tools/miri/src/shims/windows/fs.rs +++ b/src/tools/miri/src/shims/windows/fs.rs @@ -213,7 +213,6 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { return interp_ok(Handle::Invalid); } }; - #[cfg(not(bootstrap))] if !dir.metadata().unwrap().is_dir() { // This changed from a directory to a file. Retry. continue; @@ -224,7 +223,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { this.set_last_error(IoError::WindowsError("ERROR_ALREADY_EXISTS"))?; } - let fd_num = this.machine.fds.insert_new(DirHandle { dir, path: file_name }); + let fd_num = this.machine.fds.insert_new(DirHandle { dir }); return interp_ok(Handle::File(fd_num)); } else { // Per the documentation: From 0d6d4edc48392861346000aff30fb9d539cc605a Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sun, 31 May 2026 11:03:35 -0400 Subject: [PATCH 4/5] Implement support for proc macros on wasm32-wasip2 --- Cargo.lock | 917 +++++++++++++++++- bootstrap.example.toml | 9 + compiler/rustc_builtin_macros/Cargo.toml | 2 + compiler/rustc_builtin_macros/src/lib.rs | 5 + .../src/proc_macro_harness.rs | 108 ++- compiler/rustc_codegen_ssa/src/back/linker.rs | 20 +- compiler/rustc_expand/Cargo.toml | 6 + compiler/rustc_expand/src/lib.rs | 1 + compiler/rustc_expand/src/proc_macro.rs | 195 +++- .../rustc_expand/src/proc_macro_server.rs | 8 +- compiler/rustc_expand/src/wasm_proc_macro.rs | 678 +++++++++++++ compiler/rustc_interface/src/diagnostics.rs | 4 + compiler/rustc_interface/src/passes.rs | 9 +- compiler/rustc_interface/src/tests.rs | 1 + compiler/rustc_metadata/Cargo.toml | 1 + compiler/rustc_metadata/src/creader.rs | 62 +- compiler/rustc_metadata/src/host_dylib.rs | 7 +- compiler/rustc_metadata/src/locator.rs | 120 ++- compiler/rustc_metadata/src/rmeta/decoder.rs | 70 +- compiler/rustc_session/src/cstore.rs | 1 + compiler/rustc_session/src/options.rs | 2 + compiler/rustc_session/src/output.rs | 18 +- compiler/rustc_session/src/session.rs | 19 + compiler/rustc_span/src/span_encoding.rs | 11 + compiler/rustc_span/src/symbol.rs | 2 + library/Cargo.lock | 2 + library/proc_macro/Cargo.toml | 6 + library/proc_macro/src/bridge/client.rs | 2 + library/proc_macro/src/bridge/client_wasi.rs | 481 +++++++++ library/proc_macro/src/bridge/mod.rs | 23 + .../proc_macro/src/bridge/panic_message.rs | 3 + library/proc_macro/src/bridge/server.rs | 6 +- library/proc_macro/src/bridge/symbol.rs | 10 +- library/proc_macro/src/lib.rs | 32 +- library/proc_macro/wasm-interface.wit | 176 ++++ src/bootstrap/src/core/build_steps/test.rs | 12 + src/bootstrap/src/core/config/config.rs | 4 + src/bootstrap/src/core/config/toml/rust.rs | 2 + src/bootstrap/src/utils/cc_detect.rs | 11 +- src/bootstrap/src/utils/proc_macro_deps.rs | 2 + .../src/compiler-flags/wasm-proc-macros.md | 8 + src/tools/compiletest/src/common.rs | 2 + src/tools/compiletest/src/directives/cfg.rs | 6 + .../src/directives/directive_names.rs | 2 + src/tools/compiletest/src/lib.rs | 4 +- src/tools/compiletest/src/runtest.rs | 39 +- src/tools/compiletest/src/rustdoc_gui_test.rs | 1 + .../proc-macro-srv/src/dylib/proc_macros.rs | 10 +- .../crates/proc-macro-srv/src/lib.rs | 1 + src/tools/tidy/src/deps.rs | 107 ++ src/tools/tidy/src/pal.rs | 1 + .../supported-crate-types.wasm.stdout | 1 + tests/ui/proc-macro/auxiliary/make-macro.rs | 5 +- .../meta-macro-hygiene.native.stdout | 67 ++ tests/ui/proc-macro/meta-macro-hygiene.rs | 3 + .../proc-macro/meta-macro-hygiene.wasm.stdout | 67 ++ tests/ui/proc-macro/meta-macro.native.stdout | 3 + tests/ui/proc-macro/meta-macro.rs | 3 + tests/ui/proc-macro/meta-macro.wasm.stdout | 3 + 59 files changed, 3249 insertions(+), 132 deletions(-) create mode 100644 compiler/rustc_expand/src/wasm_proc_macro.rs create mode 100644 library/proc_macro/src/bridge/client_wasi.rs create mode 100644 library/proc_macro/wasm-interface.wit create mode 100644 src/doc/unstable-book/src/compiler-flags/wasm-proc-macros.md create mode 100644 tests/ui/proc-macro/meta-macro-hygiene.native.stdout create mode 100644 tests/ui/proc-macro/meta-macro-hygiene.wasm.stdout create mode 100644 tests/ui/proc-macro/meta-macro.native.stdout create mode 100644 tests/ui/proc-macro/meta-macro.wasm.stdout diff --git a/Cargo.lock b/Cargo.lock index 9d5d0f2d403f9..ef7bf4ffc9883 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,15 @@ dependencies = [ "gimli 0.31.1", ] +[[package]] +name = "addr2line" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" +dependencies = [ + "gimli 0.33.0", +] + [[package]] name = "adler2" version = "2.0.1" @@ -43,6 +52,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -184,6 +199,12 @@ dependencies = [ "object 0.37.3", ] +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + [[package]] name = "arrayref" version = "0.3.9" @@ -264,6 +285,17 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -276,7 +308,7 @@ version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ - "addr2line", + "addr2line 0.24.2", "cfg-if", "libc", "miniz_oxide", @@ -391,6 +423,9 @@ name = "bumpalo" version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +dependencies = [ + "allocator-api2", +] [[package]] name = "bytecheck" @@ -436,6 +471,74 @@ dependencies = [ "serde_core", ] +[[package]] +name = "cap-fs-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "cap-net-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20a158160765c6a7d0d8c072a53d772e4cb243f38b04bfcf6b4939cfbe7482e7" +dependencies = [ + "cap-primitives", + "cap-std", + "rustix", + "smallvec", +] + +[[package]] +name = "cap-primitives" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "rustix-linux-procfs", + "windows-sys 0.59.0", + "winx", +] + +[[package]] +name = "cap-std" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix", + "winx", +] + [[package]] name = "capstone" version = "0.14.0" @@ -941,6 +1044,15 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "cpp_demangle" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpubits" version = "0.1.1" @@ -965,6 +1077,152 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-assembler-x64" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e06aeba2c965fc446d13c56a6ccb2631b78445d7544543dd9a25289977630914" +dependencies = [ + "cranelift-assembler-x64-meta", +] + +[[package]] +name = "cranelift-assembler-x64-meta" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2d2dde4ec1352715595b5cfa6fe2e5b8ebb9da3457b3ee8db0aa2808c069aa" +dependencies = [ + "cranelift-srcgen", +] + +[[package]] +name = "cranelift-bforest" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4982ef9fa54ec9eee841e891e7ddc5434be1250e88de31572e000c888f30b" +dependencies = [ + "cranelift-entity", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-bitset" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529143118c4eeb58c39ecb02319557d512be6c61348486422974ab8e3906b8a8" +dependencies = [ + "serde", + "serde_derive", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-codegen" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7780677247ad3577e3a6a3ebf43f39b325a11d6393db72b2c9968a910d4d13d" +dependencies = [ + "bumpalo", + "cranelift-assembler-x64", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli 0.33.0", + "hashbrown 0.17.0", + "libm", + "log", + "postcard", + "pulley-interpreter", + "regalloc2", + "rustc-hash 2.1.1", + "serde", + "serde_derive", + "sha2", + "smallvec", + "target-lexicon", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9645250416cbf92454fe61160e17e026e0ce405906a54500b114f923ddffc9" +dependencies = [ + "cranelift-assembler-x64-meta", + "cranelift-codegen-shared", + "cranelift-srcgen", + "heck", + "pulley-interpreter", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ee8d222ff0fd3681791979afbf88586ac9f49010d3db96b3cbe4c96759aee3" + +[[package]] +name = "cranelift-control" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591abe6f5312bd2c4220f1b3bead56c2ad00257c52668015ba013b85dcf2a17a" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5300c49cf940526fe771517b3b3eabd5d0ff164ee61698579cf403fe8d3af3c" +dependencies = [ + "cranelift-bitset", + "serde", + "serde_derive", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-frontend" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4adbf760207fdbbe130f1191cce01cdef66831a9f648b1f39ff2800d126d45" +dependencies = [ + "cranelift-codegen", + "hashbrown 0.17.0", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8315b21ff018226a42a60a4702c2dd75f6447cac26e9bca622e14c22088c2ff5" + +[[package]] +name = "cranelift-native" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d506ef23a60715bde451b06620b14402166ded3b648454fccbf04f3e46a4aa70" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-srcgen" +version = "0.133.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ed47e602652e3410f9387fc0db70fefadcee4d78a78881421aabcab4e26b89" + [[package]] name = "crc32fast" version = "1.5.0" @@ -1358,6 +1616,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_filter" version = "0.1.4" @@ -1550,12 +1817,87 @@ dependencies = [ "autocfg", ] +[[package]] +name = "fs-set-times" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "fs_extra" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + [[package]] name = "generate-copyright" version = "0.1.0" @@ -1664,6 +2006,18 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" +dependencies = [ + "fnv", + "hashbrown 0.16.1", + "indexmap", + "stable_deref_trait", +] + [[package]] name = "git2" version = "0.20.2" @@ -2083,6 +2437,22 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "io-extras" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" +dependencies = [ + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + [[package]] name = "ipc-channel" version = "0.22.0" @@ -2102,6 +2472,12 @@ dependencies = [ "windows 0.61.3", ] +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -2117,6 +2493,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.15.0" @@ -2246,9 +2631,9 @@ checksum = "803ec87c9cfb29b9d2633f20cba1f488db3fd53f2158b1024cbefb47ba05d413" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libffi" @@ -2304,9 +2689,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -2361,9 +2746,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -2412,6 +2797,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "mach2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" + [[package]] name = "markup5ever" version = "0.39.0" @@ -2432,6 +2823,12 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.6" @@ -2462,6 +2859,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memfd" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +dependencies = [ + "rustix", +] + [[package]] name = "memmap2" version = "0.2.3" @@ -2495,9 +2901,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", @@ -2760,6 +3166,18 @@ dependencies = [ "wasmparser 0.236.1", ] +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "crc32fast", + "hashbrown 0.17.0", + "indexmap", + "memchr", +] + [[package]] name = "odht" version = "0.3.1" @@ -3194,12 +3612,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" [[package]] -name = "punycode" -version = "0.4.1" +name = "pulley-interpreter" +version = "46.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e1dcb320d6839f6edb64f7a4a59d39b30480d4d1765b56873f7c858538a5fe" - -[[package]] +checksum = "38b92604caae1a1899b6a5b54967289dd538177c626004c91accf9d0ec7e4a12" +dependencies = [ + "cranelift-bitset", + "log", + "pulley-macros", + "wasmtime-internal-core", +] + +[[package]] +name = "pulley-macros" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7ac85c0bb3fb351f10d531230aaa5e366b46d7c4e5328e5f02801d6dac1165" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "punycode" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e1dcb320d6839f6edb64f7a4a59d39b30480d4d1765b56873f7c858538a5fe" + +[[package]] name = "quine-mc_cluskey" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3359,6 +3800,21 @@ dependencies = [ "syn", ] +[[package]] +name = "regalloc2" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de2c52737737f8609e94f975dee22854a2d5c125772d4b1cf292120f4d45c186" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.17.0", + "log", + "rustc-hash 2.1.1", + "serde", + "smallvec", +] + [[package]] name = "regex" version = "1.12.2" @@ -3744,6 +4200,8 @@ dependencies = [ "smallvec", "thin-vec", "tracing", + "wit-bindgen-core 0.58.0", + "wit-bindgen-rust 0.58.0", ] [[package]] @@ -3998,6 +4456,8 @@ dependencies = [ "smallvec", "thin-vec", "tracing", + "wasmtime", + "wasmtime-wasi", ] [[package]] @@ -4341,6 +4801,7 @@ dependencies = [ "rustc_target", "tempfile", "tracing", + "wasmparser 0.252.0", ] [[package]] @@ -5026,9 +5487,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", @@ -5037,6 +5498,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustix-linux-procfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" +dependencies = [ + "once_cell", + "rustix", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -5310,11 +5781,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -5456,6 +5936,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + [[package]] name = "tempfile" version = "3.23.0" @@ -5661,6 +6147,20 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + [[package]] name = "toml" version = "0.7.8" @@ -6328,6 +6828,16 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wasm-encoder" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a879a421bd17c528b74721b2abf4c62e8f1d1889c2ba8c3c50d02deaf2ce395" +dependencies = [ + "leb128fmt", + "wasmparser 0.251.0", +] + [[package]] name = "wasm-encoder" version = "0.253.0" @@ -6350,6 +6860,18 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wasm-metadata" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f998ccc6e012f7b86865eb2a106c8a0422017a1a88977ce01a69f2244be2e57" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.251.0", + "wasmparser 0.251.0", +] + [[package]] name = "wasm-metadata" version = "0.253.0" @@ -6394,6 +6916,30 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437970b35b1a85cfde9c74b2398352d8d653f3bd8e3a3db0c063ea8f5b4b36ff" +dependencies = [ + "bitflags", + "hashbrown 0.17.0", + "indexmap", + "semver", + "serde", +] + +[[package]] +name = "wasmparser" +version = "0.252.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3eb099dcadcde5be9eef55e3a337128efd4e44b4c93122487e4d2e4e1c6627c" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + [[package]] name = "wasmparser" version = "0.253.0" @@ -6407,6 +6953,264 @@ dependencies = [ "serde", ] +[[package]] +name = "wasmprinter" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8798c1a699bd25648b6708eefe94d97c6f9891febb94b42cca1f7a4b086ea64e" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser 0.251.0", +] + +[[package]] +name = "wasmtime" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4213d2f019a5e44aa8a61d8826dd33a505bff79f749b14a8bafd67321cb9351" +dependencies = [ + "addr2line 0.26.1", + "async-trait", + "bitflags", + "bumpalo", + "cc", + "cfg-if", + "encoding_rs", + "futures", + "libc", + "log", + "mach2", + "memfd", + "object 0.39.1", + "once_cell", + "postcard", + "pulley-interpreter", + "rustix", + "semver", + "serde", + "serde_derive", + "smallvec", + "target-lexicon", + "wasmparser 0.251.0", + "wasmtime-environ", + "wasmtime-internal-component-macro", + "wasmtime-internal-component-util", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-environ" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45863de41977ec6453e859cf843d456fa3fcb45a659b66d16e794f90ec4f5b7" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-entity", + "gimli 0.33.0", + "hashbrown 0.17.0", + "indexmap", + "log", + "object 0.39.1", + "postcard", + "rustc-demangle", + "semver", + "serde", + "serde_derive", + "sha2", + "smallvec", + "target-lexicon", + "wasm-encoder 0.251.0", + "wasmparser 0.251.0", + "wasmprinter", + "wasmtime-internal-component-util", + "wasmtime-internal-core", +] + +[[package]] +name = "wasmtime-internal-component-macro" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e48f8d4966d62a10b6d70722bc432c1e163890be2801d3b5784589ad36ffc3" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn", + "wasmtime-internal-component-util", + "wasmtime-internal-wit-bindgen", + "wit-parser 0.251.0", +] + +[[package]] +name = "wasmtime-internal-component-util" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ad5abd5822a22dbf4014475cdfd1fe790707761cd732d74aaa3ba4d5ba489" + +[[package]] +name = "wasmtime-internal-core" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc28372e36eaf8cf70faa83b5779137f7e99c8d18569a125d1580e735cc9e4d" +dependencies = [ + "hashbrown 0.17.0", + "libm", + "serde", +] + +[[package]] +name = "wasmtime-internal-cranelift" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a433efc6e35112a5457e1dc8bc4d8d39820ac7722267e89bc04e5df641f32124" +dependencies = [ + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "gimli 0.33.0", + "itertools 0.14.0", + "log", + "object 0.39.1", + "pulley-interpreter", + "smallvec", + "target-lexicon", + "thiserror 2.0.17", + "wasmparser 0.251.0", + "wasmtime-environ", + "wasmtime-internal-core", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-fiber" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a1d3a39d0d210f6b8574ee96a4315e0a14c67f3a1fc3cd5372cb10d2fb4422" +dependencies = [ + "cc", + "cfg-if", + "libc", + "rustix", + "wasmtime-environ", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-internal-jit-debug" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f667288cb4dfa68a4639ffac4d5628535dda64ebdc2b990526efb12b30ba803" +dependencies = [ + "cc", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-jit-icache-coherence" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba651d44ab0faad4c58106b3adb45068189fb65ef50f0c404b6d9e3bf81a357" +dependencies = [ + "cfg-if", + "libc", + "wasmtime-internal-core", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-internal-unwinder" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ecc52563b0558af2a7487eb710de07cc4532564b55528876129238e83118cb1" +dependencies = [ + "cfg-if", + "cranelift-codegen", + "log", + "object 0.39.1", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-internal-versioned-export-macros" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e747f4a074699ba1b4e4d841fb263f9b7df5bd1555181c4752bf5990d21ba676" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasmtime-internal-wit-bindgen" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80009f46991622814196d96fac6fc0a938f46b5cba737a8f4e21e24e5a03856f" +dependencies = [ + "anyhow", + "bitflags", + "heck", + "indexmap", + "wit-parser 0.251.0", +] + +[[package]] +name = "wasmtime-wasi" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f65ef30a2c5478873cdb619085a7a649d3ce41cc3eaf298a7ce3dee96a8e11" +dependencies = [ + "async-trait", + "bitflags", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-std", + "cap-time-ext", + "cfg-if", + "futures", + "io-extras", + "io-lifetimes", + "rand 0.10.1", + "rustix", + "thiserror 2.0.17", + "tokio", + "tracing", + "url", + "wasmtime", + "wasmtime-wasi-io", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-wasi-io" +version = "46.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee57d5fef4976b1ab542615f4cef2c43278eb549d8078939668ea0f13d5c696" +dependencies = [ + "async-trait", + "bytes", + "futures", + "tracing", + "wasmtime", +] + [[package]] name = "wast" version = "253.0.0" @@ -6785,6 +7589,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ab703352da6a72f35c39a533526393725640575bb211f61987a2748323ad956" +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -6811,6 +7625,17 @@ dependencies = [ "wit-parser 0.244.0", ] +[[package]] +name = "wit-bindgen-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4738d1c9a78e97bc7f664bfafd5d8e67d7bb26faa5c41e6d628e8bbdad3ec351" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.251.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -6832,10 +7657,26 @@ dependencies = [ "prettyplease", "syn", "wasm-metadata 0.244.0", - "wit-bindgen-core", + "wit-bindgen-core 0.51.0", "wit-component 0.244.0", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1130ce1f531bc9f9a75922244aa773bf5e2117fda1ef4a86b9f98d6b8135eb46" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata 0.251.0", + "wit-bindgen-core 0.58.0", + "wit-component 0.251.0", +] + [[package]] name = "wit-bindgen-rust-macro" version = "0.51.0" @@ -6847,8 +7688,8 @@ dependencies = [ "proc-macro2", "quote", "syn", - "wit-bindgen-core", - "wit-bindgen-rust", + "wit-bindgen-core 0.51.0", + "wit-bindgen-rust 0.51.0", ] [[package]] @@ -6870,6 +7711,25 @@ dependencies = [ "wit-parser 0.244.0", ] +[[package]] +name = "wit-component" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a5e60173c413659c689f0581b0cf5d1a2404077568f9ffdce748a9eb2fc913" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.251.0", + "wasm-metadata 0.251.0", + "wasmparser 0.251.0", + "wit-parser 0.251.0", +] + [[package]] name = "wit-component" version = "0.253.0" @@ -6907,6 +7767,25 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wit-parser" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e960732e824fab95099971a09e638979347c94ca48568d3c854c945729196947" +dependencies = [ + "anyhow", + "hashbrown 0.17.0", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.251.0", +] + [[package]] name = "wit-parser" version = "0.253.0" diff --git a/bootstrap.example.toml b/bootstrap.example.toml index 1ca4bc9159e7c..827002859fb8b 100644 --- a/bootstrap.example.toml +++ b/bootstrap.example.toml @@ -923,6 +923,15 @@ # #rust.parallel-frontend-threads = 1 +# Enables building a wasm proc macro compatible toolchain. +# +# This requires building an additional standard library for a different target and adding it +# to the sysroot before running tests, and so needs special handling in bootstrap. Currently +# off by default. +# +# This currently opts compiletest into running/building proc-macro tests via wasm. +#rust.wasm-proc-macro = false + # ============================================================================= # Distribution options # diff --git a/compiler/rustc_builtin_macros/Cargo.toml b/compiler/rustc_builtin_macros/Cargo.toml index f5dbc4a0d7cbe..ab6df94eb8f48 100644 --- a/compiler/rustc_builtin_macros/Cargo.toml +++ b/compiler/rustc_builtin_macros/Cargo.toml @@ -31,6 +31,8 @@ rustc_target = { path = "../rustc_target" } smallvec = { version = "1.8.1", features = ["union", "may_dangle"] } thin-vec = "0.2.18" tracing = "0.1" +wit-bindgen-core = "0.58" +wit-bindgen-rust = "0.58" # tidy-alphabetical-end [features] diff --git a/compiler/rustc_builtin_macros/src/lib.rs b/compiler/rustc_builtin_macros/src/lib.rs index bd99b269ef5b6..7fefb4f979827 100644 --- a/compiler/rustc_builtin_macros/src/lib.rs +++ b/compiler/rustc_builtin_macros/src/lib.rs @@ -147,4 +147,9 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) { register(sym::contracts_requires, requires); let ensures = SyntaxExtensionKind::Attr(Arc::new(contracts::ExpandEnsures)); register(sym::contracts_ensures, ensures); + + register( + sym::internal_wit_bindgen, + SyntaxExtensionKind::Bang(Arc::new(proc_macro_harness::InternalWitBindgen)), + ); } diff --git a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs index 32865f234ef44..6e5fe8a5d1d7d 100644 --- a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs +++ b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs @@ -89,7 +89,14 @@ pub fn inject( impl<'a> CollectProcMacros<'a> { fn check_not_pub_in_root(&self, vis: &ast::Visibility, sp: Span) { if self.is_proc_macro_crate && self.in_root && vis.kind.is_pub() { - self.dcx.emit_err(diagnostics::ProcMacro { span: sp }); + // On wasm we end up generating other public exports (though the exact specifics are + // internal). For now omit this check, we'll need to refine it before stabilizing wasm + // proc macros. + if !(self.session.opts.unstable_opts.wasm_proc_macros + && self.session.target.is_like_wasm) + { + self.dcx.emit_err(diagnostics::ProcMacro { span: sp }); + } } } @@ -270,6 +277,9 @@ impl<'a> Visitor<'a> for CollectProcMacros<'a> { // // ... // ]; // } +// +// If we're targeting wasm32, we also inject a macro call to generate_export!(DECLS). This produces +// the WASI component model ABI exports/imports to support the proc macro's execution. fn mk_decls(cx: &mut ExtCtxt<'_>, macros: &[ProcMacro]) -> Box { let expn_id = cx.resolver.expansion_for_ast_pass( DUMMY_SP, @@ -361,9 +371,33 @@ fn mk_decls(cx: &mut ExtCtxt<'_>, macros: &[ProcMacro]) -> Box { cx.attr_nested_word(sym::allow, sym::deprecated, span), ]); - let block = ast::ConstItemRhsKind::new_body(cx.expr_block( - cx.block(span, thin_vec![cx.stmt_item(span, krate), cx.stmt_item(span, decls_static)]), - )); + // For wasm targets, exporting from proc-macros requires that we generate additional symbols + // (not just the single #[used] static). We use a macro defined in the proc_macro crate to do + // so. + let block_contents = if cx.sess.target.is_like_wasm { + let mac_call = cx.stmt_semi(cx.expr_macro_call( + span, + cx.macro_call( + span, + cx.path( + span, + vec![proc_macro, bridge, client, Ident::new(sym::generate_export, span)], + ), + rustc_ast::token::Delimiter::Parenthesis, + rustc_ast::tokenstream::TokenStream::new(vec![ + rustc_ast::tokenstream::TokenTree::Token( + rustc_ast::token::Token::from_ast_ident(Ident::new(sym::_DECLS, span)), + rustc_ast::tokenstream::Spacing::Alone, + ), + ]), + ), + )); + thin_vec![cx.stmt_item(span, krate), cx.stmt_item(span, decls_static), mac_call] + } else { + thin_vec![cx.stmt_item(span, krate), cx.stmt_item(span, decls_static)] + }; + + let block = ast::ConstItemRhsKind::new_body(cx.expr_block(cx.block(span, block_contents))); let anon_constant = cx.item_const( span, @@ -376,3 +410,69 @@ fn mk_decls(cx: &mut ExtCtxt<'_>, macros: &[ProcMacro]) -> Box { let items = AstFragment::Items(smallvec![anon_constant]); cx.monotonic_expander().fully_expand_fragment(items).make_items().pop().unwrap() } + +pub(crate) struct InternalWitBindgen; + +impl rustc_expand::base::BangProcMacro for InternalWitBindgen { + fn expand<'cx>( + &self, + ecx: &'cx mut ExtCtxt<'_>, + span: Span, + _ts: rustc_ast::tokenstream::TokenStream, + ) -> Result { + let mut options = wit_bindgen_rust::Opts::default(); + options.pub_export_macro = true; + options.format = false; + + let mut resolve = wit_bindgen_core::wit_parser::Resolve::default(); + let pkg_id = resolve + .push_str( + "proc-macro-wasm.wit", + include_str!("../../../library/proc_macro/wasm-interface.wit"), + ) + .unwrap(); + let world = resolve.select_world(&[pkg_id], None).unwrap(); + + let mut generator = options.build(); + let mut files = Default::default(); + wit_bindgen_core::WorldGenerator::generate(&mut generator, &mut resolve, world, &mut files) + .expect("generation successful"); + let (_, src) = files.iter().next().unwrap(); + let src = std::str::from_utf8(src).unwrap(); + + let expn_data = ecx.current_expansion.id.expn_data(); + let call_site = ecx.with_call_site_ctxt(expn_data.call_site); + + let needle = "macro_rules! "; + let src = src.replace( + needle, + // #[allow_internal_unstable(...)] is not transitive on macro expansions and so + // doesn't apply to this inner macro -- which also references unstable types from + // the generated bindings. + // + // This string replacement is obviously a hack, but it works OK in practice. If you + // can remove this and keep wasm proc macro tests passing, go for it. + &format!("#[allow_internal_unstable(proc_macro_internals)] {needle}"), + ); + assert!(src.contains(needle), "{}", src); + let output = rustc_parse::source_str_to_stream( + ecx.psess(), + rustc_span::FileName::proc_macro_source_code(&src), + src, + Some(call_site), + ); + + match output { + Ok(o) => Ok(o), + Err(diags) => { + for diag in diags { + diag.emit(); + } + + Err(ecx + .dcx() + .span_delayed_bug(span, "failed to parse wit-bindgen generated source")) + } + } + } +} diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs index e24e7bad2b945..f200f5fb3869e 100644 --- a/compiler/rustc_codegen_ssa/src/back/linker.rs +++ b/compiler/rustc_codegen_ssa/src/back/linker.rs @@ -1800,11 +1800,7 @@ pub(crate) fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec, crate_type: CrateType) -> Vec, + span: Span, + input: TokenStream, + ) -> Result { + let _timer = record_expand_proc_macro(ecx, "expand_proc_macro", span); + + (self.client)(ecx, ecx.current_expansion.id, input).map_err(|e| { + ecx.dcx().emit_err(diagnostics::ProcMacroPanicked { + span, + message: e.map(|message| diagnostics::ProcMacroPanickedHelp { message }), + }) + }) + } +} + pub struct AttrProcMacro { pub client: pm::bridge::client::Client, } @@ -87,8 +111,31 @@ impl base::AttrProcMacro for AttrProcMacro { } } +pub struct WasmAttrProcMacro { + pub client: WasmExpand2, +} + +impl base::AttrProcMacro for WasmAttrProcMacro { + fn expand( + &self, + ecx: &mut ExtCtxt<'_>, + span: Span, + annotation: TokenStream, + annotated: TokenStream, + ) -> Result { + let _timer = record_expand_proc_macro(ecx, "expand_proc_macro", span); + + (self.client)(ecx, ecx.current_expansion.id, annotation, annotated).map_err(|e| { + ecx.dcx().emit_err(diagnostics::CustomAttributePanicked { + span, + message: e.map(|message| diagnostics::CustomAttributePanickedHelp { message }), + }) + }) + } +} + pub struct DeriveProcMacro { - pub client: DeriveClient, + pub client: pm::bridge::client::Client, } impl MultiItemModifier for DeriveProcMacro { @@ -122,45 +169,89 @@ impl MultiItemModifier for DeriveProcMacro { }) }) } else { - expand_derive_macro(invoc_id, input, ecx, self.client) + expand_derive_macro(invoc_id, input, ecx, &self.client) }; - let Ok(output) = res else { - // error will already have been emitted - return ExpandResult::Ready(vec![]); + finish_derive_expansion(ecx, span, is_stmt, res) + } +} + +pub struct WasmDeriveProcMacro { + pub client: WasmExpand1, +} + +impl MultiItemModifier for WasmDeriveProcMacro { + fn expand( + &self, + ecx: &mut ExtCtxt<'_>, + span: Span, + _meta_item: &ast::MetaItem, + item: Annotatable, + _is_derive_const: bool, + ) -> ExpandResult, Annotatable> { + let _timer = record_expand_proc_macro(ecx, "expand_derive_proc_macro_outer", span); + + // We need special handling for statement items + // (e.g. `fn foo() { #[derive(Debug)] struct Bar; }`) + let is_stmt = matches!(item, Annotatable::Stmt(..)); + + let input = item.to_tokens(); + + let invoc_id = ecx.current_expansion.id; + + let res = if ecx.sess.opts.incremental.is_some() + && ecx.sess.opts.unstable_opts.cache_proc_macros + { + unimplemented!("wasm proc macros don't yet support -Zcache-proc-macros") + } else { + expand_wasm_derive_macro(invoc_id, input, ecx, &self.client) }; - let error_count_before = ecx.dcx().err_count(); - let mut parser = Parser::new(&ecx.sess.psess, output, Some("proc-macro derive")); - let mut items = vec![]; - - loop { - match parser.parse_item( - ForceCollect::No, - if is_stmt { AllowConstBlockItems::No } else { AllowConstBlockItems::Yes }, - ) { - Ok(None) => break, - Ok(Some(item)) => { - if is_stmt { - items.push(Annotatable::Stmt(Box::new(ecx.stmt_item(span, item)))); - } else { - items.push(Annotatable::Item(item)); - } - } - Err(err) => { - err.emit(); - break; + finish_derive_expansion(ecx, span, is_stmt, res) + } +} + +fn finish_derive_expansion( + ecx: &mut ExtCtxt<'_>, + span: Span, + is_stmt: bool, + res: Result, +) -> ExpandResult, Annotatable> { + let Ok(output) = res else { + // error will already have been emitted + return ExpandResult::Ready(vec![]); + }; + + let error_count_before = ecx.dcx().err_count(); + let mut parser = Parser::new(&ecx.sess.psess, output, Some("proc-macro derive")); + let mut items = vec![]; + + loop { + match parser.parse_item( + ForceCollect::No, + if is_stmt { AllowConstBlockItems::No } else { AllowConstBlockItems::Yes }, + ) { + Ok(None) => break, + Ok(Some(item)) => { + if is_stmt { + items.push(Annotatable::Stmt(Box::new(ecx.stmt_item(span, item)))); + } else { + items.push(Annotatable::Item(item)); } } + Err(err) => { + err.emit(); + break; + } } // fail if there have been errors emitted if ecx.dcx().err_count() > error_count_before { ecx.dcx().emit_err(diagnostics::ProcMacroDeriveTokens { span }); } - - ExpandResult::Ready(items) } + + ExpandResult::Ready(items) } /// Provide a query for computing the output of a derive macro. @@ -174,17 +265,37 @@ pub(super) fn provide_derive_macro_expansion<'tcx>( let _ = tcx.crate_hash(invoc_id.expn_data().macro_def_id.unwrap().krate); QueryDeriveExpandCtx::with(|ecx, client| { - expand_derive_macro(invoc_id, input.clone(), ecx, client).map(|ts| &*tcx.arena.alloc(ts)) + expand_derive_macro(invoc_id, input.clone(), ecx, &client).map(|ts| &*tcx.arena.alloc(ts)) }) } type DeriveClient = pm::bridge::client::Client; +pub type WasmExpand1 = rustc_data_structures::sync::IntoDynSyncSend< + Arc< + dyn Fn(&mut ExtCtxt<'_>, LocalExpnId, TokenStream) -> Result> + + Send + + Sync, + >, +>; +pub type WasmExpand2 = rustc_data_structures::sync::IntoDynSyncSend< + Arc< + dyn Fn( + &mut ExtCtxt<'_>, + LocalExpnId, + TokenStream, + TokenStream, + ) -> Result> + + Send + + Sync, + >, +>; + fn expand_derive_macro( invoc_id: LocalExpnId, input: TokenStream, ecx: &mut ExtCtxt<'_>, - client: DeriveClient, + client: &DeriveClient, ) -> Result { let _timer = ecx.sess.prof.generic_activity_with_arg_recorder("expand_proc_macro", |recorder| { @@ -216,6 +327,32 @@ fn expand_derive_macro( } } +fn expand_wasm_derive_macro( + invoc_id: LocalExpnId, + input: TokenStream, + ecx: &mut ExtCtxt<'_>, + client: &WasmExpand1, +) -> Result { + let _timer = + ecx.sess.prof.generic_activity_with_arg_recorder("expand_proc_macro", |recorder| { + let invoc_expn_data = invoc_id.expn_data(); + let span = invoc_expn_data.call_site; + let event_arg = invoc_expn_data.kind.descr(); + recorder.record_arg_with_span(ecx.sess.source_map(), event_arg, span); + }); + + client(ecx, invoc_id, input).map_err(|e| { + let invoc_expn_data = invoc_id.expn_data(); + let span = invoc_expn_data.call_site; + ecx.dcx().emit_err({ + diagnostics::ProcMacroDerivePanicked { + span, + message: e.map(|message| diagnostics::ProcMacroDerivePanickedHelp { message }), + } + }); + }) +} + /// Stores the context necessary to expand a derive proc macro via a query. struct QueryDeriveExpandCtx { /// Type-erased version of `&mut ExtCtxt` diff --git a/compiler/rustc_expand/src/proc_macro_server.rs b/compiler/rustc_expand/src/proc_macro_server.rs index 65af690611919..617dbae1dfdb2 100644 --- a/compiler/rustc_expand/src/proc_macro_server.rs +++ b/compiler/rustc_expand/src/proc_macro_server.rs @@ -420,10 +420,10 @@ fn cancel_diags_into_string(diags: Vec>) -> String { } pub(crate) struct Rustc<'a, 'b> { - ecx: &'a mut ExtCtxt<'b>, - def_site: Span, - call_site: Span, - mixed_site: Span, + pub(crate) ecx: &'a mut ExtCtxt<'b>, + pub(crate) def_site: Span, + pub(crate) call_site: Span, + pub(crate) mixed_site: Span, krate: CrateNum, rebased_spans: FxHashMap, } diff --git a/compiler/rustc_expand/src/wasm_proc_macro.rs b/compiler/rustc_expand/src/wasm_proc_macro.rs new file mode 100644 index 0000000000000..7f85cfbdc6fd3 --- /dev/null +++ b/compiler/rustc_expand/src/wasm_proc_macro.rs @@ -0,0 +1,678 @@ +use std::sync::Arc; + +use rustc_ast::tokenstream; +use rustc_ast::tokenstream::TokenStream; +use rustc_data_structures::sync::IntoDynSyncSend; +use rustc_proc_macro::bridge; +use rustc_proc_macro::bridge::server::Server as _; +use rustc_session::Session; +use rustc_span::{Span, Symbol}; + +use crate::base::ExtCtxt; +use crate::proc_macro_server::Rustc; +use crate::wasm_proc_macro::generated::exports::rust_lang::rust::custom_derive::DeriveKind; +use crate::wasm_proc_macro::generated::rust_lang::rust::host; + +#[allow(unreachable_pub)] +mod generated { + wasmtime::component::bindgen!({ + path: "../../library/proc_macro/wasm-interface.wit", + + with: { + "rust-lang:rust/host.token-stream": rustc_ast::tokenstream::TokenStream, + "rust-lang:rust/host.diagnostic": rust_lang::rust::host::DiagnosticInner, + }, + }); +} + +pub struct Ctx { + ctx: wasmtime_wasi::WasiCtx, + pub table: wasmtime_wasi::ResourceTable, + + // Outer Option is tracking whether a panic was stored during wasm execution + // (from a panic hook). + // Inner Option is the panic message (which may not be available). + stored_panic: Option>, +} + +impl Default for Ctx { + fn default() -> Self { + Ctx { + ctx: wasmtime_wasi::WasiCtx::builder().inherit_stdout().inherit_stderr().build(), + table: Default::default(), + stored_panic: None, + } + } +} + +impl wasmtime_wasi::WasiView for Ctx { + fn ctx(&mut self) -> wasmtime_wasi::WasiCtxView<'_> { + wasmtime_wasi::WasiCtxView { ctx: &mut self.ctx, table: &mut self.table } + } +} + +trait ToInternal { + fn to_internal(self) -> T; +} + +impl ToInternal for generated::rust_lang::rust::host::Level { + fn to_internal(self) -> rustc_errors::Level { + match self { + Self::Error => rustc_errors::Level::Error, + Self::Warning => rustc_errors::Level::Warning, + Self::Help => rustc_errors::Level::Help, + Self::Note => rustc_errors::Level::Note, + } + } +} + +impl ToInternal for generated::rust_lang::rust::host::Level { + fn to_internal(self) -> rustc_proc_macro::Level { + match self { + Self::Error => rustc_proc_macro::Level::Error, + Self::Warning => rustc_proc_macro::Level::Warning, + Self::Help => rustc_proc_macro::Level::Help, + Self::Note => rustc_proc_macro::Level::Note, + } + } +} + +impl host::DiagnosticInner { + fn to_internal( + self, + table: &mut wasmtime_wasi::ResourceTable, + ) -> rustc_proc_macro::bridge::Diagnostic { + rustc_proc_macro::bridge::Diagnostic { + level: self.level.to_internal(), + message: self.message, + spans: self.spans.into_iter().map(|s| s.decode()).collect(), + children: self + .children + .into_iter() + .map(|c| { + let child = table.delete(c).unwrap(); + child.to_internal(table) + }) + .collect(), + } + } +} + +impl ToInternal for rustc_proc_macro::bridge::LitKind { + fn to_internal(self) -> host::LiteralKind { + use host::LiteralKind; + use rustc_proc_macro::bridge::LitKind; + match self { + LitKind::Byte => LiteralKind::Byte, + LitKind::Char => LiteralKind::Char, + LitKind::Integer => LiteralKind::Integer, + LitKind::Float => LiteralKind::Float, + LitKind::Str => LiteralKind::Str, + LitKind::StrRaw(n) => LiteralKind::StrRaw(n), + LitKind::ByteStr => LiteralKind::ByteStr, + LitKind::ByteStrRaw(n) => LiteralKind::ByteStrRaw(n), + LitKind::CStr => LiteralKind::CStr, + LitKind::CStrRaw(n) => LiteralKind::CStrRaw(n), + LitKind::ErrWithGuar => LiteralKind::ErrWithGuar, + } + } +} + +impl ToInternal for host::LiteralKind { + fn to_internal(self) -> rustc_proc_macro::bridge::LitKind { + use host::LiteralKind; + use rustc_proc_macro::bridge::LitKind; + match self { + LiteralKind::Byte => LitKind::Byte, + LiteralKind::Char => LitKind::Char, + LiteralKind::Integer => LitKind::Integer, + LiteralKind::Float => LitKind::Float, + LiteralKind::Str => LitKind::Str, + LiteralKind::StrRaw(n) => LitKind::StrRaw(n), + LiteralKind::ByteStr => LitKind::ByteStr, + LiteralKind::ByteStrRaw(n) => LitKind::ByteStrRaw(n), + LiteralKind::CStr => LitKind::CStr, + LiteralKind::CStrRaw(n) => LitKind::CStrRaw(n), + LiteralKind::ErrWithGuar => LitKind::ErrWithGuar, + } + } +} + +trait ToWasmSpan { + fn encode(self) -> WasmSpan; +} + +impl ToWasmSpan for Span { + fn encode(self) -> WasmSpan { + WasmSpan { inner: self.encode_raw() } + } +} + +impl WasmSpan { + fn decode(self) -> Span { + Span::decode_raw(self.inner) + } +} + +impl generated::rust_lang::rust::host::Host for Ctx { + fn emit_diagnostic(&mut self, diag: wasmtime::component::Resource) { + let diagnostic = self.table.delete(diag).unwrap(); + DeriveExpandCtx::with(|(ecx, _)| { + ecx.emit_diagnostic(diagnostic.to_internal(&mut self.table)) + }) + } + + fn literal_from_str(&mut self, s: String) -> Result { + DeriveExpandCtx::with(|(ecx, _)| { + let literal = ecx.literal_from_str(&s)?; + Ok(host::Literal { + kind: literal.kind.to_internal(), + symbol: literal.symbol.to_string(), + suffix: literal.suffix.map(|s| s.to_string()), + span: self.span_call_site(), + }) + }) + } + + fn symbol_normalize_and_validate_ident(&mut self, string: String) -> Result { + DeriveExpandCtx::with(|(ecx, _)| { + let sym = ecx.symbol_normalize_and_validate_ident(&string)?; + Ok(sym.to_string()) + }) + } + + fn injected_env_var(&mut self, var: String) -> Option { + DeriveExpandCtx::with(|(ecx, _)| ecx.injected_env_var(&var)) + } + + fn track_env_var(&mut self, var: String, value: Option) { + DeriveExpandCtx::with(|(ecx, _)| ecx.track_env_var(&var, value.as_deref())) + } + + fn track_path(&mut self, path: String) { + DeriveExpandCtx::with(|(ecx, _)| ecx.track_path(&path)) + } + + fn report_panic(&mut self, msg: Option) -> bool { + self.stored_panic = Some(msg); + + DeriveExpandCtx::with(|(ecx, _)| ecx.ecx.ecfg.proc_macro_backtrace) + } + + fn span_is_same(&mut self, a: WasmSpan, b: WasmSpan) -> bool { + a.decode() == b.decode() + } + + fn span_subspan( + &mut self, + a: WasmSpan, + start: host::RangeBound, + end: host::RangeBound, + ) -> Option { + let span = a.decode(); + + let start = match start.bound { + host::Bound::Included => std::ops::Bound::Included(start.value as usize), + host::Bound::Excluded => std::ops::Bound::Excluded(start.value as usize), + host::Bound::Unbounded => std::ops::Bound::Unbounded, + }; + let end = match end.bound { + host::Bound::Included => std::ops::Bound::Included(end.value as usize), + host::Bound::Excluded => std::ops::Bound::Excluded(end.value as usize), + host::Bound::Unbounded => std::ops::Bound::Unbounded, + }; + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_subspan(span, start, end))?; + Some(ret.encode()) + } + + fn span_def_site(&mut self) -> WasmSpan { + DeriveExpandCtx::with(|(ecx, _)| ecx.def_site.encode()) + } + + fn span_call_site(&mut self) -> WasmSpan { + DeriveExpandCtx::with(|(ecx, _)| ecx.call_site.encode()) + } + + fn span_mixed_site(&mut self) -> WasmSpan { + DeriveExpandCtx::with(|(ecx, _)| ecx.mixed_site.encode()) + } + + fn span_line(&mut self, sp: WasmSpan) -> u64 { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_line(span)).try_into().unwrap() + } + + fn span_column(&mut self, sp: WasmSpan) -> u64 { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_column(span).try_into().unwrap()) + } + + fn span_file(&mut self, sp: WasmSpan) -> String { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_file(span)) + } + + fn span_local_file(&mut self, sp: WasmSpan) -> Option { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_local_file(span)) + } + + fn span_start(&mut self, sp: WasmSpan) -> WasmSpan { + let span = sp.decode(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_start(span)); + ret.encode() + } + + fn span_end(&mut self, sp: WasmSpan) -> WasmSpan { + let span = sp.decode(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_end(span)); + ret.encode() + } + + fn span_join(&mut self, this: WasmSpan, other: WasmSpan) -> Option { + let this = this.decode(); + let other = other.decode(); + + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_join(this, other))?; + Some(ret.encode()) + } + + fn span_byte_range(&mut self, sp: WasmSpan) -> (u64, u64) { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| { + let ret = ecx.span_byte_range(span); + (ret.start as u64, ret.end as u64) + }) + } + + fn span_parent(&mut self, sp: WasmSpan) -> Option { + let span = sp.decode(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_parent(span))?; + Some(ret.encode()) + } + + fn span_source(&mut self, sp: WasmSpan) -> WasmSpan { + let span = sp.decode(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_source(span)); + ret.encode() + } + + fn span_debug(&mut self, sp: WasmSpan) -> String { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_debug(span)) + } + + fn span_source_text(&mut self, sp: WasmSpan) -> Option { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_source_text(span)) + } + + fn span_resolved_at(&mut self, this: WasmSpan, at: WasmSpan) -> WasmSpan { + let this = this.decode(); + let at = at.decode(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.span_resolved_at(this, at)); + ret.encode() + } + + fn span_save_span(&mut self, sp: WasmSpan) -> u64 { + let span = sp.decode(); + DeriveExpandCtx::with(|(ecx, _)| ecx.span_save_span(span)).try_into().unwrap() + } + + fn span_recover_proc_macro_span(&mut self, id: u64) -> WasmSpan { + let span = DeriveExpandCtx::with(|(ecx, _)| ecx.span_recover_proc_macro_span(id as usize)); + span.encode() + } + + fn ts_drop(&mut self, ts: TokenStreamResource) { + self.table.delete(ts).unwrap(); + } + + fn ts_is_empty(&mut self, input: TokenStreamResource) -> bool { + let input = self.table.get(&input).unwrap(); + input.is_empty() + } + + fn ts_concat_streams( + &mut self, + base: Option, + streams: Vec, + ) -> TokenStreamResource { + let base = base.map(|b| self.table.delete(b).unwrap()); + let ret = DeriveExpandCtx::with(|(ecx, _)| { + ecx.ts_concat_streams( + base, + streams.into_iter().map(|s| self.table.delete(s).unwrap()).collect(), + ) + }); + self.table.push(ret).unwrap() + } + + fn ts_from_token_tree(&mut self, tree: host::TokenTree) -> TokenStreamResource { + let ret = DeriveExpandCtx::with(|(ecx, _)| { + ecx.ts_from_token_tree(tree.to_internal(&mut self.table)) + }); + self.table.push(ret).unwrap() + } + + fn ts_concat_trees( + &mut self, + base: Option, + trees: Vec, + ) -> TokenStreamResource { + let base = base.map(|b| self.table.delete(b).unwrap()); + let ret = DeriveExpandCtx::with(|(ecx, _)| { + ecx.ts_concat_trees( + base, + trees.into_iter().map(|t| t.to_internal(&mut self.table)).collect(), + ) + }); + self.table.push(ret).unwrap() + } + + fn ts_clone(&mut self, input: TokenStreamResource) -> TokenStreamResource { + let input = self.table.get(&input).unwrap(); + self.table.push(input.clone()).unwrap() + } + + fn ts_expand_expr(&mut self, stream: TokenStreamResource) -> Result { + let stream = self.table.get(&stream).unwrap(); + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.ts_expand_expr(stream))?; + Ok(self.table.push(ret).unwrap()) + } + + fn ts_from_str(&mut self, src: String) -> Result { + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.ts_from_str(&src))?; + Ok(self.table.push(ret).unwrap()) + } + + fn ts_to_string(&mut self, input: TokenStreamResource) -> String { + let input = self.table.get(&input).unwrap(); + DeriveExpandCtx::with(|(ecx, _)| ecx.ts_to_string(&input)) + } + + fn ts_into_trees(&mut self, stream: TokenStreamResource) -> Vec { + let stream = self.table.get(&stream).expect("valid resource"); + let stream = stream.clone(); + + let ret = DeriveExpandCtx::with(|(ecx, _)| ecx.ts_into_trees(stream)); + ret.into_iter() + .map(|tt| match tt { + bridge::TokenTree::Group(group) => host::TokenTree::Group(host::Group { + delimiter: match group.delimiter { + rustc_proc_macro::Delimiter::Parenthesis => host::Delimiter::Parenthesis, + rustc_proc_macro::Delimiter::Brace => host::Delimiter::Brace, + rustc_proc_macro::Delimiter::Bracket => host::Delimiter::Bracket, + rustc_proc_macro::Delimiter::None => host::Delimiter::None, + }, + stream: group.stream.map(|ts| self.table.push(ts).unwrap()), + span: host::DelimSpan { + open: group.span.open.encode(), + close: group.span.close.encode(), + entire: group.span.entire.encode(), + }, + }), + bridge::TokenTree::Punct(punct) => host::TokenTree::Punct(host::Punct { + ch: punct.ch, + joint: punct.joint, + span: punct.span.encode(), + }), + bridge::TokenTree::Ident(ident) => host::TokenTree::Ident(host::Ident { + sym: ident.sym.to_string(), + is_raw: ident.is_raw, + span: ident.span.encode(), + }), + bridge::TokenTree::Literal(literal) => host::TokenTree::Literal(host::Literal { + kind: literal.kind.to_internal(), + symbol: literal.symbol.to_string(), + suffix: literal.suffix.map(|s| s.to_string()), + span: literal.span.encode(), + }), + }) + .collect() + } +} + +type TokenStreamResource = wasmtime::component::Resource; +type WasmSpan = generated::rust_lang::rust::host::Span; +type Diagnostic = generated::rust_lang::rust::host::DiagnosticInner; + +impl generated::rust_lang::rust::host::HostDiagnostic for Ctx { + fn new(&mut self, diagnostic: Diagnostic) -> wasmtime::component::Resource { + self.table.push(diagnostic).unwrap() + } + + fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + self.table.delete(rep)?; + Ok(()) + } +} + +impl host::DelimSpan { + fn to_internal(self) -> rustc_proc_macro::bridge::DelimSpan { + rustc_proc_macro::bridge::DelimSpan { + open: self.open.decode(), + close: self.close.decode(), + entire: self.entire.decode(), + } + } +} + +impl host::Delimiter { + fn to_internal(self) -> rustc_proc_macro::Delimiter { + match self { + host::Delimiter::Parenthesis => rustc_proc_macro::Delimiter::Parenthesis, + host::Delimiter::Brace => rustc_proc_macro::Delimiter::Brace, + host::Delimiter::Bracket => rustc_proc_macro::Delimiter::Bracket, + host::Delimiter::None => rustc_proc_macro::Delimiter::None, + } + } +} + +impl host::TokenTree { + fn to_internal( + self, + table: &mut wasmtime_wasi::ResourceTable, + ) -> bridge::TokenTree { + match self { + host::TokenTree::Group(group) => bridge::TokenTree::Group(bridge::Group { + delimiter: group.delimiter.to_internal(), + stream: group.stream.map(|s| table.delete(s).unwrap()), + span: group.span.to_internal(), + }), + host::TokenTree::Punct(punct) => bridge::TokenTree::Punct(bridge::Punct { + ch: punct.ch, + joint: punct.joint, + span: punct.span.decode(), + }), + host::TokenTree::Ident(ident) => bridge::TokenTree::Ident(bridge::Ident { + sym: Symbol::intern(&ident.sym), + is_raw: ident.is_raw, + span: ident.span.decode(), + }), + host::TokenTree::Literal(literal) => bridge::TokenTree::Literal(bridge::Literal { + kind: literal.kind.to_internal(), + symbol: Symbol::intern(&literal.symbol), + suffix: literal.suffix.map(|s| Symbol::intern(&s)), + span: literal.span.decode(), + }), + } + } +} + +impl generated::rust_lang::rust::host::HostTokenStream for Ctx { + fn new(&mut self) -> TokenStreamResource { + self.table.push(TokenStream::default()).unwrap() + } + + fn drop(&mut self, r: TokenStreamResource) -> wasmtime::Result<()> { + self.table.delete(r)?; + Ok(()) + } +} + +#[derive(Clone)] +pub enum RustcProcMacro { + Dylib { client: rustc_proc_macro::bridge::client::Client }, + + WasmExpand1 { client: crate::proc_macro::WasmExpand1 }, + + WasmExpand2 { client: crate::proc_macro::WasmExpand2 }, +} + +type ErasedCtx<'a, 'b> = (Rustc<'a, 'b>, rustc_span::LocalExpnId); + +/// Stores the context necessary to expand a derive proc macro via a query. +struct DeriveExpandCtx { + /// Type-erased version of `&mut ExtCtxt` + ctx: *mut (), +} + +impl DeriveExpandCtx { + /// Store the extension context and the client into the thread local value. + /// It will be accessible via the `with` method while `f` is active. + fn enter(ecx: &mut ErasedCtx<'_, '_>, f: F) -> R + where + F: FnOnce() -> R, + { + // We need erasure to get rid of the lifetime + let ctx = Self { ctx: ecx as *mut _ as *mut () }; + DERIVE_EXPAND_CTX.set(&ctx, f) + } + + /// Accesses the thread local value of the derive expansion context. + /// Must be called while the `enter` function is active. + fn with(f: F) -> R + where + F: for<'a, 'b, 'c> FnOnce(&'a mut ErasedCtx<'b, 'c>) -> R, + { + DERIVE_EXPAND_CTX.with(|ctx| { + let ectx = { + let casted = ctx.ctx.cast::>(); + // SAFETY: We can only get the value from `with` while the `enter` function + // is active (on the callstack), and that function's signature ensures that the + // lifetime is valid. + // If `with` is called at some other time, it will panic due to usage of + // `scoped_tls::with`. + unsafe { casted.as_mut().unwrap() } + }; + + f(ectx) + }) + } +} + +// When we invoke a query to expand a derive proc macro, we need to provide it with the expansion +// context and derive Client. We do that using a thread-local. +scoped_tls::scoped_thread_local!(static DERIVE_EXPAND_CTX: DeriveExpandCtx); + +pub fn expand( + engine: &wasmtime::Engine, + component: &wasmtime::component::Component, + ecx: &mut ExtCtxt<'_>, + expn_id: rustc_span::LocalExpnId, + derive_idx: usize, + cb: impl FnOnce( + &mut wasmtime::Store, + wasmtime::component::ResourceAny, + generated::exports::rust_lang::rust::custom_derive::GuestCustomDerive<'_>, + ) -> wasmtime::Result, +) -> Result> { + let mut linker = wasmtime::component::Linker::new(&engine); + wasmtime_wasi::p2::add_to_linker_sync(&mut linker).unwrap(); + generated::ProcMacro::add_to_linker::<_, wasmtime::component::HasSelf<_>>( + &mut linker, + |state| state, + ) + .unwrap(); + + let ctx = Ctx::default(); + + let mut store = wasmtime::Store::new(&engine, ctx); + let bindings = generated::ProcMacro::instantiate(&mut store, component, &linker).unwrap(); + + let mut derives = + bindings.rust_lang_rust_custom_derive().call_get_custom_derives(&mut store).unwrap(); + let derive = derives.remove(derive_idx); + + let ecx = Rustc::new(ecx); + + DeriveExpandCtx::enter(&mut (ecx, expn_id), || { + match cb(&mut store, derive, bindings.rust_lang_rust_custom_derive().custom_derive()) { + Ok(expanded) => Ok(store.data_mut().table.delete::(expanded).unwrap()), + Err(e) => { + if let Some(msg) = store.data_mut().stored_panic.take() { + return Err(msg); + } + + // If we didn't store a panic during execution then this must be something else. + panic!("Failed to run wasm proc-macro: {:?}", e); + } + } + }) +} + +pub enum WasmLoadError { + FileRead(std::io::Error), + Parse(wasmtime::Error), + RuntimeFailed(wasmtime::Error), +} + +pub fn load_wasm_macro( + _sess: &Session, + path: &std::path::Path, +) -> Result, WasmLoadError> { + let code = std::fs::read(path).map_err(WasmLoadError::FileRead)?; + let engine = wasmtime::Engine::default(); + let component = + wasmtime::component::Component::new(&engine, code).map_err(WasmLoadError::Parse)?; + let mut linker = wasmtime::component::Linker::new(&engine); + wasmtime_wasi::p2::add_to_linker_sync(&mut linker).unwrap(); + generated::ProcMacro::add_to_linker::<_, wasmtime::component::HasSelf<_>>( + &mut linker, + |state| state, + ) + .unwrap(); + + let ctx = Ctx::default(); + let mut store = wasmtime::Store::new(&engine, ctx); + let bindings = generated::ProcMacro::instantiate(&mut store, &component, &linker).unwrap(); + let mut provided = vec![]; + + let derives = + bindings.rust_lang_rust_custom_derive().call_get_custom_derives(&mut store).unwrap(); + for (idx, derive) in derives.into_iter().enumerate() { + let kind = bindings + .rust_lang_rust_custom_derive() + .custom_derive() + .call_get_kind(&mut store, derive) + .unwrap(); + let component = component.clone(); + let engine = engine.clone(); + match kind { + DeriveKind::Expand1 => { + provided.push(RustcProcMacro::WasmExpand1 { + client: IntoDynSyncSend(Arc::new(move |ecx, expn_id, stream| { + expand(&engine, &component, ecx, expn_id, idx, |store, derive, bindings| { + let input_handle = store.data_mut().table.push(stream).unwrap(); + bindings.call_expand1(store, derive, input_handle) + }) + })), + }); + } + + DeriveKind::Expand2 => { + provided.push(RustcProcMacro::WasmExpand2 { + client: IntoDynSyncSend(Arc::new(move |ecx, expn_id, stream_a, stream_b| { + expand(&engine, &component, ecx, expn_id, idx, |store, derive, bindings| { + let input_handle_a = store.data_mut().table.push(stream_a).unwrap(); + let input_handle_b = store.data_mut().table.push(stream_b).unwrap(); + bindings.call_expand2(store, derive, input_handle_a, input_handle_b) + }) + })), + }); + } + } + } + Ok(provided) +} diff --git a/compiler/rustc_interface/src/diagnostics.rs b/compiler/rustc_interface/src/diagnostics.rs index 7cae1aa54d2e7..3a2386ab7dea4 100644 --- a/compiler/rustc_interface/src/diagnostics.rs +++ b/compiler/rustc_interface/src/diagnostics.rs @@ -53,6 +53,10 @@ pub(crate) struct MixedBinCrate; #[diag("cannot mix `proc-macro` crate type with others")] pub(crate) struct MixedProcMacroCrate; +#[derive(Diagnostic)] +#[diag("cannot compile `proc-macro` crate to wasm targets without -Zwasm-proc-macros")] +pub(crate) struct UnstableWasmProcMacro; + #[derive(Diagnostic)] #[diag("error writing dependencies to `{$path}`: {$error}")] pub(crate) struct ErrorWritingDependencies<'a> { diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index ca6e48cb67fe5..5d31f5756cf55 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -274,13 +274,20 @@ fn configure_and_expand( } if is_proc_macro_crate { sess.dcx().emit_err(diagnostics::MixedProcMacroCrate); + + if sess.target.is_like_wasm && !sess.opts.unstable_opts.wasm_proc_macros { + sess.dcx().emit_err(diagnostics::UnstableWasmProcMacro); + } } } if crate_types.contains(&CrateType::Sdylib) && !tcx.features().export_stable() { feature_err(sess, sym::export_stable, DUMMY_SP, "`sdylib` crate type is unstable").emit(); } - if is_proc_macro_crate && !sess.panic_strategy().unwinds() { + // Wasm targets today don't unwind, but they also generally don't crash the compiler since + // at least today proc-macros are run in a separate wasm runtime than the compiler. (The + // compiler probably won't run in wasm itself anyway). + if is_proc_macro_crate && !sess.panic_strategy().unwinds() && !sess.target.is_like_wasm { sess.dcx().emit_warn(diagnostics::ProcMacroCratePanicAbort); } diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs index 640f31355ac33..a247d2517e971 100644 --- a/compiler/rustc_interface/src/tests.rs +++ b/compiler/rustc_interface/src/tests.rs @@ -912,6 +912,7 @@ fn test_unstable_options_tracking_hash() { tracked!(verify_llvm_ir, true); tracked!(virtual_function_elimination, true); tracked!(wasi_exec_model, Some(WasiExecModel::Reactor)); + tracked!(wasm_proc_macros, true); // tidy-alphabetical-end macro_rules! tracked_no_crate_hash { diff --git a/compiler/rustc_metadata/Cargo.toml b/compiler/rustc_metadata/Cargo.toml index 2fce131e08b6a..e77d82ceb3dec 100644 --- a/compiler/rustc_metadata/Cargo.toml +++ b/compiler/rustc_metadata/Cargo.toml @@ -30,6 +30,7 @@ rustc_span = { path = "../rustc_span" } rustc_target = { path = "../rustc_target" } tempfile = "3.7.1" tracing = "0.1" +wasmparser = { version = "0.252.0", default-features = false, features = ["std", "component-model", "simd"] } # tidy-alphabetical-end [target.'cfg(target_os = "aix")'.dependencies] diff --git a/compiler/rustc_metadata/src/creader.rs b/compiler/rustc_metadata/src/creader.rs index dd063f5425511..543b9f1e60d6a 100644 --- a/compiler/rustc_metadata/src/creader.rs +++ b/compiler/rustc_metadata/src/creader.rs @@ -13,6 +13,7 @@ use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::{self, FreezeReadGuard, FreezeWriteGuard}; use rustc_data_structures::unord::UnordMap; use rustc_expand::base::SyntaxExtension; +use rustc_expand::wasm_proc_macro::{RustcProcMacro, WasmLoadError}; use rustc_hir as hir; use rustc_hir::def_id::{CrateNum, LOCAL_CRATE, LocalDefId, StableCrateId}; use rustc_hir::definitions::Definitions; @@ -20,7 +21,6 @@ use rustc_index::IndexVec; use rustc_middle::bug; use rustc_middle::ty::data_structures::IndexSet; use rustc_middle::ty::{TyCtxt, TyCtxtFeed}; -use rustc_proc_macro::bridge::client::Client as ProcMacroClient; use rustc_session::config::mitigation_coverage::DeniedPartialMitigationLevel; use rustc_session::config::{ CrateType, ExtendedTargetModifierInfo, ExternLocation, Externs, OptionsTargetModifiers, @@ -119,10 +119,13 @@ impl<'a> std::fmt::Debug for CrateDump<'a> { writeln!(fmt, " hash: {}", data.hash())?; writeln!(fmt, " reqd: {:?}", data.dep_kind())?; writeln!(fmt, " priv: {:?}", data.is_private_dep())?; - let CrateSource { dylib, rlib, rmeta, sdylib_interface } = data.source(); + let CrateSource { dylib, rlib, wasm, rmeta, sdylib_interface } = data.source(); if let Some(dylib) = dylib { writeln!(fmt, " dylib: {}", dylib.display())?; } + if let Some(wasm) = wasm { + writeln!(fmt, " wasm: {}", wasm.display())?; + } if let Some(rlib) = rlib { writeln!(fmt, " rlib: {}", rlib.display())?; } @@ -649,8 +652,15 @@ impl CStore { }), None => (&source, &crate_root), }; - let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate"); - Some(self.dlsym_proc_macros(dlsym_dylib, dlsym_root.stable_crate_id())?) + if tcx.sess.opts.unstable_opts.wasm_proc_macros && dlsym_source.wasm.is_some() { + let wasm_source = + dlsym_source.wasm.as_ref().expect("no wasm for a proc-macro crate"); + Some(self.load_wasm_macro(tcx.sess, wasm_source)?) + } else { + let dlsym_dylib = + dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate"); + Some(self.dlsym_proc_macros(dlsym_dylib, dlsym_root.stable_crate_id())?) + } } else { None }; @@ -730,13 +740,21 @@ impl CStore { // Load the proc macro crate for the host proc_macro_locator.for_proc_macro(sess, path_kind); - let Some(host_result) = + if let Some(host_result) = self.load(&mut proc_macro_locator, &mut CrateRejections::default())? - else { - return Ok(None); - }; + { + return Ok(Some((host_result, None))); + } + + proc_macro_locator.for_wasm_proc_macro(sess, path_kind); + + if let Some(wasm_result) = + self.load(&mut proc_macro_locator, &mut CrateRejections::default())? + { + return Ok(Some((wasm_result, None))); + } - Ok(Some((host_result, None))) + Ok(None) } } @@ -817,7 +835,7 @@ impl CStore { match self.load(&mut locator, &mut crate_rejections)? { Some(res) => (res, None), None => { - info!("falling back to loading proc_macro"); + info!("falling back to loading proc_macro for {}", name); dep_kind = CrateDepKind::MacrosOnly; match self.load_proc_macro( tcx.sess, @@ -947,10 +965,32 @@ impl CStore { &self, path: &Path, stable_crate_id: StableCrateId, - ) -> Result<&'static [ProcMacroClient], CrateError> { + ) -> Result, CrateError> { Ok(crate::host_dylib::dlsym_proc_macros(path, stable_crate_id)?) } + fn load_wasm_macro( + &self, + sess: &Session, + path: &Path, + ) -> Result, CrateError> { + match rustc_expand::wasm_proc_macro::load_wasm_macro(sess, path) { + Ok(p) => return Ok(p), + Err(WasmLoadError::FileRead(err)) => { + return Err(CrateError::DlOpen(path.to_string_lossy().into(), err.to_string())); + } + Err(WasmLoadError::Parse(err)) => { + return Err(CrateError::DlOpen( + path.to_string_lossy().into(), + format!("wasm parse failed: {}", err), + )); + } + Err(WasmLoadError::RuntimeFailed(err)) => { + bug!("failed to load wasm macro, wasm runtime error: {:?}", err) + } + } + } + fn inject_panic_runtime(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) { // If we're only compiling an rlib, then there's no need to select a // panic runtime, so we just skip this section entirely. diff --git a/compiler/rustc_metadata/src/host_dylib.rs b/compiler/rustc_metadata/src/host_dylib.rs index 9bd2a57fcd285..d4bbd5be7f0d4 100644 --- a/compiler/rustc_metadata/src/host_dylib.rs +++ b/compiler/rustc_metadata/src/host_dylib.rs @@ -2,6 +2,7 @@ use std::error::Error; use std::path::Path; use std::time::Duration; +use rustc_expand::wasm_proc_macro::RustcProcMacro; use rustc_fs_util::try_canonicalize; use rustc_proc_macro::bridge::client::Client as ProcMacroClient; use rustc_session::StableCrateId; @@ -126,17 +127,17 @@ pub unsafe fn load_symbol_from_dylib( pub(crate) fn dlsym_proc_macros( path: &Path, stable_crate_id: StableCrateId, -) -> Result<&'static [ProcMacroClient], DylibError> { +) -> Result, DylibError> { let sym_name = rustc_session::generate_proc_macro_decls_symbol(stable_crate_id); debug!("trying to dlsym proc_macros {} for symbol `{}`", path.display(), sym_name); unsafe { // FIXME(bjorn3) this depends on the unstable slice memory layout - let result = crate::load_symbol_from_dylib::<*const &[ProcMacroClient]>(path, &sym_name); + let result = load_symbol_from_dylib::<*const &[ProcMacroClient]>(path, &sym_name); match result { Ok(result) => { debug!("loaded dlsym proc_macros {} for symbol `{}`", path.display(), sym_name); - Ok(*result) + Ok((*result).iter().map(|pm| RustcProcMacro::Dylib { client: *pm }).collect()) } Err(err) => { debug!("failed to dlsym proc_macros {} for symbol `{}`", path.display(), sym_name); diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index f970be089f2ee..e5826ed25194e 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -223,8 +223,8 @@ use rustc_data_structures::memmap::Mmap; use rustc_data_structures::owned_slice::{OwnedSlice, slice_owned}; use rustc_data_structures::svh::Svh; use rustc_errors::{DiagArgValue, IntoDiagArg}; +use rustc_expand::wasm_proc_macro::RustcProcMacro; use rustc_fs_util::try_canonicalize; -use rustc_proc_macro::bridge::client::Client as ProcMacroClient; use rustc_session::cstore::CrateSource; use rustc_session::filesearch::FileSearch; use rustc_session::search_paths::PathKind; @@ -276,6 +276,7 @@ pub(crate) enum CrateFlavor { Rmeta, Dylib, SDylib, + Wasm, } impl fmt::Display for CrateFlavor { @@ -284,6 +285,7 @@ impl fmt::Display for CrateFlavor { CrateFlavor::Rlib => "rlib", CrateFlavor::Rmeta => "rmeta", CrateFlavor::Dylib => "dylib", + CrateFlavor::Wasm => "wasm", CrateFlavor::SDylib => "sdylib", }) } @@ -295,6 +297,7 @@ impl IntoDiagArg for CrateFlavor { CrateFlavor::Rlib => DiagArgValue::Str(Cow::Borrowed("rlib")), CrateFlavor::Rmeta => DiagArgValue::Str(Cow::Borrowed("rmeta")), CrateFlavor::Dylib => DiagArgValue::Str(Cow::Borrowed("dylib")), + CrateFlavor::Wasm => DiagArgValue::Str(Cow::Borrowed("wasm")), CrateFlavor::SDylib => DiagArgValue::Str(Cow::Borrowed("sdylib")), } } @@ -360,6 +363,14 @@ impl<'a> CrateLocator<'a> { self.path_kind = path_kind; } + pub(crate) fn for_wasm_proc_macro(&mut self, sess: &'a Session, path_kind: PathKind) { + self.is_proc_macro = true; + self.target = &sess.host; + self.tuple = TargetTuple::from_tuple("wasm32-wasip2"); + self.filesearch = sess.wasm_filesearch(); + self.path_kind = path_kind; + } + pub(crate) fn maybe_load_library_crate( &self, crate_rejections: &mut CrateRejections, @@ -390,16 +401,20 @@ impl<'a> CrateLocator<'a> { let staticlib_prefix = &format!("{}{}{}", self.target.staticlib_prefix, self.crate_name, extra_prefix); let interface_prefix = rmeta_prefix; + // Right now CrateFlavor::Wasm is only supported for proc-macros, where we inject `lib` + // artificially for the output artifact despite the target not having it normally. + let wasm_prefix = &format!("lib{}", self.crate_name); let rmeta_suffix = ".rmeta"; let rlib_suffix = ".rlib"; let dylib_suffix = &self.target.dll_suffix; let staticlib_suffix = &self.target.staticlib_suffix; let interface_suffix = ".rs"; + let wasm_suffix = ".wasm"; let mut candidates: FxIndexMap< _, - (FxIndexSet<_>, FxIndexSet<_>, FxIndexSet<_>, FxIndexSet<_>), + (FxIndexSet<_>, FxIndexSet<_>, FxIndexSet<_>, FxIndexSet<_>, FxIndexSet<_>), > = Default::default(); // First, find all possible candidate rlibs and dylibs purely based on @@ -422,26 +437,32 @@ impl<'a> CrateLocator<'a> { // given that `extra_filename` comes from the `-C extra-filename` // option and thus can be anything, and the incorrect match will be // handled safely in `extract_one`. + let search_params = [ + (rlib_prefix.as_str(), rlib_suffix, CrateFlavor::Rlib), + (rmeta_prefix.as_str(), rmeta_suffix, CrateFlavor::Rmeta), + (wasm_prefix, wasm_suffix, CrateFlavor::Wasm), + (dylib_prefix, dylib_suffix, CrateFlavor::Dylib), + (interface_prefix, interface_suffix, CrateFlavor::SDylib), + ]; + debug!("searching with params={:?}", search_params); for search_path in self.filesearch.search_paths(self.path_kind) { - debug!("searching {}", search_path.dir.display()); + debug!("searching {} {:?}", search_path.dir.display(), search_path); let spf = &search_path.files; let mut should_check_staticlibs = true; - for (prefix, suffix, kind) in [ - (rlib_prefix.as_str(), rlib_suffix, CrateFlavor::Rlib), - (rmeta_prefix.as_str(), rmeta_suffix, CrateFlavor::Rmeta), - (dylib_prefix, dylib_suffix, CrateFlavor::Dylib), - (interface_prefix, interface_suffix, CrateFlavor::SDylib), - ] { + for (prefix, suffix, kind) in search_params.iter().copied() { if prefix == staticlib_prefix && suffix == staticlib_suffix { should_check_staticlibs = false; } if let Some(matches) = spf.query(prefix, suffix) { for (hash, spf) in matches { let spf_path = spf.path(&search_path.dir); - info!("lib candidate: {}", spf_path.display()); + info!( + "lib candidate: {} (kind={kind:?} hash={hash:?})", + spf_path.display() + ); - let (rlibs, rmetas, dylibs, interfaces) = + let (rlibs, rmetas, dylibs, interfaces, wasms) = candidates.entry(hash).or_default(); { // As a performance optimisation we canonicalize the path and skip @@ -462,6 +483,7 @@ impl<'a> CrateLocator<'a> { CrateFlavor::Rmeta => rmetas.insert(spf_path), CrateFlavor::Dylib => dylibs.insert(spf_path), CrateFlavor::SDylib => interfaces.insert(spf_path), + CrateFlavor::Wasm => wasms.insert(spf_path), }; } } @@ -488,9 +510,9 @@ impl<'a> CrateLocator<'a> { // libraries corresponds to the crate id and hash criteria that this // search is being performed for. let mut libraries = FxIndexMap::default(); - for (_hash, (rlibs, rmetas, dylibs, interfaces)) in candidates { + for (_hash, (rlibs, rmetas, dylibs, interfaces, wasms)) in candidates { if let Some((svh, lib)) = - self.extract_lib(crate_rejections, rlibs, rmetas, dylibs, interfaces)? + self.extract_lib(crate_rejections, rlibs, rmetas, dylibs, interfaces, wasms)? { libraries.insert(svh, lib); } @@ -526,6 +548,7 @@ impl<'a> CrateLocator<'a> { rmetas: FxIndexSet, dylibs: FxIndexSet, interfaces: FxIndexSet, + wasm_proc_macros: FxIndexSet, ) -> Result, CrateError> { let mut slot = None; // Order here matters, rmeta should come first. @@ -538,12 +561,14 @@ impl<'a> CrateLocator<'a> { let sdylib_interface = self.extract_one(crate_rejections, interfaces, CrateFlavor::SDylib, &mut slot)?; let dylib = self.extract_one(crate_rejections, dylibs, CrateFlavor::Dylib, &mut slot)?; + let wasm = + self.extract_one(crate_rejections, wasm_proc_macros, CrateFlavor::Wasm, &mut slot)?; if sdylib_interface.is_some() && dylib.is_none() { return Err(CrateError::FullMetadataNotFound(self.crate_name, CrateFlavor::SDylib)); } - let source = CrateSource { rmeta, rlib, dylib, sdylib_interface }; + let source = CrateSource { rmeta, rlib, dylib, wasm, sdylib_interface }; Ok(slot.map(|(svh, metadata, _, _)| (svh, Library { source, metadata }))) } @@ -552,6 +577,10 @@ impl<'a> CrateLocator<'a> { return true; } + if flavor == CrateFlavor::Wasm && self.is_proc_macro { + return true; + } + if self.only_needs_metadata { flavor == CrateFlavor::Rmeta } else { @@ -749,6 +778,7 @@ impl<'a> CrateLocator<'a> { let mut rmetas = FxIndexSet::default(); let mut dylibs = FxIndexSet::default(); let mut sdylib_interfaces = FxIndexSet::default(); + let mut wasm_proc_macros = FxIndexSet::default(); for loc in &self.exact_paths { let loc_canon = loc.canonicalized(); let loc_orig = loc.original(); @@ -786,14 +816,25 @@ impl<'a> CrateLocator<'a> { dylibs.insert(loc_canon.clone()); continue; } + if file.ends_with(".wasm") { + wasm_proc_macros.insert(loc_canon.clone()); + continue; + } crate_rejections .via_filename .push(CrateMismatch { path: loc_orig.clone(), got: String::new() }); } // Extract the dylib/rlib/rmeta triple. - self.extract_lib(crate_rejections, rlibs, rmetas, dylibs, sdylib_interfaces) - .map(|opt| opt.map(|(_, lib)| lib)) + self.extract_lib( + crate_rejections, + rlibs, + rmetas, + dylibs, + sdylib_interfaces, + wasm_proc_macros, + ) + .map(|opt| opt.map(|(_, lib)| lib)) } pub(crate) fn into_error( @@ -906,6 +947,49 @@ fn get_metadata_section<'p>( buf.slice(|buf| &buf[data_start..(data_start + metadata_len)]) } CrateFlavor::Rmeta => get_rmeta_metadata_section(filename)?, + CrateFlavor::Wasm => { + let buf = std::fs::read(filename).expect("could read"); + let buf = slice_owned(buf, Deref::deref); + let mut section = None; + for payload in wasmparser::Parser::new(0).parse_all(&buf.clone()) { + let payload = payload.expect("could parse"); + let wasmparser::Payload::CustomSection(reader) = payload else { + continue; + }; + if reader.name() != ".rustc" { + // compiler/rustc_codegen_ssa/src/back/metadata.rs + continue; + } + let contents = buf.clone().slice(|s| &s[reader.data_offset()..reader.range().end]); + + let header_len = METADATA_HEADER.len(); + // header + u64 length of data + let data_start = header_len + 8; + + debug!("checking {} bytes of metadata-version stamp", header_len); + let header = &contents[..cmp::min(header_len, contents.len())]; + if header != METADATA_HEADER { + return Err(MetadataError::LoadFailure(format!( + "invalid metadata version found: {}", + filename.display() + ))); + } + + // Length of the metadata - this allows linkers to pad the section if they want + let Ok(len_bytes) = <[u8; 8]>::try_from( + &contents[header_len..cmp::min(data_start, contents.len())], + ) else { + return Err(MetadataError::LoadFailure( + "invalid metadata length found".to_string(), + )); + }; + let metadata_len = u64::from_le_bytes(len_bytes) as usize; + + section = Some(contents.slice(|b| &b[data_start..(data_start + metadata_len)])); + break; + } + section.expect("found rustc metadata in wasm component") + } }; let Ok(blob) = MetadataBlob::new(raw_bytes) else { return Err(MetadataError::LoadFailure(format!( @@ -986,7 +1070,7 @@ pub fn get_proc_macros( path: &Path, metadata_loader: &dyn MetadataLoader, cfg_version: &'static str, -) -> IoResult> { +) -> IoResult> { let metadata = get_metadata_section(target, CrateFlavor::Dylib, path, metadata_loader, cfg_version, None) .map_err(|err| io::Error::other(err.to_string()))?; @@ -1000,7 +1084,7 @@ pub fn get_proc_macros( let proc_macro_info = metadata.get_proc_macro_info(); assert_eq!(proc_macro_info.len(), clients.len()); - Ok(clients.into_iter().copied().zip(proc_macro_info).collect()) + Ok(clients.into_iter().zip(proc_macro_info).collect()) } // ------------------------------------------ Error reporting ------------------------------------- diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index bed2be51a3468..50b4eee361bdc 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -14,7 +14,11 @@ use rustc_data_structures::owned_slice::OwnedSlice; use rustc_data_structures::sync::Lock; use rustc_data_structures::unhash::UnhashMap; use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind}; -use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, DeriveProcMacro}; +use rustc_expand::proc_macro::{ + AttrProcMacro, BangProcMacro, DeriveProcMacro, WasmAttrProcMacro, WasmBangProcMacro, + WasmDeriveProcMacro, +}; +use rustc_expand::wasm_proc_macro::RustcProcMacro; use rustc_hir::Safety; use rustc_hir::def::Res; use rustc_hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE}; @@ -26,7 +30,6 @@ use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState}; use rustc_middle::ty::Visibility; use rustc_middle::ty::codec::TyDecoder; use rustc_middle::{bug, implement_ty_decoder}; -use rustc_proc_macro::bridge::client::Client as ProcMacroClient; use rustc_serialize::opaque::MemDecoder; use rustc_serialize::{Decodable, Decoder}; use rustc_session::config::TargetModifier; @@ -105,7 +108,7 @@ pub(crate) struct CrateMetadata { /// or `#[rustc_allow_incoherent_impl]`. incoherent_impls: FxIndexMap>, /// Proc macro function pointers for this crate, if it's a proc macro crate. - raw_proc_macros: Option<&'static [ProcMacroClient]>, + raw_proc_macros: Option>, /// Source maps for code from the crate. source_map_import_info: Lock>>, /// For every definition in this crate, maps its `DefPathHash` to its `DefIndex`. @@ -986,7 +989,7 @@ impl CrateMetadata { bug!("missing `{descr}` for {:?}", self.local_def_id(id)) } - fn raw_proc_macro(&self, tcx: TyCtxt<'_>, id: DefIndex) -> (ProcMacroClient, ProcMacroKind) { + fn raw_proc_macro(&self, tcx: TyCtxt<'_>, id: DefIndex) -> (RustcProcMacro, ProcMacroKind) { // DefIndex's in root.proc_macro_data have a one-to-one correspondence // with items in 'raw_proc_macros'. let (pos, (_id, kind)) = self @@ -999,7 +1002,7 @@ impl CrateMetadata { .enumerate() .find(|(_pos, (i, _))| *i == id) .unwrap(); - (self.raw_proc_macros.unwrap()[pos], kind.decode((self, tcx))) + (self.raw_proc_macros.as_ref().unwrap()[pos].clone(), kind.decode((self, tcx))) } fn opt_item_name(&self, item_index: DefIndex) -> Option { @@ -1058,21 +1061,56 @@ impl CrateMetadata { fn load_proc_macro<'tcx>(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> SyntaxExtension { let (name, kind, helper_attrs) = match self.raw_proc_macro(tcx, id) { - (client, ProcMacroKind::CustomDerive { trait_name, attributes }) => { + ( + RustcProcMacro::WasmExpand1 { client }, + ProcMacroKind::CustomDerive { trait_name, attributes }, + ) => { let helper_attrs = - attributes.into_iter().map(|attr| Symbol::intern(&attr)).collect(); + attributes.iter().cloned().map(|s| Symbol::intern(&s)).collect::>(); ( - trait_name, - SyntaxExtensionKind::Derive(Arc::new(DeriveProcMacro { client })), + Symbol::intern(&trait_name), + SyntaxExtensionKind::Derive(Arc::new(WasmDeriveProcMacro { + client: client.clone(), + })), helper_attrs, ) } - (client, ProcMacroKind::Attr { name }) => { - (name, SyntaxExtensionKind::Attr(Arc::new(AttrProcMacro { client })), Vec::new()) - } - (client, ProcMacroKind::Bang { name }) => { - (name, SyntaxExtensionKind::Bang(Arc::new(BangProcMacro { client })), Vec::new()) + (RustcProcMacro::WasmExpand2 { client }, ProcMacroKind::Attr { name }) => ( + Symbol::intern(&name), + SyntaxExtensionKind::Attr(Arc::new(WasmAttrProcMacro { client: client.clone() })), + Vec::new(), + ), + (RustcProcMacro::WasmExpand1 { client }, ProcMacroKind::Bang { name }) => ( + Symbol::intern(&name), + SyntaxExtensionKind::Bang(Arc::new(WasmBangProcMacro { client: client.clone() })), + Vec::new(), + ), + + ( + RustcProcMacro::Dylib { client }, + ProcMacroKind::CustomDerive { trait_name, attributes }, + ) => { + let helper_attrs = + attributes.iter().cloned().map(|s| Symbol::intern(&s)).collect::>(); + ( + Symbol::intern(&trait_name), + SyntaxExtensionKind::Derive(Arc::new(DeriveProcMacro { + client: client.clone(), + })), + helper_attrs, + ) } + (RustcProcMacro::Dylib { client }, ProcMacroKind::Attr { name }) => ( + Symbol::intern(&name), + SyntaxExtensionKind::Attr(Arc::new(AttrProcMacro { client: client.clone() })), + Vec::new(), + ), + (RustcProcMacro::Dylib { client }, ProcMacroKind::Bang { name }) => ( + Symbol::intern(&name), + SyntaxExtensionKind::Bang(Arc::new(BangProcMacro { client: client.clone() })), + Vec::new(), + ), + _ => unreachable!(), }; let sess = tcx.sess; @@ -1083,7 +1121,7 @@ impl CrateMetadata { self.get_span(tcx, id), helper_attrs, self.root.edition, - Symbol::intern(&name), + name, &attrs, false, ) @@ -1889,7 +1927,7 @@ impl CrateMetadata { tcx: TyCtxt<'_>, blob: MetadataBlob, root: CrateRoot, - raw_proc_macros: Option<&'static [ProcMacroClient]>, + raw_proc_macros: Option>, cnum: CrateNum, cnum_map: CrateNumMap, dep_kind: CrateDepKind, diff --git a/compiler/rustc_session/src/cstore.rs b/compiler/rustc_session/src/cstore.rs index 94237132bd393..c1ed93a57480f 100644 --- a/compiler/rustc_session/src/cstore.rs +++ b/compiler/rustc_session/src/cstore.rs @@ -22,6 +22,7 @@ use rustc_span::{Span, Symbol}; #[derive(PartialEq, Clone, Debug, StableHash, Encodable, Decodable)] pub struct CrateSource { pub dylib: Option, + pub wasm: Option, pub rlib: Option, pub rmeta: Option, pub sdylib_interface: Option, diff --git a/compiler/rustc_session/src/options.rs b/compiler/rustc_session/src/options.rs index 2f44b4c102486..304fac02b5fa9 100644 --- a/compiler/rustc_session/src/options.rs +++ b/compiler/rustc_session/src/options.rs @@ -2872,6 +2872,8 @@ written to standard error output)"), // FIXME remove this after a couple releases wasm_c_abi: () = ((), parse_wasm_c_abi, [TRACKED], "use spec-compliant C ABI for `wasm32-unknown-unknown` (deprecated, always enabled)"), + wasm_proc_macros: bool = (false, parse_bool, [TRACKED], + "enable support for compiling and loading wasm proc macros"), write_long_types_to_disk: bool = (true, parse_bool, [UNTRACKED], "whether long type names should be written to files instead of being printed in errors"), // tidy-alphabetical-end diff --git a/compiler/rustc_session/src/output.rs b/compiler/rustc_session/src/output.rs index 9224368f90d6e..43a1dbedf0694 100644 --- a/compiler/rustc_session/src/output.rs +++ b/compiler/rustc_session/src/output.rs @@ -96,10 +96,24 @@ pub fn filename_for_input( CrateType::Rlib => { OutFileName::Real(outputs.out_directory.join(&format!("lib{libname}.rlib"))) } - CrateType::Cdylib | CrateType::ProcMacro | CrateType::Dylib | CrateType::Sdylib => { + CrateType::Cdylib | CrateType::Dylib | CrateType::Sdylib => { let (prefix, suffix) = (&sess.target.dll_prefix, &sess.target.dll_suffix); OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}"))) } + CrateType::ProcMacro => { + if sess.target.is_like_wasm { + // Override the output file to start with `lib`. + // FIXME: This is a bit of a hack to make our crate loading code avoid needing a + // 'wasm_proc_macro' search path. We probably *do* actually want wasm proc macros to + // have their own search path inside the session, in which case this wouldn't be + // needed. + let (prefix, suffix) = ("lib", &sess.target.dll_suffix); + OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}"))) + } else { + let (prefix, suffix) = (&sess.target.dll_prefix, &sess.target.dll_suffix); + OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}"))) + } + } CrateType::StaticLib => { let (prefix, suffix) = sess.staticlib_components(false); OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}"))) @@ -130,7 +144,7 @@ pub fn invalid_output_for_target(sess: &Session, crate_type: CrateType) -> bool return true; } } - if let CrateType::ProcMacro | CrateType::Dylib = crate_type + if let CrateType::Dylib = crate_type && sess.target.only_cdylib { return true; diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 986dababf770a..6958dbd472c37 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -160,6 +160,7 @@ pub struct Session { target_filesearch: FileSearch, host_filesearch: FileSearch, + wasm_filesearch: FileSearch, /// The names of intrinsics that the current codegen backend replaces /// with its own implementations. @@ -426,6 +427,9 @@ impl Session { pub fn host_filesearch(&self) -> &filesearch::FileSearch { &self.host_filesearch } + pub fn wasm_filesearch(&self) -> &filesearch::FileSearch { + &self.wasm_filesearch + } /// Returns a list of directories where target-specific tool binaries are located. Some fallback /// directories are also returned, for example if `--sysroot` is used but tools are missing @@ -1071,6 +1075,18 @@ pub fn build_session( None }; + let wasm_triple = TargetTuple::from_tuple("wasm32-wasip2"); + let wasm_tlib_path = + Arc::new(SearchPath::from_sysroot_and_triple(sopts.sysroot.path(), wasm_triple.tuple())); + let (wasm_target, target_warnings) = + Target::search(&wasm_triple, sopts.sysroot.path(), sopts.unstable_opts.unstable_options) + .unwrap_or_else(|e| { + dcx.handle().fatal(format!("Error loading host specification: {e}")) + }); + for warning in target_warnings.warning_messages() { + dcx.handle().warn(warning) + } + let psess = ParseSess::with_dcx(dcx, source_map); let host_triple = config::host_tuple(); @@ -1101,6 +1117,8 @@ pub fn build_session( let target_filesearch = filesearch::FileSearch::new(&sopts.search_paths, &target_tlib_path, &target); let host_filesearch = filesearch::FileSearch::new(&sopts.search_paths, &host_tlib_path, &host); + let wasm_filesearch = + filesearch::FileSearch::new(&sopts.search_paths, &wasm_tlib_path, &wasm_target); let timings = TimingSectionHandler::new(sopts.json_timings); @@ -1132,6 +1150,7 @@ pub fn build_session( file_depinfo: Default::default(), target_filesearch, host_filesearch, + wasm_filesearch, replaced_intrinsics: FxHashSet::default(), // filled by `run_compiler` fallback_intrinsics: FxHashSet::default(), // filled by `run_compiler` thin_lto_supported: true, // filled by `run_compiler` diff --git a/compiler/rustc_span/src/span_encoding.rs b/compiler/rustc_span/src/span_encoding.rs index 64280d5ce4b5e..1b05412e92645 100644 --- a/compiler/rustc_span/src/span_encoding.rs +++ b/compiler/rustc_span/src/span_encoding.rs @@ -79,6 +79,7 @@ use crate::{BytePos, SPAN_TRACK, SpanData}; /// This is performed using the callback `SPAN_TRACK` to access the query engine. #[derive(Clone, Copy, Eq, PartialEq, Hash)] #[rustc_pass_by_value] +#[repr(C)] // we transmute to u64 and under -Zrandomize-layout this is otherwise 96 bits. pub struct Span { lo_or_index: u32, len_with_tag_or_marker: u16, @@ -454,6 +455,16 @@ impl Span { // Field order must match `to_raw_span`. Span { lo_or_index: a, len_with_tag_or_marker: b, ctxt_or_parent_or_marker: c } } + + #[inline] + pub fn encode_raw(self) -> u64 { + unsafe { std::mem::transmute(self) } + } + + #[inline] + pub fn decode_raw(sp: u64) -> Span { + unsafe { std::mem::transmute(sp) } + } } #[derive(Default)] diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index db2804a3f83bf..6b80a660f47f1 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1039,6 +1039,7 @@ symbols! { ge, gen_blocks, gen_future, + generate_export, generator_clone, generators, generic_arg_infer, @@ -1133,6 +1134,7 @@ symbols! { internal, internal_eq_trait_method_impls, internal_features, + internal_wit_bindgen, interrupt, into_async_iter_into_iter, into_future, diff --git a/library/Cargo.lock b/library/Cargo.lock index c30ed6dc30c55..a7c2acd715e2e 100644 --- a/library/Cargo.lock +++ b/library/Cargo.lock @@ -217,9 +217,11 @@ dependencies = [ name = "proc_macro" version = "0.0.0" dependencies = [ + "alloc", "core", "rustc-literal-escaper", "std", + "wit-bindgen", ] [[package]] diff --git a/library/proc_macro/Cargo.toml b/library/proc_macro/Cargo.toml index 286080e1bea2e..3fce666c9cae8 100644 --- a/library/proc_macro/Cargo.toml +++ b/library/proc_macro/Cargo.toml @@ -5,12 +5,18 @@ edition = "2024" [dependencies] std = { path = "../std" } +alloc = { path = "../alloc" } # Workaround: when documenting this crate rustdoc will try to load crate named # `core` when resolving doc links. Without this line a different `core` will be # loaded from sysroot causing duplicate lang items and other similar errors. core = { path = "../core" } rustc-literal-escaper = { version = "0.0.8", features = ["rustc-dep-of-std"] } +[target.'cfg(target_family = "wasm")'.dependencies] +wit-bindgen = { version = '0.57.1', features = [ + 'rustc-dep-of-std', +], default-features = false } + [features] default = ["rustc-dep-of-std"] rustc-dep-of-std = [] diff --git a/library/proc_macro/src/bridge/client.rs b/library/proc_macro/src/bridge/client.rs index 48e6245ecf98b..12a8616e27fe7 100644 --- a/library/proc_macro/src/bridge/client.rs +++ b/library/proc_macro/src/bridge/client.rs @@ -135,6 +135,8 @@ macro_rules! define_client_side { } } } + +#[cfg(not(target_family = "wasm"))] with_api!(define_client_side, TokenStream, Span, Symbol); struct Bridge<'a> { diff --git a/library/proc_macro/src/bridge/client_wasi.rs b/library/proc_macro/src/bridge/client_wasi.rs new file mode 100644 index 0000000000000..12f7f2e3ac82e --- /dev/null +++ b/library/proc_macro/src/bridge/client_wasi.rs @@ -0,0 +1,481 @@ +//! This module implements the client (in-wasm) for WebAssembly-based proc macros. +//! +//! At a high level, unlike for native proc macros, we go through a component model interface that +//! mirrors the API defined in bridge/mod.rs (see library/proc_macro/wasm-interface.wit). Where +//! possible, we directly use types defined by WIT in the bridge interface, but where needed we have +//! wrappers around it. The raw interface is mandated to be closely mirrored because we use +//! `with_api!` to generate it (see bottom of this file). From there input/output is converted with +//! the `Encode` (wasm -> host) and `Decode` (host -> wasm) traits. These are similar to those used +//! for the buffer encoding in native code, but typically just map types with very little real +//! logic (unlike the buffer encoding), low-level serde is handled by wit-bindgen. + +use std::fmt; +use std::ops::Bound; + +pub(crate) use host::TokenStream; + +pub(crate) use crate::bridge::Methods; +pub(crate) use crate::bridge::symbol::Symbol; +use crate::wasi_bindgen::exports::rust_lang::rust::custom_derive as cd; +use crate::wasi_bindgen::rust_lang::rust::host; + +pub(crate) fn is_available() -> bool { + // On wasm we currently don't support executing libproc_macro without the bridge (since it's + // statically imported) -- unclear whether that can change in the future, but for now just + // always return true. + true +} + +#[derive(Copy, Clone)] +pub(crate) struct Span(pub(crate) host::Span); + +impl Span { + pub(crate) fn def_site() -> Span { + Span(host::span_def_site()) + } + + pub(crate) fn call_site() -> Span { + Span(host::span_call_site()) + } + + pub(crate) fn mixed_site() -> Span { + Span(host::span_mixed_site()) + } + + pub(crate) fn byte_range(self) -> std::ops::Range { + Methods::span_byte_range(self) + } + + pub(crate) fn parent(self) -> Option { + Methods::span_parent(self) + } + + pub(crate) fn source(self) -> Span { + Methods::span_source(self) + } +} + +impl PartialEq for Span { + fn eq(&self, other: &Span) -> bool { + host::span_is_same(self.0, other.0) + } +} + +impl fmt::Debug for Span { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&host::span_debug(self.0)) + } +} + +impl Clone for TokenStream { + fn clone(&self) -> Self { + host::ts_clone(self) + } +} + +impl !Send for TokenStream {} +impl !Sync for TokenStream {} + +#[derive(Copy, Clone)] +pub enum Client { + Expand1 { expand: fn(crate::TokenStream) -> crate::TokenStream }, + Expand2 { expand: fn(crate::TokenStream, crate::TokenStream) -> crate::TokenStream }, +} + +impl Client { + pub const fn expand1(expand: fn(crate::TokenStream) -> crate::TokenStream) -> Self { + Self::Expand1 { expand } + } + + pub const fn expand2( + expand: fn(crate::TokenStream, crate::TokenStream) -> crate::TokenStream, + ) -> Self { + Self::Expand2 { expand } + } +} + +impl cd::GuestCustomDerive for Client { + fn get_kind(&self) -> cd::DeriveKind { + match self { + Self::Expand1 { .. } => cd::DeriveKind::Expand1, + Self::Expand2 { .. } => cd::DeriveKind::Expand2, + } + } + + fn expand1(&self, tokens: TokenStream) -> TokenStream { + setup_hook(); + match self { + Self::Expand1 { expand } => { + let output = (*expand)(crate::TokenStream(Some(tokens))); + let output = output.0.unwrap_or_else(|| TokenStream::new()); + output + } + Self::Expand2 { .. } => unreachable!("should not be called by host"), + } + } + + fn expand2(&self, a: TokenStream, b: TokenStream) -> TokenStream { + setup_hook(); + + match self { + Self::Expand2 { expand } => { + let output = (*expand)(crate::TokenStream(Some(a)), crate::TokenStream(Some(b))); + let output = output.0.unwrap_or_else(|| TokenStream::new()); + output + } + Self::Expand1 { .. } => { + unreachable!("should not be called by host") + } + } + } +} + +fn setup_hook() { + static ONCE: std::sync::Once = std::sync::Once::new(); + ONCE.call_once(|| { + let prev = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + // If the host wants us to also emit it, run the default panic hook. + if host::report_panic(info.payload_as_str()) { + prev(info) + } + })); + }); +} + +#[allow_internal_unstable(proc_macro_internals, staged_api)] +pub macro generate_export($list:ident) { + use $crate::wasi_bindgen::exports::rust_lang::rust::custom_derive as cd; + + struct ExportAbi; + + impl cd::Guest for ExportAbi { + type CustomDerive = $crate::bridge::client::Client; + fn get_custom_derives() -> Vec { + $list.iter().map(|d| cd::CustomDerive::new(*d)).collect() + } + } + + $crate::wasi_bindgen::export!(ExportAbi with_types_in $crate::wasi_bindgen); +} + +trait Encode { + fn convert(input: Self) -> Output; +} + +impl Decode for super::LitKind { + fn convert(v: super::LitKind) -> host::LiteralKind { + match v { + super::LitKind::Byte => host::LiteralKind::Byte, + super::LitKind::Char => host::LiteralKind::Char, + super::LitKind::Integer => host::LiteralKind::Integer, + super::LitKind::Float => host::LiteralKind::Float, + super::LitKind::ByteStr => host::LiteralKind::ByteStr, + super::LitKind::ByteStrRaw(n) => host::LiteralKind::ByteStrRaw(n), + super::LitKind::Str => host::LiteralKind::Str, + super::LitKind::StrRaw(n) => host::LiteralKind::StrRaw(n), + super::LitKind::CStr => host::LiteralKind::CStr, + super::LitKind::CStrRaw(n) => host::LiteralKind::CStrRaw(n), + super::LitKind::ErrWithGuar => host::LiteralKind::ErrWithGuar, + } + } +} + +impl Encode for host::LiteralKind { + fn convert(v: Self) -> super::LitKind { + match v { + host::LiteralKind::Byte => super::LitKind::Byte, + host::LiteralKind::Char => super::LitKind::Char, + host::LiteralKind::Integer => super::LitKind::Integer, + host::LiteralKind::Float => super::LitKind::Float, + host::LiteralKind::ByteStr => super::LitKind::ByteStr, + host::LiteralKind::ByteStrRaw(n) => super::LitKind::ByteStrRaw(n), + host::LiteralKind::Str => super::LitKind::Str, + host::LiteralKind::StrRaw(n) => super::LitKind::StrRaw(n), + host::LiteralKind::CStr => super::LitKind::CStr, + host::LiteralKind::CStrRaw(n) => super::LitKind::CStrRaw(n), + host::LiteralKind::ErrWithGuar => super::LitKind::ErrWithGuar, + } + } +} + +impl Encode> for Result { + fn convert(input: Self) -> Result { + match input { + Ok(v) => Ok(Symbol::new(&v)), + Err(()) => Err(()), + } + } +} + +impl Encode for String { + fn convert(input: Self) -> String { + input + } +} + +impl Encode for host::Span { + fn convert(input: Self) -> Span { + Span(input) + } +} + +impl Encode> for Option { + fn convert(input: Self) -> Option { + input.map(Span) + } +} + +impl Encode for u64 { + fn convert(input: Self) -> usize { + input.try_into().unwrap() + } +} + +trait Decode { + fn convert(input: Self) -> Out; +} + +impl<'a> Decode<&'a str> for &'a str { + fn convert(input: &str) -> &str { + input + } +} + +impl Decode for usize { + fn convert(input: Self) -> u64 { + input.try_into().unwrap() + } +} + +impl Decode for Span { + fn convert(input: Self) -> host::Span { + input.0 + } +} + +impl Decode for crate::bridge::Diagnostic { + fn convert(input: Self) -> host::Diagnostic { + fn to_internal(diag: crate::bridge::Diagnostic) -> host::Diagnostic { + host::Diagnostic::new(host::DiagnosticInner { + level: match diag.level { + crate::Level::Error => host::Level::Error, + crate::Level::Warning => host::Level::Warning, + crate::Level::Note => host::Level::Note, + crate::Level::Help => host::Level::Help, + }, + message: diag.message, + spans: diag.spans.into_iter().map(|s| s.0).collect(), + children: diag.children.into_iter().map(to_internal).collect(), + }) + } + + to_internal(input) + } +} + +impl Encode>> for Vec { + fn convert(input: Self) -> Vec> { + input.into_iter().map(Encode::convert).collect() + } +} + +impl Encode> for host::TokenTree { + fn convert(input: Self) -> super::TokenTree { + match input { + host::TokenTree::Group(g) => super::TokenTree::Group(super::Group { + delimiter: match g.delimiter { + host::Delimiter::Parenthesis => super::Delimiter::Parenthesis, + host::Delimiter::Brace => super::Delimiter::Brace, + host::Delimiter::Bracket => super::Delimiter::Bracket, + host::Delimiter::None => super::Delimiter::None, + }, + stream: g.stream, + span: super::DelimSpan { + open: Span(g.span.open), + close: Span(g.span.close), + entire: Span(g.span.entire), + }, + }), + host::TokenTree::Punct(p) => super::TokenTree::Punct(super::Punct { + ch: p.ch, + joint: p.joint, + span: Span(p.span), + }), + host::TokenTree::Ident(i) => super::TokenTree::Ident(super::Ident { + sym: Symbol::new(&i.sym), + is_raw: i.is_raw, + span: Span(i.span), + }), + host::TokenTree::Literal(l) => super::TokenTree::Literal(super::Literal { + kind: Encode::convert(l.kind), + span: Span(l.span), + suffix: l.suffix.map(|s| Symbol::new(&s)), + symbol: Symbol::new(&l.symbol), + }), + } + } +} + +impl Decode> for Vec { + fn convert(input: Self) -> Vec { + input.into_iter().map(Decode::convert).collect() + } +} + +impl Decode for Bound { + fn convert(input: Self) -> host::RangeBound { + match input { + Bound::Included(v) => { + host::RangeBound { value: v as u64, bound: host::Bound::Included } + } + Bound::Excluded(v) => { + host::RangeBound { value: v as u64, bound: host::Bound::Excluded } + } + Bound::Unbounded => host::RangeBound { value: 0, bound: host::Bound::Unbounded }, + } + } +} + +impl Encode> for (u64, u64) { + fn convert(input: Self) -> std::ops::Range { + input.0.try_into().unwrap()..input.1.try_into().unwrap() + } +} + +impl Encode> for Option { + fn convert(input: Self) -> Option { + input + } +} + +impl<'a> Decode> for Option<&'a str> { + fn convert(input: Option<&str>) -> Option<&str> { + input + } +} + +impl Encode<()> for () { + fn convert(_: ()) -> () {} +} + +impl Encode for bool { + fn convert(v: bool) -> bool { + v + } +} + +impl Encode, String>> for Result { + fn convert(input: Self) -> Result, String> { + match input { + Ok(l) => Ok(super::Literal { + kind: Encode::convert(l.kind), + symbol: Symbol::new(&l.symbol), + suffix: l.suffix.map(|s| Symbol::new(&s)), + span: Span(l.span), + }), + Err(e) => Err(e), + } + } +} + +impl Decode for TokenStream { + fn convert(input: TokenStream) -> TokenStream { + input + } +} + +impl<'a> Decode<&'a TokenStream> for &'a TokenStream { + fn convert(input: &TokenStream) -> &TokenStream { + &input + } +} + +impl Encode for TokenStream { + fn convert(input: TokenStream) -> TokenStream { + input + } +} + +impl Encode> for Result { + fn convert(input: Result) -> Result { + input + } +} + +impl Encode> for Result { + fn convert(input: Result) -> Result { + input + } +} + +impl Decode for super::TokenTree { + fn convert(input: Self) -> host::TokenTree { + match input { + super::TokenTree::Group(g) => host::TokenTree::Group(host::Group { + delimiter: match g.delimiter { + super::Delimiter::Parenthesis => host::Delimiter::Parenthesis, + super::Delimiter::Brace => host::Delimiter::Brace, + super::Delimiter::Bracket => host::Delimiter::Bracket, + super::Delimiter::None => host::Delimiter::None, + }, + stream: g.stream, + span: host::DelimSpan { + open: g.span.open.0, + close: g.span.close.0, + entire: g.span.entire.0, + }, + }), + super::TokenTree::Punct(p) => { + host::TokenTree::Punct(host::Punct { ch: p.ch, joint: p.joint, span: p.span.0 }) + } + super::TokenTree::Ident(i) => host::TokenTree::Ident(host::Ident { + sym: i.sym.to_string(), + is_raw: i.is_raw, + span: i.span.0, + }), + super::TokenTree::Literal(l) => host::TokenTree::Literal(host::Literal { + kind: Decode::convert(l.kind), + span: l.span.0, + suffix: l.suffix.map(|s| s.to_string()), + symbol: l.symbol.to_string(), + }), + } + } +} + +impl Decode> for Option { + fn convert(input: Self) -> Option { + input + } +} + +impl Decode> for Vec> { + fn convert(input: Self) -> Vec { + input.into_iter().map(Decode::convert).collect() + } +} + +macro_rules! wasm { + ( + $(fn $method:ident($($arg:ident: $arg_ty:ty),* $(,)?) $(-> $ret_ty:ty)?;)* + ) => { + impl Methods { + $( + pub(crate) fn $method($($arg: $arg_ty),*) $(-> $ret_ty)* { + Encode::convert(host::$method($(Decode::convert($arg),)+)) + } + )* + } + } +} + +mod api_instantiated { + use std::ops::{Bound, Range}; + + use super::{Decode, Encode, Span, TokenStream, host}; + use crate::bridge::symbol::Symbol; + use crate::bridge::{Diagnostic, Literal, Methods, TokenTree}; + + with_api!(wasm, TokenStream, Span, Symbol); +} diff --git a/library/proc_macro/src/bridge/mod.rs b/library/proc_macro/src/bridge/mod.rs index 8b60043f5dc2a..7cfabba98b4bc 100644 --- a/library/proc_macro/src/bridge/mod.rs +++ b/library/proc_macro/src/bridge/mod.rs @@ -7,6 +7,7 @@ //! Rust ABIs (e.g., stage0/bin/rustc vs stage1/bin/rustc during bootstrap). #![deny(unsafe_code)] +#![cfg_attr(target_family = "wasm", allow(unused))] use std::hash::Hash; use std::marker; @@ -87,37 +88,54 @@ pub(crate) struct Methods; #[allow(unsafe_code)] mod arena; #[allow(unsafe_code)] +#[cfg(not(target_family = "wasm"))] mod buffer; #[deny(unsafe_code)] +#[cfg_attr(target_family = "wasm", path = "client_wasi.rs")] +#[cfg_attr(not(target_family = "wasm"), path = "client.rs")] pub mod client; #[allow(unsafe_code)] +#[cfg(not(target_family = "wasm"))] mod closure; #[forbid(unsafe_code)] mod fxhash; #[forbid(unsafe_code)] +#[cfg(not(target_family = "wasm"))] mod handle; #[macro_use] #[forbid(unsafe_code)] +#[cfg(not(target_family = "wasm"))] mod rpc; #[forbid(unsafe_code)] mod panic_message; #[allow(unsafe_code)] +#[cfg(not(target_family = "wasm"))] mod selfless_reify; #[forbid(unsafe_code)] +#[cfg(not(target_family = "wasm"))] pub mod server; #[allow(unsafe_code)] mod symbol; +#[cfg(not(target_family = "wasm"))] use buffer::Buffer; +#[cfg(not(target_family = "wasm"))] pub use panic_message::PanicMessage; +#[cfg(not(target_family = "wasm"))] use rpc::{Decode, Encode}; +#[cfg(target_family = "wasm")] +macro_rules! rpc_encode_decode { + ($($t:tt)*) => {}; +} + /// Configuration for establishing an active connection between a server and a /// client. The server creates the bridge config (`run_server` in `server.rs`), /// then passes it to the client through the function pointer in the `run` field /// of `client::Client`. The client constructs a local `Bridge` from the config /// in TLS during its execution (`Bridge::{enter, with}` in `client.rs`). #[repr(C)] +#[cfg(not(target_family = "wasm"))] pub struct BridgeConfig<'a> { /// Buffer used to pass initial input to the client. input: Buffer, @@ -129,7 +147,9 @@ pub struct BridgeConfig<'a> { force_show_panics: bool, } +#[cfg(not(target_family = "wasm"))] impl !Send for BridgeConfig<'_> {} +#[cfg(not(target_family = "wasm"))] impl !Sync for BridgeConfig<'_> {} macro_rules! declare_tags { @@ -140,6 +160,7 @@ macro_rules! declare_tags { pub(super) enum ApiTags { $($method),* } + #[cfg(not(target_family = "wasm"))] rpc_encode_decode!(enum ApiTags { $($method),* }); } } @@ -323,7 +344,9 @@ macro_rules! mark_compound { macro_rules! compound_traits { ($($t:tt)*) => { + #[cfg(not(target_family = "wasm"))] rpc_encode_decode!($($t)*); + #[cfg(not(target_family = "wasm"))] mark_compound!($($t)*); }; } diff --git a/library/proc_macro/src/bridge/panic_message.rs b/library/proc_macro/src/bridge/panic_message.rs index a91bdddea576c..f1ecbf4fa4c56 100644 --- a/library/proc_macro/src/bridge/panic_message.rs +++ b/library/proc_macro/src/bridge/panic_message.rs @@ -1,5 +1,6 @@ use std::any::Any; +#[cfg(not(target_family = "wasm"))] use crate::bridge::{Buffer, Decode, Encode}; /// Simplified version of panic payloads, ignoring @@ -53,6 +54,7 @@ impl PanicMessage { } } +#[cfg(not(target_family = "wasm"))] impl Encode for PanicMessage { #[inline] fn encode(self, w: &mut Buffer, s: &mut S) { @@ -60,6 +62,7 @@ impl Encode for PanicMessage { } } +#[cfg(not(target_family = "wasm"))] impl Decode<'_, '_, S> for PanicMessage { #[inline] fn decode(r: &mut &[u8], s: &mut S) -> Self { diff --git a/library/proc_macro/src/bridge/server.rs b/library/proc_macro/src/bridge/server.rs index ff525c6cd7735..537b8f6d6dba0 100644 --- a/library/proc_macro/src/bridge/server.rs +++ b/library/proc_macro/src/bridge/server.rs @@ -3,9 +3,9 @@ use std::cell::Cell; use std::hash::Hash; use std::ops::{Bound, Range}; +use std::panic; use std::sync::atomic::AtomicU32; use std::sync::mpsc; -use std::{panic, thread}; use crate::bridge::{ ApiTags, BridgeConfig, Buffer, Decode, Diagnostic, Encode, ExpnGlobals, Literal, Mark, Marked, @@ -113,7 +113,7 @@ macro_rules! define_dispatcher { // If client and server happen to use the same `std`, // `catch_unwind` asserts that the panic counter was 0, // even when the closure passed to it didn't panic. - let r = if thread::panicking() { + let r = if std::thread::panicking() { Ok(call_method()) } else { panic::catch_unwind(panic::AssertUnwindSafe(call_method)) @@ -194,7 +194,7 @@ impl ExecutionStrategy for MaybeCrossThread { if self.cross_thread || ALREADY_RUNNING_SAME_THREAD.get() { let (mut server, mut client) = MessagePipe::new(); - let join_handle = thread::spawn(move || { + let join_handle = std::thread::spawn(move || { let mut dispatch = |b: Buffer| -> Buffer { client.send(b); client.recv().expect("server died while client waiting for reply") diff --git a/library/proc_macro/src/bridge/symbol.rs b/library/proc_macro/src/bridge/symbol.rs index 1e632489f31e1..157beaac03ead 100644 --- a/library/proc_macro/src/bridge/symbol.rs +++ b/library/proc_macro/src/bridge/symbol.rs @@ -13,7 +13,9 @@ use std::cell::RefCell; use std::fmt; use std::num::NonZero; -use crate::bridge::{Buffer, Decode, Encode, Mark, arena, client, fxhash, server}; +#[cfg(not(target_family = "wasm"))] +use crate::bridge::{Buffer, Decode, Encode, Mark, server}; +use crate::bridge::{arena, client, fxhash}; /// Handle for a symbol string stored within the Interner. #[derive(Copy, Clone, PartialEq, Eq, Hash)] @@ -59,6 +61,7 @@ impl Symbol { /// Clear out the thread-local symbol interner, making all previously /// created symbols invalid such that `with` will panic when called on them. + #[cfg(not(target_family = "wasm"))] pub(crate) fn invalidate_all() { INTERNER.with_borrow_mut(|i| i.clear()); } @@ -94,24 +97,28 @@ impl fmt::Display for Symbol { } } +#[cfg(not(target_family = "wasm"))] impl Encode for Symbol { fn encode(self, w: &mut Buffer, s: &mut S) { self.with(|sym| sym.encode(w, s)) } } +#[cfg(not(target_family = "wasm"))] impl Decode<'_, '_, server::HandleStore> for server::MarkedSymbol { fn decode(r: &mut &[u8], s: &mut server::HandleStore) -> Self { Mark::mark(S::intern_symbol(<&str>::decode(r, s))) } } +#[cfg(not(target_family = "wasm"))] impl Encode> for server::MarkedSymbol { fn encode(self, w: &mut Buffer, s: &mut server::HandleStore) { S::with_symbol_string(&self.unmark(), |sym| sym.encode(w, s)) } } +#[cfg(not(target_family = "wasm"))] impl Decode<'_, '_, S> for Symbol { fn decode(r: &mut &[u8], s: &mut S) -> Self { Symbol::new(<&str>::decode(r, s)) @@ -178,6 +185,7 @@ impl Interner { /// Clear all symbols from the store, invalidating them such that `get` will /// panic if they are accessed in the future. + #[cfg(not(target_family = "wasm"))] fn clear(&mut self) { // NOTE: Be careful not to panic here, as we may be called on the client // when a `catch_unwind` isn't installed. diff --git a/library/proc_macro/src/lib.rs b/library/proc_macro/src/lib.rs index 2cba4b52fc276..30c988846ddfa 100644 --- a/library/proc_macro/src/lib.rs +++ b/library/proc_macro/src/lib.rs @@ -23,12 +23,12 @@ #![feature(allow_internal_unstable)] #![feature(decl_macro)] #![feature(negative_impls)] -#![feature(panic_can_unwind)] +#![cfg_attr(not(target_family = "wasm"), feature(panic_can_unwind))] #![feature(restricted_std)] #![feature(rustc_attrs)] #![feature(extend_one)] -#![feature(mem_conjure_zst)] #![feature(f16)] +#![cfg_attr(not(target_family = "wasm"), feature(mem_conjure_zst))] #![recursion_limit = "256"] #![allow(internal_features)] #![deny(ffi_unwind_calls)] @@ -45,7 +45,6 @@ mod diagnostic; mod escape; mod to_tokens; -use core::convert::From; use core::ops::BitOr; use std::borrow::Cow; use std::ffi::CStr; @@ -54,6 +53,31 @@ use std::path::PathBuf; use std::str::FromStr; use std::{error, fmt}; +#[cfg(target_family = "wasm")] +#[unstable(feature = "proc_macro_internals", issue = "none")] +#[doc(hidden)] +#[allow(unreachable_pub)] +pub mod wasi_bindgen { + // There's a cli (wit-bindgen-cli) that can be used to do this instead of this rustc internal + // macro, but then we'd need to check in the output and setup tidy to enforce it's always been + // run. Since the majority of these dependencies are part of the rustc closure anyway (from + // wasmtime::bindgen's own parsing of the same wit file), we went with this builtin macro hack. + // + // Note that even if we could use the macro directly we'd still need some post-processing (or + // upstream a change to the macro to add an option / gate on cfg), see the string replacement + // done on the internal macro's implementation for details. + // + // Note also that if this used a normal proc macro we'd also need to worry about downstream user + // code supporting cross-compilation (notably to wasm, since that's not a host target). + #[allow_internal_unstable(proc_macro_internals)] + #[rustc_builtin_macro] + macro internal_wit_bindgen($($t:tt)*) { + /* compiler built-in */ + } + + internal_wit_bindgen!(); +} + #[unstable(feature = "proc_macro_diagnostic", issue = "54140")] pub use diagnostic::{Diagnostic, Level, MultiSpan}; use rustc_literal_escaper::{ @@ -427,7 +451,7 @@ impl ConcatTreesHelper { if self.trees.is_empty() { return; } - stream.0 = Some(BridgeMethods::ts_concat_trees(stream.0.take(), self.trees)) + stream.0 = Some(BridgeMethods::ts_concat_trees(stream.0.take(), self.trees)); } } diff --git a/library/proc_macro/wasm-interface.wit b/library/proc_macro/wasm-interface.wit new file mode 100644 index 0000000000000..2e826d2dbfe49 --- /dev/null +++ b/library/proc_macro/wasm-interface.wit @@ -0,0 +1,176 @@ +package rust-lang:rust; + +interface host { + resource token-stream { + constructor(); + } + + type symbol = string; + + enum bound { + included, + excluded, + unbounded, + } + + record range-bound { + value: u64, + bound: bound, + } + + record span { + inner: u64 + } + + span-is-same: func(a: span, b: span) -> bool; + span-def-site: func() -> span; + span-call-site: func() -> span; + span-mixed-site: func() -> span; + span-parent: func(sp: span) -> option; + span-source: func(sp: span) -> span; + // -> Range (start, end) + span-byte-range: func(sp: span) -> tuple; + span-debug: func(sp: span) -> string; + span-line: func(sp: span) -> u64; + span-column: func(sp: span) -> u64; + span-file: func(sp: span) -> string; + span-local-file: func(sp: span) -> option; + span-start: func(sp: span) -> span; + span-end: func(sp: span) -> span; + span-join: func(sp: span, other: span) -> option; + span-source-text: func(sp: span) -> option; + span-resolved-at: func(sp: span, other: span) -> span; + span-subspan: func(sp: span, start: range-bound, end: range-bound) -> option; + span-save-span: func(sp: span) -> u64; + span-recover-proc-macro-span: func(id: u64) -> span; + + record delim-span { + open: span, + close: span, + entire: span, + } + + enum delimiter { + parenthesis, + brace, + bracket, + none, + } + + record group { + delimiter: delimiter, + %stream: option, + span: delim-span, + } + + record punct { + ch: u8, + joint: bool, + span: span, + } + + record ident { + sym: symbol, + is-raw: bool, + span: span, + } + + record literal { + kind: literal-kind, + symbol: symbol, + suffix: option, + span: span, + } + + variant literal-kind { + byte, + %char, + integer, + float, + str, + str-raw(u8), + byte-str, + byte-str-raw(u8), + c-str, + c-str-raw(u8), + // This should have an `ErrorGuaranteed`, except that type isn't available + // in this crate. (Imagine it is there.) Hence the `WithGuar` suffix. Must + // only be constructed in `LitKind::from_internal`, where an + // `ErrorGuaranteed` is available. + err-with-guar, + } + + variant token-tree { + group(group), + punct(punct), + ident(ident), + literal(literal), + } + + enum level { + error, + warning, + note, + help, + } + + record diagnostic-inner { + level: level, + message: string, + spans: list, + children: list, + } + + resource diagnostic { + constructor(d: diagnostic-inner); + } + + emit-diagnostic: func(diag: diagnostic); + literal-from-str: func(s: string) -> result; + symbol-normalize-and-validate-ident: func(s: string) -> result; + + injected-env-var: func(k: string) -> option; + track-env-var: func(k: string, v: option); + track-path: func(path: string); + + // Today we don't report additional metadata but we could. + // Returns whether or not to also emit the panic to stderr (via the default panic hook). + report-panic: func(msg: option) -> bool; + + ts-drop: func(ts: token-stream); + ts-clone: func(ts: borrow) -> token-stream; + ts-is-empty: func(ts: borrow) -> bool; + ts-expand-expr: func(ts: borrow) -> result; + ts-from-str: func(src: string) -> result; + ts-to-string: func(ts: borrow) -> string; + ts-from-token-tree: func(tt: token-tree) -> token-stream; + ts-concat-trees: func(base: option, trees: list) -> token-stream; + ts-concat-streams: func(base: option, trees: list) -> token-stream; + ts-into-trees: func(ts: token-stream) -> list; +} + +interface custom-derive { + use host.{token-stream}; + + enum derive-kind { + expand1, + expand2, + } + + resource custom-derive { + get-kind: func() -> derive-kind; + + // for derive and bang macros + expand1: func(tokens: token-stream) -> token-stream; + + // defined for attr macros only + expand2: func(tokens: token-stream, tokens2: token-stream) -> token-stream; + } + + get-custom-derives: func() -> list; +} + +world proc-macro { + import host; + export custom-derive; +} diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 697f659816120..b782a93246f79 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -2193,6 +2193,14 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the builder.ensure(compile::Rustc::new(test_compiler, target)); } + // Build the standard library for wasm32-wasip2 (current target for wasm proc macros). + if builder.config.wasm_proc_macro { + builder.ensure(compile::Std::new( + test_compiler, + TargetSelection::from_user("wasm32-wasip2"), + )); + } + if suite == "debuginfo" { builder.ensure(dist::DebuggerScripts { sysroot: builder.sysroot(test_compiler).to_path_buf(), @@ -2242,6 +2250,10 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the let is_rustdoc = suite == "rustdoc-ui" || suite == "rustdoc-js"; + if builder.config.wasm_proc_macro { + cmd.arg("--wasm-proc-macro"); + } + // There are (potentially) 2 `cargo`s to consider: // // - A "bootstrap" cargo, which is the same cargo used to build bootstrap itself, and is diff --git a/src/bootstrap/src/core/config/config.rs b/src/bootstrap/src/core/config/config.rs index 267e21c599728..88bb1bcc9d47a 100644 --- a/src/bootstrap/src/core/config/config.rs +++ b/src/bootstrap/src/core/config/config.rs @@ -335,6 +335,8 @@ pub struct Config { pub skip_std_check_if_no_download_rustc: bool, pub exec_ctx: ExecutionContext, + + pub wasm_proc_macro: bool, } impl Config { @@ -595,6 +597,7 @@ impl Config { std_features: rust_std_features, break_on_ice: rust_break_on_ice, rustflags: rust_rustflags, + wasm_proc_macro, } = toml.rust.unwrap_or_default(); let Llvm { @@ -1538,6 +1541,7 @@ NOTE: Please add `--stage 2` to your command line, or if you're sure you want to .unwrap_or(rust_debug == Some(true)), vendor, verbose_tests, + wasm_proc_macro: wasm_proc_macro.unwrap_or(false), windows_rc: build_windows_rc.map(PathBuf::from), yarn: build_yarn.map(PathBuf::from), // tidy-alphabetical-end diff --git a/src/bootstrap/src/core/config/toml/rust.rs b/src/bootstrap/src/core/config/toml/rust.rs index 2facf839521d3..15963f3514d7c 100644 --- a/src/bootstrap/src/core/config/toml/rust.rs +++ b/src/bootstrap/src/core/config/toml/rust.rs @@ -73,6 +73,7 @@ define_config! { std_features: Option> = "std-features", break_on_ice: Option = "break-on-ice", parallel_frontend_threads: Option = "parallel-frontend-threads", + wasm_proc_macro: Option = "wasm-proc-macro", } } @@ -380,6 +381,7 @@ pub fn check_incompatible_options_for_ci_rustc( bootstrap_override_lld: _, bootstrap_override_lld_legacy: _, rustflags: _, + wasm_proc_macro: _, } = ci_rust_config; // There are two kinds of checks for CI rustc incompatible options: diff --git a/src/bootstrap/src/utils/cc_detect.rs b/src/bootstrap/src/utils/cc_detect.rs index 1ab2b92070c93..12ee71ea0b349 100644 --- a/src/bootstrap/src/utils/cc_detect.rs +++ b/src/bootstrap/src/utils/cc_detect.rs @@ -71,7 +71,7 @@ fn new_cc_build(build: &Build, target: TargetSelection) -> cc::Build { /// by combining the primary build target, host targets, and any additional targets. For /// each target, it calls [`fill_target_compiler`] to configure the necessary compiler tools. pub fn fill_compilers(build: &mut Build) { - let targets: HashSet<_> = match build.config.cmd { + let mut targets: HashSet<_> = match build.config.cmd { // We don't need to check cross targets for these commands. crate::Subcommand::Clean { .. } | crate::Subcommand::Check { .. } @@ -93,7 +93,14 @@ pub fn fill_compilers(build: &mut Build) { } }; - for target in targets.into_iter() { + // When we intend to build wasm proc macros, we'll need to detect a toolchain for linking those + // as well. In the future it would be good to make this a no-op given that we shouldn't need to + // build any C/C++ code for wasm... + if build.config.wasm_proc_macro { + targets.insert(TargetSelection::from_user("wasm32-wasip2")); + } + + for target in targets { fill_target_compiler(build, target); } } diff --git a/src/bootstrap/src/utils/proc_macro_deps.rs b/src/bootstrap/src/utils/proc_macro_deps.rs index 6dde0ae28064b..626255f67ebd9 100644 --- a/src/bootstrap/src/utils/proc_macro_deps.rs +++ b/src/bootstrap/src/utils/proc_macro_deps.rs @@ -76,6 +76,8 @@ pub static CRATES: &[&str] = &[ "wasm-encoder", "wasm-metadata", "wasmparser", + "wasmtime-internal-component-util", + "wasmtime-internal-wit-bindgen", "winnow", "wit-bindgen-core", "wit-bindgen-rust", diff --git a/src/doc/unstable-book/src/compiler-flags/wasm-proc-macros.md b/src/doc/unstable-book/src/compiler-flags/wasm-proc-macros.md new file mode 100644 index 0000000000000..1f47f4373968e --- /dev/null +++ b/src/doc/unstable-book/src/compiler-flags/wasm-proc-macros.md @@ -0,0 +1,8 @@ +# `wasm-proc-macros` + +This option controls whether to enable support for compiling and loading +`--crate-type=proc-macro` to/from WASM rather than the normal host dylib target. + +Currently we expect that proc macros are compiled to the `wasm32-wasip2` +target. The exact target will likely change in the future. When this flag is +passed, both regular dylib proc macros and wasm proc macros are supported. diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 1cf9c94a11721..dc3287b02c925 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -772,6 +772,8 @@ pub(crate) struct Config { pub(crate) parallel_frontend_threads: u32, /// Number of times to execute each test. pub(crate) iteration_count: u32, + + pub(crate) wasm_proc_macro: bool, } impl Config { diff --git a/src/tools/compiletest/src/directives/cfg.rs b/src/tools/compiletest/src/directives/cfg.rs index 25ebb86ad28d3..3acf100aa49ef 100644 --- a/src/tools/compiletest/src/directives/cfg.rs +++ b/src/tools/compiletest/src/directives/cfg.rs @@ -209,6 +209,12 @@ pub(crate) fn prepare_conditions(config: &Config) -> PreparedConditions { "when std is built with remapping of debuginfo", ); + builder.cond( + "wasm-proc-macro", + config.wasm_proc_macro, + "when wasm-proc-macro is enabled in bootstrap.toml", + ); + for &debugger in Debugger::STR_VARIANTS { builder.cond( debugger, diff --git a/src/tools/compiletest/src/directives/directive_names.rs b/src/tools/compiletest/src/directives/directive_names.rs index 70901f5b84c56..0ca2c8f50ad0a 100644 --- a/src/tools/compiletest/src/directives/directive_names.rs +++ b/src/tools/compiletest/src/directives/directive_names.rs @@ -136,6 +136,7 @@ pub(crate) const KNOWN_DIRECTIVE_NAMES: &[&str] = &[ "ignore-vxworks", "ignore-wasi", "ignore-wasm", + "ignore-wasm-proc-macro", "ignore-wasm32", "ignore-wasm32-unknown-unknown", "ignore-wasm64", @@ -264,6 +265,7 @@ pub(crate) const KNOWN_DIRECTIVE_NAMES: &[&str] = &[ "only-uefi", "only-unix", "only-visionos", + "only-wasm-proc-macro", "only-wasm32", "only-wasm32-unknown-emscripten", "only-wasm32-unknown-unknown", diff --git a/src/tools/compiletest/src/lib.rs b/src/tools/compiletest/src/lib.rs index 0836caa590f81..3f3242d75367e 100644 --- a/src/tools/compiletest/src/lib.rs +++ b/src/tools/compiletest/src/lib.rs @@ -234,7 +234,8 @@ fn parse_config(args: Vec) -> Config { "number of parallel threads to use for the frontend when building test artifacts", "THREADS_COUNT", ) - .optopt("", "iteration-count", "number of times to execute each test", "COUNT"); + .optopt("", "iteration-count", "number of times to execute each test", "COUNT") + .optflag("", "wasm-proc-macro", "compile proc macros for wasm"); let (argv0, args_) = args.split_first().unwrap(); if args.len() == 1 || args[1] == "-h" || args[1] == "--help" { @@ -523,6 +524,7 @@ fn parse_config(args: Vec) -> Config { parallel_frontend_threads, iteration_count, + wasm_proc_macro: matches.opt_present("wasm-proc-macro"), } } diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 4243c60001244..7db44af0c1f0b 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -90,7 +90,7 @@ fn disable_error_reporting R, R>(f: F) -> R { } /// The platform-specific library name -fn get_lib_name(name: &str, aux_type: AuxType) -> Option { +fn get_lib_name(name: &str, aux_type: AuxType, wasm_proc_macro: bool) -> Option { match aux_type { AuxType::Bin => None, // In some cases (e.g. MUSL), we build a static @@ -98,6 +98,7 @@ fn get_lib_name(name: &str, aux_type: AuxType) -> Option { // In this case, the only path we can pass // with '--extern-meta' is the '.rlib' file AuxType::Lib => Some(format!("lib{name}.rlib")), + AuxType::ProcMacro if wasm_proc_macro => Some(format!("lib{name}.wasm")), AuxType::Dylib | AuxType::ProcMacro => Some(dylib_name(name)), } } @@ -1251,7 +1252,8 @@ impl<'test> TestCx<'test> { aux_name: &str, aux_path: &str, aux_type: AuxType| { - let lib_name = get_lib_name(&path_to_crate_name(aux_path), aux_type); + let lib_name = + get_lib_name(&path_to_crate_name(aux_path), aux_type, self.config.wasm_proc_macro); if let Some(lib_name) = lib_name { let modifiers_and_name = match extern_modifiers { Some(modifiers) => format!("{modifiers}:{aux_name}"), @@ -1282,7 +1284,11 @@ impl<'test> TestCx<'test> { // to `-Zcodegen-backend` when compiling the test file. if let Some(aux_file) = &self.props.aux.codegen_backend { let aux_type = self.build_auxiliary(aux_file, aux_dir, None); - if let Some(lib_name) = get_lib_name(aux_file.trim_end_matches(".rs"), aux_type) { + if let Some(lib_name) = get_lib_name( + aux_file.trim_end_matches(".rs"), + aux_type, + self.config.wasm_proc_macro, + ) { let lib_path = aux_dir.join(&lib_name); rustc.arg(format!("-Zcodegen-backend={}", lib_path)); } @@ -1353,7 +1359,27 @@ impl<'test> TestCx<'test> { let aux_path = self.resolve_aux_path(source_path); let mut aux_props = self.props.from_aux_file(&aux_path, self.revision, self.config); if aux_type == Some(AuxType::ProcMacro) { - aux_props.force_host = true; + if self.config.wasm_proc_macro { + aux_props.compile_flags.push("--target=wasm32-wasip2".to_owned()); + // Override any earlier linkers for now, otherwise we fail to build since compiletest + // thinks we're building for a different target and passes its linker (if one is + // configured). + // + // wasm32-wasip2 should in principle always be able to link with wasm-component-ld + + // wasm-ld. This does mean that rust.lld needs to be enabled to build wasm-ld wrapper + // around rust-lld. + aux_props.compile_flags.push("-Clinker=wasm-component-ld".to_owned()); + aux_props.compile_flags.push(format!( + "-Clink-arg=--wasm-ld-path={}", + self.config + .sysroot_base + .join("lib/rustlib") + .join(&self.config.host) + .join("bin/gcc-ld/wasm-ld") + )); + } else { + aux_props.force_host = true; + } } let mut aux_dir = aux_dir.to_path_buf(); if aux_type == Some(AuxType::Bin) { @@ -1581,6 +1607,11 @@ impl<'test> TestCx<'test> { // Use a single thread for efficiency and a deterministic error message order compiler.arg("-Zthreads=1"); + // Enable wasm proc macros. + if self.config.wasm_proc_macro { + compiler.arg("-Zwasm-proc-macros"); + } + // Hide libstd sources from ui tests to make sure we generate the stderr // output that users will see. // Without this, we may be producing good diagnostics in-tree but users diff --git a/src/tools/compiletest/src/rustdoc_gui_test.rs b/src/tools/compiletest/src/rustdoc_gui_test.rs index 57ce0c5a6d5f7..3b9cb9a9aa6fe 100644 --- a/src/tools/compiletest/src/rustdoc_gui_test.rs +++ b/src/tools/compiletest/src/rustdoc_gui_test.rs @@ -143,5 +143,6 @@ fn incomplete_config_for_rustdoc_gui_test() -> Config { jobs: Default::default(), parallel_frontend_threads: Config::DEFAULT_PARALLEL_FRONTEND_THREADS, iteration_count: Config::DEFAULT_ITERATION_COUNT, + wasm_proc_macro: false, } } diff --git a/src/tools/rust-analyzer/crates/proc-macro-srv/src/dylib/proc_macros.rs b/src/tools/rust-analyzer/crates/proc-macro-srv/src/dylib/proc_macros.rs index 4976298d5fcd1..f5b7a87d7a11c 100644 --- a/src/tools/rust-analyzer/crates/proc-macro-srv/src/dylib/proc_macros.rs +++ b/src/tools/rust-analyzer/crates/proc-macro-srv/src/dylib/proc_macros.rs @@ -2,6 +2,7 @@ use crate::{ ProcMacroClientHandle, ProcMacroKind, ProcMacroSrvSpan, TrackedEnv, token_stream::TokenStream, }; +use rustc_expand::wasm_proc_macro::RustcProcMacro; use rustc_proc_macro::bridge; impl From for crate::PanicMessage { @@ -10,12 +11,10 @@ impl From for crate::PanicMessage { } } -pub(crate) struct ProcMacros(Vec<(bridge::client::Client, rustc_metadata::ProcMacroKind)>); +pub(crate) struct ProcMacros(Vec<(RustcProcMacro, rustc_metadata::ProcMacroKind)>); impl ProcMacros { - pub(super) fn new( - macros: Vec<(bridge::client::Client, rustc_metadata::ProcMacroKind)>, - ) -> Self { + pub(super) fn new(macros: Vec<(RustcProcMacro, rustc_metadata::ProcMacroKind)>) -> Self { ProcMacros(macros) } @@ -33,6 +32,9 @@ impl ProcMacros { let parsed_attributes = attribute.unwrap_or_default(); for (client, kind) in &self.0 { + let RustcProcMacro::Dylib { client } = client else { + panic!("not yet implemented support for wasm proc macro, should reuse rustc impl"); + }; match kind { rustc_metadata::ProcMacroKind::CustomDerive { trait_name, .. } if trait_name.as_str() == macro_name => diff --git a/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs b/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs index 2a3a1bc002601..05874f7b87217 100644 --- a/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs +++ b/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs @@ -17,6 +17,7 @@ extern crate rustc_codegen_ssa; extern crate rustc_driver as _; +extern crate rustc_expand; extern crate rustc_interface; extern crate rustc_lexer; extern crate rustc_metadata; diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index ebe3c04ea4cc4..ae608acc26593 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -287,29 +287,59 @@ const PERMITTED_RUSTC_DEPS_LOCATION: ListLocation = location!(+6); /// rustc. Please check with the compiler team before adding an entry. const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ // tidy-alphabetical-start + "addr2line", "adler2", "aho-corasick", "allocator-api2", // FIXME: only appears in Cargo.lock due to https://github.com/rust-lang/cargo/issues/10801 + "ambient-authority", + "android_system_properties", "annotate-snippets", "anstream", "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", + "anyhow", "ar_archive_writer", + "arbitrary", "arrayref", "arrayvec", + "async-trait", "bitflags", "blake3", "block-buffer", "block2", "bstr", + "bumpalo", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-primitives", + "cap-std", + "cap-time-ext", "cc", "cfg-if", "cfg_aliases", + "chacha20", + "cobs", "colorchoice", "constant_time_eq", + "core-foundation-sys", + "cpp_demangle", "cpufeatures", + "cranelift-assembler-x64", + "cranelift-assembler-x64-meta", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-isle", + "cranelift-native", + "cranelift-srcgen", "crc32fast", "crossbeam-deque", "crossbeam-epoch", @@ -329,7 +359,9 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "dyn-clone", "either", "elsa", + "embedded-io", "ena", + "encoding_rs", "equivalent", "errno", "expect-test", @@ -342,42 +374,71 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "fluent-syntax", "fnv", "foldhash", + "form_urlencoded", + "fs-set-times", + "futures", + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", "generic-array", "getopts", "getrandom", "gimli", "gsgdt", "hashbrown", + "heck", + "iana-time-zone", + "iana-time-zone-haiku", "icu_collections", "icu_list", "icu_locale", "icu_locale_core", "icu_locale_data", + "icu_normalizer", + "icu_normalizer_data", + "icu_properties", + "icu_properties_data", "icu_provider", + "id-arena", "ident_case", + "idna", + "idna_adapter", "indexmap", "intl-memoizer", "intl_pluralrules", + "io-extras", + "io-lifetimes", + "ipnet", "is_terminal_polyfill", "itertools", "itoa", "jiff", "jiff-static", "jobserver", + "js-sys", "lazy_static", "leb128", + "leb128fmt", "libc", "libloading", + "libm", "linux-raw-sys", "litemap", "lock_api", "log", + "mach2", "matchers", + "maybe-owned", "md-5", "measureme", "memchr", + "memfd", "memmap2", "miniz_oxide", + "mio", "nix", "nu-ansi-term", "objc2", @@ -389,18 +450,23 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "parking_lot", "parking_lot_core", "pathdiff", + "percent-encoding", "perf-event-open-sys", "pin-project-lite", "polonius-engine", "portable-atomic", // dependency for platforms doesn't support `AtomicU64` in std "portable-atomic-util", + "postcard", "potential_utf", "ppv-lite86", + "prettyplease", "proc-macro-hack", "proc-macro2", "psm", "pulldown-cmark", "pulldown-cmark-escape", + "pulley-interpreter", + "pulley-macros", "punycode", "quote", "r-efi", @@ -412,6 +478,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "redox_syscall", "ref-cast", "ref-cast-impl", + "regalloc2", "regex", "regex-automata", "regex-syntax", @@ -421,6 +488,8 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "rustc-stable-hash", "rustc_apfloat", "rustix", + "rustix-linux-procfs", + "rustversion", "ruzstd", // via object in thorin-dwp "ryu", "schemars", @@ -428,6 +497,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "scoped-tls", "scopeguard", "self_cell", + "semver", "serde", "serde_core", "serde_derive", @@ -439,14 +509,18 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "sharded-slab", "shlex", "simd-adler32", + "slab", "smallvec", + "socket2", "stable_deref_trait", "stacker", "static_assertions", "strsim", "syn", "synstructure", + "target-lexicon", "tempfile", + "termcolor", "termize", "thin-vec", "thiserror", @@ -457,6 +531,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "tinystr", "tinyvec", "tinyvec_macros", + "tokio", "tracing", "tracing-attributes", "tracing-core", @@ -478,13 +553,38 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "unicode-script", "unicode-security", "unicode-width", + "unicode-xid", + "url", "utf8_iter", "utf8parse", "valuable", "version_check", "wasi", + "wasip2", + "wasip3", + "wasm-bindgen", + "wasm-bindgen-macro", + "wasm-bindgen-macro-support", + "wasm-bindgen-shared", "wasm-encoder", + "wasm-metadata", "wasmparser", + "wasmprinter", + "wasmtime", + "wasmtime-environ", + "wasmtime-internal-component-macro", + "wasmtime-internal-component-util", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "wasmtime-internal-wit-bindgen", + "wasmtime-wasi", + "wasmtime-wasi-io", + "winapi-util", "windows", "windows-collections", "windows-core", @@ -506,7 +606,14 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", + "winx", + "wit-bindgen", + "wit-bindgen-core", "wit-bindgen-rt@0.39.0", // pinned to a specific version due to using a binary blob: + "wit-bindgen-rust", + "wit-bindgen-rust-macro", + "wit-component", + "wit-parser", "writeable", "yoke", "yoke-derive", diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs index f1ac90ba0bc5e..c1a1c1346ed9b 100644 --- a/src/tools/tidy/src/pal.rs +++ b/src/tools/tidy/src/pal.rs @@ -62,6 +62,7 @@ const EXCEPTION_PATHS: &[&str] = &[ "library/std/src/lib.rs", // for miniz_oxide leaking docs, which itself workaround "library/std/src/path.rs", "library/std/src/io/error.rs", // Repr unpacked needed for UEFI + "library/proc_macro", // proc-macro wasm scatters cfgs throughout ]; pub fn check(library_path: &Path, tidy_ctx: TidyCtx) { diff --git a/tests/ui/print-request/supported-crate-types.wasm.stdout b/tests/ui/print-request/supported-crate-types.wasm.stdout index ca1de519598af..1ddfc8fd496d8 100644 --- a/tests/ui/print-request/supported-crate-types.wasm.stdout +++ b/tests/ui/print-request/supported-crate-types.wasm.stdout @@ -1,5 +1,6 @@ bin cdylib lib +proc-macro rlib staticlib diff --git a/tests/ui/proc-macro/auxiliary/make-macro.rs b/tests/ui/proc-macro/auxiliary/make-macro.rs index a0db47885a10d..aa60c9e9530d4 100644 --- a/tests/ui/proc-macro/auxiliary/make-macro.rs +++ b/tests/ui/proc-macro/auxiliary/make-macro.rs @@ -1,4 +1,7 @@ -//@ force-host +//@ revisions: wasm native +//@[wasm] compile-flags: --target=wasm32-wasip2 --crate-type=rlib +//@[wasm] needs-llvm-components: webassembly +//@[native] force-host #[macro_export] macro_rules! make_it { diff --git a/tests/ui/proc-macro/meta-macro-hygiene.native.stdout b/tests/ui/proc-macro/meta-macro-hygiene.native.stdout new file mode 100644 index 0000000000000..88a99b58ca5f8 --- /dev/null +++ b/tests/ui/proc-macro/meta-macro-hygiene.native.stdout @@ -0,0 +1,67 @@ +Def site: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) +Input: TokenStream [Ident { ident: "$crate", span: $DIR/meta-macro-hygiene.rs:29:37: 29:43 (#3) }, Punct { ch: ':', spacing: Joint, span: $DIR/meta-macro-hygiene.rs:29:43: 29:44 (#3) }, Punct { ch: ':', spacing: Alone, span: $DIR/meta-macro-hygiene.rs:29:44: 29:45 (#3) }, Ident { ident: "dummy", span: $DIR/meta-macro-hygiene.rs:29:45: 29:50 (#3) }, Punct { ch: '!', spacing: Alone, span: $DIR/meta-macro-hygiene.rs:29:50: 29:51 (#3) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: $DIR/meta-macro-hygiene.rs:29:51: 29:53 (#3) }] +Respanned: TokenStream [Ident { ident: "$crate", span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: ':', spacing: Joint, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: ':', spacing: Alone, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Ident { ident: "dummy", span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: '!', spacing: Alone, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }] +#![feature /* 0#0 */(prelude_import /* 0#0 */)] +//@ aux-build:make-macro.rs +//@ proc-macro: meta-macro.rs +//@ edition:2018 +//@ compile-flags: -Z span-debug -Z macro-backtrace -Z unpretty=expanded,hygiene -Z trim-diagnostic-paths=no +//@ check-pass +//@ revisions: wasm native +//@[wasm] only-wasm-proc-macro +//@[native] ignore-wasm-proc-macro +// ignore-tidy-linelength +//@ normalize-stdout: "\d+#" -> "0#" +//@ normalize-stdout: "expn\d{3,}" -> "expnNNN" +//@ normalize-stdout: "extern crate compiler_builtins /\* \d+ \*/" -> "extern crate compiler_builtins /* NNN */" +// +// We don't care about symbol ids, so we set them all to 0 +// in the stdout + +#![no_std /* 0#0 */] +extern crate core /* 0#1 */; +#[prelude_import /* 0#1 */] +use core /* 0#1 */::prelude /* 0#1 */::rust_2018 /* 0#1 */::*; +// Don't load unnecessary hygiene information from std +extern crate std /* 0#0 */; + +extern crate meta_macro /* 0#0 */; + +macro_rules! produce_it + /* + 0#0 + */ { + () => + { + meta_macro /* 0#0 */::print_def_site /* 0#0 + */!($crate /* 0#0 */::dummy /* 0#0 */!()); + // `print_def_site!` will respan the `$crate` identifier + // with `Span::def_site()`. This should cause it to resolve + // relative to `meta_macro`, *not* `make_macro` (despite + // the fact that `print_def_site` is produced by a + // `macro_rules!` macro in `make_macro`). + }; +} + +fn main /* 0#0 */() { ; } + +/* +Expansions: +crate0::{{expn0}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Root +crate0::{{expn1}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: AstPass(StdImports) +crate0::{{expn2}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Bang, "produce_it") +crate0::{{expn3}}: parent: crate0::{{expn2}}, call_site_ctxt: #3, def_site_ctxt: #0, kind: Macro(Bang, "meta_macro::print_def_site") +crate0::{{expn4}}: parent: crate0::{{expn3}}, call_site_ctxt: #4, def_site_ctxt: #0, kind: Macro(Bang, "$crate::dummy") + +SyntaxContexts: +#0: parent: #0, outer_mark: (crate0::{{expn0}}, Opaque) +#1: parent: #0, outer_mark: (crate0::{{expn1}}, Opaque) +#2: parent: #0, outer_mark: (crate0::{{expn1}}, Transparent) +#3: parent: #0, outer_mark: (crate0::{{expn2}}, SemiOpaque) +#4: parent: #0, outer_mark: (crate0::{{expn3}}, Opaque) +#5: parent: #3, outer_mark: (crate0::{{expn3}}, Transparent) +#6: parent: #0, outer_mark: (crate0::{{expn3}}, SemiOpaque) +#7: parent: #0, outer_mark: (crate0::{{expn4}}, Opaque) +#8: parent: #4, outer_mark: (crate0::{{expn4}}, Transparent) +#9: parent: #4, outer_mark: (crate0::{{expn4}}, SemiOpaque) +*/ diff --git a/tests/ui/proc-macro/meta-macro-hygiene.rs b/tests/ui/proc-macro/meta-macro-hygiene.rs index afe0e1fb601a1..3581f42b6f863 100644 --- a/tests/ui/proc-macro/meta-macro-hygiene.rs +++ b/tests/ui/proc-macro/meta-macro-hygiene.rs @@ -3,6 +3,9 @@ //@ edition:2018 //@ compile-flags: -Z span-debug -Z macro-backtrace -Z unpretty=expanded,hygiene -Z trim-diagnostic-paths=no //@ check-pass +//@ revisions: wasm native +//@[wasm] only-wasm-proc-macro +//@[native] ignore-wasm-proc-macro // ignore-tidy-linelength //@ normalize-stdout: "\d+#" -> "0#" //@ normalize-stdout: "expn\d{3,}" -> "expnNNN" diff --git a/tests/ui/proc-macro/meta-macro-hygiene.wasm.stdout b/tests/ui/proc-macro/meta-macro-hygiene.wasm.stdout new file mode 100644 index 0000000000000..88a99b58ca5f8 --- /dev/null +++ b/tests/ui/proc-macro/meta-macro-hygiene.wasm.stdout @@ -0,0 +1,67 @@ +Def site: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) +Input: TokenStream [Ident { ident: "$crate", span: $DIR/meta-macro-hygiene.rs:29:37: 29:43 (#3) }, Punct { ch: ':', spacing: Joint, span: $DIR/meta-macro-hygiene.rs:29:43: 29:44 (#3) }, Punct { ch: ':', spacing: Alone, span: $DIR/meta-macro-hygiene.rs:29:44: 29:45 (#3) }, Ident { ident: "dummy", span: $DIR/meta-macro-hygiene.rs:29:45: 29:50 (#3) }, Punct { ch: '!', spacing: Alone, span: $DIR/meta-macro-hygiene.rs:29:50: 29:51 (#3) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: $DIR/meta-macro-hygiene.rs:29:51: 29:53 (#3) }] +Respanned: TokenStream [Ident { ident: "$crate", span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: ':', spacing: Joint, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: ':', spacing: Alone, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Ident { ident: "dummy", span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Punct { ch: '!', spacing: Alone, span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#4) }] +#![feature /* 0#0 */(prelude_import /* 0#0 */)] +//@ aux-build:make-macro.rs +//@ proc-macro: meta-macro.rs +//@ edition:2018 +//@ compile-flags: -Z span-debug -Z macro-backtrace -Z unpretty=expanded,hygiene -Z trim-diagnostic-paths=no +//@ check-pass +//@ revisions: wasm native +//@[wasm] only-wasm-proc-macro +//@[native] ignore-wasm-proc-macro +// ignore-tidy-linelength +//@ normalize-stdout: "\d+#" -> "0#" +//@ normalize-stdout: "expn\d{3,}" -> "expnNNN" +//@ normalize-stdout: "extern crate compiler_builtins /\* \d+ \*/" -> "extern crate compiler_builtins /* NNN */" +// +// We don't care about symbol ids, so we set them all to 0 +// in the stdout + +#![no_std /* 0#0 */] +extern crate core /* 0#1 */; +#[prelude_import /* 0#1 */] +use core /* 0#1 */::prelude /* 0#1 */::rust_2018 /* 0#1 */::*; +// Don't load unnecessary hygiene information from std +extern crate std /* 0#0 */; + +extern crate meta_macro /* 0#0 */; + +macro_rules! produce_it + /* + 0#0 + */ { + () => + { + meta_macro /* 0#0 */::print_def_site /* 0#0 + */!($crate /* 0#0 */::dummy /* 0#0 */!()); + // `print_def_site!` will respan the `$crate` identifier + // with `Span::def_site()`. This should cause it to resolve + // relative to `meta_macro`, *not* `make_macro` (despite + // the fact that `print_def_site` is produced by a + // `macro_rules!` macro in `make_macro`). + }; +} + +fn main /* 0#0 */() { ; } + +/* +Expansions: +crate0::{{expn0}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Root +crate0::{{expn1}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: AstPass(StdImports) +crate0::{{expn2}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Bang, "produce_it") +crate0::{{expn3}}: parent: crate0::{{expn2}}, call_site_ctxt: #3, def_site_ctxt: #0, kind: Macro(Bang, "meta_macro::print_def_site") +crate0::{{expn4}}: parent: crate0::{{expn3}}, call_site_ctxt: #4, def_site_ctxt: #0, kind: Macro(Bang, "$crate::dummy") + +SyntaxContexts: +#0: parent: #0, outer_mark: (crate0::{{expn0}}, Opaque) +#1: parent: #0, outer_mark: (crate0::{{expn1}}, Opaque) +#2: parent: #0, outer_mark: (crate0::{{expn1}}, Transparent) +#3: parent: #0, outer_mark: (crate0::{{expn2}}, SemiOpaque) +#4: parent: #0, outer_mark: (crate0::{{expn3}}, Opaque) +#5: parent: #3, outer_mark: (crate0::{{expn3}}, Transparent) +#6: parent: #0, outer_mark: (crate0::{{expn3}}, SemiOpaque) +#7: parent: #0, outer_mark: (crate0::{{expn4}}, Opaque) +#8: parent: #4, outer_mark: (crate0::{{expn4}}, Transparent) +#9: parent: #4, outer_mark: (crate0::{{expn4}}, SemiOpaque) +*/ diff --git a/tests/ui/proc-macro/meta-macro.native.stdout b/tests/ui/proc-macro/meta-macro.native.stdout new file mode 100644 index 0000000000000..191876197156f --- /dev/null +++ b/tests/ui/proc-macro/meta-macro.native.stdout @@ -0,0 +1,3 @@ +Def site: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#3) +Input: TokenStream [] +Respanned: TokenStream [] diff --git a/tests/ui/proc-macro/meta-macro.rs b/tests/ui/proc-macro/meta-macro.rs index 02ef45c0c21f5..a04dafc5908be 100644 --- a/tests/ui/proc-macro/meta-macro.rs +++ b/tests/ui/proc-macro/meta-macro.rs @@ -3,6 +3,9 @@ //@ edition:2018 //@ compile-flags: -Z span-debug //@ run-pass +//@ revisions: wasm native +//@[wasm] only-wasm-proc-macro +//@[native] ignore-wasm-proc-macro #![no_std] // Don't load unnecessary hygiene information from std extern crate std; diff --git a/tests/ui/proc-macro/meta-macro.wasm.stdout b/tests/ui/proc-macro/meta-macro.wasm.stdout new file mode 100644 index 0000000000000..191876197156f --- /dev/null +++ b/tests/ui/proc-macro/meta-macro.wasm.stdout @@ -0,0 +1,3 @@ +Def site: $DIR/auxiliary/make-macro.rs:10:9: 10:56 (#3) +Input: TokenStream [] +Respanned: TokenStream [] From fc88e25b18d3424c31a23c995738d592fccbca15 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Thu, 9 Jul 2026 08:29:47 -0400 Subject: [PATCH 5/5] fix duplicate rustc_driver --- Cargo.lock | 3 +++ compiler/rustc/Cargo.toml | 2 ++ compiler/rustc_driver_impl/Cargo.toml | 3 +++ compiler/rustc_driver_impl/src/lib.rs | 2 ++ 4 files changed, 10 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ef7bf4ffc9883..2b0ab287cf297 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3967,6 +3967,7 @@ name = "rustc-main" version = "0.0.0" dependencies = [ "getrandom 0.3.3", + "proc-macro2", "rustc_codegen_ssa", "rustc_driver", "rustc_driver_impl", @@ -4354,6 +4355,7 @@ dependencies = [ "ctrlc", "jiff", "libc", + "quote", "rustc_abi", "rustc_ast", "rustc_ast_pretty", @@ -4382,6 +4384,7 @@ dependencies = [ "rustc_target", "serde_json", "shlex", + "syn", "tracing", "windows 0.61.3", ] diff --git a/compiler/rustc/Cargo.toml b/compiler/rustc/Cargo.toml index 8cef9e0644bb0..ce569dc1bda35 100644 --- a/compiler/rustc/Cargo.toml +++ b/compiler/rustc/Cargo.toml @@ -20,6 +20,8 @@ rustc_public = { path = "../rustc_public" } rustc_public_bridge = { path = "../rustc_public_bridge" } # tidy-alphabetical-end +proc-macro2 = { version = "1", features = ["proc-macro"] } + # Pin these to avoid pulling in a package with a binary blob # [target.'cfg(target_os = "wasi")'.dependencies] diff --git a/compiler/rustc_driver_impl/Cargo.toml b/compiler/rustc_driver_impl/Cargo.toml index aeb2063e76960..a6e4eb0f93c20 100644 --- a/compiler/rustc_driver_impl/Cargo.toml +++ b/compiler/rustc_driver_impl/Cargo.toml @@ -38,6 +38,9 @@ shlex = "1.0" tracing = { version = "0.1.35" } # tidy-alphabetical-end +syn = { version = "2", features = ["extra-traits", "visit", "visit-mut"] } +quote = "1.0.45" + [target.'cfg(all(unix, any(target_env = "gnu", target_os = "macos")))'.dependencies] # tidy-alphabetical-start libc = "0.2" diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 31353d1eac0fb..1d84dc8c7e4cd 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -27,6 +27,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Instant; use std::{env, str}; +use quote as _; use rustc_ast as ast; use rustc_codegen_ssa::traits::CodegenBackend; use rustc_codegen_ssa::{CodegenError, CompiledModules}; @@ -62,6 +63,7 @@ use rustc_span::def_id::LOCAL_CRATE; use rustc_span::{DUMMY_SP, FileName}; use rustc_target::json::ToJson; use rustc_target::spec::{Target, TargetTuple}; +use syn as _; use tracing::trace; #[allow(unused_macros)]