diff --git a/Cargo.lock b/Cargo.lock index 4677d34d2a630..0c492e3af1623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3275,7 +3275,6 @@ dependencies = [ "rustc_driver_impl", "rustc_public", "rustc_public_bridge", - "rustc_windows_rc", "tikv-jemalloc-sys", ] @@ -3651,7 +3650,6 @@ name = "rustc_driver" version = "0.0.0" dependencies = [ "rustc_driver_impl", - "rustc_windows_rc", ] [[package]] @@ -4748,13 +4746,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustc_windows_rc" -version = "0.0.0" -dependencies = [ - "cc", -] - [[package]] name = "rustdoc" version = "0.0.0" diff --git a/compiler/rustc/Cargo.toml b/compiler/rustc/Cargo.toml index e3214d1ab9cec..3ca752354466f 100644 --- a/compiler/rustc/Cargo.toml +++ b/compiler/rustc/Cargo.toml @@ -33,8 +33,3 @@ llvm = ['rustc_driver_impl/llvm'] max_level_info = ['rustc_driver_impl/max_level_info'] rustc_randomized_layouts = ['rustc_driver_impl/rustc_randomized_layouts'] # tidy-alphabetical-end - -[build-dependencies] -# tidy-alphabetical-start -rustc_windows_rc = { path = "../rustc_windows_rc" } -# tidy-alphabetical-end diff --git a/compiler/rustc/build.rs b/compiler/rustc/build.rs index 9b5def53e3cbf..8b7d28d2b8aa6 100644 --- a/compiler/rustc/build.rs +++ b/compiler/rustc/build.rs @@ -1,6 +1,4 @@ -use std::{env, path}; - -use rustc_windows_rc::{VersionInfoFileType, compile_windows_resource_file}; +use std::env; fn main() { let target_os = env::var("CARGO_CFG_TARGET_OS"); @@ -15,18 +13,6 @@ fn main() { // Add a manifest file to rustc.exe. fn set_windows_exe_options() { - set_windows_resource(); - set_windows_manifest(); -} - -fn set_windows_resource() { - let stem = path::PathBuf::from("rustc_main_resource"); - let file_description = "rustc"; - let res_file = compile_windows_resource_file(&stem, file_description, VersionInfoFileType::App); - println!("cargo:rustc-link-arg={}", res_file.display()); -} - -fn set_windows_manifest() { static WINDOWS_MANIFEST_FILE: &str = "Windows Manifest.xml"; let mut manifest = env::current_dir().unwrap(); diff --git a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs index d4942e56f429d..bceb8423eae79 100644 --- a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs +++ b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs @@ -65,10 +65,22 @@ impl CombineAttributeParser for LinkParser { cx: &'c mut AcceptContext<'_, '_, S>, args: &'c ArgParser<'_>, ) -> impl IntoIterator + 'c { - let mut result = None; - let Some(items) = args.list() else { - cx.expected_list(cx.attr_span); - return result; + let items = match args { + ArgParser::List(list) => list, + // This is an edgecase added because making this a hard error would break too many crates + // Specifically `#[link = "dl"]` is accepted with a FCW + // For more information, see https://github.com/rust-lang/rust/pull/143193 + ArgParser::NameValue(nv) if nv.value_as_str().is_some_and(|v| v == sym::dl) => { + let suggestions = >::TEMPLATE + .suggestions(cx.attr_style, "link"); + let span = cx.attr_span; + cx.emit_lint(AttributeLintKind::IllFormedAttributeInput { suggestions }, span); + return None; + } + _ => { + cx.expected_list(cx.attr_span); + return None; + } }; let sess = cx.sess(); @@ -113,7 +125,7 @@ impl CombineAttributeParser for LinkParser { } }; if !cont { - return result; + return None; } } @@ -202,7 +214,7 @@ impl CombineAttributeParser for LinkParser { } let Some((name, name_span)) = name else { cx.emit_err(LinkRequiresName { span: cx.attr_span }); - return result; + return None; }; // Do this outside of the loop so that `import_name_type` can be specified before `kind`. @@ -218,15 +230,14 @@ impl CombineAttributeParser for LinkParser { cx.emit_err(RawDylibNoNul { span: name_span }); } - result = Some(LinkEntry { + Some(LinkEntry { span: cx.attr_span, kind: kind.unwrap_or(NativeLibKind::Unspecified), name, cfg, verbatim, import_name_type, - }); - result + }) } } @@ -455,8 +466,14 @@ impl SingleAttributeParser for LinkSectionParser { const PATH: &[Symbol] = &[sym::link_section]; const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost; const ON_DUPLICATE: OnDuplicate = OnDuplicate::WarnButFutureError; - const ALLOWED_TARGETS: AllowedTargets = - AllowedTargets::AllowListWarnRest(&[Allow(Target::Static), Allow(Target::Fn)]); + const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowListWarnRest(&[ + Allow(Target::Static), + Allow(Target::Fn), + Allow(Target::Method(MethodKind::Inherent)), + Allow(Target::Method(MethodKind::Trait { body: false })), + Allow(Target::Method(MethodKind::Trait { body: true })), + Allow(Target::Method(MethodKind::TraitImpl)), + ]); const TEMPLATE: AttributeTemplate = template!( NameValueStr: "name", "https://doc.rust-lang.org/reference/abi.html#the-link_section-attribute" diff --git a/compiler/rustc_borrowck/src/diagnostics/mod.rs b/compiler/rustc_borrowck/src/diagnostics/mod.rs index 5642cdf87fded..e85945d633b66 100644 --- a/compiler/rustc_borrowck/src/diagnostics/mod.rs +++ b/compiler/rustc_borrowck/src/diagnostics/mod.rs @@ -21,6 +21,7 @@ use rustc_middle::ty::print::Print; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::{bug, span_bug}; use rustc_mir_dataflow::move_paths::{InitLocation, LookupResult, MoveOutIndex}; +use rustc_session::lint::builtin::MACRO_EXTENDED_TEMPORARY_SCOPES; use rustc_span::def_id::LocalDefId; use rustc_span::source_map::Spanned; use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span, Symbol, sym}; @@ -1580,4 +1581,32 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> { pub(crate) fn local_excluded_from_unused_mut_lint(&self, index: Local) -> bool { self.local_name(index).is_none_or(|name| name.as_str().starts_with('_')) } + + /// Report a temporary whose scope will shorten in Rust 1.92 due to #145838. + pub(crate) fn lint_macro_extended_temporary_scope( + &self, + future_drop: Location, + borrow: &BorrowData<'tcx>, + ) { + let tcx = self.infcx.tcx; + let temp_decl = &self.body.local_decls[borrow.borrowed_place.local]; + let temp_span = temp_decl.source_info.span; + let lint_root = self.body.source_scopes[temp_decl.source_info.scope] + .local_data + .as_ref() + .unwrap_crate_local() + .lint_root; + + let mut labels = MultiSpan::from_span(temp_span); + labels.push_span_label(temp_span, "this expression creates a temporary value..."); + labels.push_span_label( + self.body.source_info(future_drop).span, + "...which will be dropped at the end of this block in Rust 1.92", + ); + + tcx.node_span_lint(MACRO_EXTENDED_TEMPORARY_SCOPES, lint_root, labels, |diag| { + diag.primary_message("temporary lifetime will be shortened in Rust 1.92"); + diag.note("consider using a `let` binding to create a longer lived value"); + }); + } } diff --git a/compiler/rustc_borrowck/src/handle_placeholders.rs b/compiler/rustc_borrowck/src/handle_placeholders.rs index 94379cdebf730..90d5e5e4f23f9 100644 --- a/compiler/rustc_borrowck/src/handle_placeholders.rs +++ b/compiler/rustc_borrowck/src/handle_placeholders.rs @@ -348,7 +348,7 @@ pub(crate) fn compute_sccs_applying_placeholder_outlives_constraints<'tcx>( } } -fn rewrite_placeholder_outlives<'tcx>( +pub(crate) fn rewrite_placeholder_outlives<'tcx>( sccs: &Sccs, annotations: &SccAnnotations<'_, '_, RegionTracker>, fr_static: RegionVid, diff --git a/compiler/rustc_borrowck/src/lib.rs b/compiler/rustc_borrowck/src/lib.rs index 5d2dda8b0e7cc..c00538755756c 100644 --- a/compiler/rustc_borrowck/src/lib.rs +++ b/compiler/rustc_borrowck/src/lib.rs @@ -843,8 +843,8 @@ impl<'a, 'tcx> ResultsVisitor<'tcx, Borrowck<'a, 'tcx>> for MirBorrowckCtxt<'a, | StatementKind::ConstEvalCounter | StatementKind::StorageLive(..) => {} // This does not affect borrowck - StatementKind::BackwardIncompatibleDropHint { place, reason: BackwardIncompatibleDropReason::Edition2024 } => { - self.check_backward_incompatible_drop(location, **place, state); + StatementKind::BackwardIncompatibleDropHint { place, reason } => { + self.check_backward_incompatible_drop(location, **place, state, *reason); } StatementKind::StorageDead(local) => { self.access_place( @@ -1386,6 +1386,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> { location: Location, place: Place<'tcx>, state: &BorrowckDomain, + reason: BackwardIncompatibleDropReason, ) { let tcx = self.infcx.tcx; // If this type does not need `Drop`, then treat it like a `StorageDead`. @@ -1412,21 +1413,29 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> { if matches!(borrow.kind, BorrowKind::Fake(_)) { return ControlFlow::Continue(()); } - let borrowed = this.retrieve_borrow_spans(borrow).var_or_use_path_span(); - let explain = this.explain_why_borrow_contains_point( - location, - borrow, - Some((WriteKind::StorageDeadOrDrop, place)), - ); - this.infcx.tcx.node_span_lint( - TAIL_EXPR_DROP_ORDER, - CRATE_HIR_ID, - borrowed, - |diag| { - session_diagnostics::TailExprDropOrder { borrowed }.decorate_lint(diag); - explain.add_explanation_to_diagnostic(&this, diag, "", None, None); - }, - ); + match reason { + BackwardIncompatibleDropReason::Edition2024 => { + let borrowed = this.retrieve_borrow_spans(borrow).var_or_use_path_span(); + let explain = this.explain_why_borrow_contains_point( + location, + borrow, + Some((WriteKind::StorageDeadOrDrop, place)), + ); + this.infcx.tcx.node_span_lint( + TAIL_EXPR_DROP_ORDER, + CRATE_HIR_ID, + borrowed, + |diag| { + session_diagnostics::TailExprDropOrder { borrowed } + .decorate_lint(diag); + explain.add_explanation_to_diagnostic(&this, diag, "", None, None); + }, + ); + } + BackwardIncompatibleDropReason::MacroExtendedScope => { + this.lint_macro_extended_temporary_scope(location, borrow); + } + } // We may stop at the first case ControlFlow::Break(()) }, diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs index 667fc440ac002..a2e2b61ae2d35 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs @@ -39,7 +39,7 @@ pub(super) fn apply_member_constraints<'tcx>( debug!(?member_constraints); for scc_a in rcx.constraint_sccs.all_sccs() { debug!(?scc_a); - // Start by adding the region values required by outlives constraints. This + // Start by adding the region values required by outlives constraints. This // matches how we compute the final region values in `fn compute_regions`. // // We need to do this here to get a lower bound when applying member constraints. @@ -64,6 +64,7 @@ fn apply_member_constraint<'tcx>( // If the member region lives in a higher universe, we currently choose // the most conservative option by leaving it unchanged. if !rcx.max_placeholder_universe_reached(member).is_root() { + debug!("member region reached non root universe, bailing"); return; } diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs index 0af636aa734ca..0c35bec316694 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs @@ -254,6 +254,10 @@ fn collect_defining_uses<'tcx>( } } else { errors.push(DeferredOpaqueTypeError::InvalidOpaqueTypeArgs(err)); + debug!( + "collect_defining_uses: InvalidOpaqueTypeArgs for {:?} := {:?}", + non_nll_opaque_type_key, hidden_type + ); } continue; } @@ -277,6 +281,7 @@ fn collect_defining_uses<'tcx>( defining_uses } +#[instrument(level = "debug", skip(rcx, concrete_opaque_types, defining_uses, errors))] fn compute_concrete_types_from_defining_uses<'tcx>( rcx: &RegionCtxt<'_, 'tcx>, concrete_opaque_types: &mut ConcreteOpaqueTypes<'tcx>, @@ -288,6 +293,7 @@ fn compute_concrete_types_from_defining_uses<'tcx>( let mut decls_modulo_regions: FxIndexMap, (OpaqueTypeKey<'tcx>, Span)> = FxIndexMap::default(); for &DefiningUse { opaque_type_key, ref arg_regions, hidden_type } in defining_uses { + debug!(?opaque_type_key, ?arg_regions, ?hidden_type); // After applying member constraints, we now map all regions in the hidden type // to the `arg_regions` of this defining use. In case a region in the hidden type // ended up not being equal to any such region, we error. @@ -295,6 +301,7 @@ fn compute_concrete_types_from_defining_uses<'tcx>( match hidden_type.try_fold_with(&mut ToArgRegionsFolder::new(rcx, arg_regions)) { Ok(hidden_type) => hidden_type, Err(r) => { + debug!("UnexpectedHiddenRegion: {:?}", r); errors.push(DeferredOpaqueTypeError::UnexpectedHiddenRegion { hidden_type, opaque_type_key, diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs index 88326e4eebfc2..90b15cbdd2cc8 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types/region_ctxt.rs @@ -11,7 +11,9 @@ use crate::constraints::ConstraintSccIndex; use crate::handle_placeholders::{SccAnnotations, region_definitions}; use crate::region_infer::reverse_sccs::ReverseSccGraph; use crate::region_infer::values::RegionValues; -use crate::region_infer::{ConstraintSccs, RegionDefinition, RegionTracker, Representative}; +use crate::region_infer::{ + ConstraintSccs, OutlivesConstraintSet, RegionDefinition, RegionTracker, Representative, +}; use crate::type_check::MirTypeckRegionConstraints; use crate::type_check::free_region_relations::UniversalRegionRelations; use crate::universal_regions::UniversalRegions; @@ -39,16 +41,36 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> { location_map: Rc, constraints: &MirTypeckRegionConstraints<'tcx>, ) -> RegionCtxt<'a, 'tcx> { + let mut outlives_constraints = constraints.outlives_constraints.clone(); let universal_regions = &universal_region_relations.universal_regions; let (definitions, _has_placeholders) = region_definitions(infcx, universal_regions); + + let compute_sccs = + |outlives_constraints: &OutlivesConstraintSet<'tcx>, + annotations: &mut SccAnnotations<'_, 'tcx, RegionTracker>| { + ConstraintSccs::new_with_annotation( + &outlives_constraints + .graph(definitions.len()) + .region_graph(outlives_constraints, universal_regions.fr_static), + annotations, + ) + }; + let mut scc_annotations = SccAnnotations::init(&definitions); - let constraint_sccs = ConstraintSccs::new_with_annotation( - &constraints - .outlives_constraints - .graph(definitions.len()) - .region_graph(&constraints.outlives_constraints, universal_regions.fr_static), - &mut scc_annotations, + let mut constraint_sccs = compute_sccs(&outlives_constraints, &mut scc_annotations); + + let added_constraints = crate::handle_placeholders::rewrite_placeholder_outlives( + &constraint_sccs, + &scc_annotations, + universal_regions.fr_static, + &mut outlives_constraints, ); + + if added_constraints { + scc_annotations = SccAnnotations::init(&definitions); + constraint_sccs = compute_sccs(&outlives_constraints, &mut scc_annotations); + } + let scc_annotations = scc_annotations.scc_to_annotation; // Unlike the `RegionInferenceContext`, we only care about free regions diff --git a/compiler/rustc_codegen_llvm/src/attributes.rs b/compiler/rustc_codegen_llvm/src/attributes.rs index 573c51a95398b..bdc025cd955a4 100644 --- a/compiler/rustc_codegen_llvm/src/attributes.rs +++ b/compiler/rustc_codegen_llvm/src/attributes.rs @@ -435,16 +435,6 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>( || codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::ALLOCATOR_ZEROED) { to_add.push(create_alloc_family_attr(cx.llcx)); - if let Some(zv) = - cx.tcx.get_attr(instance.def_id(), rustc_span::sym::rustc_allocator_zeroed_variant) - && let Some(name) = zv.value_str() - { - to_add.push(llvm::CreateAttrStringValue( - cx.llcx, - "alloc-variant-zeroed", - &mangle_internal_symbol(cx.tcx, name.as_str()), - )); - } // apply to argument place instead of function let alloc_align = AttributeKind::AllocAlign.create_attr(cx.llcx); attributes::apply_to_llfn(llfn, AttributePlace::Argument(1), &[alloc_align]); diff --git a/compiler/rustc_codegen_ssa/Cargo.toml b/compiler/rustc_codegen_ssa/Cargo.toml index 5462163f4ffd3..2dfbc58164323 100644 --- a/compiler/rustc_codegen_ssa/Cargo.toml +++ b/compiler/rustc_codegen_ssa/Cargo.toml @@ -9,7 +9,7 @@ ar_archive_writer = "0.5" bitflags = "2.4.1" bstr = "1.11.3" # `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_llvm` and `rustc_windows_rc`. +# per crate", so if you change this, you need to also change it in `rustc_llvm`. cc = "=1.2.16" itertools = "0.12" pathdiff = "0.2.0" diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index f6f2e3f2a3a3c..addd41dbd2b36 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -1048,14 +1048,14 @@ pub(super) fn transmute_scalar<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>( imm = match (from_scalar.primitive(), to_scalar.primitive()) { (Int(..) | Float(_), Int(..) | Float(_)) => bx.bitcast(imm, to_backend_ty), (Pointer(..), Pointer(..)) => bx.pointercast(imm, to_backend_ty), - (Int(..), Pointer(..)) => bx.ptradd(bx.const_null(bx.type_ptr()), imm), + (Int(..), Pointer(..)) => bx.inttoptr(imm, to_backend_ty), (Pointer(..), Int(..)) => { // FIXME: this exposes the provenance, which shouldn't be necessary. bx.ptrtoint(imm, to_backend_ty) } (Float(_), Pointer(..)) => { let int_imm = bx.bitcast(imm, bx.cx().type_isize()); - bx.ptradd(bx.const_null(bx.type_ptr()), int_imm) + bx.inttoptr(int_imm, to_backend_ty) } (Pointer(..), Float(_)) => { // FIXME: this exposes the provenance, which shouldn't be necessary. diff --git a/compiler/rustc_driver/Cargo.toml b/compiler/rustc_driver/Cargo.toml index 5190971982763..e3ee83512952a 100644 --- a/compiler/rustc_driver/Cargo.toml +++ b/compiler/rustc_driver/Cargo.toml @@ -10,8 +10,3 @@ crate-type = ["dylib"] # tidy-alphabetical-start rustc_driver_impl = { path = "../rustc_driver_impl" } # tidy-alphabetical-end - -[build-dependencies] -# tidy-alphabetical-start -rustc_windows_rc = { path = "../rustc_windows_rc" } -# tidy-alphabetical-end diff --git a/compiler/rustc_driver/build.rs b/compiler/rustc_driver/build.rs deleted file mode 100644 index ba44fe7a86ed9..0000000000000 --- a/compiler/rustc_driver/build.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::{env, path}; - -use rustc_windows_rc::{VersionInfoFileType, compile_windows_resource_file}; - -fn main() { - let target_os = env::var("CARGO_CFG_TARGET_OS"); - let target_env = env::var("CARGO_CFG_TARGET_ENV"); - if Ok("windows") == target_os.as_deref() && Ok("msvc") == target_env.as_deref() { - set_windows_dll_options(); - } else { - // Avoid rerunning the build script every time. - println!("cargo:rerun-if-changed=build.rs"); - } -} - -fn set_windows_dll_options() { - let stem = path::PathBuf::from("rustc_driver_resource"); - let file_description = "rustc_driver"; - let res_file = compile_windows_resource_file(&stem, file_description, VersionInfoFileType::Dll); - println!("cargo:rustc-link-arg={}", res_file.display()); -} diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index 6af4cfb0e562e..364a1202b05c2 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -205,7 +205,7 @@ declare_features! ( (accepted, extended_key_value_attributes, "1.54.0", Some(78835)), /// Allows using `aapcs`, `efiapi`, `sysv64` and `win64` as calling conventions /// for functions with varargs. - (accepted, extended_varargs_abi_support, "CURRENT_RUSTC_VERSION", Some(100189)), + (accepted, extended_varargs_abi_support, "1.91.0", Some(100189)), /// Allows resolving absolute paths as paths from other crates. (accepted, extern_absolute_paths, "1.30.0", Some(44660)), /// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude. @@ -400,7 +400,7 @@ declare_features! ( /// Allows use of `&foo[a..b]` as a slicing syntax. (accepted, slicing_syntax, "1.0.0", None), /// Allows use of `sse4a` target feature. - (accepted, sse4a_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (accepted, sse4a_target_feature, "1.91.0", Some(44839)), /// Allows elision of `'static` lifetimes in `static`s and `const`s. (accepted, static_in_const, "1.17.0", Some(35897)), /// Allows the definition recursive static items. @@ -414,7 +414,7 @@ declare_features! ( /// Allows the use of `#[target_feature]` on safe functions. (accepted, target_feature_11, "1.86.0", Some(69098)), /// Allows use of `tbm` target feature. - (accepted, tbm_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (accepted, tbm_target_feature, "1.91.0", Some(44839)), /// Allows `fn main()` with return types which implements `Termination` (RFC 1937). (accepted, termination_trait, "1.26.0", Some(43301)), /// Allows `#[test]` functions where the return type implements `Termination` (RFC 1937). diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 129ab7eccb577..fe358bd1ecb33 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -1001,10 +1001,6 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_allocator_zeroed, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, ), - rustc_attr!( - rustc_allocator_zeroed_variant, Normal, template!(NameValueStr: "function"), ErrorPreceding, - EncodeCrossCrate::Yes, - ), gated!( default_lib_allocator, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, allocator_internals, experimental!(default_lib_allocator), diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index e37fc6b7bfcce..32115535e9941 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -192,7 +192,7 @@ declare_features! ( (removed, no_debug, "1.43.0", Some(29721), Some("removed due to lack of demand"), 69667), // Allows the use of `no_sanitize` attribute. /// The feature was renamed to `sanitize` and the attribute to `#[sanitize(xyz = "on|off")]` - (removed, no_sanitize, "CURRENT_RUSTC_VERSION", Some(39699), Some(r#"renamed to sanitize(xyz = "on|off")"#), 142681), + (removed, no_sanitize, "1.91.0", Some(39699), Some(r#"renamed to sanitize(xyz = "on|off")"#), 142681), /// Note: this feature was previously recorded in a separate /// `STABLE_REMOVED` list because it, uniquely, was once stable but was /// then removed. But there was no utility storing it separately, so now @@ -203,7 +203,7 @@ declare_features! ( (removed, object_safe_for_dispatch, "1.83.0", Some(43561), Some("renamed to `dyn_compatible_for_dispatch`"), 131511), /// Allows using `#[omit_gdb_pretty_printer_section]`. - (removed, omit_gdb_pretty_printer_section, "CURRENT_RUSTC_VERSION", None, None, 144738), + (removed, omit_gdb_pretty_printer_section, "1.91.0", None, None, 144738), /// Allows using `#[on_unimplemented(..)]` on traits. /// (Moved to `rustc_attrs`.) (removed, on_unimplemented, "1.40.0", None, None, 65794), diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 93e5588146e14..6ef0df72365ec 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -327,7 +327,7 @@ declare_features! ( (unstable, m68k_target_feature, "1.85.0", Some(134328)), (unstable, mips_target_feature, "1.27.0", Some(44839)), (unstable, movrs_target_feature, "1.88.0", Some(137976)), - (unstable, nvptx_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)), + (unstable, nvptx_target_feature, "1.91.0", Some(44839)), (unstable, powerpc_target_feature, "1.27.0", Some(44839)), (unstable, prfchw_target_feature, "1.78.0", Some(44839)), (unstable, riscv_target_feature, "1.45.0", Some(44839)), @@ -471,7 +471,7 @@ declare_features! ( /// Allows deref patterns. (incomplete, deref_patterns, "1.79.0", Some(87121)), /// Allows deriving the From trait on single-field structs. - (unstable, derive_from, "CURRENT_RUSTC_VERSION", Some(144889)), + (unstable, derive_from, "1.91.0", Some(144889)), /// Tells rustdoc to automatically generate `#[doc(cfg(...))]`. (unstable, doc_auto_cfg, "1.58.0", Some(43781)), /// Allows `#[doc(cfg(...))]`. @@ -481,7 +481,7 @@ declare_features! ( /// Allows `#[doc(masked)]`. (unstable, doc_masked, "1.21.0", Some(44027)), /// Allows features to allow target_feature to better interact with traits. - (incomplete, effective_target_features, "CURRENT_RUSTC_VERSION", Some(143352)), + (incomplete, effective_target_features, "1.91.0", Some(143352)), /// Allows the .use postfix syntax `x.use` and use closures `use |x| { ... }` (incomplete, ergonomic_clones, "1.87.0", Some(132290)), /// Allows exhaustive pattern matching on types that contain uninhabited types. @@ -554,9 +554,9 @@ declare_features! ( /// Allows fused `loop`/`match` for direct intraprocedural jumps. (incomplete, loop_match, "1.90.0", Some(132306)), /// Allow `macro_rules!` attribute rules - (unstable, macro_attr, "CURRENT_RUSTC_VERSION", Some(83527)), + (unstable, macro_attr, "1.91.0", Some(83527)), /// Allow `macro_rules!` derive rules - (unstable, macro_derive, "CURRENT_RUSTC_VERSION", Some(143549)), + (unstable, macro_derive, "1.91.0", Some(143549)), /// Give access to additional metadata about declarative macro meta-variables. (unstable, macro_metavar_expr, "1.61.0", Some(83527)), /// Provides a way to concatenate identifiers using metavariable expressions. @@ -613,7 +613,7 @@ declare_features! ( (unstable, proc_macro_hygiene, "1.30.0", Some(54727)), /// Allows the use of raw-dylibs on ELF platforms (incomplete, raw_dylib_elf, "1.87.0", Some(135694)), - (unstable, reborrow, "CURRENT_RUSTC_VERSION", Some(145612)), + (unstable, reborrow, "1.91.0", Some(145612)), /// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024. (incomplete, ref_pat_eat_one_layer_2024, "1.79.0", Some(123076)), /// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024—structural variant @@ -627,13 +627,13 @@ declare_features! ( /// Allows `extern "rust-cold"`. (unstable, rust_cold_cc, "1.63.0", Some(97544)), /// Allows the use of the `sanitize` attribute. - (unstable, sanitize, "CURRENT_RUSTC_VERSION", Some(39699)), + (unstable, sanitize, "1.91.0", Some(39699)), /// Allows the use of SIMD types in functions declared in `extern` blocks. (unstable, simd_ffi, "1.0.0", Some(27731)), /// Allows specialization of implementations (RFC 1210). (incomplete, specialization, "1.7.0", Some(31844)), /// Allows using `#[rustc_align_static(...)]` on static items. - (unstable, static_align, "CURRENT_RUSTC_VERSION", Some(146177)), + (unstable, static_align, "1.91.0", Some(146177)), /// Allows attributes on expressions and non-item statements. (unstable, stmt_expr_attributes, "1.6.0", Some(15701)), /// Allows lints part of the strict provenance effort. @@ -645,7 +645,7 @@ declare_features! ( /// Allows subtrait items to shadow supertrait items. (unstable, supertrait_item_shadowing, "1.86.0", Some(89151)), /// Allows the use of target_feature when a function is marked inline(always). - (unstable, target_feature_inline_always, "CURRENT_RUSTC_VERSION", Some(145574)), + (unstable, target_feature_inline_always, "1.91.0", Some(145574)), /// Allows using `#[thread_local]` on `static` items. (unstable, thread_local, "1.0.0", Some(29594)), /// Allows defining `trait X = A + B;` alias items. diff --git a/compiler/rustc_hir_analysis/src/check/region.rs b/compiler/rustc_hir_analysis/src/check/region.rs index 2ba7ed46f92c4..eb5ce80cc0ea6 100644 --- a/compiler/rustc_hir_analysis/src/check/region.rs +++ b/compiler/rustc_hir_analysis/src/check/region.rs @@ -24,7 +24,7 @@ use tracing::debug; #[derive(Debug, Copy, Clone)] struct Context { /// The scope that contains any new variables declared. - var_parent: Option, + var_parent: (Option, ScopeCompatibility), /// Region parent of expressions, etc. parent: Option, @@ -38,12 +38,26 @@ struct ScopeResolutionVisitor<'tcx> { cx: Context, - extended_super_lets: FxHashMap>, + extended_super_lets: FxHashMap, +} + +#[derive(Copy, Clone)] +struct ExtendedTemporaryScope { + /// The scope of extended temporaries. + scope: Option, + /// Whether this lifetime originated from a regular `let` or a `super let` initializer. In the + /// latter case, this scope may shorten after #145838 if applied to temporaries within block + /// tail expressions. + let_kind: LetKind, + /// Whether this scope will shorten after #145838. If this is applied to a temporary value, + /// we'll emit the `macro_extended_temporary_scopes` lint. + compat: ScopeCompatibility, } /// Records the lifetime of a local variable as `cx.var_parent` fn record_var_lifetime(visitor: &mut ScopeResolutionVisitor<'_>, var_id: hir::ItemLocalId) { - match visitor.cx.var_parent { + let (var_parent_scope, var_parent_compat) = visitor.cx.var_parent; + match var_parent_scope { None => { // this can happen in extern fn declarations like // @@ -51,6 +65,9 @@ fn record_var_lifetime(visitor: &mut ScopeResolutionVisitor<'_>, var_id: hir::It } Some(parent_scope) => visitor.scope_tree.record_var_scope(var_id, parent_scope), } + if let ScopeCompatibility::FutureIncompatible { shortens_to } = var_parent_compat { + visitor.scope_tree.record_future_incompatible_var_scope(var_id, shortens_to); + } } fn resolve_block<'tcx>( @@ -88,7 +105,7 @@ fn resolve_block<'tcx>( // itself has returned. visitor.enter_node_scope_with_dtor(blk.hir_id.local_id, terminating); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); { // This block should be kept approximately in sync with @@ -107,7 +124,8 @@ fn resolve_block<'tcx>( local_id: blk.hir_id.local_id, data: ScopeData::Remainder(FirstStatementIndex::new(i)), }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = + (visitor.cx.parent, ScopeCompatibility::FutureCompatible); visitor.visit_stmt(statement); // We need to back out temporarily to the last enclosing scope // for the `else` block, so that even the temporaries receiving @@ -131,7 +149,8 @@ fn resolve_block<'tcx>( local_id: blk.hir_id.local_id, data: ScopeData::Remainder(FirstStatementIndex::new(i)), }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = + (visitor.cx.parent, ScopeCompatibility::FutureCompatible); visitor.visit_stmt(statement) } hir::StmtKind::Item(..) => { @@ -195,7 +214,7 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir: let prev_cx = visitor.cx; visitor.enter_node_scope_with_dtor(arm.hir_id.local_id, true); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_pat(visitor, arm.pat); if let Some(guard) = arm.guard { @@ -203,7 +222,7 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir: // ensure they're dropped before the arm's pattern's bindings. This extends to the end of // the arm body and is the scope of its locals as well. visitor.enter_scope(Scope { local_id: arm.hir_id.local_id, data: ScopeData::MatchGuard }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, guard); } resolve_expr(visitor, arm.body, false); @@ -360,7 +379,7 @@ fn resolve_expr<'tcx>( ScopeData::IfThen }; visitor.enter_scope(Scope { local_id: then.hir_id.local_id, data }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, cond); resolve_expr(visitor, then, true); visitor.cx = expr_cx; @@ -375,7 +394,7 @@ fn resolve_expr<'tcx>( ScopeData::IfThen }; visitor.enter_scope(Scope { local_id: then.hir_id.local_id, data }); - visitor.cx.var_parent = visitor.cx.parent; + visitor.cx.var_parent = (visitor.cx.parent, ScopeCompatibility::FutureCompatible); resolve_cond(visitor, cond); resolve_expr(visitor, then, true); visitor.cx = expr_cx; @@ -467,37 +486,57 @@ fn resolve_local<'tcx>( // A, but the inner rvalues `a()` and `b()` have an extended lifetime // due to rule C. - if let_kind == LetKind::Super { - if let Some(scope) = visitor.extended_super_lets.remove(&pat.unwrap().hir_id.local_id) { - // This expression was lifetime-extended by a parent let binding. E.g. - // - // let a = { - // super let b = temp(); - // &b - // }; - // - // (Which needs to behave exactly as: let a = &temp();) - // - // Processing of `let a` will have already decided to extend the lifetime of this - // `super let` to its own var_scope. We use that scope. - visitor.cx.var_parent = scope; - } else { - // This `super let` is not subject to lifetime extension from a parent let binding. E.g. - // - // identity({ super let x = temp(); &x }).method(); - // - // (Which needs to behave exactly as: identity(&temp()).method();) - // - // Iterate up to the enclosing destruction scope to find the same scope that will also - // be used for the result of the block itself. - if let Some(inner_scope) = visitor.cx.var_parent { - (visitor.cx.var_parent, _) = visitor.scope_tree.default_temporary_scope(inner_scope) + let (source_let_kind, compat) = match let_kind { + // Normal `let` initializers are unaffected by #145838. + LetKind::Regular => { + (LetKind::Regular, ScopeCompatibility::FutureCompatible) + } + LetKind::Super => { + if let Some(scope) = visitor.extended_super_lets.remove(&pat.unwrap().hir_id.local_id) { + // This expression was lifetime-extended by a parent let binding. E.g. + // + // let a = { + // super let b = temp(); + // &b + // }; + // + // (Which needs to behave exactly as: let a = &temp();) + // + // Processing of `let a` will have already decided to extend the lifetime of this + // `super let` to its own var_scope. We use that scope. + visitor.cx.var_parent = (scope.scope, scope.compat); + // Inherit compatibility from the original `let` statement. If the original `let` + // was regular, lifetime extension should apply as normal. If the original `let` was + // `super`, blocks within the initializer will be affected by #145838. + (scope.let_kind, scope.compat) + } else { + // This `super let` is not subject to lifetime extension from a parent let binding. E.g. + // + // identity({ super let x = temp(); &x }).method(); + // + // (Which needs to behave exactly as: identity(&temp()).method();) + // + // Iterate up to the enclosing destruction scope to find the same scope that will also + // be used for the result of the block itself. + if let (Some(inner_scope), _) = visitor.cx.var_parent { + // NB(@dianne): This could use the incompatibility reported by + // `default_temporary_scope` to make `tail_expr_drop_order` more comprehensive. + visitor.cx.var_parent = + (visitor.scope_tree.default_temporary_scope(inner_scope).0, ScopeCompatibility::FutureCompatible); + } + // Blocks within the initializer will be affected by #145838. + (LetKind::Super, ScopeCompatibility::FutureCompatible) } } - } + }; if let Some(expr) = init { - record_rvalue_scope_if_borrow_expr(visitor, expr, visitor.cx.var_parent); + let scope = ExtendedTemporaryScope { + scope: visitor.cx.var_parent.0, + let_kind: source_let_kind, + compat, + }; + record_rvalue_scope_if_borrow_expr(visitor, expr, scope); if let Some(pat) = pat { if is_binding_pat(pat) { @@ -505,7 +544,8 @@ fn resolve_local<'tcx>( expr.hir_id, RvalueCandidate { target: expr.hir_id.local_id, - lifetime: visitor.cx.var_parent, + lifetime: visitor.cx.var_parent.0, + compat: visitor.cx.var_parent.1, }, ); } @@ -607,50 +647,106 @@ fn resolve_local<'tcx>( fn record_rvalue_scope_if_borrow_expr<'tcx>( visitor: &mut ScopeResolutionVisitor<'tcx>, expr: &hir::Expr<'_>, - blk_id: Option, + scope: ExtendedTemporaryScope, ) { match expr.kind { hir::ExprKind::AddrOf(_, _, subexpr) => { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope); visitor.scope_tree.record_rvalue_candidate( subexpr.hir_id, - RvalueCandidate { target: subexpr.hir_id.local_id, lifetime: blk_id }, + RvalueCandidate { + target: subexpr.hir_id.local_id, + lifetime: scope.scope, + compat: scope.compat, + }, ); } hir::ExprKind::Struct(_, fields, _) => { for field in fields { - record_rvalue_scope_if_borrow_expr(visitor, field.expr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, field.expr, scope); } } hir::ExprKind::Array(subexprs) | hir::ExprKind::Tup(subexprs) => { for subexpr in subexprs { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope); } } hir::ExprKind::Cast(subexpr, _) => { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id) + record_rvalue_scope_if_borrow_expr(visitor, subexpr, scope) } hir::ExprKind::Block(block, _) => { if let Some(subexpr) = block.expr { - record_rvalue_scope_if_borrow_expr(visitor, subexpr, blk_id); + let tail_expr_scope = + if scope.let_kind == LetKind::Super && block.span.at_least_rust_2024() { + // The tail expression will no longer be extending after #145838. + // Since tail expressions are temporary scopes in Rust 2024, lint on + // temporaries that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: subexpr.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, subexpr, tail_expr_scope); } for stmt in block.stmts { if let hir::StmtKind::Let(local) = stmt.kind && let Some(_) = local.super_ { - visitor.extended_super_lets.insert(local.pat.hir_id.local_id, blk_id); + visitor.extended_super_lets.insert(local.pat.hir_id.local_id, scope); } } } hir::ExprKind::If(_, then_block, else_block) => { - record_rvalue_scope_if_borrow_expr(visitor, then_block, blk_id); + let then_scope = if scope.let_kind == LetKind::Super { + // The then and else blocks will no longer be extending after #145838. + // Since `if` blocks are temporary scopes in all editions, lint on temporaries + // that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: then_block.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, then_block, then_scope); if let Some(else_block) = else_block { - record_rvalue_scope_if_borrow_expr(visitor, else_block, blk_id); + let else_scope = if scope.let_kind == LetKind::Super { + // The then and else blocks will no longer be extending after #145838. + // Since `if` blocks are temporary scopes in all editions, lint on temporaries + // that acquire this (longer) lifetime. + ExtendedTemporaryScope { + compat: ScopeCompatibility::FutureIncompatible { + shortens_to: Scope { + local_id: else_block.hir_id.local_id, + data: ScopeData::Node, + }, + }, + ..scope + } + } else { + // This is extended by a regular `let`, so it won't be changed. + scope + }; + record_rvalue_scope_if_borrow_expr(visitor, else_block, else_scope); } } hir::ExprKind::Match(_, arms, _) => { for arm in arms { - record_rvalue_scope_if_borrow_expr(visitor, arm.body, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, arm.body, scope); } } hir::ExprKind::Call(func, args) => { @@ -663,7 +759,7 @@ fn resolve_local<'tcx>( && let Res::SelfCtor(_) | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) = path.res { for arg in args { - record_rvalue_scope_if_borrow_expr(visitor, arg, blk_id); + record_rvalue_scope_if_borrow_expr(visitor, arg, scope); } } } @@ -730,7 +826,7 @@ impl<'tcx> Visitor<'tcx> for ScopeResolutionVisitor<'tcx> { self.enter_body(body.value.hir_id, |this| { if this.tcx.hir_body_owner_kind(owner_id).is_fn_or_closure() { // The arguments and `self` are parented to the fn. - this.cx.var_parent = this.cx.parent; + this.cx.var_parent = (this.cx.parent, ScopeCompatibility::FutureCompatible); for param in body.params { this.visit_pat(param.pat); } @@ -756,7 +852,7 @@ impl<'tcx> Visitor<'tcx> for ScopeResolutionVisitor<'tcx> { // would *not* let the `f()` temporary escape into an outer scope // (i.e., `'static`), which means that after `g` returns, it drops, // and all the associated destruction scope rules apply. - this.cx.var_parent = None; + this.cx.var_parent = (None, ScopeCompatibility::FutureCompatible); this.enter_scope(Scope { local_id: body.value.hir_id.local_id, data: ScopeData::Destruction, @@ -808,7 +904,7 @@ pub(crate) fn region_scope_tree(tcx: TyCtxt<'_>, def_id: DefId) -> &ScopeTree { let mut visitor = ScopeResolutionVisitor { tcx, scope_tree: ScopeTree::default(), - cx: Context { parent: None, var_parent: None }, + cx: Context { parent: None, var_parent: (None, ScopeCompatibility::FutureCompatible) }, extended_super_lets: Default::default(), }; diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs index c8f6c06b720dc..559f354a3a7cf 100644 --- a/compiler/rustc_hir_typeck/src/method/suggest.rs +++ b/compiler/rustc_hir_typeck/src/method/suggest.rs @@ -441,8 +441,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Check scope of binding. fn is_sub_scope(&self, sub_id: hir::ItemLocalId, super_id: hir::ItemLocalId) -> bool { let scope_tree = self.fcx.tcx.region_scope_tree(self.fcx.body_id); - if let Some(sub_var_scope) = scope_tree.var_scope(sub_id) - && let Some(super_var_scope) = scope_tree.var_scope(super_id) + if let (Some(sub_var_scope), _) = scope_tree.var_scope(sub_id) + && let (Some(super_var_scope), _) = scope_tree.var_scope(super_id) && scope_tree.is_subscope_of(sub_var_scope, super_var_scope) { return true; diff --git a/compiler/rustc_hir_typeck/src/rvalue_scopes.rs b/compiler/rustc_hir_typeck/src/rvalue_scopes.rs index 973dc7141e64d..9f5055f967f0e 100644 --- a/compiler/rustc_hir_typeck/src/rvalue_scopes.rs +++ b/compiler/rustc_hir_typeck/src/rvalue_scopes.rs @@ -2,7 +2,9 @@ use hir::Node; use hir::def_id::DefId; use rustc_hir as hir; use rustc_middle::bug; -use rustc_middle::middle::region::{RvalueCandidate, Scope, ScopeTree}; +use rustc_middle::middle::region::{ + ScopeCompatibility, RvalueCandidate, Scope, ScopeTree, +}; use rustc_middle::ty::RvalueScopes; use tracing::debug; @@ -29,6 +31,7 @@ fn record_rvalue_scope_rec( rvalue_scopes: &mut RvalueScopes, mut expr: &hir::Expr<'_>, lifetime: Option, + compat: ScopeCompatibility, ) { loop { // Note: give all the expressions matching `ET` with the @@ -37,7 +40,7 @@ fn record_rvalue_scope_rec( // into a temporary, we request the temporary scope of the // outer expression. - rvalue_scopes.record_rvalue_scope(expr.hir_id.local_id, lifetime); + rvalue_scopes.record_rvalue_scope(expr.hir_id.local_id, lifetime, compat); match expr.kind { hir::ExprKind::AddrOf(_, _, subexpr) @@ -58,7 +61,7 @@ fn record_rvalue_scope( candidate: &RvalueCandidate, ) { debug!("resolve_rvalue_scope(expr={expr:?}, candidate={candidate:?})"); - record_rvalue_scope_rec(rvalue_scopes, expr, candidate.lifetime) + record_rvalue_scope_rec(rvalue_scopes, expr, candidate.lifetime, candidate.compat) // FIXME(@dingxiangfei2009): handle the candidates in the function call arguments } diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index b79075ac09b9c..1036d85bacfbb 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -62,6 +62,7 @@ declare_lint_pass! { LONG_RUNNING_CONST_EVAL, LOSSY_PROVENANCE_CASTS, MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS, + MACRO_EXTENDED_TEMPORARY_SCOPES, MACRO_USE_EXTERN_CRATE, MALFORMED_DIAGNOSTIC_ATTRIBUTES, MALFORMED_DIAGNOSTIC_FORMAT_LITERALS, @@ -5195,3 +5196,54 @@ declare_lint! { Warn, r#"detects when a function annotated with `#[inline(always)]` and `#[target_feature(enable = "..")]` is inlined into a caller without the required target feature"#, } + +declare_lint! { + /// The `macro_extended_temporary_scopes` lint detects borrowed temporary + /// values in arguments to `pin!` and formatting macros which have longer + /// lifetimes than intended due to a bug in the compiler. For more + /// information on temporary scopes and lifetime extension, see the + /// [Rust Reference]. + /// + /// [Rust Reference]: https://doc.rust-lang.org/reference/destructors.html#temporary-scopes + /// + /// ### Example + /// + /// ```rust + /// # fn cond() -> bool { true } + /// # fn build_string() -> String { String::new() } + /// fn main() { + /// println!("{:?}{}", (), if cond() { &build_string() } else { "" }); + /// } + /// ``` + /// + /// {{produces}} + /// + /// ### Recommended fix + /// + /// To extend the lifetimes of temporaries borrowed in macro arguments, + /// create separate definitions for them with `let` statements. + /// + /// ```rust + /// # fn cond() -> bool { true } + /// # fn build_string() -> String { String::new() } + /// fn main() { + /// let string = if cond() { &build_string() } else { "" }; + /// println!("{:?}{}", (), string); + /// } + /// ``` + /// + /// ### Explanation + /// + /// Due to a compiler bug, `pin!` and formatting macros were able to extend + /// the lifetimes of temporaries borrowed in their arguments past their + /// usual scopes. The bug is fixed in future Rust versions, so we issue this + /// future-incompatibility warning for code that may stop compiling or may + /// change in behavior thereafter. + pub MACRO_EXTENDED_TEMPORARY_SCOPES, + Warn, + "detects when a lifetime-extended temporary borrowed in a macro argument has a future-incompatible scope.", + @future_incompatible = FutureIncompatibleInfo { + reason: FutureIncompatibilityReason::FutureReleaseError, + reference: "", + }; +} diff --git a/compiler/rustc_llvm/Cargo.toml b/compiler/rustc_llvm/Cargo.toml index 0dfd1b13df502..cd352ce3d0f4f 100644 --- a/compiler/rustc_llvm/Cargo.toml +++ b/compiler/rustc_llvm/Cargo.toml @@ -11,7 +11,7 @@ libc = "0.2.73" [build-dependencies] # tidy-alphabetical-start # `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_codegen_ssa` and `rustc_windows_rc`. +# per crate", so if you change this, you need to also change it in `rustc_codegen_ssa`. cc = "=1.2.16" # tidy-alphabetical-end diff --git a/compiler/rustc_middle/src/middle/region.rs b/compiler/rustc_middle/src/middle/region.rs index 5367e5edd496a..0c881bc3a3b54 100644 --- a/compiler/rustc_middle/src/middle/region.rs +++ b/compiler/rustc_middle/src/middle/region.rs @@ -16,6 +16,7 @@ use rustc_macros::{HashStable, TyDecodable, TyEncodable}; use rustc_span::{DUMMY_SP, Span}; use tracing::debug; +use crate::mir::BackwardIncompatibleDropReason; use crate::ty::TyCtxt; /// Represents a statically-describable scope that can be used to @@ -221,6 +222,10 @@ pub struct ScopeTree { /// variable is declared. var_map: FxIndexMap, + /// Maps from bindings to their future scopes after #145838 for the + /// `macro_extended_temporary_scopes` lint. + var_compatibility_map: FxIndexMap, + /// Identifies expressions which, if captured into a temporary, ought to /// have a temporary whose lifetime extends to the end of the enclosing *block*, /// and not the enclosing *statement*. Expressions that are not present in this @@ -242,6 +247,19 @@ pub struct ScopeTree { pub struct RvalueCandidate { pub target: hir::ItemLocalId, pub lifetime: Option, + pub compat: ScopeCompatibility, +} + +/// Marks extended temporary scopes that will be shortened by #145838 and thus need to be linted on +/// by the `macro_extended_temporary_scopes` future-incompatibility warning. +#[derive(TyEncodable, TyDecodable, Clone, Copy, Debug, Eq, PartialEq, HashStable)] +pub enum ScopeCompatibility { + /// Marks a scope that was extended past a temporary destruction scope by a non-extending + /// `super let` initializer. + FutureIncompatible { shortens_to: Scope }, + /// Marks an extended temporary scope that was not extended by a non-extending `super let` + /// initializer. + FutureCompatible, } impl ScopeTree { @@ -260,6 +278,11 @@ impl ScopeTree { self.var_map.insert(var, lifetime); } + pub fn record_future_incompatible_var_scope(&mut self, var: hir::ItemLocalId, lifetime: Scope) { + assert!(var != lifetime.local_id); + self.var_compatibility_map.insert(var, lifetime); + } + pub fn record_rvalue_candidate(&mut self, var: HirId, candidate: RvalueCandidate) { debug!("record_rvalue_candidate(var={var:?}, candidate={candidate:?})"); if let Some(lifetime) = &candidate.lifetime { @@ -273,9 +296,14 @@ impl ScopeTree { self.parent_map.get(&id).cloned() } - /// Returns the lifetime of the local variable `var_id`, if any. - pub fn var_scope(&self, var_id: hir::ItemLocalId) -> Option { - self.var_map.get(&var_id).cloned() + /// Returns the lifetime of the local variable `var_id`, if any, as well as whether it is + /// shortening after #145838. + pub fn var_scope(&self, var_id: hir::ItemLocalId) -> (Option, ScopeCompatibility) { + let compat = match self.var_compatibility_map.get(&var_id) { + Some(&shortens_to) => ScopeCompatibility::FutureIncompatible { shortens_to }, + None => ScopeCompatibility::FutureCompatible, + }; + (self.var_map.get(&var_id).cloned(), compat) } /// Returns `true` if `subscope` is equal to or is lexically nested inside `superscope`, and @@ -303,7 +331,10 @@ impl ScopeTree { /// Returns the scope of non-lifetime-extended temporaries within a given scope, as well as /// whether we've recorded a potential backwards-incompatible change to lint on. /// Returns `None` when no enclosing temporary scope is found, such as for static items. - pub fn default_temporary_scope(&self, inner: Scope) -> (Option, Option) { + pub fn default_temporary_scope( + &self, + inner: Scope, + ) -> (Option, Option<(Scope, BackwardIncompatibleDropReason)>) { let mut id = inner; let mut backwards_incompatible = None; @@ -327,8 +358,10 @@ impl ScopeTree { // This is for now only working for cases where a temporary lifetime is // *shortened*. if backwards_incompatible.is_none() { - backwards_incompatible = - self.backwards_incompatible_scope.get(&p.local_id).copied(); + backwards_incompatible = self + .backwards_incompatible_scope + .get(&p.local_id) + .map(|&s| (s, BackwardIncompatibleDropReason::Edition2024)); } id = p } diff --git a/compiler/rustc_middle/src/mir/loops.rs b/compiler/rustc_middle/src/mir/loops.rs new file mode 100644 index 0000000000000..ae332913c6421 --- /dev/null +++ b/compiler/rustc_middle/src/mir/loops.rs @@ -0,0 +1,29 @@ +use rustc_index::bit_set::DenseBitSet; + +use super::*; + +/// Compute the set of loop headers in the given body. A loop header is usually defined as a block +/// which dominates one of its predecessors. This definition is only correct for reducible CFGs. +/// However, computing dominators is expensive, so we approximate according to the post-order +/// traversal order. A loop header for us is a block which is visited after its predecessor in +/// post-order. This is ok as we mostly need a heuristic. +pub fn maybe_loop_headers(body: &Body<'_>) -> DenseBitSet { + let mut maybe_loop_headers = DenseBitSet::new_empty(body.basic_blocks.len()); + let mut visited = DenseBitSet::new_empty(body.basic_blocks.len()); + for (bb, bbdata) in traversal::postorder(body) { + // Post-order means we visit successors before the block for acyclic CFGs. + // If the successor is not visited yet, consider it a loop header. + for succ in bbdata.terminator().successors() { + if !visited.contains(succ) { + maybe_loop_headers.insert(succ); + } + } + + // Only mark `bb` as visited after we checked the successors, in case we have a self-loop. + // bb1: goto -> bb1; + let _new = visited.insert(bb); + debug_assert!(_new); + } + + maybe_loop_headers +} diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index da2245b12d2c2..cfc2576756d22 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -51,6 +51,7 @@ mod statement; mod syntax; mod terminator; +pub mod loops; pub mod traversal; pub mod visit; diff --git a/compiler/rustc_middle/src/mir/syntax.rs b/compiler/rustc_middle/src/mir/syntax.rs index 3b8def67f92d7..09a9102086597 100644 --- a/compiler/rustc_middle/src/mir/syntax.rs +++ b/compiler/rustc_middle/src/mir/syntax.rs @@ -989,17 +989,21 @@ pub enum TerminatorKind<'tcx> { #[derive( Clone, + Copy, Debug, TyEncodable, TyDecodable, Hash, HashStable, PartialEq, + Eq, TypeFoldable, TypeVisitable )] pub enum BackwardIncompatibleDropReason { Edition2024, + /// Used by the `macro_extended_temporary_scopes` lint. + MacroExtendedScope, } #[derive(Debug, Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq)] diff --git a/compiler/rustc_middle/src/thir.rs b/compiler/rustc_middle/src/thir.rs index f1d19800a7891..9fd5ee42fba7e 100644 --- a/compiler/rustc_middle/src/thir.rs +++ b/compiler/rustc_middle/src/thir.rs @@ -27,7 +27,9 @@ use tracing::instrument; use crate::middle::region; use crate::mir::interpret::AllocId; -use crate::mir::{self, AssignOp, BinOp, BorrowKind, FakeReadCause, UnOp}; +use crate::mir::{ + self, AssignOp, BackwardIncompatibleDropReason, BinOp, BorrowKind, FakeReadCause, UnOp, +}; use crate::thir::visit::for_each_immediate_subpat; use crate::ty::adjustment::PointerCoercion; use crate::ty::layout::IntegerExt; @@ -272,7 +274,7 @@ pub struct TempLifetime { pub temp_lifetime: Option, /// If `Some(lt)`, indicates that the lifetime of this temporary will change to `lt` in a future edition. /// If `None`, then no changes are expected, or lints are disabled. - pub backwards_incompatible: Option, + pub backwards_incompatible: Option<(region::Scope, BackwardIncompatibleDropReason)>, } #[derive(Clone, Debug, HashStable)] @@ -1125,7 +1127,7 @@ mod size_asserts { use super::*; // tidy-alphabetical-start static_assert_size!(Block, 48); - static_assert_size!(Expr<'_>, 72); + static_assert_size!(Expr<'_>, 80); static_assert_size!(ExprKind<'_>, 40); static_assert_size!(Pat<'_>, 64); static_assert_size!(PatKind<'_>, 48); diff --git a/compiler/rustc_middle/src/ty/rvalue_scopes.rs b/compiler/rustc_middle/src/ty/rvalue_scopes.rs index 8b92e48ed1a07..eef8b6bd26ed2 100644 --- a/compiler/rustc_middle/src/ty/rvalue_scopes.rs +++ b/compiler/rustc_middle/src/ty/rvalue_scopes.rs @@ -3,13 +3,14 @@ use rustc_hir::ItemLocalMap; use rustc_macros::{HashStable, TyDecodable, TyEncodable}; use tracing::debug; -use crate::middle::region::{Scope, ScopeData, ScopeTree}; +use crate::middle::region::{ScopeCompatibility, Scope, ScopeData, ScopeTree}; +use crate::mir::BackwardIncompatibleDropReason; /// `RvalueScopes` is a mapping from sub-expressions to _extended_ lifetime as determined by /// rules laid out in `rustc_hir_analysis::check::rvalue_scopes`. #[derive(TyEncodable, TyDecodable, Clone, Debug, Default, Eq, PartialEq, HashStable)] pub struct RvalueScopes { - map: ItemLocalMap>, + map: ItemLocalMap<(Option, Option<(Scope, BackwardIncompatibleDropReason)>)>, } impl RvalueScopes { @@ -24,11 +25,11 @@ impl RvalueScopes { &self, region_scope_tree: &ScopeTree, expr_id: hir::ItemLocalId, - ) -> (Option, Option) { + ) -> (Option, Option<(Scope, BackwardIncompatibleDropReason)>) { // Check for a designated rvalue scope. - if let Some(&s) = self.map.get(&expr_id) { + if let Some(&(s, future_scope)) = self.map.get(&expr_id) { debug!("temporary_scope({expr_id:?}) = {s:?} [custom]"); - return (s, None); + return (s, future_scope); } // Otherwise, locate the innermost terminating scope @@ -40,11 +41,23 @@ impl RvalueScopes { } /// Make an association between a sub-expression and an extended lifetime - pub fn record_rvalue_scope(&mut self, var: hir::ItemLocalId, lifetime: Option) { + pub fn record_rvalue_scope( + &mut self, + var: hir::ItemLocalId, + lifetime: Option, + compat: ScopeCompatibility, + ) { debug!("record_rvalue_scope(var={var:?}, lifetime={lifetime:?})"); if let Some(lifetime) = lifetime { assert!(var != lifetime.local_id); } - self.map.insert(var, lifetime); + let future_scope = + if let ScopeCompatibility::FutureIncompatible { shortens_to } = compat + { + Some((shortens_to, BackwardIncompatibleDropReason::MacroExtendedScope)) + } else { + None + }; + self.map.insert(var, (lifetime, future_scope)); } } diff --git a/compiler/rustc_mir_build/src/builder/expr/as_temp.rs b/compiler/rustc_mir_build/src/builder/expr/as_temp.rs index b0ce3527d8b3d..b9f09fadc5a74 100644 --- a/compiler/rustc_mir_build/src/builder/expr/as_temp.rs +++ b/compiler/rustc_mir_build/src/builder/expr/as_temp.rs @@ -129,8 +129,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.schedule_drop(expr_span, temp_lifetime, temp, DropKind::Value); } - if let Some(backwards_incompatible) = temp_lifetime.backwards_incompatible { - this.schedule_backwards_incompatible_drop(expr_span, backwards_incompatible, temp); + if let Some((backwards_incompatible, reason)) = temp_lifetime.backwards_incompatible { + this.schedule_backwards_incompatible_drop( + expr_span, + backwards_incompatible, + temp, + reason, + ); } block.and(temp) diff --git a/compiler/rustc_mir_build/src/builder/matches/mod.rs b/compiler/rustc_mir_build/src/builder/matches/mod.rs index d216c4ecd1155..9ba2f4db4f03a 100644 --- a/compiler/rustc_mir_build/src/builder/matches/mod.rs +++ b/compiler/rustc_mir_build/src/builder/matches/mod.rs @@ -15,7 +15,7 @@ use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_hir::{BindingMode, ByRef, LetStmt, LocalSource, Node}; use rustc_middle::bug; -use rustc_middle::middle::region; +use rustc_middle::middle::region::{self, ScopeCompatibility}; use rustc_middle::mir::*; use rustc_middle::thir::{self, *}; use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, ValTree, ValTreeKind}; @@ -807,10 +807,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.cfg.push(block, Statement::new(source_info, StatementKind::StorageLive(local_id))); // Although there is almost always scope for given variable in corner cases // like #92893 we might get variable with no scope. - if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) - && matches!(schedule_drop, ScheduleDrops::Yes) - { - self.schedule_drop(span, region_scope, local_id, DropKind::Storage); + if matches!(schedule_drop, ScheduleDrops::Yes) { + let (var_scope, var_scope_compat) = self.region_scope_tree.var_scope(var.0.local_id); + if let Some(region_scope) = var_scope { + self.schedule_drop(span, region_scope, local_id, DropKind::Storage); + } + if let ScopeCompatibility::FutureIncompatible { shortens_to } = var_scope_compat { + self.schedule_backwards_incompatible_drop( + span, + shortens_to, + local_id, + BackwardIncompatibleDropReason::MacroExtendedScope, + ); + } } Place::from(local_id) } @@ -822,7 +831,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { for_guard: ForGuard, ) { let local_id = self.var_local_id(var, for_guard); - if let Some(region_scope) = self.region_scope_tree.var_scope(var.0.local_id) { + // We can ignore the var scope's future-compatibility information since we've already taken + // it into account when scheduling the storage drop in `storage_live_binding`. + if let (Some(region_scope), _) = self.region_scope_tree.var_scope(var.0.local_id) { self.schedule_drop(span, region_scope, local_id, DropKind::Value); } } diff --git a/compiler/rustc_mir_build/src/builder/scope.rs b/compiler/rustc_mir_build/src/builder/scope.rs index 9665987362202..7fbc005967b8a 100644 --- a/compiler/rustc_mir_build/src/builder/scope.rs +++ b/compiler/rustc_mir_build/src/builder/scope.rs @@ -85,7 +85,7 @@ use std::mem; use interpret::ErrorHandled; use rustc_data_structures::fx::FxHashMap; -use rustc_hir::HirId; +use rustc_hir::{self as hir, HirId}; use rustc_index::{IndexSlice, IndexVec}; use rustc_middle::middle::region; use rustc_middle::mir::{self, *}; @@ -166,7 +166,7 @@ struct DropData { pub(crate) enum DropKind { Value, Storage, - ForLint, + ForLint(BackwardIncompatibleDropReason), } #[derive(Debug)] @@ -268,7 +268,7 @@ impl Scope { /// use of optimizations in the MIR coroutine transform. fn needs_cleanup(&self) -> bool { self.drops.iter().any(|drop| match drop.kind { - DropKind::Value | DropKind::ForLint => true, + DropKind::Value | DropKind::ForLint(_) => true, DropKind::Storage => false, }) } @@ -432,12 +432,12 @@ impl DropTree { }; cfg.terminate(block, drop_node.data.source_info, terminator); } - DropKind::ForLint => { + DropKind::ForLint(reason) => { let stmt = Statement::new( drop_node.data.source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(drop_node.data.local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ); cfg.push(block, stmt); @@ -1161,14 +1161,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ); block = next; } - DropKind::ForLint => { + DropKind::ForLint(reason) => { self.cfg.push( block, Statement::new( source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ), ); @@ -1395,7 +1395,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { drop_kind: DropKind, ) { let needs_drop = match drop_kind { - DropKind::Value | DropKind::ForLint => { + DropKind::Value | DropKind::ForLint(_) => { if !self.local_decls[local].ty.needs_drop(self.tcx, self.typing_env()) { return; } @@ -1492,6 +1492,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { span: Span, region_scope: region::Scope, local: Local, + reason: BackwardIncompatibleDropReason, ) { // Note that we are *not* gating BIDs here on whether they have significant destructor. // We need to know all of them so that we can capture potential borrow-checking errors. @@ -1499,13 +1500,24 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Since we are inserting linting MIR statement, we have to invalidate the caches scope.invalidate_cache(); if scope.region_scope == region_scope { - let region_scope_span = region_scope.span(self.tcx, self.region_scope_tree); + // We'll be using this span in diagnostics, so let's make sure it points to the end + // end of the block, not just the end of the tail expression. + let region_scope_span = if reason + == BackwardIncompatibleDropReason::MacroExtendedScope + && let Some(scope_hir_id) = region_scope.hir_id(self.region_scope_tree) + && let hir::Node::Expr(expr) = self.tcx.hir_node(scope_hir_id) + && let hir::Node::Block(blk) = self.tcx.parent_hir_node(expr.hir_id) + { + blk.span + } else { + region_scope.span(self.tcx, self.region_scope_tree) + }; let scope_end = self.tcx.sess.source_map().end_point(region_scope_span); scope.drops.push(DropData { source_info: SourceInfo { span: scope_end, scope: scope.source_scope }, local, - kind: DropKind::ForLint, + kind: DropKind::ForLint(reason), }); return; @@ -1902,7 +1914,7 @@ where ); block = next; } - DropKind::ForLint => { + DropKind::ForLint(reason) => { // As in the `DropKind::Storage` case below: // normally lint-related drops are not emitted for unwind, // so we can just leave `unwind_to` unmodified, but in some @@ -1931,7 +1943,7 @@ where source_info, StatementKind::BackwardIncompatibleDropHint { place: Box::new(local.into()), - reason: BackwardIncompatibleDropReason::Edition2024, + reason, }, ), ); @@ -1985,7 +1997,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> { let mut unwind_indices = IndexVec::from_elem_n(unwind_target, 1); for (drop_idx, drop_node) in drops.drop_nodes.iter_enumerated().skip(1) { match drop_node.data.kind { - DropKind::Storage | DropKind::ForLint => { + DropKind::Storage | DropKind::ForLint(_) => { if is_coroutine { let unwind_drop = self .scopes @@ -2024,7 +2036,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> { .coroutine_drops .add_drop(drop_data.data, dropline_indices[drop_data.next]); match drop_data.data.kind { - DropKind::Storage | DropKind::ForLint => {} + DropKind::Storage | DropKind::ForLint(_) => {} DropKind::Value => { if self.is_async_drop(drop_data.data.local) { self.scopes.coroutine_drops.add_entry_point( diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs index bf6aa800d20f4..7795fac1941a4 100644 --- a/compiler/rustc_mir_transform/src/gvn.rs +++ b/compiler/rustc_mir_transform/src/gvn.rs @@ -126,6 +126,7 @@ impl<'tcx> crate::MirPass<'tcx> for GVN { let ssa = SsaLocals::new(tcx, body, typing_env); // Clone dominators because we need them while mutating the body. let dominators = body.basic_blocks.dominators().clone(); + let maybe_loop_headers = loops::maybe_loop_headers(body); let mut state = VnState::new(tcx, body, typing_env, &ssa, dominators, &body.local_decls); @@ -136,6 +137,11 @@ impl<'tcx> crate::MirPass<'tcx> for GVN { let reverse_postorder = body.basic_blocks.reverse_postorder().to_vec(); for bb in reverse_postorder { + // N.B. With loops, reverse postorder cannot produce a valid topological order. + // A statement or terminator from inside the loop, that is not processed yet, may have performed an indirect write. + if maybe_loop_headers.contains(bb) { + state.invalidate_derefs(); + } let data = &mut body.basic_blocks.as_mut_preserves_cfg()[bb]; state.visit_basic_block_data(bb, data); } diff --git a/compiler/rustc_mir_transform/src/jump_threading.rs b/compiler/rustc_mir_transform/src/jump_threading.rs index f9e642e28ebd7..fb2f82fcaf707 100644 --- a/compiler/rustc_mir_transform/src/jump_threading.rs +++ b/compiler/rustc_mir_transform/src/jump_threading.rs @@ -84,7 +84,7 @@ impl<'tcx> crate::MirPass<'tcx> for JumpThreading { body, arena, map: Map::new(tcx, body, Some(MAX_PLACES)), - loop_headers: loop_headers(body), + loop_headers: loops::maybe_loop_headers(body), opportunities: Vec::new(), }; @@ -832,21 +832,3 @@ enum Update { Incr, Decr, } - -/// Compute the set of loop headers in the given body. We define a loop header as a block which has -/// at least a predecessor which it dominates. This definition is only correct for reducible CFGs. -/// But if the CFG is already irreducible, there is no point in trying much harder. -/// is already irreducible. -fn loop_headers(body: &Body<'_>) -> DenseBitSet { - let mut loop_headers = DenseBitSet::new_empty(body.basic_blocks.len()); - let dominators = body.basic_blocks.dominators(); - // Only visit reachable blocks. - for (bb, bbdata) in traversal::preorder(body) { - for succ in bbdata.terminator().successors() { - if dominators.dominates(succ, bb) { - loop_headers.insert(succ); - } - } - } - loop_headers -} diff --git a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs index 61c9bbe31239e..58bc154fbdfde 100644 --- a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs +++ b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs @@ -13,8 +13,8 @@ use rustc_index::{IndexSlice, IndexVec}; use rustc_macros::{LintDiagnostic, Subdiagnostic}; use rustc_middle::bug; use rustc_middle::mir::{ - self, BasicBlock, Body, ClearCrossCrate, Local, Location, MirDumper, Place, StatementKind, - TerminatorKind, + self, BackwardIncompatibleDropReason, BasicBlock, Body, ClearCrossCrate, Local, Location, + MirDumper, Place, StatementKind, TerminatorKind, }; use rustc_middle::ty::significant_drop_order::{ extract_component_with_significant_dtor, ty_dtor_span, @@ -207,7 +207,11 @@ pub(crate) fn run_lint<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId, body: &Body< let mut ty_dropped_components = UnordMap::default(); for (block, data) in body.basic_blocks.iter_enumerated() { for (statement_index, stmt) in data.statements.iter().enumerate() { - if let StatementKind::BackwardIncompatibleDropHint { place, reason: _ } = &stmt.kind { + if let StatementKind::BackwardIncompatibleDropHint { + place, + reason: BackwardIncompatibleDropReason::Edition2024, + } = &stmt.kind + { let ty = place.ty(body, tcx).ty; if ty_dropped_components .entry(ty) diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index cdb0b5b58da6d..bc2c687035e36 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -871,6 +871,7 @@ symbols! { div, div_assign, diverging_block_default, + dl, do_not_recommend, doc, doc_alias, @@ -1850,7 +1851,6 @@ symbols! { rustc_align_static, rustc_allocator, rustc_allocator_zeroed, - rustc_allocator_zeroed_variant, rustc_allow_const_fn_unstable, rustc_allow_incoherent_impl, rustc_allowed_through_unstable_modules, diff --git a/compiler/rustc_trait_selection/src/infer.rs b/compiler/rustc_trait_selection/src/infer.rs index 4c50c44b84182..cd076d1cb692a 100644 --- a/compiler/rustc_trait_selection/src/infer.rs +++ b/compiler/rustc_trait_selection/src/infer.rs @@ -9,7 +9,7 @@ use rustc_middle::infer::canonical::{ Canonical, CanonicalQueryInput, CanonicalQueryResponse, QueryResponse, }; use rustc_middle::traits::query::NoSolution; -use rustc_middle::ty::{self, GenericArg, Ty, TyCtxt, TypeFoldable, TypeVisitableExt, Upcast}; +use rustc_middle::ty::{self, GenericArg, Ty, TyCtxt, TypeFoldable, Upcast}; use rustc_span::DUMMY_SP; use tracing::instrument; @@ -31,19 +31,7 @@ impl<'tcx> InferCtxt<'tcx> { fn type_is_copy_modulo_regions(&self, param_env: ty::ParamEnv<'tcx>, ty: Ty<'tcx>) -> bool { let ty = self.resolve_vars_if_possible(ty); - - // FIXME(#132279): This should be removed as it causes us to incorrectly - // handle opaques in their defining scope, and stalled coroutines. - if !self.next_trait_solver() && !(param_env, ty).has_infer() && !ty.has_coroutines() { - return self.tcx.type_is_copy_modulo_regions(self.typing_env(param_env), ty); - } - let copy_def_id = self.tcx.require_lang_item(LangItem::Copy, DUMMY_SP); - - // This can get called from typeck (by euv), and `moves_by_default` - // rightly refuses to work with inference variables, but - // moves_by_default has a cache, which we want to use in other - // cases. traits::type_known_to_meet_bound_modulo_regions(self, param_env, ty, copy_def_id) } diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 488094b15ac60..5a3b45591f248 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -423,19 +423,24 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { constituents.types, ); - // FIXME(coroutine_clone): We could uplift this into `collect_predicates_for_types` - // and do this for `Copy`/`Clone` too, but that's feature-gated so it doesn't really - // matter yet. - for assumption in constituents.assumptions { - let assumption = normalize_with_depth_to( - self, - obligation.param_env, - cause.clone(), - obligation.recursion_depth + 1, - assumption, - &mut obligations, - ); - self.infcx.register_region_assumption(assumption); + // Only normalize these goals if `-Zhigher-ranked-assumptions` is enabled, since + // we don't want to cause ourselves to do extra work if we're not even able to + // take advantage of these assumption clauses. + if self.tcx().sess.opts.unstable_opts.higher_ranked_assumptions { + // FIXME(coroutine_clone): We could uplift this into `collect_predicates_for_types` + // and do this for `Copy`/`Clone` too, but that's feature-gated so it doesn't really + // matter yet. + for assumption in constituents.assumptions { + let assumption = normalize_with_depth_to( + self, + obligation.param_env, + cause.clone(), + obligation.recursion_depth + 1, + assumption, + &mut obligations, + ); + self.infcx.register_region_assumption(assumption); + } } Ok(obligations) diff --git a/compiler/rustc_windows_rc/Cargo.toml b/compiler/rustc_windows_rc/Cargo.toml deleted file mode 100644 index 080acd35c38cb..0000000000000 --- a/compiler/rustc_windows_rc/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "rustc_windows_rc" -version = "0.0.0" -edition = "2024" - -[dependencies] -#tidy-alphabetical-start -# `cc` updates often break things, so we pin it here. Cargo enforces "max 1 semver-compat version -# per crate", so if you change this, you need to also change it in `rustc_llvm` and `rustc_codegen_ssa`. -cc = "=1.2.16" -#tidy-alphabetical-end diff --git a/compiler/rustc_windows_rc/rustc.rc.in b/compiler/rustc_windows_rc/rustc.rc.in deleted file mode 100644 index 10a00b9bd4e32..0000000000000 --- a/compiler/rustc_windows_rc/rustc.rc.in +++ /dev/null @@ -1,40 +0,0 @@ -// A template for the rustc_driver and rustc Windows resource files. -// This file is processed by the build script to produce rustc.rc and rustc_driver.rc -// with the appropriate version information filled in. - -// All the strings are in UTF-8 -#pragma code_page(65001) - -#define RUSTC_FILEDESCRIPTION_STR "@RUSTC_FILEDESCRIPTION_STR@" -#define RUSTC_FILETYPE @RUSTC_FILETYPE@ -#define RUSTC_FILEVERSION_QUAD @RUSTC_FILEVERSION_QUAD@ -#define RUSTC_FILEVERSION_STR "@RUSTC_FILEVERSION_STR@" - -#define RUSTC_PRODUCTNAME_STR "@RUSTC_PRODUCTNAME_STR@" -#define RUSTC_PRODUCTVERSION_QUAD @RUSTC_PRODUCTVERSION_QUAD@ -#define RUSTC_PRODUCTVERSION_STR "@RUSTC_PRODUCTVERSION_STR@" - - -1 VERSIONINFO -FILEVERSION RUSTC_FILEVERSION_QUAD -PRODUCTVERSION RUSTC_PRODUCTVERSION_QUAD -FILEOS 0x00040004 -FILETYPE RUSTC_FILETYPE -FILESUBTYPE 0 -FILEFLAGSMASK 0x3f -FILEFLAGS 0x0 -{ - BLOCK "StringFileInfo" - { - BLOCK "000004b0" - { - VALUE "FileDescription", RUSTC_FILEDESCRIPTION_STR - VALUE "FileVersion", RUSTC_FILEVERSION_STR - VALUE "ProductVersion", RUSTC_PRODUCTVERSION_STR - VALUE "ProductName", RUSTC_PRODUCTNAME_STR - } - } - BLOCK "VarFileInfo" { - VALUE "Translation", 0x0, 0x04b0 - } -} diff --git a/compiler/rustc_windows_rc/src/lib.rs b/compiler/rustc_windows_rc/src/lib.rs deleted file mode 100644 index caa5e5ef27656..0000000000000 --- a/compiler/rustc_windows_rc/src/lib.rs +++ /dev/null @@ -1,158 +0,0 @@ -//! A build script dependency to create a Windows resource file for the compiler -//! -//! Uses values from the `CFG_VERSION` and `CFG_RELEASE` environment variables -//! to set the product and file version information in the Windows resource file. -use std::{env, ffi, fs, path, process}; - -use cc::windows_registry; - -/// The template for the Windows resource file. -const RESOURCE_TEMPLATE: &str = include_str!("../rustc.rc.in"); - -/// A subset of the possible values for the `FILETYPE` field in a Windows resource file -/// -/// See the `dwFileType` member of [VS_FIXEDFILEINFO](https://learn.microsoft.com/en-us/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo#members) -#[derive(Debug, Clone, Copy)] -#[repr(u32)] -pub enum VersionInfoFileType { - /// `VFT_APP` - The file is an application. - App = 0x00000001, - /// `VFT_DLL` - The file is a dynamic link library. - Dll = 0x00000002, -} - -/// Create and compile a Windows resource file with the product and file version information for the rust compiler. -/// -/// Returns the path to the compiled resource file -/// -/// Does not emit any cargo directives, the caller is responsible for that. -pub fn compile_windows_resource_file( - file_stem: &path::Path, - file_description: &str, - filetype: VersionInfoFileType, -) -> path::PathBuf { - let mut resources_dir = path::PathBuf::from(env::var_os("OUT_DIR").unwrap()); - resources_dir.push("resources"); - fs::create_dir_all(&resources_dir).unwrap(); - - let resource_compiler = - find_resource_compiler(&env::var("CARGO_CFG_TARGET_ARCH").unwrap()).expect("found rc.exe"); - - let rc_path = resources_dir.join(file_stem.with_extension("rc")); - - write_resource_script_file(&rc_path, file_description, filetype); - - let res_path = resources_dir.join(file_stem.with_extension("res")); - - let status = process::Command::new(resource_compiler) - .arg("/fo") - .arg(&res_path) - .arg(&rc_path) - .status() - .expect("can execute resource compiler"); - assert!(status.success(), "rc.exe failed with status {}", status); - assert!( - res_path.try_exists().unwrap_or(false), - "resource file {} was not created", - res_path.display() - ); - res_path -} - -/// Writes a Windows resource script file for the rust compiler with the product and file version information -/// into `rc_path` -fn write_resource_script_file( - rc_path: &path::Path, - file_description: &str, - filetype: VersionInfoFileType, -) { - let mut resource_script = RESOURCE_TEMPLATE.to_string(); - - // Set the string product and file version to the same thing as `rustc --version` - let descriptive_version = env::var("CFG_VERSION").unwrap_or("unknown".to_string()); - - // Set the product name to "Rust Compiler" or "Rust Compiler (nightly)" etc - let product_name = product_name(env::var("CFG_RELEASE_CHANNEL").unwrap()); - - // For the numeric version we need `major,minor,patch,build`. - // Extract them from `CFG_RELEASE` which is "major.minor.patch" and a "-dev", "-nightly" or similar suffix - let cfg_release = env::var("CFG_RELEASE").unwrap(); - // remove the suffix, if present and parse into [`ResourceVersion`] - let version = parse_version(cfg_release.split("-").next().unwrap_or("0.0.0")) - .expect("valid CFG_RELEASE version"); - - resource_script = resource_script - .replace("@RUSTC_FILEDESCRIPTION_STR@", file_description) - .replace("@RUSTC_FILETYPE@", &format!("{}", filetype as u32)) - .replace("@RUSTC_FILEVERSION_QUAD@", &version.to_quad_string()) - .replace("@RUSTC_FILEVERSION_STR@", &descriptive_version) - .replace("@RUSTC_PRODUCTNAME_STR@", &product_name) - .replace("@RUSTC_PRODUCTVERSION_QUAD@", &version.to_quad_string()) - .replace("@RUSTC_PRODUCTVERSION_STR@", &descriptive_version); - - fs::write(&rc_path, resource_script) - .unwrap_or_else(|_| panic!("failed to write resource file {}", rc_path.display())); -} - -fn product_name(channel: String) -> String { - format!( - "Rust Compiler{}", - if channel == "stable" { "".to_string() } else { format!(" ({})", channel) } - ) -} - -/// Windows resources store versions as four 16-bit integers. -struct ResourceVersion { - major: u16, - minor: u16, - patch: u16, - build: u16, -} - -impl ResourceVersion { - /// Format the version as a comma-separated string of four integers - /// as expected by Windows resource scripts for the `FILEVERSION` and `PRODUCTVERSION` fields. - fn to_quad_string(&self) -> String { - format!("{},{},{},{}", self.major, self.minor, self.patch, self.build) - } -} - -/// Parse a string in the format "major.minor.patch" into a [`ResourceVersion`]. -/// The build is set to 0. -/// Returns `None` if the version string is not in the expected format. -fn parse_version(version: &str) -> Option { - let mut parts = version.split('.'); - let major = parts.next()?.parse::().ok()?; - let minor = parts.next()?.parse::().ok()?; - let patch = parts.next()?.parse::().ok()?; - if parts.next().is_some() { - None - } else { - Some(ResourceVersion { major, minor, patch, build: 0 }) - } -} - -/// Find the Windows SDK resource compiler `rc.exe` for the given architecture or target triple. -/// Returns `None` if the tool could not be found. -fn find_resource_compiler(arch_or_target: &str) -> Option { - find_windows_sdk_tool(arch_or_target, "rc.exe") -} - -/// Find a Windows SDK tool for the given architecture or target triple. -/// Returns `None` if the tool could not be found. -fn find_windows_sdk_tool(arch_or_target: &str, tool_name: &str) -> Option { - // windows_registry::find_tool can only find MSVC tools, not Windows SDK tools, but - // cc does include the Windows SDK tools in the PATH environment of MSVC tools. - - let msvc_linker = windows_registry::find_tool(arch_or_target, "link.exe")?; - let path = &msvc_linker.env().iter().find(|(k, _)| k == "PATH")?.1; - find_tool_in_path(tool_name, path) -} - -/// Find a tool in the directories in a given PATH-like string. -fn find_tool_in_path>(tool_name: &str, path: P) -> Option { - env::split_paths(path.as_ref()).find_map(|p| { - let tool_path = p.join(tool_name); - if tool_path.try_exists().unwrap_or(false) { Some(tool_path) } else { None } - }) -} diff --git a/library/alloc/src/alloc.rs b/library/alloc/src/alloc.rs index 76630a746dd26..c9b98fa4e5a9b 100644 --- a/library/alloc/src/alloc.rs +++ b/library/alloc/src/alloc.rs @@ -17,7 +17,6 @@ unsafe extern "Rust" { #[rustc_allocator] #[rustc_nounwind] #[rustc_std_internal_symbol] - #[rustc_allocator_zeroed_variant = "__rust_alloc_zeroed"] fn __rust_alloc(size: usize, align: usize) -> *mut u8; #[rustc_deallocator] #[rustc_nounwind] diff --git a/library/alloc/src/boxed.rs b/library/alloc/src/boxed.rs index 98c9f6b51ab86..c67b75a070a67 100644 --- a/library/alloc/src/boxed.rs +++ b/library/alloc/src/boxed.rs @@ -1718,7 +1718,7 @@ impl Default for Box { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 98f11e2ea57fd..e5943f55eb4bf 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -1449,7 +1449,7 @@ impl BTreeMap { /// assert_eq!(low.keys().copied().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.keys().copied().collect::>(), [4, 5, 6, 7]); /// ``` - #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "btree_extract_if", since = "1.91.0")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F, A> where K: Ord, @@ -1936,7 +1936,7 @@ impl Default for Values<'_, K, V> { } /// An iterator produced by calling `extract_if` on BTreeMap. -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1969,7 +1969,7 @@ pub(super) struct ExtractIfInner<'a, K, V, R> { range: R, } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl fmt::Debug for ExtractIf<'_, K, V, R, F, A> where K: fmt::Debug, @@ -1981,7 +1981,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl Iterator for ExtractIf<'_, K, V, R, F, A> where K: PartialOrd, @@ -2055,7 +2055,7 @@ impl<'a, K, V, R> ExtractIfInner<'a, K, V, R> { } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl FusedIterator for ExtractIf<'_, K, V, R, F> where K: PartialOrd, diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index e6b0a1f632321..6e6996bcbd69b 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -1218,7 +1218,7 @@ impl BTreeSet { /// assert_eq!(low.into_iter().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.into_iter().collect::>(), [4, 5, 6, 7]); /// ``` - #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "btree_extract_if", since = "1.91.0")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A> where T: Ord, @@ -1553,7 +1553,7 @@ impl<'a, T, A: Allocator + Clone> IntoIterator for &'a BTreeSet { } /// An iterator produced by calling `extract_if` on BTreeSet. -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1568,7 +1568,7 @@ pub struct ExtractIf< alloc: A, } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl fmt::Debug for ExtractIf<'_, T, R, F, A> where T: fmt::Debug, @@ -1581,7 +1581,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl Iterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, @@ -1601,7 +1601,7 @@ where } } -#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "btree_extract_if", since = "1.91.0")] impl FusedIterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index 529b583cdd2bc..71bce93b6dc5f 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -2398,7 +2398,7 @@ impl Default for Rc<[T]> { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index a21b6880674c6..4ddc5c4185a87 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -3655,7 +3655,7 @@ impl Default for Arc<[T]> { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "pin_default_impls", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_default_impls", since = "1.91.0")] impl Default for Pin> where T: ?Sized, diff --git a/library/core/src/any.rs b/library/core/src/any.rs index 76ea2d18a82f4..3ab95438c3ff3 100644 --- a/library/core/src/any.rs +++ b/library/core/src/any.rs @@ -774,7 +774,7 @@ impl TypeId { /// ``` #[must_use] #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_type_id", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_type_id", since = "1.91.0")] pub const fn of() -> TypeId { const { intrinsics::type_id::() } } diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index d14419a23a1d8..00726e1abce21 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -49,7 +49,7 @@ pub use iter::IntoIter; /// ``` #[inline] #[must_use = "cloning is often expensive and is not expected to have side effects"] -#[stable(feature = "array_repeat", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "array_repeat", since = "1.91.0")] pub fn repeat(val: T) -> [T; N] { from_trusted_iterator(repeat_n(val, N)) } @@ -622,7 +622,7 @@ impl [T; N] { /// assert_eq!(strings.len(), 3); /// ``` #[stable(feature = "array_methods", since = "1.77.0")] - #[rustc_const_stable(feature = "const_array_each_ref", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_array_each_ref", since = "1.91.0")] pub const fn each_ref(&self) -> [&T; N] { let mut buf = [null::(); N]; @@ -653,7 +653,7 @@ impl [T; N] { /// assert_eq!(floats, [0.0, 2.7, -1.0]); /// ``` #[stable(feature = "array_methods", since = "1.77.0")] - #[rustc_const_stable(feature = "const_array_each_ref", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_array_each_ref", since = "1.91.0")] pub const fn each_mut(&mut self) -> [&mut T; N] { let mut buf = [null_mut::(); N]; diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 9b53b75ebee80..9a6c6c12ffcbd 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -705,8 +705,8 @@ impl Cell<[T; N]> { /// let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array); /// let array_cell: &[Cell; 3] = cell_array.as_array_of_cells(); /// ``` - #[stable(feature = "as_array_of_cells", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "as_array_of_cells", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "as_array_of_cells", since = "1.91.0")] + #[rustc_const_stable(feature = "as_array_of_cells", since = "1.91.0")] pub const fn as_array_of_cells(&self) -> &[Cell; N] { // SAFETY: `Cell` has the same memory layout as `T`. unsafe { &*(self as *const Cell<[T; N]> as *const [Cell; N]) } diff --git a/library/core/src/iter/adapters/chain.rs b/library/core/src/iter/adapters/chain.rs index 3ebdf7b472796..0ece54554d464 100644 --- a/library/core/src/iter/adapters/chain.rs +++ b/library/core/src/iter/adapters/chain.rs @@ -60,7 +60,7 @@ impl Chain { /// assert_eq!(iter.next(), Some(6)); /// assert_eq!(iter.next(), None); /// ``` -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub fn chain(a: A, b: B) -> Chain where A: IntoIterator, diff --git a/library/core/src/iter/adapters/mod.rs b/library/core/src/iter/adapters/mod.rs index 6c6de0a4e5c98..1ff5093922b6d 100644 --- a/library/core/src/iter/adapters/mod.rs +++ b/library/core/src/iter/adapters/mod.rs @@ -32,7 +32,7 @@ mod zip; pub use self::array_chunks::ArrayChunks; #[unstable(feature = "std_internals", issue = "none")] pub use self::by_ref_sized::ByRefSized; -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub use self::chain::chain; #[stable(feature = "iter_cloned", since = "1.1.0")] pub use self::cloned::Cloned; diff --git a/library/core/src/iter/mod.rs b/library/core/src/iter/mod.rs index bc07324f5204c..c7e1c4ef767ba 100644 --- a/library/core/src/iter/mod.rs +++ b/library/core/src/iter/mod.rs @@ -404,7 +404,7 @@ pub use self::adapters::StepBy; pub use self::adapters::TrustedRandomAccess; #[unstable(feature = "trusted_random_access", issue = "none")] pub use self::adapters::TrustedRandomAccessNoCoerce; -#[stable(feature = "iter_chain", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_chain", since = "1.91.0")] pub use self::adapters::chain; pub(crate) use self::adapters::try_process; #[stable(feature = "iter_zip", since = "1.59.0")] diff --git a/library/core/src/iter/traits/accum.rs b/library/core/src/iter/traits/accum.rs index 3b805139ded17..375b5ef52859f 100644 --- a/library/core/src/iter/traits/accum.rs +++ b/library/core/src/iter/traits/accum.rs @@ -148,7 +148,7 @@ macro_rules! saturating_integer_sum_product { saturating_integer_sum_product!(@impls Saturating(0), Saturating(1), "The short-circuiting behavior of this implementation is unspecified. If you care about \ short-circuiting, use [`Iterator::fold`] directly.", - #[stable(feature = "saturating_iter_arith", since = "CURRENT_RUSTC_VERSION")], + #[stable(feature = "saturating_iter_arith", since = "1.91.0")], $(Saturating<$a>)*); ); } diff --git a/library/core/src/net/ip_addr.rs b/library/core/src/net/ip_addr.rs index 9779fb8fe4d5e..a1bfd774710d5 100644 --- a/library/core/src/net/ip_addr.rs +++ b/library/core/src/net/ip_addr.rs @@ -631,8 +631,8 @@ impl Ipv4Addr { /// let addr = Ipv4Addr::from_octets([13u8, 12u8, 11u8, 10u8]); /// assert_eq!(Ipv4Addr::new(13, 12, 11, 10), addr); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_octets(octets: [u8; 4]) -> Ipv4Addr { @@ -1478,8 +1478,8 @@ impl Ipv6Addr { /// addr /// ); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_segments(segments: [u16; 8]) -> Ipv6Addr { @@ -2043,8 +2043,8 @@ impl Ipv6Addr { /// addr /// ); /// ``` - #[stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "ip_from", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "ip_from", since = "1.91.0")] + #[rustc_const_stable(feature = "ip_from", since = "1.91.0")] #[must_use] #[inline] pub const fn from_octets(octets: [u8; 16]) -> Ipv6Addr { diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs index 64a3dd3e8bc54..93f586b1e871d 100644 --- a/library/core/src/num/int_macros.rs +++ b/library/core/src/num/int_macros.rs @@ -519,8 +519,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -609,8 +609,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add_unsigned(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -659,8 +659,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MIN + 2).strict_sub(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -749,8 +749,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MIN + 2).strict_sub_unsigned(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -799,8 +799,8 @@ macro_rules! int_impl { /// ``` should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_mul(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -906,8 +906,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -973,8 +973,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1139,8 +1139,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_rem(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1205,8 +1205,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_rem_euclid(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1286,8 +1286,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_neg();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1342,8 +1342,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = 0x1", stringify!($SelfT), ".strict_shl(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1517,8 +1517,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shr(128);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1693,8 +1693,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MIN.strict_abs();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1762,8 +1762,8 @@ macro_rules! int_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_pow(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] diff --git a/library/core/src/num/uint_macros.rs b/library/core/src/num/uint_macros.rs index bf72ec8319704..7b40373065fd7 100644 --- a/library/core/src/num/uint_macros.rs +++ b/library/core/src/num/uint_macros.rs @@ -667,8 +667,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -762,8 +762,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX - 2).strict_add_signed(3);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -821,8 +821,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0", stringify!($SelfT), ".strict_sub(1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -946,8 +946,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (", stringify!($SelfT), "::MAX).strict_sub_signed(-1);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1002,8 +1002,8 @@ macro_rules! uint_impl { "::MAX), Some(0));" )] /// ``` - #[stable(feature = "unsigned_signed_diff", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "unsigned_signed_diff", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_signed_diff", since = "1.91.0")] + #[rustc_const_stable(feature = "unsigned_signed_diff", since = "1.91.0")] #[inline] pub const fn checked_signed_diff(self, rhs: Self) -> Option<$SignedT> { let res = self.wrapping_sub(rhs) as $SignedT; @@ -1055,8 +1055,8 @@ macro_rules! uint_impl { /// ``` should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_mul(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1151,8 +1151,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1205,8 +1205,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = (1", stringify!($SelfT), ").strict_div_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1353,8 +1353,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 5", stringify!($SelfT), ".strict_rem(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1409,8 +1409,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 5", stringify!($SelfT), ".strict_rem_euclid(0);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline(always)] @@ -1694,8 +1694,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 1", stringify!($SelfT), ".strict_neg();")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1750,8 +1750,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shl(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1922,8 +1922,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = 0x10", stringify!($SelfT), ".strict_shr(129);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2104,8 +2104,8 @@ macro_rules! uint_impl { /// ```should_panic #[doc = concat!("let _ = ", stringify!($SelfT), "::MAX.strict_pow(2);")] /// ``` - #[stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "strict_overflow_ops", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_overflow_ops", since = "1.91.0")] + #[rustc_const_stable(feature = "strict_overflow_ops", since = "1.91.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2682,7 +2682,7 @@ macro_rules! uint_impl { /// /// assert_eq!((sum1, sum0), (9, 6)); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -2774,7 +2774,7 @@ macro_rules! uint_impl { /// #[doc = concat!("assert_eq!((diff1, diff0), (3, ", stringify!($SelfT), "::MAX));")] /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -2991,7 +2991,7 @@ macro_rules! uint_impl { /// 789_u16.wrapping_mul(456).wrapping_add(123), /// ); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] @@ -3057,7 +3057,7 @@ macro_rules! uint_impl { /// u32::to_le_bytes(0xcffc982d) /// ); /// ``` - #[stable(feature = "unsigned_bigint_helpers", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "unsigned_bigint_helpers", since = "1.91.0")] #[rustc_const_unstable(feature = "bigint_helper_methods", issue = "85532")] #[must_use = "this returns the result of the operation, \ without modifying the original"] diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 625024373ef47..b29d267654252 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -975,7 +975,7 @@ pub const fn dangling_mut() -> *mut T { #[must_use] #[inline(always)] #[stable(feature = "exposed_provenance", since = "1.84.0")] -#[rustc_const_stable(feature = "const_exposed_provenance", since = "CURRENT_RUSTC_VERSION")] +#[rustc_const_stable(feature = "const_exposed_provenance", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[allow(fuzzy_provenance_casts)] // this *is* the explicit provenance API one should use instead pub const fn with_exposed_provenance(addr: usize) -> *const T { @@ -1016,7 +1016,7 @@ pub const fn with_exposed_provenance(addr: usize) -> *const T { #[must_use] #[inline(always)] #[stable(feature = "exposed_provenance", since = "1.84.0")] -#[rustc_const_stable(feature = "const_exposed_provenance", since = "CURRENT_RUSTC_VERSION")] +#[rustc_const_stable(feature = "const_exposed_provenance", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[allow(fuzzy_provenance_casts)] // this *is* the explicit provenance API one should use instead pub const fn with_exposed_provenance_mut(addr: usize) -> *mut T { diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index 04fdaa8143eff..f67038d5ae449 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -404,8 +404,8 @@ impl str { /// assert_eq!(closest, 10); /// assert_eq!(&s[..closest], "❤️🧡"); /// ``` - #[stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "round_char_boundary", since = "1.91.0")] + #[rustc_const_stable(feature = "round_char_boundary", since = "1.91.0")] #[inline] pub const fn floor_char_boundary(&self, index: usize) -> usize { if index >= self.len() { @@ -447,8 +447,8 @@ impl str { /// assert_eq!(closest, 14); /// assert_eq!(&s[..closest], "❤️🧡💛"); /// ``` - #[stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "round_char_boundary", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "round_char_boundary", since = "1.91.0")] + #[rustc_const_stable(feature = "round_char_boundary", since = "1.91.0")] #[inline] pub const fn ceil_char_boundary(&self, index: usize) -> usize { if index >= self.len() { diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index 1b4a54b1b7a78..30a42d4eb5e64 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -2208,7 +2208,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_ptr_add(&self, val: usize, order: Ordering) -> *mut T { self.fetch_byte_add(val.wrapping_mul(size_of::()), order) @@ -2252,7 +2252,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_ptr_sub(&self, val: usize, order: Ordering) -> *mut T { self.fetch_byte_sub(val.wrapping_mul(size_of::()), order) @@ -2286,7 +2286,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_byte_add(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2321,7 +2321,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_byte_sub(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2371,7 +2371,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_or(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2420,7 +2420,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_and(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. @@ -2467,7 +2467,7 @@ impl AtomicPtr { /// ``` #[inline] #[cfg(target_has_atomic = "ptr")] - #[stable(feature = "strict_provenance_atomic_ptr", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "strict_provenance_atomic_ptr", since = "1.91.0")] #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces pub fn fetch_xor(&self, val: usize, order: Ordering) -> *mut T { // SAFETY: data races are prevented by atomic intrinsics. diff --git a/library/core/src/time.rs b/library/core/src/time.rs index d205bc376f125..f721fcd6156cf 100644 --- a/library/core/src/time.rs +++ b/library/core/src/time.rs @@ -416,8 +416,8 @@ impl Duration { /// assert_eq!(6 * 60 * 60, duration.as_secs()); /// assert_eq!(0, duration.subsec_nanos()); /// ``` - #[stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "duration_constructors_lite", since = "1.91.0")] + #[rustc_const_stable(feature = "duration_constructors_lite", since = "1.91.0")] #[must_use] #[inline] pub const fn from_hours(hours: u64) -> Duration { @@ -444,8 +444,8 @@ impl Duration { /// assert_eq!(10 * 60, duration.as_secs()); /// assert_eq!(0, duration.subsec_nanos()); /// ``` - #[stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] - #[rustc_const_stable(feature = "duration_constructors_lite", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "duration_constructors_lite", since = "1.91.0")] + #[rustc_const_stable(feature = "duration_constructors_lite", since = "1.91.0")] #[must_use] #[inline] pub const fn from_mins(mins: u64) -> Duration { diff --git a/library/std/src/ffi/os_str.rs b/library/std/src/ffi/os_str.rs index a39565d215924..6c098034eea3b 100644 --- a/library/std/src/ffi/os_str.rs +++ b/library/std/src/ffi/os_str.rs @@ -137,7 +137,7 @@ impl OsString { #[stable(feature = "rust1", since = "1.0.0")] #[must_use] #[inline] - #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "1.91.0")] pub const fn new() -> OsString { OsString { inner: Buf::from_string(String::new()) } } diff --git a/library/std/src/os/windows/ffi.rs b/library/std/src/os/windows/ffi.rs index 345d5b74285e1..20e5383dc09e0 100644 --- a/library/std/src/os/windows/ffi.rs +++ b/library/std/src/os/windows/ffi.rs @@ -141,7 +141,7 @@ impl OsStrExt for OsStr { pub struct EncodeWide<'a> { inner: alloc::wtf8::EncodeWide<'a>, } -#[stable(feature = "encode_wide_debug", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "encode_wide_debug", since = "1.91.0")] impl fmt::Debug for EncodeWide<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Debug::fmt(&self.inner, f) diff --git a/library/std/src/panic.rs b/library/std/src/panic.rs index 5e8d2f8e78ec7..1997785885d34 100644 --- a/library/std/src/panic.rs +++ b/library/std/src/panic.rs @@ -122,7 +122,7 @@ impl<'a> PanicHookInfo<'a> { /// ``` #[must_use] #[inline] - #[stable(feature = "panic_payload_as_str", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "panic_payload_as_str", since = "1.91.0")] pub fn payload_as_str(&self) -> Option<&str> { if let Some(s) = self.payload.downcast_ref::<&str>() { Some(s) diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 70ba502d68421..718c7c2e3b1a6 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -1191,7 +1191,7 @@ impl PathBuf { #[stable(feature = "rust1", since = "1.0.0")] #[must_use] #[inline] - #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_pathbuf_osstring_new", since = "1.91.0")] pub const fn new() -> PathBuf { PathBuf { inner: OsString::new() } } @@ -1594,7 +1594,7 @@ impl PathBuf { /// p.add_extension(""); /// assert_eq!(Path::new("/feel/the.formatted.dark"), p.as_path()); /// ``` - #[stable(feature = "path_add_extension", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_add_extension", since = "1.91.0")] pub fn add_extension>(&mut self, extension: S) -> bool { self._add_extension(extension.as_ref()) } @@ -2103,35 +2103,35 @@ impl PartialEq for PathBuf { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &str) -> bool { - Path::eq(self, other) + self.as_path() == other } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for str { #[inline] fn eq(&self, other: &PathBuf) -> bool { - other == self + self == other.as_path() } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for PathBuf { #[inline] fn eq(&self, other: &String) -> bool { - **self == **other + self.as_path() == other.as_str() } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &PathBuf) -> bool { - other == self + self.as_str() == other.as_path() } } @@ -2724,7 +2724,7 @@ impl Path { /// /// [`Path::file_stem`]: Path::file_stem /// - #[stable(feature = "path_file_prefix", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_file_prefix", since = "1.91.0")] #[must_use] pub fn file_prefix(&self) -> Option<&OsStr> { self.file_name().map(split_file_at_dot).and_then(|(before, _after)| Some(before)) @@ -2888,7 +2888,7 @@ impl Path { /// assert_eq!(path.with_added_extension("xz"), PathBuf::from("foo.tar.gz.xz")); /// assert_eq!(path.with_added_extension("").with_added_extension("txt"), PathBuf::from("foo.tar.gz.txt")); /// ``` - #[stable(feature = "path_add_extension", since = "CURRENT_RUSTC_VERSION")] + #[stable(feature = "path_add_extension", since = "1.91.0")] pub fn with_added_extension>(&self, extension: S) -> PathBuf { let mut new_path = self.to_path_buf(); new_path.add_extension(extension); @@ -3405,7 +3405,7 @@ impl PartialEq for Path { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for Path { #[inline] fn eq(&self, other: &str) -> bool { @@ -3414,7 +3414,7 @@ impl cmp::PartialEq for Path { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for str { #[inline] fn eq(&self, other: &Path) -> bool { @@ -3422,19 +3422,19 @@ impl cmp::PartialEq for str { } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for Path { #[inline] fn eq(&self, other: &String) -> bool { - self == &*other + self == other.as_str() } } -#[stable(feature = "eq_str_for_path", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "eq_str_for_path", since = "1.91.0")] impl cmp::PartialEq for String { #[inline] fn eq(&self, other: &Path) -> bool { - other == self + self.as_str() == other } } diff --git a/library/std/tests/path.rs b/library/std/tests/path.rs index fa76c50597b05..837a14b808ff8 100644 --- a/library/std/tests/path.rs +++ b/library/std/tests/path.rs @@ -2528,7 +2528,17 @@ fn normalize_lexically() { } #[test] -/// See issue#146183 -fn compare_path_to_str() { - assert!(&PathBuf::from("x") == "x"); +/// See issue#146183 and issue#146940 +fn compare_path_like_to_str_like() { + let path_buf = PathBuf::from("x"); + let path = Path::new("x"); + let s = String::from("x"); + assert!(path == "x"); + assert!("x" == path); + assert!(path == &s); + assert!(&s == path); + assert!(&path_buf == "x"); + assert!("x" == &path_buf); + assert!(path_buf == s); + assert!(s == path_buf); } diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs index 1458b0beefa85..82fd1119c7fea 100644 --- a/src/bootstrap/src/core/build_steps/compile.rs +++ b/src/bootstrap/src/core/build_steps/compile.rs @@ -519,7 +519,7 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, cargo: &mut Car // Query rustc for the deployment target, and the associated env var. // The env var is one of the standard `*_DEPLOYMENT_TARGET` vars, i.e. // `MACOSX_DEPLOYMENT_TARGET`, `IPHONEOS_DEPLOYMENT_TARGET`, etc. - let mut cmd = command(builder.rustc(cargo.compiler())); + let mut cmd = builder.rustc_cmd(cargo.compiler()); cmd.arg("--target").arg(target.rustc_target_arg()); cmd.arg("--print=deployment-target"); let output = cmd.run_capture_stdout(builder).stdout(); diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 99a1062109adc..2453d442b6d02 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -625,7 +625,7 @@ fn generate_target_spec_json_schema(builder: &Builder<'_>, sysroot: &Path) { // We do this by using the stage 1 compiler, which is always compiled for the host, // even in a cross build. let stage1_host = builder.compiler(1, builder.host_target); - let mut rustc = command(builder.rustc(stage1_host)).fail_fast(); + let mut rustc = builder.rustc_cmd(stage1_host).fail_fast(); rustc .env("RUSTC_BOOTSTRAP", "1") .args(["--print=target-spec-json-schema", "-Zunstable-options"]); diff --git a/src/bootstrap/src/core/build_steps/synthetic_targets.rs b/src/bootstrap/src/core/build_steps/synthetic_targets.rs index 21733c5d9e3f7..2cc691832b5f0 100644 --- a/src/bootstrap/src/core/build_steps/synthetic_targets.rs +++ b/src/bootstrap/src/core/build_steps/synthetic_targets.rs @@ -10,7 +10,6 @@ use crate::Compiler; use crate::core::builder::{Builder, ShouldRun, Step}; use crate::core::config::TargetSelection; -use crate::utils::exec::command; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) struct MirOptPanicAbortSyntheticTarget { @@ -55,7 +54,7 @@ fn create_synthetic_target( return TargetSelection::create_synthetic(&name, path.to_str().unwrap()); } - let mut cmd = command(builder.rustc(compiler)); + let mut cmd = builder.rustc_cmd(compiler); cmd.arg("--target").arg(base.rustc_target_arg()); cmd.args(["-Zunstable-options", "--print", "target-spec-json"]); diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 723ba80eaf827..ce257edc5cc19 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -3263,6 +3263,8 @@ fn distcheck_plain_source_tarball(builder: &Builder<'_>, plain_src_dir: &Path) { .env("GITHUB_ACTIONS", "0") .current_dir(plain_src_dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(plain_src_dir); } /// Check that rust-src has all of libstd's dependencies @@ -3288,6 +3290,8 @@ fn distcheck_rust_src(builder: &Builder<'_>, src_dir: &Path) { .arg(&toml) .current_dir(src_dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(src_dir); } /// Check that rustc-dev's compiler crate source code can be loaded with `cargo metadata` @@ -3312,6 +3316,8 @@ fn distcheck_rustc_dev(builder: &Builder<'_>, dir: &Path) { .env("RUSTC", &builder.initial_rustc) .current_dir(dir) .run(builder); + // Mitigate pressure on small-capacity disks. + builder.remove_dir(dir); } #[derive(Debug, Clone, PartialEq, Eq, Hash)] diff --git a/src/bootstrap/src/core/builder/cargo.rs b/src/bootstrap/src/core/builder/cargo.rs index 924bb4adb42d0..b7d2b72363632 100644 --- a/src/bootstrap/src/core/builder/cargo.rs +++ b/src/bootstrap/src/core/builder/cargo.rs @@ -722,10 +722,8 @@ impl Builder<'_> { // Build proc macros both for the host and the target unless proc-macros are not // supported by the target. if target != compiler.host && cmd_kind != Kind::Check { - let mut rustc_cmd = command(self.rustc(compiler)); - self.add_rustc_lib_path(compiler, &mut rustc_cmd); - - let error = rustc_cmd + let error = self + .rustc_cmd(compiler) .arg("--target") .arg(target.rustc_target_arg()) .arg("--print=file-names") diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs index 75c8ee365284e..b212373839741 100644 --- a/src/bootstrap/src/core/builder/mod.rs +++ b/src/bootstrap/src/core/builder/mod.rs @@ -1591,6 +1591,14 @@ Alternatively, you can set `build.local-rebuild=true` and use a stage0 compiler } } + /// Gets a command to run the compiler specified, including the dynamic library + /// path in case the executable has not been build with `rpath` enabled. + pub fn rustc_cmd(&self, compiler: Compiler) -> BootstrapCommand { + let mut cmd = command(self.rustc(compiler)); + self.add_rustc_lib_path(compiler, &mut cmd); + cmd + } + /// Gets the paths to all of the compiler's codegen backends. fn codegen_backends(&self, compiler: Compiler) -> impl Iterator { fs::read_dir(self.sysroot_codegen_backends(compiler)) diff --git a/src/bootstrap/src/core/builder/tests.rs b/src/bootstrap/src/core/builder/tests.rs index 229adf714598b..89a0ab7711ee2 100644 --- a/src/bootstrap/src/core/builder/tests.rs +++ b/src/bootstrap/src/core/builder/tests.rs @@ -1805,7 +1805,7 @@ mod snapshot { insta::assert_snapshot!( ctx.config("check") .path("compiler") - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] @@ -1831,7 +1831,7 @@ mod snapshot { ctx.config("check") .path("compiler") .stage(1) - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] @@ -1845,7 +1845,7 @@ mod snapshot { [build] llvm [build] rustc 0 -> rustc 1 [build] rustc 1 -> std 1 - [check] rustc 1 -> rustc 2 (75 crates) + [check] rustc 1 -> rustc 2 (74 crates) "); } @@ -1861,7 +1861,7 @@ mod snapshot { [build] rustc 0 -> rustc 1 [build] rustc 1 -> std 1 [check] rustc 1 -> std 1 - [check] rustc 1 -> rustc 2 (75 crates) + [check] rustc 1 -> rustc 2 (74 crates) [check] rustc 1 -> rustc 2 [check] rustc 1 -> Rustdoc 2 [check] rustc 1 -> rustc_codegen_cranelift 2 @@ -1957,7 +1957,7 @@ mod snapshot { ctx.config("check") .paths(&["library", "compiler"]) .args(&args) - .render_steps(), @"[check] rustc 0 -> rustc 1 (75 crates)"); + .render_steps(), @"[check] rustc 0 -> rustc 1 (74 crates)"); } #[test] diff --git a/src/ci/channel b/src/ci/channel index bf867e0ae5b6c..65b2df87f7df3 100644 --- a/src/ci/channel +++ b/src/ci/channel @@ -1 +1 @@ -nightly +beta diff --git a/src/doc/rustc/src/platform-support/apple-ios-macabi.md b/src/doc/rustc/src/platform-support/apple-ios-macabi.md index c6f68f7a1e812..0d0acaa3bef28 100644 --- a/src/doc/rustc/src/platform-support/apple-ios-macabi.md +++ b/src/doc/rustc/src/platform-support/apple-ios-macabi.md @@ -57,7 +57,7 @@ $ rustc --target aarch64-apple-ios-macabi your-code.rs ``` The target can be differentiated from the iOS targets with the -`target_env = "macabi"` cfg (or `target_abi = "macabi"` before Rust CURRENT_RUSTC_VERSION). +`target_env = "macabi"` cfg (or `target_abi = "macabi"` before Rust 1.91.0). ```rust if cfg!(target_env = "macabi") { diff --git a/src/doc/rustc/src/platform-support/apple-ios.md b/src/doc/rustc/src/platform-support/apple-ios.md index 586afa652262b..2e705e3aef5c3 100644 --- a/src/doc/rustc/src/platform-support/apple-ios.md +++ b/src/doc/rustc/src/platform-support/apple-ios.md @@ -68,7 +68,7 @@ $ rustc --target aarch64-apple-ios your-code.rs The simulator variants can be differentiated from the variants running on-device with the `target_env = "sim"` cfg (or `target_abi = "sim"` before -Rust CURRENT_RUSTC_VERSION). +Rust 1.91.0). ```rust if cfg!(all(target_vendor = "apple", target_env = "sim")) { diff --git a/src/llvm-project b/src/llvm-project index 333793696b0a0..8c30b9c5098bd 160000 --- a/src/llvm-project +++ b/src/llvm-project @@ -1 +1 @@ -Subproject commit 333793696b0a08002acac6af983adc7a5233fc56 +Subproject commit 8c30b9c5098bdff1d3d9a2d460ee091cd1171e60 diff --git a/src/stage0 b/src/stage0 index a705cd1c760d6..d960a46978326 100644 --- a/src/stage0 +++ b/src/stage0 @@ -13,506 +13,372 @@ nightly_branch=master # All changes below this comment will be overridden the next time the # tool is executed. -compiler_date=2025-08-05 -compiler_version=beta -rustfmt_date=2025-09-05 -rustfmt_version=nightly +compiler_date=2025-09-18 +compiler_version=1.90.0 -dist/2025-08-05/rustc-beta-aarch64-apple-darwin.tar.gz=b9d8f74da46aeadb6c650a4ccfc3c2de08e229e4211a198fa2914103f09f579d -dist/2025-08-05/rustc-beta-aarch64-apple-darwin.tar.xz=493ed87c65bac5593c104373a3277ddc2330072796704e4b6800c531326da860 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-gnullvm.tar.gz=6c20a3b2e4d3ef9a54b1fe4f50c71895d4d8557d6960f887ef4958c0f2a19eab -dist/2025-08-05/rustc-beta-aarch64-pc-windows-gnullvm.tar.xz=d6bffc013745c0d69f4cf7ab4f747f8ad885e3b1b77fa56c2e7de8808e278294 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-msvc.tar.gz=3b6bf7e2aff93854346c1d0970cf207c049c17c5ea6ee299dcdb1fd92e996fc0 -dist/2025-08-05/rustc-beta-aarch64-pc-windows-msvc.tar.xz=8241fdc7c673499091700cfcfafe10f3b70bf91918a3b7204a73d2b28445cfa5 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-gnu.tar.gz=36a093e6c99f227e293ebcaebc89e58166e3da7447d2499069c616610fb4e691 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-gnu.tar.xz=7cad77f36dcabbe77d603b8b3b4bfa83488a3af2e9b815f698f544de148c77a8 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-musl.tar.gz=421980aa1ef5467f59c1a8ad43415d69057c9277fdc91d1d5c2b53c246e8bbe9 -dist/2025-08-05/rustc-beta-aarch64-unknown-linux-musl.tar.xz=0ba5b4cd4f5975a58cf86331de5a3c80fb2fd620d50797360a5af4ebf2bba575 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabi.tar.gz=13b3e61ca606bfdf90d46a8873ca4f14fa07ad8bd77364f1a85f557f31ba7299 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabi.tar.xz=f6a1991e55af549d6cd59ddbebb6d2289d90d1e37b2a9449d7831b4c117a54bf -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz=a5533df1ae642bcea571aa6c2b5eda16a56c6cd597906081840bb7531f7b02a3 -dist/2025-08-05/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz=2a7187ad6d0215f07d0472880e117556508780e37df6e2a1a7fdbb67fd8dc87e -dist/2025-08-05/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz=3ae6e7d83ae3e1c5c8030ba93b9103addaf11f0f8807f1fbf813305d8e6a9188 -dist/2025-08-05/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz=324d6de1a8e4d9c1dd13cc86665fd06cb167d4a3ea55607cd5353300733f480e -dist/2025-08-05/rustc-beta-i686-pc-windows-gnu.tar.gz=0bc4b50638818008e054af245d4e987ce5e55fdc56e19d31c18e8c0165f860ab -dist/2025-08-05/rustc-beta-i686-pc-windows-gnu.tar.xz=b0e5343207a9684d5efe81e536d23135df07bebd869dcad69c632811e1e37137 -dist/2025-08-05/rustc-beta-i686-pc-windows-msvc.tar.gz=c3231335a50402989d4e08857fd7194a3fe5384d2aa34153a25a3f2955a942ef -dist/2025-08-05/rustc-beta-i686-pc-windows-msvc.tar.xz=be578fcbfe32e40fd9688e618927ddcce88e7e08a279778d4c3399eb46e8ae29 -dist/2025-08-05/rustc-beta-i686-unknown-linux-gnu.tar.gz=96b2cdda499b63aadb76b37a4895623a4806c5c8db8f6edeaeb1b812d337192f -dist/2025-08-05/rustc-beta-i686-unknown-linux-gnu.tar.xz=f6496eabe0efcc09c7a4994cc4825e9c3e494c8ca7679cfcbd38a699438e1b74 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-gnu.tar.gz=3403d7be2f49387149ce075b427f8eaa306066db9fd4ec69de61dc01f6834037 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-gnu.tar.xz=8cb3a329ef3632afc1f709b9f9b99a2ab7f5c18590590ddacf64f1b3e5a3ff69 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-musl.tar.gz=9485ce37e99a6a53b5521683bec65d015a730a41c4c3f3baa19226edd211fc39 -dist/2025-08-05/rustc-beta-loongarch64-unknown-linux-musl.tar.xz=450d91ad61a23f69560e53c7001aec047bd17fb4831bafb97e7226162bb3c0f4 -dist/2025-08-05/rustc-beta-powerpc-unknown-linux-gnu.tar.gz=dc9ff117a7dd3e685c634e8668d78022f66f6e58dc449fbe5f398688ed2dae0a -dist/2025-08-05/rustc-beta-powerpc-unknown-linux-gnu.tar.xz=7dbc936f94d531040601d6fc02d9db87335a1b7927637494c9e208a43f012010 -dist/2025-08-05/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz=4a68557cf53063817ee651f5838ad2c3de93a647b9002fe3c82f0372cbd71708 -dist/2025-08-05/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz=f5ae9c4ba17d2941e8fa947d9712a8db8dbbdecbcfa4330988d02b9299fbc814 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz=ad33c48172c3b9abbd95b9dd3c1d38d5f6bc25fe84b95e492b6cdad27ef1bf19 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz=89d40fb02cded4e8d9b3e177f07e1b984481d493015a2532dfdb5b8aaf5ffa94 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-musl.tar.gz=a5ab7a321363502609a4ec5464be96629c693395503c8ce285990db3c556a775 -dist/2025-08-05/rustc-beta-powerpc64le-unknown-linux-musl.tar.xz=7e3b5afc7858857d5840bd6e788fd88449555e2fbe4c9a206ee3552e61dd79b0 -dist/2025-08-05/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz=fde633217cf77d6fc6f901d84619f681a1fd1e42be75960809bab4806528a451 -dist/2025-08-05/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz=69541c68f31a401229d770ef2ea6d032104fe928db845eae23f04c40db021a8d -dist/2025-08-05/rustc-beta-s390x-unknown-linux-gnu.tar.gz=dc257bbab4790dbc3f9df70853eadce198dd5f6f47c8e830254ee2b21c6c79a3 -dist/2025-08-05/rustc-beta-s390x-unknown-linux-gnu.tar.xz=d5a9d5c555241b231eacc0584db0b540ee2982e8bd66cf8568064aab4beb0c94 -dist/2025-08-05/rustc-beta-sparcv9-sun-solaris.tar.gz=96b25f8ce6db2f9d9b7e8da75839d1bd4c97011bebd2544633ab2061e4460bb3 -dist/2025-08-05/rustc-beta-sparcv9-sun-solaris.tar.xz=88438d143441da62bf5415857aab3490697f7f413b7de41cd113bac1480ea7de -dist/2025-08-05/rustc-beta-x86_64-apple-darwin.tar.gz=f59175ef402489c1dd2f6a8984ecb66314240a8e4f7c55e5d92017fc025fa4ee -dist/2025-08-05/rustc-beta-x86_64-apple-darwin.tar.xz=21de96e49395252e6eb5b175ee794acad78ccd4ac081303a8da7ec84bf2b6ab1 -dist/2025-08-05/rustc-beta-x86_64-pc-solaris.tar.gz=164a9b76347131d78fb81519627ab50f13a313d8da13d09f7fa479a41c519458 -dist/2025-08-05/rustc-beta-x86_64-pc-solaris.tar.xz=0f91f1f4b8880944341d82894b830a70f8a60837687829e0ab9626f3281ddd1b -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnu.tar.gz=634711ae22708a5ae57bb2022fd22257664a8510b59975f4b4ad4b9a8acf475b -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnu.tar.xz=b72c0d3f5800e92b91d1361e52b28ff622aeb1f1cbdff2efd22c2f2a3315dd68 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnullvm.tar.gz=668f3a8b48092721bb6e1a01440776d6b906850a11e1bcc37a50bb13ef8d7b04 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-gnullvm.tar.xz=e06a183829e09448e76daaf8c317b52d11fac7d16ad191ef61b8f7a806eb9414 -dist/2025-08-05/rustc-beta-x86_64-pc-windows-msvc.tar.gz=564849501d1e41fe776f5443b87c9500621adef97eff05d2c03d539ea3c886da -dist/2025-08-05/rustc-beta-x86_64-pc-windows-msvc.tar.xz=6a1c1cc47c0e8b6aaad215d4d4e8b770b96336e9f2a0317fcf0511b662966bfd -dist/2025-08-05/rustc-beta-x86_64-unknown-freebsd.tar.gz=560bcc4d150f4e22f5598d61fce86c9baeda1b57bda837270f7cac78cfc12b19 -dist/2025-08-05/rustc-beta-x86_64-unknown-freebsd.tar.xz=cdfe207645068b4659b0f979cae177723c5f211084f45ae9180b2d93ee83fce6 -dist/2025-08-05/rustc-beta-x86_64-unknown-illumos.tar.gz=5a362ca0c686b0e0666824df3f304ec49d7d419abb08473fece69d41e96ee625 -dist/2025-08-05/rustc-beta-x86_64-unknown-illumos.tar.xz=fb4e7b12b5223545f6fd57754744f03dd6807b6801e97f9f0fe07bc371efed62 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-gnu.tar.gz=74225a1889120c0174a056e7ca7656f38e8788137ee3d29df857567ae0605692 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-gnu.tar.xz=2d37542e88f84a0501841e12865262142fec0efef9ca729d26a3c333f16e465d -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-musl.tar.gz=156eabc89e1ee9558b9de6f60b1bc47c81ab33ae20fa946c4ad4e32b7f30c221 -dist/2025-08-05/rustc-beta-x86_64-unknown-linux-musl.tar.xz=0cf9e649b9020fcfd25282ae1edb1ac59560b7d6d0f79ff7ff3b62871ff25d86 -dist/2025-08-05/rustc-beta-x86_64-unknown-netbsd.tar.gz=8db86a95b22efc2ff2f344e301171813375ccfd2aacad61d3aa84a63f573647a -dist/2025-08-05/rustc-beta-x86_64-unknown-netbsd.tar.xz=68c10c6431b4433d4de5d24a9bb6ebabe99769b077cdd80ab5e0ee67a273035e -dist/2025-08-05/rust-std-beta-aarch64-apple-darwin.tar.gz=872e61e6d6915c02de0b9437b910f6f37f5e11c83347bbe2284a59c31aa27ac3 -dist/2025-08-05/rust-std-beta-aarch64-apple-darwin.tar.xz=748516af852836f06efa927cc96bdd2ad6b012d0262e87bdec97a112212cc24a -dist/2025-08-05/rust-std-beta-aarch64-apple-ios.tar.gz=2c1cf24819ec790d124c7ace59c12a903250eefdad6362b40c779a97b732459e -dist/2025-08-05/rust-std-beta-aarch64-apple-ios.tar.xz=b2fd6df9653b6c0bc13d4331355b3b9a4756886ba46d6c744687bf7bbd8e4630 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-macabi.tar.gz=c266b75c66ea17b174ce8a746bbad78bca58bd72c3cdda603f20a868f9b3b00c -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-macabi.tar.xz=da5558b25c82a5fc1b66786b035212c5d0df2d4124da3e581e15636f29547dd0 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-sim.tar.gz=8441032f41e142faebe78e84501344180447121602a2000d1310d7a716cf3695 -dist/2025-08-05/rust-std-beta-aarch64-apple-ios-sim.tar.xz=48713adfa5605addd97e13312f6bc4cf103c06623f67705732684b51d0bed8b1 -dist/2025-08-05/rust-std-beta-aarch64-linux-android.tar.gz=1eb2bbc5fac670aa5867546f1caf1378591d5c0d3a3800ca1dd052645fea0cd6 -dist/2025-08-05/rust-std-beta-aarch64-linux-android.tar.xz=ae5e8aedcc5c8bf719e8ed788d52cc69daf64dfcf878e8497b45454c1c582c56 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-gnullvm.tar.gz=bedf5d7663acb4e1afed9dea4b5b8e9b7f0e0dd68e311d3597819ddd028576f7 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-gnullvm.tar.xz=e19fd9dc6d9e774e30a9e4a16ac5d6d1fd3300eb880c09f6b61cc63d52370629 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-msvc.tar.gz=8ad111b1e8e19fdc5bd33d82a1f6d88b9c1809e27531af9d9fed2e37f75edeb4 -dist/2025-08-05/rust-std-beta-aarch64-pc-windows-msvc.tar.xz=332976524e42b4d7b2763a28cae3ebbc3eec03465c098df26e81242294277de4 -dist/2025-08-05/rust-std-beta-aarch64-unknown-fuchsia.tar.gz=92f4737a1775c1fed9311b8949950c6606ca34d272f787d222923555fb69f98b -dist/2025-08-05/rust-std-beta-aarch64-unknown-fuchsia.tar.xz=2f1ebaa974dc3c6b39c43e38cf6d9f5c6fba0d46229a0423be676d817905850c -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz=798dafd6f581f367dfed9763b62b35e77466f87ae8252a52f503f1c1bf58f1a5 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz=c4434727604a2773f73e8919a6e967c7c487d75684514cacbe59fb2d6a5f0d29 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-musl.tar.gz=c48d4e44b0e94f341e7ab2f9d47b08280930152a53dff20d6c9140739fbd2898 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-musl.tar.xz=8cac54d6a39c13dd0f38fde523a852c5db7f61a7f05b3e3ad0f78c7f59513d02 -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-ohos.tar.gz=5c3d7ea7ac6ab60311fb49c5a2f04a92266bc8a675d7f333219177a91b400f9b -dist/2025-08-05/rust-std-beta-aarch64-unknown-linux-ohos.tar.xz=f1f9f8a71fc5903bf720d39bedaadab16363b37f9e99817d7cf27b7122ad1ad0 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none.tar.gz=ceffb671e87556b304e63cf01572e1cad8c8cfa0b33ccd1a373b033c60696376 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none.tar.xz=a9a9b17f2b4fdf45f46359726e0c28f6a1289a7abf81fdbe1ae180b2f550aa60 -dist/2025-08-05/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz=9f6f6a121e3b19b7b3b2c85dcd13544c12af18cc5544403e29ea8bbd5b13fecc -dist/2025-08-05/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz=5b0f0059dd5d837fad74aaf2971fb135229b030a832268106be512557cc7a611 -dist/2025-08-05/rust-std-beta-aarch64-unknown-uefi.tar.gz=67166c7d6d7210ca97c3610abfa126234653d0e26658bbea64d574852fad04fe -dist/2025-08-05/rust-std-beta-aarch64-unknown-uefi.tar.xz=05f72e7c0ebbf7b41bf3e773bbbc073ca9c71417a80dec8f3916dafbe0cdcf7b -dist/2025-08-05/rust-std-beta-arm-linux-androideabi.tar.gz=bdf103a29035659972f35bb9060ba8df5ca9b7b068e3c094d758331a5e667144 -dist/2025-08-05/rust-std-beta-arm-linux-androideabi.tar.xz=8fa8b6994b4e04fec77a6657db0fde4e4cb9336466ce0c4f3e2b154709969c93 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz=4298510905c958e45291c2fbc4c54bfed9fdafbd48636896fe00a73e94f700ba -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz=79e0e393f5286429755faee738ed110fb1cc51b83aec3c94194e903f0b938d73 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz=37278a621e2449b9030045c174c71f3ddf74e70b49b5f247c36fea1b1654979f -dist/2025-08-05/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz=3ac094e855f7593a22a56ec40923384a0e25265645d05b2a46dde2612d9c6cf9 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabi.tar.gz=b5bc7d83a3c59764cdc169ae349e01cd052b8ab054eb13b4f2a1cd02ddd7fd6c -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabi.tar.xz=2f8558fee897543da620531e500f3a73c5aac4ea815b7bd418945103dedde530 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz=2e812427b5169e7de22b720776208ae92f9075c5509f6b9ad8666b9866232735 -dist/2025-08-05/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz=e544363209177357386f220d6c4101b1d86d84c03e51254ff459ca42ef187107 -dist/2025-08-05/rust-std-beta-arm64ec-pc-windows-msvc.tar.gz=778c947235bb0023ca26dc0592e4d3cb9ad9665c3316d57822c173ba2b5e231e -dist/2025-08-05/rust-std-beta-arm64ec-pc-windows-msvc.tar.xz=3a5bf7620e1b24e1f72968f5cc28cc58acc9b5739f2c08f5c4b9e449d8c551a1 -dist/2025-08-05/rust-std-beta-armebv7r-none-eabi.tar.gz=fcace82dc77156a6e7c658fc5abe4992075cfe822fb18a1edfca1967102a6adc -dist/2025-08-05/rust-std-beta-armebv7r-none-eabi.tar.xz=9616372693902e89b55de55b62009a59baccb11ccb63710a475856deca70655c -dist/2025-08-05/rust-std-beta-armebv7r-none-eabihf.tar.gz=2c596de7d22a4762908676d4e048f5075cbf2d66c5f7a03afb96e709f2d080ca -dist/2025-08-05/rust-std-beta-armebv7r-none-eabihf.tar.xz=b1ff9e3fe11acc22fa5ad46530dff62bfceac9df6fcbd3da7999535a00dd2e3e -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz=e033e4bfc11a5bcb7f0645426fac899f7d071236a228300ca2022935997b17fd -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz=919587b40e2bc6c6e8f496244c357c04d5e53b8adb9b3f274432943fd789a1a4 -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz=392a1f0528e4b783e5fd0be74efbec58eb3b0ebd69c3855675301ebf96b76c4a -dist/2025-08-05/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz=183144eb89cc1a035c04d50c4060e159ca5099fec71f4f25801a924fa013d04a -dist/2025-08-05/rust-std-beta-armv7-linux-androideabi.tar.gz=f968b761773b76f151b39dce0f3757f59eee2d8b70373d1419e0986429885d7d -dist/2025-08-05/rust-std-beta-armv7-linux-androideabi.tar.xz=fecda678541a151b76f3874e710e875a662a9165eaf1cf12b081ea55ea18a38b -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz=300d7e8adaad86ddeff643109d0c83a87e41a056171f9d48b0b6108719003325 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz=acb8f61c97efae6e95aaabe1cab1300bc3cc3a1dc2066c7e2376ad6a9994971c -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz=5e90333cb68f3161f8cb30e69d4ebe46f6653998651c72a87a795ab02c11dade -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz=355bc516a7a6454eaacc66eadaa4d640cb3ffc7b5400a01bb4bdccf4470ae650 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz=8daa2c4c4dd9e8a1b9ee8a60f2cab0dab81aaf1e7a9d732093979ccdeac8bf60 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz=52b78d85f8e9e19da83504bb523aecf7b641d15c1de2f9b988bedf52912636d4 -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz=c63000f15b52881c20f40cf1468afd4f3a2a6a84e944357fe6532c7d0e281b3a -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz=53fc3486e4d805386c1ac4d6a1007a9b5461ae606c9c820951b720b45dc8f35c -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-ohos.tar.gz=315fc371ac2cddeb65c87bd50369e28247c16ca55fdab527e88899e01adc9efe -dist/2025-08-05/rust-std-beta-armv7-unknown-linux-ohos.tar.xz=d7999aff0a39c63709977f5c18d79b575f8bfb467fbacf4f1b41cd26b52a6701 -dist/2025-08-05/rust-std-beta-armv7a-none-eabi.tar.gz=0707721586e8929811c2904e4136d31f5c415e3f00bfa88dbb920360aa9deea9 -dist/2025-08-05/rust-std-beta-armv7a-none-eabi.tar.xz=bedfd1a808f758f5088ea0fcb746d3ccf11730945e2b07220e93829c0d5c472a -dist/2025-08-05/rust-std-beta-armv7r-none-eabi.tar.gz=315fadb161b3be540b7a276ebe15b1f8d4bdf73b46c1633e39f698014aca8eb1 -dist/2025-08-05/rust-std-beta-armv7r-none-eabi.tar.xz=4bc2fcd9dee2ee44914da0e6af3763c7ddcbe3ebd9fb20c1d552a0226cd877d7 -dist/2025-08-05/rust-std-beta-armv7r-none-eabihf.tar.gz=9c8be30130709ff94a9718091559a752530f0eeb21be80fc3cca0665e85ae0dc -dist/2025-08-05/rust-std-beta-armv7r-none-eabihf.tar.xz=f0dd0bd30ed70c3a022016d8bbed54a6e942571f2e4c773bd8b4198d7dccdb5c -dist/2025-08-05/rust-std-beta-i586-unknown-linux-gnu.tar.gz=ca6c3b8af1c44deaf7dce9e8d4c8786a5801226b30beaa646067d393eeaa0ee8 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-gnu.tar.xz=4e96f0e5f2e3eda60ca2b6d9ce234ae74c5eb2412a7e2c0c571eaf792dca6e28 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-musl.tar.gz=60c736e3ac2aa5b9ceedcd73e39efa12bc9b889ef85f548170f80fbf2b05dfa0 -dist/2025-08-05/rust-std-beta-i586-unknown-linux-musl.tar.xz=fe636d893e38c32a163a88ece160d5b5ea61a3fa63463d4e4f425d229c2927f1 -dist/2025-08-05/rust-std-beta-i686-linux-android.tar.gz=9e62d61041187a91b74c81fe77cd6802a7e38c5a535412c71850426f6a48f37c -dist/2025-08-05/rust-std-beta-i686-linux-android.tar.xz=862d3d5442fb011b917f565aaadb201c22e7b2ecd6a68c0c410b3335741c1c22 -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnu.tar.gz=05a8da51c477e2c2ce4ea12d41c8afaaf0d226a6b933b6c55fd3584b39103366 -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnu.tar.xz=cf15b3d2011ceb57064d0b2285defee7df8628c3bf2b95f7f2ac92a449546d4f -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnullvm.tar.gz=fe11b777eae25d823f40352e47272222c2de8edc2d271eb4f6e7ff508efa198d -dist/2025-08-05/rust-std-beta-i686-pc-windows-gnullvm.tar.xz=a7bb6f223e3542e613eaa7f2b9d9974be71cd2debf8426faa50cfb63fde681fd -dist/2025-08-05/rust-std-beta-i686-pc-windows-msvc.tar.gz=5fbd709698d80b3227a8bc6cbecfc597e99dede3824c751e1d166cac2c5862dc -dist/2025-08-05/rust-std-beta-i686-pc-windows-msvc.tar.xz=92fd2a6a5dbe53f68e9ba3ce40cd3beea95ba9d6a2f1293f7f3d917f34739a66 -dist/2025-08-05/rust-std-beta-i686-unknown-freebsd.tar.gz=182acad6cea45855f66646d437ee44ddb1f85c2c998cc5c7a4bbb025ca0d9da9 -dist/2025-08-05/rust-std-beta-i686-unknown-freebsd.tar.xz=53f8bfaabff1dbc47929a99a92025a31c1e272bf6a8091c4f95d33557dfe9ea1 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-gnu.tar.gz=b80dd4e77c56256f7a7f837bf84129d19e1a4aa08a0ca7e2881402371a7e4395 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-gnu.tar.xz=52efb657f28303b0747cf281c972653abfbeb4bf6d0b841f8bbab7f08c5d7310 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-musl.tar.gz=323abc9766231dca10c225b3ec567c694c0ff6f6eddcc30d728a0f08aa6d2186 -dist/2025-08-05/rust-std-beta-i686-unknown-linux-musl.tar.xz=8998ce49f1be28bcd837831f1d7b79b0b339bc74ced42adb6d997ed016e90e88 -dist/2025-08-05/rust-std-beta-i686-unknown-uefi.tar.gz=07261ce98c95839b8714f40e07cbffa32c10fc7c59394dc87b07e144564c5fef -dist/2025-08-05/rust-std-beta-i686-unknown-uefi.tar.xz=fb6eb023b9722a44e63bcd48fd88c61cf41453842a211107c84039c6883409e5 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-gnu.tar.gz=d0a52888f5ef3107ecdbf28b918eb516a9176ae8695079a81a22d1b7ca0e29bd -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-gnu.tar.xz=c14a477558a6c924e05e1b58bd9df60f5e4966c7f0da294dd38e3bd89c1dc5f6 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-musl.tar.gz=bbb93219393948d055df44edcdfff4b03ca251205c545d6f1bd53ade5f314d52 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-linux-musl.tar.xz=48b437a8afe240828c0377a6baa276500f125661f1bc888ebd1ea546f0497f4a -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none.tar.gz=fcec6b60a1a22dcd04b8409d38103496d76bb4297ded9f1f092743bd05f0bd54 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none.tar.xz=2f4aacb734b5a1dd522b4836035ab213db675508b9ff9a1bdc0c2df3ea9d39d1 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none-softfloat.tar.gz=aad8445e9a5deb4a466ebed84cab101bbe8ef49530315c0349d93e2062ae65a8 -dist/2025-08-05/rust-std-beta-loongarch64-unknown-none-softfloat.tar.xz=906e1cbd1e3b22eb5c378417646baf18b00acb274ee4198ea59ea356f4f1a0da -dist/2025-08-05/rust-std-beta-nvptx64-nvidia-cuda.tar.gz=b0d7e8daae2eff0c660b6e01bc76258550b9bfbdbf95c104019db7c797339ef5 -dist/2025-08-05/rust-std-beta-nvptx64-nvidia-cuda.tar.xz=c0bffdbb4de90486cad1a26df997006c142f1acc7ed39419975c10b0d09c6217 -dist/2025-08-05/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz=3c845cade37fe2b1cfe3087c69f9ecb3e0eec32d2558701c677d4c21ea9e08db -dist/2025-08-05/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz=15830d827258f6c3386fa09da66e06ff0460098b46432e28b4e96bd36d61e787 -dist/2025-08-05/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz=4b63d9260253f1d3a0168ed367792284584b87aa936fc76262e9fe0ad83c7fa1 -dist/2025-08-05/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz=dfba70ad94524437fc8ec5e4684239eceb76678112776915f02502b80cb0afac -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz=3d96bebe611a0167a43060312cbfa2fe4000b9949772ee44ffd27226acd006c8 -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz=44e95c2756f52129b8bd21d7d4ad7ec8e05e43192f3bc894cba4a371b579a6d8 -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-musl.tar.gz=ca5b7c47b63fa8e005078cb73d111462c438b764909ca106933837ac93d5780f -dist/2025-08-05/rust-std-beta-powerpc64le-unknown-linux-musl.tar.xz=b102756451c18003ad1b132d25d333ed1a0e4959b87d2904a6e407fc02a7e422 -dist/2025-08-05/rust-std-beta-riscv32i-unknown-none-elf.tar.gz=a592e995b40d3b1eb69cb1f7cd3c100713ea092742ab6ec5769e8df8551ffa16 -dist/2025-08-05/rust-std-beta-riscv32i-unknown-none-elf.tar.xz=af9cd91be3d667cf31b535862882537a406f49932f58308f283228b20fc7bd76 -dist/2025-08-05/rust-std-beta-riscv32im-unknown-none-elf.tar.gz=bf9e9d0f8c4ce8041c6e628e1b637ac0cb316f865f97a43cf2bf522e255c5ec1 -dist/2025-08-05/rust-std-beta-riscv32im-unknown-none-elf.tar.xz=c3e56d71c1586559212f701508ee94f0bfa7801e7d2fdc62c062dcce8a0d040d -dist/2025-08-05/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz=068023ed1f1dea01f2523f3b2b9ef41b22a301ceafa0526ebaa757481d14408a -dist/2025-08-05/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz=1e3db6625ebb12a8c735cf4e8658a33bac7bca461de1e516860843d50027ee7d -dist/2025-08-05/rust-std-beta-riscv32imafc-unknown-none-elf.tar.gz=aeb986eef375fa1ebb179668c6778c587d1af8b9e1ff50e5b56f9a3b48f1d8df -dist/2025-08-05/rust-std-beta-riscv32imafc-unknown-none-elf.tar.xz=45d314189b9327645f6490628157fce32b7b59eccdf57676be0c31e1247f5385 -dist/2025-08-05/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz=82d6e6549c80e62d392654693a28528f2ea540652f3ec0810b6646968cae6509 -dist/2025-08-05/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz=805ffe0a6dfbc886f0ba93ac9ce796c110ea6d0a64b2d6209cdadd56cd2a570f -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz=941c683ef7d013166c7f3439ee1229f80a367405f55bab9072dd12725364db6b -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz=8b666222443b3954a7550b14ef919b7ab038e6a4a2355386e42c9acbe28f2024 -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-musl.tar.gz=80f740bd004b98d5c090fe280ef5e372e4bff7a34dc2ba4940204cf02f50bb93 -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-linux-musl.tar.xz=b69ad00f5d60c63fa6d7b32c4d7006d195540d902f8390754c7db92a9221973d -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz=ed52f0f9bac7b9d7ec49226eea471e44fecf0416608a5b169d35b12d009e9c1b -dist/2025-08-05/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz=d4dc1b096b26814f14e1e23717cef10f3f63cdc6902e345916e015a99851cb69 -dist/2025-08-05/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz=aa1de02a79f16bb4affb50c3ba0e719352c9925fc57f22f989eed3f7df1a8e5c -dist/2025-08-05/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz=a36e2749e118f995417f0de9c9835db4b36f8ed6d76d8805510853984f648c5b -dist/2025-08-05/rust-std-beta-s390x-unknown-linux-gnu.tar.gz=32e6e3672d3c379a1defb6c661eca6f2ce342784feaceafec004bdaa89a0b226 -dist/2025-08-05/rust-std-beta-s390x-unknown-linux-gnu.tar.xz=a449f0392193ab8a48a30b0a8c0c57b0a02747ae8302d08b3be89d475f1b8291 -dist/2025-08-05/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz=a4e0901c13d3c534e176fdf824a97e5a6ca66a198b73a132b957d41b1f198261 -dist/2025-08-05/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz=64720eab59f7c958aadd360b8e2dc5696760d62e9f5f44daba890fc55a4fb6a1 -dist/2025-08-05/rust-std-beta-sparcv9-sun-solaris.tar.gz=8d5d3be06cfe5431b9a8e965fe06837efe531c365e8d46ee8cdc8e9da19099f0 -dist/2025-08-05/rust-std-beta-sparcv9-sun-solaris.tar.xz=913d7fc4aa75ac2175aa52891f9086d48065d96007885e0caf5feb628953a86d -dist/2025-08-05/rust-std-beta-thumbv6m-none-eabi.tar.gz=ca59366093c472f19381fdc71aacf6b3d659750a8a3bd8894191a42c8c3b82f9 -dist/2025-08-05/rust-std-beta-thumbv6m-none-eabi.tar.xz=e16dc610520f4748ffca99b235e58a544e7f97ca4cf99cbebbeb106ed4acffd1 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabi.tar.gz=08a281c1bd56149ebd05531fe405a621383ad440fcf273fec04e0792f325d669 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabi.tar.xz=a9f7eadfa375061835f139bbb870a5692b727de8a85fb8177d8fabd0588e28cd -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabihf.tar.gz=f996d8b1aae894af11407ac90c277e161acd58378307548ffaa2fa0a4314f3d7 -dist/2025-08-05/rust-std-beta-thumbv7em-none-eabihf.tar.xz=48b9e7d257ad1fac0b23b3a7d6b3ae8afb5dd19db7b5dd2a59ddfe51364db72f -dist/2025-08-05/rust-std-beta-thumbv7m-none-eabi.tar.gz=1061c6b8794aa4e1f66ff17d91934bb9711c6064362cca7bca1d7cdd4f9189cb -dist/2025-08-05/rust-std-beta-thumbv7m-none-eabi.tar.xz=974b1078724ac06757d7899fde62f623e61c86ac0853cdbf02a252b13383e55a -dist/2025-08-05/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz=a4fd4047a744bea871a54af311f27a08b5f7c8f04e5e62f7abf292689378ab4f -dist/2025-08-05/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz=19c31d2a0982689228eb58522ac7610d33cfcc1b5f72ee2e41e218695a49d09d -dist/2025-08-05/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz=8b5e150d6950866734b025e58b3714c4acfe631785fc464e6fe3cbedd98709d0 -dist/2025-08-05/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz=23ca585e084fb548488e17adaea92e16ac98340fe146073046d1bfbe6faa325f -dist/2025-08-05/rust-std-beta-thumbv8m.base-none-eabi.tar.gz=d31bcb162cd2ee40a69acb2c201c07c233b8c2710bc07ad322263121f0d422db -dist/2025-08-05/rust-std-beta-thumbv8m.base-none-eabi.tar.xz=67354653ab11222806f4a688c11be6dc80468785e14a8b58f2285a695c53c5a2 -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabi.tar.gz=ad61d8510d82ca1094a893879d7148446e2880dd1d172b9e8a420772b0b4611b -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabi.tar.xz=5c1ddf66949a40265effbc76ac3da59efb1bb3349dbe2a8037b8215375647fdb -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz=4895c9a6659e831cdacd314ff2ca4c968fd368c6bf9308f334468cb07892ae56 -dist/2025-08-05/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz=f64a05715457288b36dd16fcbbdd91816829b889047c277841f3f4972bcc6076 -dist/2025-08-05/rust-std-beta-wasm32-unknown-emscripten.tar.gz=3b144570ddc44868a6609f921028b23f994de337c54a96fccaf976abe4e2ceff -dist/2025-08-05/rust-std-beta-wasm32-unknown-emscripten.tar.xz=355a1bc09dd4163a416cb78e55ec998e95b8acbb9b072dbd3a8e34f5e95d3378 -dist/2025-08-05/rust-std-beta-wasm32-unknown-unknown.tar.gz=52213b11d29f02d4531495c9d35ee7022ef6b8400a8386b8728156b33d2a9eed -dist/2025-08-05/rust-std-beta-wasm32-unknown-unknown.tar.xz=1f282c355a1499fc2a212705700fbb8de7e568dbdc5d43d3c895af86fe9f735b -dist/2025-08-05/rust-std-beta-wasm32-wasip1.tar.gz=f40da6445acb1e854625a02b1078f670874e75d763168430d0ca17ef3b9bae26 -dist/2025-08-05/rust-std-beta-wasm32-wasip1.tar.xz=a0e59495bacc1bceaeec940273fcc6d1505c283de9e2a60ee7d492f2a7efec3d -dist/2025-08-05/rust-std-beta-wasm32-wasip1-threads.tar.gz=4b4eb08ab33ff2a300828c65a9636f32428dfec784bf115aa53856b5336d61d5 -dist/2025-08-05/rust-std-beta-wasm32-wasip1-threads.tar.xz=54ae55557d66f922112a42aa2c296841f5919907ccd81354f0dbe1b0517867f8 -dist/2025-08-05/rust-std-beta-wasm32-wasip2.tar.gz=b625337e6180ec57abbed063de5bf384949254c46a5fbbb12804a3dbd0d1c3a6 -dist/2025-08-05/rust-std-beta-wasm32-wasip2.tar.xz=5a098a042f5586e7e1b7444bf64edf3dcc535d75226fa44be420c0d42b90c25c -dist/2025-08-05/rust-std-beta-wasm32v1-none.tar.gz=b11ed27b745437b39ea9699f7fd5413bdb25019720569b9940f1cbac4849344c -dist/2025-08-05/rust-std-beta-wasm32v1-none.tar.xz=3dd3f07214429f36a088a89c3de7404659d1b584895ff5b7938845fd4a669f27 -dist/2025-08-05/rust-std-beta-x86_64-apple-darwin.tar.gz=14522f13786b81727646acfcb18c81b3f78b24bf522ebaf65adba416971d9939 -dist/2025-08-05/rust-std-beta-x86_64-apple-darwin.tar.xz=b78a1df21a97c25d9977a69bf778190fbf34947c6837f895aeeb53c870083438 -dist/2025-08-05/rust-std-beta-x86_64-apple-ios.tar.gz=a5d57bef3b09c4a4e6789d756cbec9e9459261ab70c94a406d4519eb2da992ec -dist/2025-08-05/rust-std-beta-x86_64-apple-ios.tar.xz=1b461aaf03e808d26bcae49417f04b71ad1432f266f0b25b3d6b26a67b7f8953 -dist/2025-08-05/rust-std-beta-x86_64-apple-ios-macabi.tar.gz=6c7a3326abd3fb7c878af095699164237f97ce5827bd428d8aad5c9818b2098c -dist/2025-08-05/rust-std-beta-x86_64-apple-ios-macabi.tar.xz=427684c9613ce04737837a594987bb1eb81d1d3f5ea2a1b19c2b76b3be32ab62 -dist/2025-08-05/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz=2e10607e6eb7fb3168fe593f1d260b52ac578d590cc6788555346cf9bac9f586 -dist/2025-08-05/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz=256331077a036bfed1650177cd1a886aeb4ce9aa9ce2a35f5450767f5e06aee6 -dist/2025-08-05/rust-std-beta-x86_64-linux-android.tar.gz=b5943cc4d10bf039d9b52e56713a99e8edb21d9de3655450d16c557c9013f47e -dist/2025-08-05/rust-std-beta-x86_64-linux-android.tar.xz=ceeb89fa082b98c8d50c043cfd2e4bb8ac1d98943859a75d74a555ffda8d0a5d -dist/2025-08-05/rust-std-beta-x86_64-pc-solaris.tar.gz=98d9d51da4b74a2a1899be7f0dd8d3c0f980fb4ce96fddd1c2dedb76e174984b -dist/2025-08-05/rust-std-beta-x86_64-pc-solaris.tar.xz=0fed1f0452475bf10d3ec0bfef12e9fe05bb117910d871f4099bdd4ca947d74b -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnu.tar.gz=f458eab66adc91aba026a434cab47bbbd98a9d5e7d0f5a1a1979e0e6a89c8e7e -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnu.tar.xz=bfdc3bb5b66a525281236b01513f49d96d644e4cd62ce89eb59a8179fe4707b0 -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnullvm.tar.gz=b543f21106bc3a72d31a5c49118553187cbb0d2e630ea943aa97d3ae5bb4c40f -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-gnullvm.tar.xz=9056c113ee03defb6cd33acbed9829712b57ef3606623169d28416be4110a31a -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-msvc.tar.gz=c66ff2e88c79f3fe574f9ef7822d5d2e6f73efe3ebe67c6bd35096622b668d1c -dist/2025-08-05/rust-std-beta-x86_64-pc-windows-msvc.tar.xz=45765252e930a96badbf06eb04ec092bb989c0ce2067aaab52b7ddc72ea511b8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-freebsd.tar.gz=9b3d68e86e0ce6a484bf615313f98bd289db73899a55cecfa5b7955b4b0878f4 -dist/2025-08-05/rust-std-beta-x86_64-unknown-freebsd.tar.xz=bd48292b8582167a5e89ebe521c9754495403968c184b925df8b2ec1da344fc3 -dist/2025-08-05/rust-std-beta-x86_64-unknown-fuchsia.tar.gz=b4c6c046299391beb2f50eff198f4c9b6571b6c1748dd621bdd154694fffce3a -dist/2025-08-05/rust-std-beta-x86_64-unknown-fuchsia.tar.xz=a30857c8f066191b64d7b52378fae8790814a251ca452c80710bd9a49c5c0c85 -dist/2025-08-05/rust-std-beta-x86_64-unknown-illumos.tar.gz=1ee4b264021b510342c2ed96da0dacf5cf1704874de3bf9380642433defb3e0a -dist/2025-08-05/rust-std-beta-x86_64-unknown-illumos.tar.xz=ca431d4426cfba2efd408b8822f9aeb0961d81373c6154a0b7eeb957abebc33b -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz=ebba9fa476d5b0a42054a6b6ca51526efd7c2cf5ac34eb8af119bfa69f3f0a5c -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz=d4498920cce484a8b3a5cdf8ee856d80cf1379f9782169340dfff2597b530598 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz=20c37745f3ee13c2c81dfc77a80919cc0448180f6be0be56d7fb5239e5651294 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz=dd319a6c381b372ba230d86bd07a089cd2431656c7c765f029e8e10d60bbd778 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-musl.tar.gz=d0c20b13113eb62c9a78a796418386d0352f4221095de272018af6d5ec6bd9f1 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-musl.tar.xz=d0e1001e8e5af571f0fd53115ec873091a33e4943dd27a16ccd74dcd8c71abce -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-ohos.tar.gz=4be537d5fb6c0d867a131539ef4b0872f9f6d175ba0517fed50b1d463c615157 -dist/2025-08-05/rust-std-beta-x86_64-unknown-linux-ohos.tar.xz=ca034c852a4c9099a062f55c5e479bd700f2ffd89a3b2c2c7354df54e41057a8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-netbsd.tar.gz=11b5a73da1f560c218cecf9a71d6b2173df1fbe276e63e20e1e85f2dc48579bf -dist/2025-08-05/rust-std-beta-x86_64-unknown-netbsd.tar.xz=2de6a8850076e9c1edd8aa3e13902ebbc599da9637f88da347858007f8e5c212 -dist/2025-08-05/rust-std-beta-x86_64-unknown-none.tar.gz=dacb8aa48387ad15380a094104bbcfabdcdd5f88e189d9203fd3e3f466b92fa3 -dist/2025-08-05/rust-std-beta-x86_64-unknown-none.tar.xz=ce2eb95efe252de2ecbe619b3805b01ec84863a9b30330dc4ad5683d67d7c9d8 -dist/2025-08-05/rust-std-beta-x86_64-unknown-redox.tar.gz=bf28f90b1b24eabd80da75262bd260ee811ef30a1ba94bdeb7a005f132ceeead -dist/2025-08-05/rust-std-beta-x86_64-unknown-redox.tar.xz=99aa3603b7fdc84893a02e66a774e147439a1cfd77ba63818c58b11ae692058d -dist/2025-08-05/rust-std-beta-x86_64-unknown-uefi.tar.gz=75c57e4a9367a6fbee02f8857da2dd4bce8bd20c8946a3c2460a77cb95af0972 -dist/2025-08-05/rust-std-beta-x86_64-unknown-uefi.tar.xz=552c14c20d1f786c8350882a32618951de0a06e0636fa3b8d69f2ffab7e7561d -dist/2025-08-05/cargo-beta-aarch64-apple-darwin.tar.gz=4723292f91e645d3f86474ed55e52eae4f35af7458602d3da9d38b0a513cfeef -dist/2025-08-05/cargo-beta-aarch64-apple-darwin.tar.xz=d0150ce874376c41950966b0385f011ebbbd5ef4955deec7829d8ccb669e9e86 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-gnullvm.tar.gz=fb0a8a8dff4d42f9491ed9a0223a9541bbaf8691c831b5536220494c479b21e3 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-gnullvm.tar.xz=6bd35ea43ab877d84bff4b32b965371b942b10c6f6feabb3a5b481a4c84513fc -dist/2025-08-05/cargo-beta-aarch64-pc-windows-msvc.tar.gz=3437221155f338e81f55dea9d715b3958fe7d3a260d77d14725e62d0780bfc76 -dist/2025-08-05/cargo-beta-aarch64-pc-windows-msvc.tar.xz=94886636f7bf805809a8a1ac99b514036c5db1755ccfed61cb6cd01d57d244a3 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-gnu.tar.gz=7f167793fc72f5fdb6bbed97e96684cfa089f9932d3a64239bc755fe7603e7a3 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-gnu.tar.xz=1018ea99c4142db9fbf386547dee8396dc27d3d3608085a1b0b0e97e2d0172c7 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-musl.tar.gz=8e03af7a838e81c12c395ed76151aa6ead12b3e60effa3b0d775508118149058 -dist/2025-08-05/cargo-beta-aarch64-unknown-linux-musl.tar.xz=507de5fbe92e144dd37dc34123ee58b9e46805c85eccd4a759a117020578d742 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabi.tar.gz=263ad4a9ed084dd76b6ea62d377fa470043f78e0343f7fb80d5c9b50659d8977 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabi.tar.xz=ed850f484ee870172b721ab6824f0a15b41dd80ffc623557aa58a5b839d992c5 -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz=afb4cdac4a3c28fe08fbba8b98962eec6c625f6a10a52ee8cc988881852b79dd -dist/2025-08-05/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz=7f332d11e74d76efe236a7858021a626d31fb856d9ad0745369b99d9fdfe3b44 -dist/2025-08-05/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz=5c0c79bbf734c0ce18001cf27605f6728d83d24bc97ea5c78b423fb9faf46d96 -dist/2025-08-05/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz=3aff39ef7b9e8adc2e6bca19c2940287c4e091ad7ce4503c46334e6969ce0c95 -dist/2025-08-05/cargo-beta-i686-pc-windows-gnu.tar.gz=af99a5778ab4c9cea122897bcd3ea1626893156fb71346d66a584553d6531469 -dist/2025-08-05/cargo-beta-i686-pc-windows-gnu.tar.xz=8425eda844728c0353b4c7edc4636141dad265e461addf009cfa1a224df0e7cd -dist/2025-08-05/cargo-beta-i686-pc-windows-msvc.tar.gz=46d1b318b6cf826d8e7e694e54ce5b9c651dc2f8facf32ddebe21fc32e1e8dc4 -dist/2025-08-05/cargo-beta-i686-pc-windows-msvc.tar.xz=bef58a9f31aa3434152f79b2e271958fb07e925c938a569d1c9431f7764d19f1 -dist/2025-08-05/cargo-beta-i686-unknown-linux-gnu.tar.gz=c432ae4d909a21336a6645b85a90ec541818424bb76da16b19979a61a11845b2 -dist/2025-08-05/cargo-beta-i686-unknown-linux-gnu.tar.xz=053c02b341219d583caba881e525eae2cbb125ecc188e1b43d641fd7f3f027f2 -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-gnu.tar.gz=40542d76adaebdbc3fb16047a8324d439abba0485d227253614beddcc3cee2dd -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-gnu.tar.xz=d25210467dabf91917eefad9a5a415a3912a31b37ce1fd3d755b6c72b3a6ce8a -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-musl.tar.gz=09755de73380c39daf64208df9708613ed6f8790e2f5cf79e80cb7826fd74f28 -dist/2025-08-05/cargo-beta-loongarch64-unknown-linux-musl.tar.xz=e8eab1aa5b41c04b518d43a86849307cbfec76df13c834a460c546ab6b170089 -dist/2025-08-05/cargo-beta-powerpc-unknown-linux-gnu.tar.gz=93398391d308bd0c08fa2a7bab7bb6a38b78400280cbe765604a3da9d6caeb47 -dist/2025-08-05/cargo-beta-powerpc-unknown-linux-gnu.tar.xz=ed37a7c5a8c62db06e709779b81d1e013975feeb82c185c76bb3d218aa142cc4 -dist/2025-08-05/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz=a398b3ff0967b1ec2fdc2716a6b2c3a04defc14ebed577d93e45040aa5552dc8 -dist/2025-08-05/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz=51d6a1a3e71713157a4e6291023b8393e21334a952a947f82f9636a725989281 -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz=cef935747fe5205c3c5944f4dcf80e3111d2859616e7d727b8a5c77abe2d9fef -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz=fcb8aee743adcc3796b564570e0ad6d9950031160ba9a6cafbd92af2f0a0c213 -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-musl.tar.gz=73b2c9676122e842a73a8a9890f1e1aac426f75449a99b4fc0ae3f5dd5ce238e -dist/2025-08-05/cargo-beta-powerpc64le-unknown-linux-musl.tar.xz=ba293bb860349ee4732c5363d38b5e386544a25f65ef8ee33850061bc84bfe64 -dist/2025-08-05/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz=bff3ac251a42b1664a544706185826a4d9137cde990620dc73951252d2d7fb41 -dist/2025-08-05/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz=61056d4405af01b4b1c3134af8e83ed86473d0846beb41d3ab72df92edf316a6 -dist/2025-08-05/cargo-beta-s390x-unknown-linux-gnu.tar.gz=f89a30322a3621c4737f932788f4ca78c83b9f2845e324c4944522f35d44baf1 -dist/2025-08-05/cargo-beta-s390x-unknown-linux-gnu.tar.xz=394d522c9553182cf5f496e2b5324499c1845c0a0621fa527aaa925946b58d21 -dist/2025-08-05/cargo-beta-sparcv9-sun-solaris.tar.gz=0b18adbb22b34448576e6a3ba637c7565d369e1c994474337bed48b3cd0b0231 -dist/2025-08-05/cargo-beta-sparcv9-sun-solaris.tar.xz=c57709b87524d29661f77df3e3585bae4776fb3fb6de3874edb942f724543a89 -dist/2025-08-05/cargo-beta-x86_64-apple-darwin.tar.gz=c8faf66575d43fcbc03376225ac22d571def08ed1fc239d468c15929d9ecd393 -dist/2025-08-05/cargo-beta-x86_64-apple-darwin.tar.xz=538d81c3fe2b5a9edfc1e99655120d37fa159dcf761e1ddbe5233115e39b38b1 -dist/2025-08-05/cargo-beta-x86_64-pc-solaris.tar.gz=a2fb63b0a2cc3d3ea9523c8ffe61ba9ccb367dff136e6fc39aeea6400034363c -dist/2025-08-05/cargo-beta-x86_64-pc-solaris.tar.xz=02e8990865ef8f14a31e4d0f17be4cc0cbecda7e82e062b4b9cfdb99dd45156d -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnu.tar.gz=ba86f300cd40cb3cb23ac41970246ce54c03ee153f86127a379fecda930c020b -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnu.tar.xz=3bc0bf2da392ac52bcf2aa1dc19bea1a86bd7a4fe246feaae862a792c82ec476 -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnullvm.tar.gz=68a2a34e656395fabd42d20b7008d96b2a86e9a47caa52e6e2613ccb3b1b2d8f -dist/2025-08-05/cargo-beta-x86_64-pc-windows-gnullvm.tar.xz=1e2e31fe2306e26bfe58c49a99cc89664e8a7857c2c18ad74c20cdb35bd3c586 -dist/2025-08-05/cargo-beta-x86_64-pc-windows-msvc.tar.gz=5fa21f665aa40fab1896bd4a49dc5608b4b453d26f4b975771908634c699ab8e -dist/2025-08-05/cargo-beta-x86_64-pc-windows-msvc.tar.xz=adc5900506d399246960445c1e2d59f0c4b2a5cfeff9972f1617de030ce82bfa -dist/2025-08-05/cargo-beta-x86_64-unknown-freebsd.tar.gz=a2bbb1d5fa283e77ddbbc0c8d69e36b9c2bbb01912f302f522af48c2187327b3 -dist/2025-08-05/cargo-beta-x86_64-unknown-freebsd.tar.xz=11e1a51740a728f5825364a8679b28454a68e7efc96320730f9b58a8fc2e6fae -dist/2025-08-05/cargo-beta-x86_64-unknown-illumos.tar.gz=9993f4130b5ce50898e530e7411efe6923a36b5d56459ab672b1395717fe69bb -dist/2025-08-05/cargo-beta-x86_64-unknown-illumos.tar.xz=0a41315ced9f4fdce9c1877a4c27e5cca6e494f5dc8c2560334a5b75d42f495e -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-gnu.tar.gz=6b8f74b1c850093acb7227306caaed4581d70d015ebb0bb5f924af1c8bee7bd1 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-gnu.tar.xz=f6f7bb4e4f1156329946d83bad5893e508645dd76b9ce522a53ea673791da006 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-musl.tar.gz=68c829663d6166661563704e25a6e85a973705e12efc9265a23264b9ffbff4d7 -dist/2025-08-05/cargo-beta-x86_64-unknown-linux-musl.tar.xz=2c40e68c9978e58250f0e017b5cdb2fc390f26ef96324129c489f55898784488 -dist/2025-08-05/cargo-beta-x86_64-unknown-netbsd.tar.gz=65166585138bc6f09f54f88ee889aea6d4e63019d64a684798341d6b332ce99d -dist/2025-08-05/cargo-beta-x86_64-unknown-netbsd.tar.xz=97491edef98b3a13b0571907555bf5867be13ec8fd4af69142db92a8deaf8586 -dist/2025-08-05/clippy-beta-aarch64-apple-darwin.tar.gz=b933611d47ccbcf5aad43f1134cc72ac708fdf59bace0dab75cfe139e2357373 -dist/2025-08-05/clippy-beta-aarch64-apple-darwin.tar.xz=c3d473e366db3b271cbe438b3a5531e9c5a72e28248d94de0f81ee93a8a2e7cd -dist/2025-08-05/clippy-beta-aarch64-pc-windows-gnullvm.tar.gz=e5b4fc054121eb13b21171b2e851dc1c824e11aad1257dc92b4ca9e332898b40 -dist/2025-08-05/clippy-beta-aarch64-pc-windows-gnullvm.tar.xz=40bddcdd9186cfb9f8763e8e289087c15c2c8b8ab78f41ba7380cdb08fedb0da -dist/2025-08-05/clippy-beta-aarch64-pc-windows-msvc.tar.gz=7e7c47305708ae073ed8d86e621a3c0be0e135b2480508814665f24121588a56 -dist/2025-08-05/clippy-beta-aarch64-pc-windows-msvc.tar.xz=c4a5bfe2d48a2301adb4f7524cccd64f4a3ccecf985f131972a13bd221346454 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-gnu.tar.gz=dd26d49359f6010e94e04198067f83c83e81618546d1cf51606d157a02b4938f -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-gnu.tar.xz=e7c9834067311a87f547450108718582991498a102dfcba0e1a99671205e9bc2 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-musl.tar.gz=b584c26e267b0f7e105f65c436c12cfd6d9b8f2b92f9662a4797fa5e95455e11 -dist/2025-08-05/clippy-beta-aarch64-unknown-linux-musl.tar.xz=6b0eaadfea879cfc8c758fce002ffe77e34484e167c496ac0659dcc789dfc080 -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabi.tar.gz=eebd0632971888cb3bcc3b07a06f25a47af594ce5606e8e1e069fe85ec702e5c -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabi.tar.xz=946d6791e4e15ffca6195bd7c9bd2d160b9c65468fddc800948f41adc8fec597 -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabihf.tar.gz=3862815aa14e8122b70b39c1137088e0c2a724900d2d13ac2b37a1a430b23a1f -dist/2025-08-05/clippy-beta-arm-unknown-linux-gnueabihf.tar.xz=8278e11b7ea2bc035e6de21f826a775d66273a9031195d8b887752137424f2e0 -dist/2025-08-05/clippy-beta-armv7-unknown-linux-gnueabihf.tar.gz=83a847698eeafcbd3288d59013157d3d2a11b90b521ebadf1b26dac90877d11f -dist/2025-08-05/clippy-beta-armv7-unknown-linux-gnueabihf.tar.xz=308de9cedc422c2051661df74024ab26c59b86368fbf50ce4dd7b2b2907ccc8f -dist/2025-08-05/clippy-beta-i686-pc-windows-gnu.tar.gz=95fe71a1f8e68f0f3a5306dfa04e269c636ad036908e201c1b4ed7a3f99b1dc7 -dist/2025-08-05/clippy-beta-i686-pc-windows-gnu.tar.xz=5b8c928be909433fb005498a92d2fb3ff535f31c68a5e134523f9731cacb029a -dist/2025-08-05/clippy-beta-i686-pc-windows-msvc.tar.gz=d736ec4f447f6b204f250b044b406b4e4b96f014887b6f7755b037e211aad3af -dist/2025-08-05/clippy-beta-i686-pc-windows-msvc.tar.xz=8a4ac568284aabb994964323465c7287715d3dd4ab881271a4746d2ae5390ffc -dist/2025-08-05/clippy-beta-i686-unknown-linux-gnu.tar.gz=d8b87338abdb4123eb25dd778d038c516c5bd472e1426b5a5f74f25126957039 -dist/2025-08-05/clippy-beta-i686-unknown-linux-gnu.tar.xz=ebb6dcc1b038deff6a966062ca3a966d3426f8932e5aeba398636a2d2e9be0c0 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-gnu.tar.gz=51bf4e84be5b677ad9afba442d9567b96f59209219cddad5eb3f49b788bd8fe2 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-gnu.tar.xz=e63e3346089c7f300bdc73521def20cd2a012f8de98b8b05a653e85f3516371c -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-musl.tar.gz=aeb3782ca34a0ac47420109c241041ebbc029050a690a5c828c865108f56ca18 -dist/2025-08-05/clippy-beta-loongarch64-unknown-linux-musl.tar.xz=80dabbd511bd5bdfc944d7613a02c9bdac702abf2de916222a37e59a92c2e577 -dist/2025-08-05/clippy-beta-powerpc-unknown-linux-gnu.tar.gz=9307396973615663330474ec145efebd4246c6bae5d979a80b6d93f832af0137 -dist/2025-08-05/clippy-beta-powerpc-unknown-linux-gnu.tar.xz=fb2a34f9472d2c1beb1381e9ff8bca23d9058c978fdb2e52a3c7f0cba8305c59 -dist/2025-08-05/clippy-beta-powerpc64-unknown-linux-gnu.tar.gz=e985eebd182d78604861ce60aba5078e98a9a078b76752da8fabcfc5fa471fc3 -dist/2025-08-05/clippy-beta-powerpc64-unknown-linux-gnu.tar.xz=1092ddf60ba04418f91c1e51f9c9da1e0d6b61dbdb104fc8028043dc1a33caec -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-gnu.tar.gz=bf0238a4909fa15034f067d5a51e38e43c91e69f29f51c39246d5c0b23925042 -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-gnu.tar.xz=39caa6aedcd746ed1c4745e207cf8cd65de7b774f15e8892987ce2c3fdde543e -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-musl.tar.gz=b19ef1a8cdc21925887ced0c594ff5ab658bf66a0d137c01b6375fcdd0de8e35 -dist/2025-08-05/clippy-beta-powerpc64le-unknown-linux-musl.tar.xz=0ec300c1e791f946503db692e602680acf11857715b9ecc87cb446ac10d2527c -dist/2025-08-05/clippy-beta-riscv64gc-unknown-linux-gnu.tar.gz=e7c8fe214ffd70599648cfacb50b3457597b479d320bf8383869dda8b0559d42 -dist/2025-08-05/clippy-beta-riscv64gc-unknown-linux-gnu.tar.xz=d8ba0c42074c2a94dff3b05f2388f17225044485abd0459e155928f4762c8988 -dist/2025-08-05/clippy-beta-s390x-unknown-linux-gnu.tar.gz=510b9c9ca885a8e91c3d25f14cbfb34a7a927d374fa1a9149678d7ed9c4e4c2c -dist/2025-08-05/clippy-beta-s390x-unknown-linux-gnu.tar.xz=b53697799d99beb46fc17b3cca8ccfdc4ecbf7f3e1fd47f031852f07fb749ea0 -dist/2025-08-05/clippy-beta-sparcv9-sun-solaris.tar.gz=f3109a1dd87c23256057fcc94d3fade0b49d20a51040b4fbdda366f5b7c9b58e -dist/2025-08-05/clippy-beta-sparcv9-sun-solaris.tar.xz=ba265d781254d0b032d836a440c94c31ca33bc136e027ad05332cfc0cf40bf54 -dist/2025-08-05/clippy-beta-x86_64-apple-darwin.tar.gz=74c49a7cd4b6605b9a43961415fcaed1197b8f5aca798efd4b62a15d837b956b -dist/2025-08-05/clippy-beta-x86_64-apple-darwin.tar.xz=69128daabb11fd29720752bb13d83ef4bb3faa1d4aea8d525da2cb04f42b6010 -dist/2025-08-05/clippy-beta-x86_64-pc-solaris.tar.gz=e1975507778e448ac9b3040f330340f3a7d54e6dd40357494e3d891008375364 -dist/2025-08-05/clippy-beta-x86_64-pc-solaris.tar.xz=43c142c870116f4c2408f4b3208680b81390a4b37805f5a32696ad17bb313b48 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnu.tar.gz=ccd8806b6614edb270a2816cf0dc3b6376046fe58d258d296ffb222929d42d91 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnu.tar.xz=21148cd754493da3cdf72adc8da19ebfca1da8d642e1bef51782772241b48084 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnullvm.tar.gz=5a7cecb6c054a71ec5b1fb284f6bf2c069925fffcc1757ac631e8a2d08b116b0 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-gnullvm.tar.xz=b451057a4a75341924072fe26334eefce8b6eaa3edd79d3226eb02c1c99fcdb3 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-msvc.tar.gz=74e9cea693203c6217934549694a240460dda2818b144bac5777f41c44a06d53 -dist/2025-08-05/clippy-beta-x86_64-pc-windows-msvc.tar.xz=bd90fc3fc80f28ce415dc1cfd105d17ec5ecfc63fae017baeec734bf94f5d71b -dist/2025-08-05/clippy-beta-x86_64-unknown-freebsd.tar.gz=fb61d60d6c66a4632911944b5c7858b8c055ab8ae5a194d78e7d7ba18b65e940 -dist/2025-08-05/clippy-beta-x86_64-unknown-freebsd.tar.xz=bbc7b2aa6f05ecf391a757ffc5b6fa6e0989d00f7e8fa48b83faca8996f99dd1 -dist/2025-08-05/clippy-beta-x86_64-unknown-illumos.tar.gz=10e8be6eb15269cb2d0573e19e3a5004dbbd2b14e2f016d6b9c60713e22f716b -dist/2025-08-05/clippy-beta-x86_64-unknown-illumos.tar.xz=c3748db93829d3f5d9c5498592d247468125ca301ef238c41e42d37b7b90c6a4 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-gnu.tar.gz=5a0365eda14ac1a366f3c480a2358eccbfcbfce86323711d7fcfdcfd85652b42 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-gnu.tar.xz=908576635e79fe589583f18bd6ace4c488cd11ed0c59501082bb0b397df24f39 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-musl.tar.gz=79fd42cffac98024308c511144b716d18693b902dbdc1c4b88645bc7d4ae7109 -dist/2025-08-05/clippy-beta-x86_64-unknown-linux-musl.tar.xz=a3a616554ed25630df9f8cef37a5d36573e6f722b1f6b4220ff4885e2d3a60de -dist/2025-08-05/clippy-beta-x86_64-unknown-netbsd.tar.gz=ad1849cb72ccfd52ba17a34d90f65226726e5044f7ffbe975c74f23643d87d98 -dist/2025-08-05/clippy-beta-x86_64-unknown-netbsd.tar.xz=608001728598164e234f176d0c6cfe7317dde27fb4cbb8ad1c2452289e83bf30 -dist/2025-09-05/rustfmt-nightly-aarch64-apple-darwin.tar.gz=6fd7eece7221e76c2596e0472e7311fdced87e9fab26d2a4673a3242fe779bd3 -dist/2025-09-05/rustfmt-nightly-aarch64-apple-darwin.tar.xz=1a662a55931f58be9ac05841360305f277f8b1e36f99bd0a2ee4d2cc92b7ad14 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.gz=d1c3c52cf61522697d726b32ed28d7b8b4cfadf30ec57f242e8c7f9f8e09f692 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-gnullvm.tar.xz=2cc7cbbfa06803a2fe422ed3266f6eb519360b403c83f92259cc1b83f5ddca45 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz=61f525d050d1ff4a29cc7240912d84c9c091f25195b58411af9ef176175a3200 -dist/2025-09-05/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz=504b8ace2ab7ac13be143d95ed74d94940e8706ef9f53b7778da215840337e20 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz=ff48bd98d109310638822f5813042583900e2b70edd45fccd871c7c03dd1c2e6 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz=b3de2bba7858e76cdafd326f3072e4c5b534ca9b679ea62caeffb07722e9a3c9 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz=8ca4caedc50f09995dad7bc6e001cc863c524e28c45c186022ded589f3728709 -dist/2025-09-05/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz=8f2cfb052f9697052d89bb729d17d74583af3fa0be98f18a3c44ea518a8f4855 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz=b12ac2a38b379bf0de4a92f29ca40e1955c45273e798edd1a72bd40253de70f1 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz=87fb7185aa46f3810e09479dc8fafb66d13b41f4f40e9c4e866ea77fa47b1bb6 -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz=be1e8377f3d10f4f8a07ae06ab9f649f9d2fc9cfc395abaa5f0ad10a95c4fe7a -dist/2025-09-05/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz=60646799fdacdafec9e0ed81357b5db70f85bb1241fe775e71b8ad3feb686116 -dist/2025-09-05/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz=ed8cade9b846efb5ac121aa70ac188fbd2e61fa9402fe68c80b2cbd3ee32ccbd -dist/2025-09-05/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz=0d0bfbd9cd4123e0404fe476a6f16eec6e435ce28d328dc0dd0aad257b295d64 -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-gnu.tar.gz=bd411db34707c36d5b60f14bba776b0b89b69d4266007a3b591c467a17ef053c -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-gnu.tar.xz=f0f2a6a81177ae6d06ff9b8f4a5bdf3bc8b26710aaf0f09258b32f7f710722c0 -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-msvc.tar.gz=b49130da444e01fe4ef997b649aada8978b8dcca60dd38cf9e7400a7c7569e1b -dist/2025-09-05/rustfmt-nightly-i686-pc-windows-msvc.tar.xz=0195cdddc74cba2bf17eaa1d53edb1a2bc0e34cdf13c7b25a34ad9729a2635b8 -dist/2025-09-05/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz=1141897495ddca10fd6d9476a624b6a340fc2bfc619148e183bcf355a0078b18 -dist/2025-09-05/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz=81b31bc8b3d431120005c3c8eeff3ed194dd18e56220c175c3250855cbdcddbe -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.gz=10a27070239e7dfcf701669c8d93ecb2d310b9fde768639a2bf5be62cd13528d -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-gnu.tar.xz=0ac4a529f4f62a94d5ae4cc8a4a52f0e7d57296ac0884258dcc5478e6b0b1785 -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.gz=9d0ed6778fc4f0601be1e317438cf95c414fcab6d3207c635babb4f3a6faf2b0 -dist/2025-09-05/rustfmt-nightly-loongarch64-unknown-linux-musl.tar.xz=e40b607faf2f37c9d654cc0b60c47ea155893a3b62236cd66728f68665becb18 -dist/2025-09-05/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz=46c029ebbfa35972b0b9e366d17c41ff8e278e01ce12634d5e3146cbf6d1a32e -dist/2025-09-05/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz=8d1462fd09b04a94bfb1c1841c522430b644961995bf0e19e7c8fa150628e7c7 -dist/2025-09-05/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz=5827684ccb4d38956e77858ddeadeaff2d92905c67093207bed0f38202268151 -dist/2025-09-05/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz=975c7d7beb5b66caed7d507aaec092fdf33de2308f4dc7de46fe74e5e15b5352 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz=8829677ab0f898c98badf22dad61094cf53c6d599b2cc76142d3d792a44f3770 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz=3d961bead4010f8a488a065ac8a4153e3c747dfcd7d5f7eeba1cad00767a7ac5 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.gz=0138c30ebe74e8ee838d9eef31c7882812bb52d2304f2de7c23c47dedd6a5032 -dist/2025-09-05/rustfmt-nightly-powerpc64le-unknown-linux-musl.tar.xz=bdb4b7b3c89a30c79f51b5fa33a2a29fc8313f8193bc43ee611e8ce7d80382d2 -dist/2025-09-05/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz=8e440dd400bf3eb4a144318459e111069a64bb309a5a51eeb0f0383dc48ee55f -dist/2025-09-05/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz=f623e1d7d38d94965d7653fdf4a272630b2b6dec81662fbbe5d2573f2f3f3b8f -dist/2025-09-05/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz=f46a8278352d5a981c6746b876fe19df3093090a866d20d24cd5cb081136b1c0 -dist/2025-09-05/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz=fdf8b44c6f110a33ad7f969e651ad396c880a85545aadfee8a24ca3cbed35974 -dist/2025-09-05/rustfmt-nightly-sparcv9-sun-solaris.tar.gz=59d778dea354867d64c809b40443ca0762c685dd0e5361971daab04aa7c5a5ad -dist/2025-09-05/rustfmt-nightly-sparcv9-sun-solaris.tar.xz=18628b2888d77281fc9b2ac5636ce4ec444ab0e47bbe0e8a08238f90040c20a3 -dist/2025-09-05/rustfmt-nightly-x86_64-apple-darwin.tar.gz=169d9f2ee4a0c726040f4940370d1162502aa6568a0a442c92cad3fbc7bd95c2 -dist/2025-09-05/rustfmt-nightly-x86_64-apple-darwin.tar.xz=7f955cfa1ab07819f31cd904b0a79c67cae70090aabc7dafffdc1f3f67463248 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-solaris.tar.gz=d2cc32d6be1d0f1a8654400f0418d16e789b62db3fbc0cca0d0d492615bcf6e2 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-solaris.tar.xz=3dbc29c923a6a2809a8ef561d2ad375211b09dcb107bceabbf510ab0d7b471f0 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz=d9b4ca2abf1062e888b31f31f517ccc6b451bd2bfdae915ec3984bc88a8be91a -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz=00c6d92b6e82ae58e682e72c974f2dcc865820567ba44ed008e4759dfdbdca87 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.gz=e75424d0aece8d548b2c9d896291288615d08ff2a37f1c4844a70839c612e633 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-gnullvm.tar.xz=cce9578d9b35bd8192a26e2dc7d7f7e7d5b9f08c7d73b3f4dde08208b448b063 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz=ac4282e06b0972033f974c63d2c6cbf194d4e66a1c811f443d3fa0b886868825 -dist/2025-09-05/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz=a2465b31855861d0e0eea072bb366480acf2bafdd7fdfdab79c809d8bbf8d8e4 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz=30c22a97066a5711f207c1919a1d74a328540da0d9d6f85a0cc044174049c927 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz=40987da0b665940f9c406cfbb4889dc101d73846730b0bdfa1382d051297ad08 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-illumos.tar.gz=443ba10092122fbba9854abb4aa9d2e71d8e5e65b99fae6dd572909bf50f28c5 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-illumos.tar.xz=10285942b9140efc9897965cb3a4204145e774bd1b0c2690d45d8b04498fb917 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz=b09af4fe367df416bce622654d9e3dfb610c564f5e6d14b200d949340595673c -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz=1f9a585a017cee5a05190377cab105603f039fbefd9b4934278dc555dfca91b0 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz=24f911745fcc9f120e44acccb98f54dc6406e492915410aae17efdd00e2752c3 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz=48eb58ba1d58701dbff341e19fb6d446ed937cc410207b35297babafa29dd889 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz=c2d1cfdcd8a08bde3f9a635eaf2d6d2fbd82e4cabbbd459e3c47e64bf1581f11 -dist/2025-09-05/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz=ed1775b4fd3d7d1203f8749f70328ea4ade802fa0a76c4d7ab3e2d63ca1535af -dist/2025-09-05/rustc-nightly-aarch64-apple-darwin.tar.gz=4b64c4148e5cdd6585a4200125cc394c6a998da3686ef758f37742ec2d33d573 -dist/2025-09-05/rustc-nightly-aarch64-apple-darwin.tar.xz=fd45182f9db059bdc17f2c465dbaae22589eb8e8d2d88776437a34ddca3b7153 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-gnullvm.tar.gz=c14f2d7f391492d150f2f2f91af413266649cbdbdb042fc8b660b3cb141b80c7 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-gnullvm.tar.xz=d72ea1c571fe2376ef05cfd15fb3207ee2d27c3c851f3391dfbb082c06a5bdd0 -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-msvc.tar.gz=3a485d8fd8d58fdfbc1216e51414aa4d90f0c7285a99abea0fa5935d2337251b -dist/2025-09-05/rustc-nightly-aarch64-pc-windows-msvc.tar.xz=7317060a29eecd2e28d47f0ff8780150059756b07e2bc9137c3877be8af593b7 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-gnu.tar.gz=58a53ae147de1beb0a53629898bf7c51097351271be3713a2e2344b86a4080a4 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz=f79d2730843dbea9e9588fd1c1b0d854441969d8f93f76021f06af2efe22b845 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-musl.tar.gz=eddf23e28b8067021e80883faf2eb1d6d3005a6e8419a1232b84236bea286f78 -dist/2025-09-05/rustc-nightly-aarch64-unknown-linux-musl.tar.xz=4f0af1a66050f5e2d9d48b696349b9ccd420bdcfdb88b251a6655cc22a11949b -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabi.tar.gz=fd2f0446e3c993d746e8a5f72ccebd8b0a49172316ac1d1c58bad10596becbf3 -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabi.tar.xz=0b06e7ba47621819b4e59e048e5d336b3d6978e906c7363f06bbc804e49f1046 -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabihf.tar.gz=97d7c34b53628f28e6636fae738a18d0f1f4c60a9febddfb7145e6b91fcf3fdc -dist/2025-09-05/rustc-nightly-arm-unknown-linux-gnueabihf.tar.xz=323025215bf851024a7eb6566ad7dc5719832d81e8d46e70adaece98adc5644b -dist/2025-09-05/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.gz=3017e03222d030448ffe2805624143540197bd6d3b3e93f9f73469ace25ae4be -dist/2025-09-05/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.xz=4f6e86b185fb54f7a0b7d09a0faae7daac722351354f6abebd388efb3037dfa0 -dist/2025-09-05/rustc-nightly-i686-pc-windows-gnu.tar.gz=292c3770b96cde97072d70c58234488f955ed5582b7c3044c6de66891e73d639 -dist/2025-09-05/rustc-nightly-i686-pc-windows-gnu.tar.xz=6855d3fd9040fb4da554fd732eaf8a1c723921c35bb8a8efb31c78af69b2e4ec -dist/2025-09-05/rustc-nightly-i686-pc-windows-msvc.tar.gz=64a86a2971ed9934bbb6aaa0afc2a7f747da463afb55b51a7c5fdbdaa294e437 -dist/2025-09-05/rustc-nightly-i686-pc-windows-msvc.tar.xz=c98f1fc3e077b8c8eb3e526c416a6551c08c62e58be57b4a4c7d59670bc435f9 -dist/2025-09-05/rustc-nightly-i686-unknown-linux-gnu.tar.gz=5481c97d788899f896473380dde0877808489bc4a0ed6d98265558631fa67a57 -dist/2025-09-05/rustc-nightly-i686-unknown-linux-gnu.tar.xz=afadaae945c0b9a8b50dbdee28791e0c03c880cb22d3c20996eeb7fab94df0bf -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-gnu.tar.gz=18b276a2464b6c5a817d72384f25442c7619cac05b2d8d0af212c0dad96ccfc6 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-gnu.tar.xz=b74323cd2dbee966eebe8e63e24fae026ecd900a025e9167cca0341e50333cc3 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-musl.tar.gz=916dc5144107d9173479b320b55b0a95d2d42156c69fbdb0f21377d825fe0892 -dist/2025-09-05/rustc-nightly-loongarch64-unknown-linux-musl.tar.xz=3a83da72aa4a6553ecd957af35a05274528dc79f87d24d8470c20b8b4478b05b -dist/2025-09-05/rustc-nightly-powerpc-unknown-linux-gnu.tar.gz=59e031b6b79a1f11406c0640e1a357f2941967ea8c034a94148d60928038e58e -dist/2025-09-05/rustc-nightly-powerpc-unknown-linux-gnu.tar.xz=53f0e33cf2651d5dc8931ec5af8f04994188d8f9a10a5c61bd72cc822df34501 -dist/2025-09-05/rustc-nightly-powerpc64-unknown-linux-gnu.tar.gz=0eec56e3b725d918cb21e494a803b2e38eb6d744f64f1a82481a4c704eb7c1f0 -dist/2025-09-05/rustc-nightly-powerpc64-unknown-linux-gnu.tar.xz=5efc97abb235f349c6cc952b4a1e4dae7d56d70b0f8b8da2a1060b85f9b734fd -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.gz=cb45bbcdf8841b1ac184a0aacc909f153c830e8051260e09ca4e32c1f048e2fb -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.xz=1c9ddddb90d45612e4fd190fb71e527b523df13146343dde200580fb2b638794 -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-musl.tar.gz=3a9bdd4d14e8f121d3051944ee83a901b5ca4c0921f2d01e34596fb7450b49e3 -dist/2025-09-05/rustc-nightly-powerpc64le-unknown-linux-musl.tar.xz=732b9abb8a80191884fe1ff1d4d923cc1b74c21b81e6327bc5979ae526337400 -dist/2025-09-05/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.gz=1826e74200fe286478e1659ab88ea86b43efa7b023074d00dbc814d80bebc883 -dist/2025-09-05/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.xz=c30b52d0f474fd6193bb1b3e147fb79fa8cc31e5db38444f023d84d1c2d93d12 -dist/2025-09-05/rustc-nightly-s390x-unknown-linux-gnu.tar.gz=c330067621ed25d8383f27e494346eca4d7d4866e48f331f2ec897ff1c386e56 -dist/2025-09-05/rustc-nightly-s390x-unknown-linux-gnu.tar.xz=cb4097ea582a83a94cab80ff2f36b6f7141c140d75c30b1d261a1ddd4ea45bd4 -dist/2025-09-05/rustc-nightly-sparcv9-sun-solaris.tar.gz=0af19e764f10333017a3ab66020b82c7185ad648d1230b68f10977e0affb937f -dist/2025-09-05/rustc-nightly-sparcv9-sun-solaris.tar.xz=a22cfb55cdd122dd99bf3566eabd781bb2ecded90c71a41fd33b1e0588bcc39c -dist/2025-09-05/rustc-nightly-x86_64-apple-darwin.tar.gz=163a07b91e36e85c6c41368598793667414cdc6cadc980866811234539f3aec3 -dist/2025-09-05/rustc-nightly-x86_64-apple-darwin.tar.xz=76711800685b39b3b75945395682062c40efe3195f9979784bf318837e21768a -dist/2025-09-05/rustc-nightly-x86_64-pc-solaris.tar.gz=69142a6c04703c3c8309c6fdf66b25831bf9efa3ee70cc93da4b5b75f901b29a -dist/2025-09-05/rustc-nightly-x86_64-pc-solaris.tar.xz=7e535f4aa136284e4bdfd4d56891caac6844dab91e1b711fa3914a5974dfcb60 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnu.tar.gz=ff0ea563126ff28df297258001d9fac4dbd85788b5d27a0f5d6be75306f21139 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnu.tar.xz=6b66adcaa9a5332979591464242423897f59276e9e2cbeb9ab038a72e72c3a5c -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnullvm.tar.gz=64cac5e377bc115a8f8176719575903e695337941db43cfb35546d65c0723130 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-gnullvm.tar.xz=11e2765e4b3e2296ea05ecf735cf7b5f7beb08d76d12449cfae67f88bab02819 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-msvc.tar.gz=c7d15ae7cd5af774ae70e63fec3ba8723b85fa4c4640917b3960907eedb30b39 -dist/2025-09-05/rustc-nightly-x86_64-pc-windows-msvc.tar.xz=55036567af270cdac046fb4306e515787ca6ef5073617311fac79fb87ffe9366 -dist/2025-09-05/rustc-nightly-x86_64-unknown-freebsd.tar.gz=2d24470d2bb4c4d2605c15f1b2654cc45805384babb73b1960e8aea0b8cc227d -dist/2025-09-05/rustc-nightly-x86_64-unknown-freebsd.tar.xz=fa41782cb2e22aba30d1619db1f478c0305944ceb4de1d1001f221c5c68c104e -dist/2025-09-05/rustc-nightly-x86_64-unknown-illumos.tar.gz=d0f9785f76c59f3a67a499cfff4a5639f3ae05cbc76750b867faaa60b7d67f78 -dist/2025-09-05/rustc-nightly-x86_64-unknown-illumos.tar.xz=925e473c6e31d8811879a805358cfd2e5ab8f4de836c270d02dc8403771bed3a -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-gnu.tar.gz=ebac845114b89dfe7d0efc0cfe8820902faad617ed21eb2a701d73cf7b544a85 -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz=2512a5462e3f46c95ed4aba4228282a357b3e0694e9db117a857196448fe7bcc -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-musl.tar.gz=b4a5d364b84464e9a92140fff50349d4942b8d970b64150a4bc6d720cc6c4a4e -dist/2025-09-05/rustc-nightly-x86_64-unknown-linux-musl.tar.xz=6c57c2edc305737530f8551d789ee79ff952f42a0d52d6f8d7d7f1ea2027cfca -dist/2025-09-05/rustc-nightly-x86_64-unknown-netbsd.tar.gz=f3192ded327875d5a27fb50c690e3fce36669e8f71c47de304dc21edad573ff9 -dist/2025-09-05/rustc-nightly-x86_64-unknown-netbsd.tar.xz=11359e4731866f6a788e5699867e45befdf1ad49ef35c0aba22af76d3f327cc3 +dist/2025-09-18/rustc-1.90.0-aarch64-apple-darwin.tar.gz=77e8d4c354aab89b2abcd4608d2cb7612a99000d8064491aeafbc325c757943a +dist/2025-09-18/rustc-1.90.0-aarch64-apple-darwin.tar.xz=89551c0ba1cc6d0312aebc4a6cafe4497223217ea8e87c81f6afbe127dfaeeb6 +dist/2025-09-18/rustc-1.90.0-aarch64-pc-windows-msvc.tar.gz=d58d2528aeec0d659934c8ee47a5465c256f380e32ffdac54e94039d3a271952 +dist/2025-09-18/rustc-1.90.0-aarch64-pc-windows-msvc.tar.xz=7343b2ab3b39d305d804c227b7b754c726872684d0d2b9d15ade0e8a80bd52f4 +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-gnu.tar.gz=648fa8d03b1e9e2689fc530dd564e23f5db69da6b82d551eccc4c0a7f16d28bf +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-gnu.tar.xz=4e1a9987a11d7d91f0d5afbf5333feb62f44172e4a31f33ce7246549003217f2 +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-musl.tar.gz=111741cd8456820af482d93e40ee3a2f767a1f700bfac3430c8356d7362f574e +dist/2025-09-18/rustc-1.90.0-aarch64-unknown-linux-musl.tar.xz=8edced1f743772a9d3d5700b53fe9cd5f53b1942aac81bdd918e3eca98eaf373 +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabi.tar.gz=1774694e35a1536eda0766bd2ea0c048ab24a9b13fa053e52469fdf293241c1d +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabi.tar.xz=1b7b72abbf22cb62cbfb15b6a34b3b152554bab8e8d56907e2cd3044b9e1c3ad +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=4b436393e515f0e9546d2fc5b97a51506a35bf1360f960a6014ae0ce4f7f5526 +dist/2025-09-18/rustc-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=e3c1fbdd69e3071cdd10a41184fe2e4213caf898b5cabceb891b22b50711a794 +dist/2025-09-18/rustc-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=45feb2554086611d02ee13df6490abedc68402358549098d2adfe9267c520c63 +dist/2025-09-18/rustc-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=ded6744a78b8f9e73993c287d75094f29f0437aaf3c0ce8c6f1775d0972618b0 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-gnu.tar.gz=2cf0221698eb9ce672d55001a8fdc3679faac44a302557d7043c91f7e3185d82 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-gnu.tar.xz=ef4c632c10ba4f0ff8c7739b7361ef79efb241e0228282fca640c118f554cd70 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-msvc.tar.gz=03fee2cef0c0d46c05340237541b3b2e3f1c69958639460e56f32abe16f3c110 +dist/2025-09-18/rustc-1.90.0-i686-pc-windows-msvc.tar.xz=491d1ab5e6fa0d2f1291d17bca0bd85f083cfcf0fb4a2869b1fb4ee2597e3e0f +dist/2025-09-18/rustc-1.90.0-i686-unknown-linux-gnu.tar.gz=65e9c41b6e6588c1d2d3964648ce63eec77290854383c487da8858c2b5d51ca3 +dist/2025-09-18/rustc-1.90.0-i686-unknown-linux-gnu.tar.xz=3b33cef77f9a57d592beb5117d933134bc76258006e6d4f9aed2969d20c75742 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=408c736424deab1dabb7e7bbd6b2bb002267541782c46c2fbb563229650e38c8 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=aca7ee7f0d98e34dafa367cef9c35626d37cf8334f356498aa2bda2fc02206b3 +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-musl.tar.gz=279da484d255f937bea113b11f144758065a99196053282e556d8b1216d744ff +dist/2025-09-18/rustc-1.90.0-loongarch64-unknown-linux-musl.tar.xz=4f0289ff7ad32c9c458ab435529be35c65aec3f55bd601e2d1e2a5edf4dae5f9 +dist/2025-09-18/rustc-1.90.0-powerpc-unknown-linux-gnu.tar.gz=78e372aa3f32d065cbaa0886566eec8261413fcac39df64cd26be6d3129859a3 +dist/2025-09-18/rustc-1.90.0-powerpc-unknown-linux-gnu.tar.xz=c5d898ca92063d634011525557f2acabc65d4ea268022e7005f99b6ba917357b +dist/2025-09-18/rustc-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=5ae3928941064b2eef40d5f6d9984de9636b4f935f53ad2218278daa79a80020 +dist/2025-09-18/rustc-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=7adbc3c317a73b7d504e171d65a2b0e93953e3e572dab99acabe91140101f81d +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=44bd31c3a64931218056833224caafd1d50bf53b19fed96a968f8715dc37272a +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=e87b8eb926a65211a99f6712ff376c5950b4b11c67ed7f92019da27a34ae7085 +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=7b00abe2fba2282c98ee7f2000587b352b2eeb980db9222a3495f93f18a402ea +dist/2025-09-18/rustc-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=94490108a5b24d5fbdefd0ecef9a001bac8623d9651586d3ceb10566779b7e7d +dist/2025-09-18/rustc-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=e2baf36f41c4575927f7bbcab933d074f07a17a928be87d73cc827c5ff62cdc9 +dist/2025-09-18/rustc-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=11ae522969c6b18ad4b5a1ae229473de59406af7ab2e831acb43ee247a16b58d +dist/2025-09-18/rustc-1.90.0-s390x-unknown-linux-gnu.tar.gz=1e1b72b4392a4f1709833d82ab9268da981d83c4ecb9ac00f0ae166cf3d19ba4 +dist/2025-09-18/rustc-1.90.0-s390x-unknown-linux-gnu.tar.xz=274daef5a69c8812411248a4afea4f58a096c978dffba6b1198da8e3b5a02de7 +dist/2025-09-18/rustc-1.90.0-sparcv9-sun-solaris.tar.gz=66e70dd43d64765bde80703752f97e571a6150c6fe70ee918bfef8185ff325d7 +dist/2025-09-18/rustc-1.90.0-sparcv9-sun-solaris.tar.xz=a0a2d3f97d093ef897214b956ee87fd3d667ac20311812a543aaf34c498e9665 +dist/2025-09-18/rustc-1.90.0-x86_64-apple-darwin.tar.gz=50d1f94bd8c2815008041d077bfb2713bf830d9e72ecb15aa4ed67d637f41ac1 +dist/2025-09-18/rustc-1.90.0-x86_64-apple-darwin.tar.xz=594687a61b671445ea9fff0e6b6c6eef81cba30b005d22710217b4da8d2d2ecc +dist/2025-09-18/rustc-1.90.0-x86_64-pc-solaris.tar.gz=a75e86b0b771ab8a0ff2c3fc8c0756c9f4a664bd6667a5d011a780be85b9920f +dist/2025-09-18/rustc-1.90.0-x86_64-pc-solaris.tar.xz=98114a77eb7905ba1f8ad1f7adde8bea9997f2faf3f0533cc84bf2b507a3659e +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-gnu.tar.gz=4ee149033f1a686d25e9bd40f37e46b9fdefb67efccfe98b94e11ed7e8a22d7b +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-gnu.tar.xz=925e67ef4684861eb301d123a45292a63a0afba49060b60e3264f73c7f9cc1ec +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-msvc.tar.gz=e73b85f204d984d562060154727c616145dd7b3c64d6ed85b95693292469a655 +dist/2025-09-18/rustc-1.90.0-x86_64-pc-windows-msvc.tar.xz=a18b3912905f154c34a7572954dda9e9849ac6411a1e02fa390bf742f918fbcb +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-freebsd.tar.gz=d2a985b47f5cb3eb754ebd32ca0219a516f86dbe5c1876f57aa12862afde4db6 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-freebsd.tar.xz=9c0acd773db47aa18f0dbe7adef71192163f3d5e76897217d9229328f0b37f12 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-illumos.tar.gz=cd00b480f1d0cf817d509abee27b6878a3a700ceb7218287c2f7e2bacea16a2d +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-illumos.tar.xz=735446819124fad059336422f03cb093ab11b951f176cd8e892101416c823721 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.gz=b22d65fd75f50cc036c0cb514500628253aaa815bf2e18ec65620acb8a1ad244 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.xz=48c2a42de9e92fcae8c24568f5fe40d5734696a6f80e83cc6d46eef1a78f13c9 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-musl.tar.gz=1ce89b34797bcf6885f5ae01919d3387d87ff148ca0facb68ed3e3acb0d9281a +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-musl.tar.xz=993cb26cee9525b1553d82b8fc2b6ddffd50a0a561cd896e3daa3a9f8ae65949 +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-netbsd.tar.gz=46cc7b7ab3ddae2a89524e9c1a9a7af0c3239dbbfcd956d62a2f1204975a7e2b +dist/2025-09-18/rustc-1.90.0-x86_64-unknown-netbsd.tar.xz=7befecc400527789829c88f87bd26ac0217bc5186471136f3ddfbebcdfd390c4 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-darwin.tar.gz=30d6e3008a288f779c90c92d867dcd4f05fd5107d7f3e69d4d37a5945878110a +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-darwin.tar.xz=c36777aec17d617f85f94b7cb87bdd4270eeca30ef38c6f686809d163c881609 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios.tar.gz=0e9fc3777909512989188023eb1124f788defa2afefa5726d7b690678f426e47 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios.tar.xz=781416004db05053431d8f1385450a5b441977cf822451450b7ef147f8584164 +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-macabi.tar.gz=43ee5b6c721f655a2e86e0e4cd01162864f0441709078cd47c21c59db57712bc +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-macabi.tar.xz=836df3652144992a4e4e47b4fe5655d0b68700290f9d674d97f64313590603ab +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-sim.tar.gz=78f1a3b2dc79d6b42cc7ff54fd8ce0d1c2e498ec7783ff01376988f87210c4ae +dist/2025-09-18/rust-std-1.90.0-aarch64-apple-ios-sim.tar.xz=8092114ab1787075d52a0c1f32b7626b620ae3f8acfb4f297058f774be4f880f +dist/2025-09-18/rust-std-1.90.0-aarch64-linux-android.tar.gz=3d5d41ecea4cafa623c12d1acc694505aa6b12c7f2265a1f18cb0b06fee6d7e9 +dist/2025-09-18/rust-std-1.90.0-aarch64-linux-android.tar.xz=7ee2ca40b11788e6350d1d29cd966e9c7418716a08178b104a5329d43c8fa464 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-gnullvm.tar.gz=ab632b4c6f711e1374b654ebeb415e500771248f65437046e0a17b674413ca96 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-gnullvm.tar.xz=5129a3e05338afee4bf3ebf0ec65b83644989829fe9d6cbedb63aa34749f553e +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-msvc.tar.gz=58b9333df1aaf662b5202c9e903c4e583c9b14e0a7213b500131ea472960b8e0 +dist/2025-09-18/rust-std-1.90.0-aarch64-pc-windows-msvc.tar.xz=0aa0ca1d58eeff8faec557922a6b6321556ee0679ffa8c026d4963cf202764f5 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-fuchsia.tar.gz=56bbc334d3f628ac3d830928771460b624fa783eec6c196ac71f2c9767114202 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-fuchsia.tar.xz=18852fa9cb088aa241eb8d678c87001291f099068747201abcc74e3f33bdaa6e +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-gnu.tar.gz=609df2b364009d86c3b62f7c9d2225a31839d3bfd81c02e4ae5633b2432cef4d +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-gnu.tar.xz=4952abb7d9d3ed7cea4f7ea44dcb23dc67631fae4ac44a5f059b90a4b5e9223f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-musl.tar.gz=ef546dfa4e749c57d3dd42457319336f6b78b09af41443602b89b26314c482a8 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-musl.tar.xz=a603e135d4eb67ababdd193268a69937fa4490bafde592f2c931d17c7567b228 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-ohos.tar.gz=4bcac2a4daf99f976c47399fecbc23fcdbc4e5e42219dfa8738f2f7faebdda65 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-linux-ohos.tar.xz=cd0a6e1a7b05134500338b6e621ffd6eca66cbe80d621c182911b1d3f48c151f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none.tar.gz=94337166d307943787f4142b05b2a122eaa8650206d4fb0551d66304b0665318 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none.tar.xz=20079b3887df0f622c13c71f942ad9912042e3cad50fb3f73f488115695507fc +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none-softfloat.tar.gz=aedca63362b6bb71364ea101ccaf0cca1975a797ddabf29d7dae166934fc12a2 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-none-softfloat.tar.xz=8a644b41355abea904ee5920fb1baa64f099c7ac60002c07a9129579429b2da2 +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-uefi.tar.gz=015eb13fe64ac4b7190c3af3ecbc6d790f1635166735a239aa6ce8303a95803f +dist/2025-09-18/rust-std-1.90.0-aarch64-unknown-uefi.tar.xz=3638ca1ac6ae3cb977e18814a6df177526fbdb20a0b856b75a0b76c7fab3cb1c +dist/2025-09-18/rust-std-1.90.0-arm-linux-androideabi.tar.gz=e592d0855d83d02d8dfc35b1a954af177d640abedef610d909df4abcc45ac457 +dist/2025-09-18/rust-std-1.90.0-arm-linux-androideabi.tar.xz=1d380ac2cfae19e045612ff6009938a9da7d9f0c5d1073eee244792d82c8f01e +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabi.tar.gz=8d28ae8940d27ee30d8465361ec6ade9777f177fbf98fe58071412db21110575 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9362a3474cd26ace0776dc064c620b7512ac1391ac68c972b926188e3a60b9f9 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=9be34eae2283cd313fe55be005ea76c850ac37aa202f8e6fdc10bbf4f9eb5bfb +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=a839d314309c6ce1d00f2005311a5d9d17d5ce1351d8ad1d09c0e78f716d4741 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabi.tar.gz=134c0af3d09afe077ea7cf99e5aa6a1281d28d995676641c17ad31619be81b46 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabi.tar.xz=e30b176633b8513cc6cfeab0d9ff6784be4483727d1a8d7aa2c3182da91c22e5 +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabihf.tar.gz=621a5f23f443b0a7960badc8f36741d0581654853b4077cb6f3b802179cd1e8d +dist/2025-09-18/rust-std-1.90.0-arm-unknown-linux-musleabihf.tar.xz=0c691759d82980bc18276b27918578ccc9ee17cdbb83669b58ea4b49e1b07b38 +dist/2025-09-18/rust-std-1.90.0-arm64ec-pc-windows-msvc.tar.gz=673b29d5a13819324204e143dc2fdcc1444610a8e55b72f245073231a04e0b71 +dist/2025-09-18/rust-std-1.90.0-arm64ec-pc-windows-msvc.tar.xz=99858f01263b61689ef429be0f0675048c65ec4f50df4ba4ef5c2643573fc69e +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabi.tar.gz=30752bc097368d527f97f119e2f33eba8430771bdb0605b7361b519aa00839dc +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabi.tar.xz=50f48d01edbd92a379e47f80528cdc299d94ecf2d210d205b697ea88758a2ece +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabihf.tar.gz=e8b031a5ae8be624bd796d33c586fa047dc5e4ff7e9b871c78aef1d307980b2f +dist/2025-09-18/rust-std-1.90.0-armebv7r-none-eabihf.tar.xz=7bb33a1cc828ea2de2d8b30c5be4f2ea0f607003dbc38f0a961833f5d6c44fe4 +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-gnueabi.tar.gz=0fd9e7288a02a151c105709bc68f8781cdbfd0c518c4d7173922576d8493ce5b +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-gnueabi.tar.xz=599112c1a380d641b21c76e8cbfef60fc4201f415c658dcbf6b7485cad96615f +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-musleabi.tar.gz=fa1c8e3ff6f8661806bf72a9b8124d9ee1d3baccf44325c924730aff375ce65c +dist/2025-09-18/rust-std-1.90.0-armv5te-unknown-linux-musleabi.tar.xz=5ddbdffdfabf10d6f2fcfcccb7305d1c3ee07c6e8a212d7358ab2a921a6ccada +dist/2025-09-18/rust-std-1.90.0-armv7-linux-androideabi.tar.gz=8aa2cea2f074a1496035a51d13bc91d2884e07b4f01d1e675ffbfab664bfa5f6 +dist/2025-09-18/rust-std-1.90.0-armv7-linux-androideabi.tar.xz=3d017192c80457cbb3163299fd79e26d98df7243024d3c78b84e72a0d59f10b1 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabi.tar.gz=9a0df1f1e7fbebce383cb68e5cc16160a950aef188f9160912130a49beb8efb9 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabi.tar.xz=d37e6157ae9b62e7cdb59acc177c25a727cb99c8b48f711359ad91fd84a96230 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=dcce5a4dc892c58e7ba7662dccdcbed5a9e1a40b1108e5fb76a50a0a4d3e62ff +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=3549bb5a6c1676809dd1e7eb32039c62a3e02927e31c30cf864fdbaa7a4bb9d0 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabi.tar.gz=ef01796ff70e65ebc61e0100e3a73a3589c42a384e2d4acffaef2b00fb3caa45 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabi.tar.xz=2d6c62518ae63f979172f9d8aa6fbfe9aaa9bcffdf2a43f0a8e01ea304e32d9a +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabihf.tar.gz=199f4489cd33455a738022b7da0767c08a2b38316f2b58dfaa041dc18d92c0f3 +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-musleabihf.tar.xz=072027aa8ce4ce6d053c73abc3a8bb603149533e4109dce72b36c9f0fd63d00a +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-ohos.tar.gz=da0946a9603ae4c3c5eeaa2047dc1f01b7aaa824b49ceaf14799d5b8d38104cc +dist/2025-09-18/rust-std-1.90.0-armv7-unknown-linux-ohos.tar.xz=a259c966a66dfd90be86b67651fd3b591cb41e9f79bf04372247eef0f2fb427e +dist/2025-09-18/rust-std-1.90.0-armv7a-none-eabi.tar.gz=b70ff023674bd2834d198bfb32b0e40ed4541a89c231c0ad6ce1ec46b348d56d +dist/2025-09-18/rust-std-1.90.0-armv7a-none-eabi.tar.xz=c019b4060a1aafe84b2ce91feca4b2f0f2ca615d9c4a479a3c4284315f1161fb +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabi.tar.gz=0af7efdcc243ad1127d2bcd42b7e9e184b62d76353c63847a4fdd6f474d4f8f5 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabi.tar.xz=332ceb902eb22dfd349860261cee6cb9077d718e4361c85f4312f0edfed7b165 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabihf.tar.gz=7bc50a6a4d4824cb8b39f33ae9e4321c0fd7cdb809e9cf3a455231b2b46bf228 +dist/2025-09-18/rust-std-1.90.0-armv7r-none-eabihf.tar.xz=2075bfc1f4de14bde51dbef421c921e3da5fef58ed62315367fa8464efa02add +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-gnu.tar.gz=f5c4fcfc1bd07d78ebdba8637f50ab2c63ad4c95f2d0c70f887d9ffe6d2f6100 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-gnu.tar.xz=46eab5c41bf9160a31a53560ff5fc43308c0998cde952533e76fadef66799553 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-musl.tar.gz=e512dc8fc0f8234485aa0b51f9a8a626b10930b3dc7f668bf736f3ec6721d453 +dist/2025-09-18/rust-std-1.90.0-i586-unknown-linux-musl.tar.xz=4cce18ea1d46a9944eca6bd10bfdabca7980fbe1b47b052c49be1e68962ebf75 +dist/2025-09-18/rust-std-1.90.0-i686-linux-android.tar.gz=9cbd75f7c51fc6389b2b7100e5bf88c8a2457dbed19feb4181c143262e5b348b +dist/2025-09-18/rust-std-1.90.0-i686-linux-android.tar.xz=e68dd5d8c902daaee7fd12d692518e42005b6c0c47cd8b7dc7e6ad84b18f52d5 +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnu.tar.gz=1b6365967179e68b96fea465d1c285057f2a2af7a6cbc06524cca8c1d5575c0f +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnu.tar.xz=47e11eedfe870a3d11e81996fbd6f6bdb8617bd1e34df480b170f080dc3bfd31 +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnullvm.tar.gz=9b67ecd0297a199412cd59de7edbcfdd264ab4567b107550564847cdfba6a1be +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-gnullvm.tar.xz=f5234e6e2826fb94e427a2d0459fecc167ac931d93fe310203abcc13f158e27f +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-msvc.tar.gz=b4424b6b97f1fffaf98f48f4ca0f2c032e7ee85e22aed9ea614251177c03289d +dist/2025-09-18/rust-std-1.90.0-i686-pc-windows-msvc.tar.xz=afff4d53d4b1e5b6d7fb5c3bd89e9e08090268e0244f0c6f2c79ac04cd1420b7 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-freebsd.tar.gz=d27a8919d3eaa2ee4bfc9bbc03712e2e59444c3e2b99692e3990b6369f288cde +dist/2025-09-18/rust-std-1.90.0-i686-unknown-freebsd.tar.xz=627d417afe5dce38d39446e52bd2e0fb8f18eb4afcc3cadd0290a516b87256f9 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-gnu.tar.gz=8736064309c51aa957a4b6918f3650ab204ce24859dffed59611394b81fe58fb +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-gnu.tar.xz=dc4bffa768326e0cc47d6b129bcb891af6e7b7bf09ec92bca45e49420b9837bd +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-musl.tar.gz=6e947f9851ce39023ea9c331ce736705095913beecd2c63011487d0d94d9962a +dist/2025-09-18/rust-std-1.90.0-i686-unknown-linux-musl.tar.xz=0913253ea961e9b5c689b3f43a3ed0eaed48ab217afcef07c4505491e303d34b +dist/2025-09-18/rust-std-1.90.0-i686-unknown-uefi.tar.gz=19cab5a5e4d3a1edc7360e71500cafb243cd45d9c57f1d55ff320cce7d6c2832 +dist/2025-09-18/rust-std-1.90.0-i686-unknown-uefi.tar.xz=139d867f7b1feb56271c168122008d1308bb75c1fc60c9f5173fe8de5d40a0ac +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=95fdcbe23e0abf18bfeb93394c25357abaf25d5f0144e3cecf528004af7b385e +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=cb779575cec151223c3c144bc9ca957530fa510e36b32bc9f35bbb1b7dde9e2f +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-musl.tar.gz=250224d084e4a879d5217e8a760cd50bc744c7ff45c0fb5be72787ff4cd7cda8 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-linux-musl.tar.xz=bcaeb5c943f422356f115b2e4583cba92dfdc1a6a34bf03604fc81acf6eef75a +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none.tar.gz=a827faa6bc5fede52656f506b0a8ea43a4b0dad8efe3714de3baee3afe3842b1 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none.tar.xz=51a8913f46f10cc1e1b2862c3ecae70d5b09e1dc2eef41e3e81dd15a3693f8f5 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none-softfloat.tar.gz=84c0445e5bccf22a4649cf852525bd30f083ccb85e02347c11c3e6bfad6843f4 +dist/2025-09-18/rust-std-1.90.0-loongarch64-unknown-none-softfloat.tar.xz=78c056e0f330d0e79b317230773ab95f2899cba9c374c8398074b7d4aa670ebe +dist/2025-09-18/rust-std-1.90.0-nvptx64-nvidia-cuda.tar.gz=1a40253c6d2cfe0d54cd256e37e732cba7fe3a9b6d4629e5d3578db1aeca39d3 +dist/2025-09-18/rust-std-1.90.0-nvptx64-nvidia-cuda.tar.xz=d5a501b01ad92ada96ed3c1110e28860ceb82de96f23d5a1e7c2d8cbd74c2104 +dist/2025-09-18/rust-std-1.90.0-powerpc-unknown-linux-gnu.tar.gz=7311b0bfe1169b8c8a82ee3cc04c690bfd6136db162787cc4509deb3ca1de6e9 +dist/2025-09-18/rust-std-1.90.0-powerpc-unknown-linux-gnu.tar.xz=756d1bbd66ebb0d4d575b650a8a94d52546f6892bd2f864410411f6027ed879f +dist/2025-09-18/rust-std-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=64fa57ff7ac8b27880f3fc78c7fe83a6a25f09a702e564e8c17c1d410d8a2dda +dist/2025-09-18/rust-std-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=16daac5dc6994c03ab3b8c4e6e5e52c41f5fc5846acea08f4fdf0759cc273aa2 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=1bc7b28f48ddf9fa5c628c93c4ae39f697b5c6d483dee02c54ac434ab193a5ca +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=eac29f92ccd335c51553c362c7a6d3de2eb7071b5ae3839470e351a6a3ebdb77 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=90a8089f1faf7f4d382e5abc335d2afbe318832a3fb5db55f4ee95f2974548e0 +dist/2025-09-18/rust-std-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=fac9e7d7acb39f157466537c600083040733934cc74e52c116e85bccbd8e05ed +dist/2025-09-18/rust-std-1.90.0-riscv32i-unknown-none-elf.tar.gz=917f3f63a9c97c508062be65c724a61dbabbd59b7c8de89760c9a8e3da2f0055 +dist/2025-09-18/rust-std-1.90.0-riscv32i-unknown-none-elf.tar.xz=9a624cfdc7b0f388b2d5a7c59e35a2a87bfde5f545644d8ef7954b3b00887d37 +dist/2025-09-18/rust-std-1.90.0-riscv32im-unknown-none-elf.tar.gz=76f6cc83037cac0090732042d1eec41780dd6c2882bbc23f18fc0c6525ebae98 +dist/2025-09-18/rust-std-1.90.0-riscv32im-unknown-none-elf.tar.xz=673e07fa7c53277a9ad0c9b7cdf3ac08572bdbdc5821df2d57ab687ad4564ddb +dist/2025-09-18/rust-std-1.90.0-riscv32imac-unknown-none-elf.tar.gz=f5a8c5239fd7f20784700e87b44d29a8c0ebbc52fd5bd048c4ac1b6d6a551601 +dist/2025-09-18/rust-std-1.90.0-riscv32imac-unknown-none-elf.tar.xz=ee60074b1ee8ee62404113070d27eb93c319fcbb2ba8fef654a709087787a348 +dist/2025-09-18/rust-std-1.90.0-riscv32imafc-unknown-none-elf.tar.gz=bbe7d7674d9528d9f0e07abbc810cc8563fbaac107f6b6654d3ede3b28947e3c +dist/2025-09-18/rust-std-1.90.0-riscv32imafc-unknown-none-elf.tar.xz=da00e370a32a50cbca2034a06a7c17572d3b8704ac6d31b0a3fcc2e6afb1b947 +dist/2025-09-18/rust-std-1.90.0-riscv32imc-unknown-none-elf.tar.gz=3960d90e43baae2353c3f275acab46593cde3683d9ae632b82948f033a226cc2 +dist/2025-09-18/rust-std-1.90.0-riscv32imc-unknown-none-elf.tar.xz=ea0b3ebc3a7d6aceec237048aed2275ef4e377aac3875ee5012b81ef9c98c82b +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=1abdc9a7a36244185aac647bc2170e91656ecb53d420801a40ecfca45b1e069e +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=675dc5556d9d879101d2401b693fcf79edac8f00a49249e2e0f19cecd172ce51 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-musl.tar.gz=c1e20fc2715aaba244907799ac7ed8f9ab0aca4dd7f5ea6e7d4af2f68e8b3e8e +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-linux-musl.tar.xz=e35b32e8202ba06887b5f3b4a7553c0c5964a413c38c8dd1fa6588ed9dd3deb4 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-none-elf.tar.gz=c0c376585f16dd180da12fc74b5082941ac5388ae969f43ab484f3747c679786 +dist/2025-09-18/rust-std-1.90.0-riscv64gc-unknown-none-elf.tar.xz=063ef69235d9510880b7d40e07b4e73ab7339c266cdcc1e265d80bfb87529d9d +dist/2025-09-18/rust-std-1.90.0-riscv64imac-unknown-none-elf.tar.gz=d94b61f5cf71140d85dd053c4522c6c2f05dfa62273c18725c4eae073825385d +dist/2025-09-18/rust-std-1.90.0-riscv64imac-unknown-none-elf.tar.xz=5da0a13d98797d83d65e5e3715d7838853b1d029020ea688a66acbff97aed1a8 +dist/2025-09-18/rust-std-1.90.0-s390x-unknown-linux-gnu.tar.gz=ea7448013ea52b1e76b34d4c71d8286dbe1ed795b5b1c479a36da3a0849ea4df +dist/2025-09-18/rust-std-1.90.0-s390x-unknown-linux-gnu.tar.xz=e3e7e3dbc65616eebc69e642d9042363ec38d7f50393ef816cc5238ec475f3f5 +dist/2025-09-18/rust-std-1.90.0-sparc64-unknown-linux-gnu.tar.gz=10bac16d087f80cd52864c558a05462859ecadcea74c2aa50fb37515110c270d +dist/2025-09-18/rust-std-1.90.0-sparc64-unknown-linux-gnu.tar.xz=c204ecb424090cc6c0100cef3013f8636d29f288db99c037578aee7d2672a711 +dist/2025-09-18/rust-std-1.90.0-sparcv9-sun-solaris.tar.gz=95241fe58f9260ece56d2dc52981ba2721ab14dfe7f03179b278654db0397de1 +dist/2025-09-18/rust-std-1.90.0-sparcv9-sun-solaris.tar.xz=7b953e6b67e958b15fc7eb4b8fb1e3a8330044f2afb9e88edadb226928af6be0 +dist/2025-09-18/rust-std-1.90.0-thumbv6m-none-eabi.tar.gz=f129ffa91cf7c08cc3514e8f80d5804d17b924d8805468fd42b9de5d665fbea5 +dist/2025-09-18/rust-std-1.90.0-thumbv6m-none-eabi.tar.xz=b7c4b94649d927ee7d38df7e72b2a2716961c05325b63681ee3a05ea42806402 +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabi.tar.gz=4378a41ef1c77e8637765bbf29e330aea5dbbb15873d913c6fefc5b1d00e03ce +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabi.tar.xz=dde6d6e27729cddaaffc6b4b70ce947cd9ed19c2ec443c99d3157a3be24dee13 +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabihf.tar.gz=d94852a55ddda2b1fe56c4be638b86c9c73709c439dc451ea3cdd483577a61fc +dist/2025-09-18/rust-std-1.90.0-thumbv7em-none-eabihf.tar.xz=03dad7d86b0d0764622671cbd4aebc9d1c046c49dc20689a0a01fcd9d19a8dd3 +dist/2025-09-18/rust-std-1.90.0-thumbv7m-none-eabi.tar.gz=c39811d330618a562aec2085e0e2968576bd95476b141404ea12833bd9165c74 +dist/2025-09-18/rust-std-1.90.0-thumbv7m-none-eabi.tar.xz=96d1f0fb69770ffa7f810b434064309c8763ee3946128cc85fb35205a184da92 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-linux-androideabi.tar.gz=762b1a125f8059b1d6aae4dae122671b64fdfc0a94ed869b0fd024f826ae25b3 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-linux-androideabi.tar.xz=80176eca21e02528bb92211821338638717e77eb7edd8a5a55fafb514286e429 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-unknown-linux-gnueabihf.tar.gz=09eac0dd5f00785f08302e93405f6ac2f0ea7e5063f2fdc8697998f4085d37e4 +dist/2025-09-18/rust-std-1.90.0-thumbv7neon-unknown-linux-gnueabihf.tar.xz=d73864434c087942244296f7128b441a540237787e0c6cdb61c4159f605dd9f0 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.base-none-eabi.tar.gz=590eb5e84480458ef8048a9c77762b93840e93d44feed103719150b7d605d9b1 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.base-none-eabi.tar.xz=3491c627c0389b37308f95ba732d34f1668cfa7823faa1fb29c537620b56552c +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabi.tar.gz=36adea203fda3b1e90453dc2646e118689f1caff9c57301edf734d5b666d2ea8 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabi.tar.xz=a1241f24ea3b0cbe5d4d9bba934a7b13f4b33a690bebcd258ffa16a52044a278 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabihf.tar.gz=bb57af3e26109f8a077a2b11d9378de5037d3025d91f757f718cb9d6a269da20 +dist/2025-09-18/rust-std-1.90.0-thumbv8m.main-none-eabihf.tar.xz=06db4701e5ff7c2d683c4ef340f61fdb37b740eb82c6ca1b109c79f7a97e8625 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-emscripten.tar.gz=73d3c17f4b06df7ccfb5a5f8e2ce8f78ae550c4bdfc4d8d35113ab4499bfc278 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-emscripten.tar.xz=865be91ae976398ddecee4817fd50dbaeb50e31354d1491b556e6fa545601334 +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-unknown.tar.gz=cbcd4ea55884e9c3d8d72e1497c70e9ed18c4a824d4d0f049006a245229d11af +dist/2025-09-18/rust-std-1.90.0-wasm32-unknown-unknown.tar.xz=e6e3964f4a9639688577d5a3609633b983c795ad8de43c9eceb878a84d1aeb78 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1.tar.gz=0ea19575b8fd5238e4e094bfb849df1d265a97c824ca6f31d607699588b3dffd +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1.tar.xz=d813ddb537b57e79f18b6493e7ec2b0a18a8dd2be0dec0a7d6472d9bd62edbe6 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1-threads.tar.gz=8926af63c5aed3d1a06b7dfe5786604032f8b1a1f1af06d7748ed6c7da046eb5 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip1-threads.tar.xz=19e4a3b180f1143cf19802e80af2db812039077ece8cf99c00465467452307f6 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip2.tar.gz=f4405a408199bac5babba5f26ab967a61b19002ae8b75514874822b4b4fd1238 +dist/2025-09-18/rust-std-1.90.0-wasm32-wasip2.tar.xz=8fc58f7b3e49b4ef0295486ca012dc2195bd8df7a17acc02c407e6a14dcd15e2 +dist/2025-09-18/rust-std-1.90.0-wasm32v1-none.tar.gz=f99b455756a45d367006d5c625e2369bacce4f479cd3df7c4b0d51645c640d8b +dist/2025-09-18/rust-std-1.90.0-wasm32v1-none.tar.xz=cb5e5c225d3dbcad4892e60fd938f1c11682ce734b86b7744e7bdc1e931227ea +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-darwin.tar.gz=73535b1a8f40133d789d9897f2fff4d441bd8a629a5c079bc0e94984267602f1 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-darwin.tar.xz=dd731e6f9f30cb9b2928b92b084d2f12a3abf06a481ecbd8c3553c3e6f742139 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios.tar.gz=6671a532000d1fad538da3477d2089c15a78452fad7cf303cb50eacf39949c32 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios.tar.xz=60e6c9bd7cc38f440689ff05f0e5f1f441a5d3b9e1491df2ccd3a893133a275a +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios-macabi.tar.gz=2cd2e240a4c807277a716d8264ffbbec7c7aa36aede712502d6693595e78a3a3 +dist/2025-09-18/rust-std-1.90.0-x86_64-apple-ios-macabi.tar.xz=1ab0d0a2bd049fce9923046c6e126aaed3704177a19bcb6ac4068ffc8bfeafdc +dist/2025-09-18/rust-std-1.90.0-x86_64-fortanix-unknown-sgx.tar.gz=6d7a331740879480b9ee7fb4af4a583f83762d61ffac46ea591758b7ca58c27c +dist/2025-09-18/rust-std-1.90.0-x86_64-fortanix-unknown-sgx.tar.xz=e614e5aef818385970674e1716ce654802884e1abc6593dbe72505b2f3c71b6f +dist/2025-09-18/rust-std-1.90.0-x86_64-linux-android.tar.gz=2f441da296b1848b6e68d20b2cb25d77fe10966433070ce93326b5f36b369403 +dist/2025-09-18/rust-std-1.90.0-x86_64-linux-android.tar.xz=66639dcb8ac7fdf7bd7e476aca045a10c3ad827d84069d03cdc317534c64924f +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-solaris.tar.gz=7cefdd59f37ad2dced7ce8b532326776f4af811e610c8c15c237aed8d413fc4c +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-solaris.tar.xz=bbbe65a0625b0467db7203b228321998ea78aed4d43dc4383b38285da8f14ba3 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnu.tar.gz=63758c76bd4758a77d4e3e2429b93833d3ab20fbad205db2c72640670e894d16 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnu.tar.xz=d82b3240908390cef1ddb88d2d922fa6d5e8abb6e6ef1d47948ec503ba694bf5 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnullvm.tar.gz=ea6a14c08499be72d95bc908da58be921f35d68f193ea8ccbc116746c162e3ab +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-gnullvm.tar.xz=f18594d0ea4794b9693e3bc1485d800577b21a185fc6ada9960c41c8d9354cdd +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-msvc.tar.gz=ee4bf4c2928598359fd517445ec2af4b46b2926730c111f2ffbac2a1b9550b72 +dist/2025-09-18/rust-std-1.90.0-x86_64-pc-windows-msvc.tar.xz=3b8c22f81c93c7e914369433430792bd6c06403806ae25b0b95f3cfc540a8b48 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-freebsd.tar.gz=16f32d2b9deff920e291909a3e4eb0fc3327a0822f8d1320f908d95e484ea470 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-freebsd.tar.xz=c092ff153ed4e9670c63d9ca62e48ac41da339d4bb286f187b7afb0dfe333f10 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-fuchsia.tar.gz=46d763abedc893fb21f9eb7ea22bbb9fdd6d0064e5da95d222050a48a6bd6d06 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-fuchsia.tar.xz=0e0ed1e28906be354db48c39f85942f3de72974f5741fea66d6fefd9ad3265f6 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-illumos.tar.gz=f9b7456042092d07a85a4383c58625f18fe280fd48cc691cfd7e8d77ea2255f7 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-illumos.tar.xz=7ed43bd9062abbed7e5264af7b0c5f6d2916b78f108cb5d3b282d3844bf760d2 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.gz=81d7dad58adaf8a9904771d1aa1ea7e8dc732236fe0a1b148a068ceb502de7fb +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.xz=663f4ab7945b392d5e5294dec1b050a66820a20e86f084ec37eeb0f2f7ff5569 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnux32.tar.gz=d83c0d9a67ae9ef0435b4dc566fdaeebff2cad5b2d30844e9869174af56643fe +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnux32.tar.xz=f1c2cb20f8f9a54e76317a876e9c7317412e925eb9ca3f1663213aab4a92bedf +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-musl.tar.gz=9e8bf994828cc45eaa22d94ec674f3bac710ef7771ba6742bf37ae706a1caf75 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-musl.tar.xz=38490d575786f4688e83b357baeb022d8dde0ace2cb8c1357e060c76644fc56a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-ohos.tar.gz=dbd013ffe203172d937b0e3e6edc07c69e51f246f25e4d70a18fbe0f9fc37c0a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-ohos.tar.xz=aba4de9f449a090bf72ae692bd300ec18b43138c629869dee41a398c68004261 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-netbsd.tar.gz=7009e9a611492120240a1e6291629202ea2023088562044c1dcbb1aaa7aee46a +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-netbsd.tar.xz=a3b3317fb3af19733fbf7d7dc5d7e256db217a36f2f4d2a096ea2efc2d84e2c9 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-none.tar.gz=e856bc9b19b9afcae970e6424f92dadf7da767b7ac2c6668a89effbcb781e028 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-none.tar.xz=47cb9f0ffcbeebeaee06a92a189ea81011b46d7dd10360a3b0801a041bc3b9af +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-redox.tar.gz=2603317c04e3cd074f4c189a4d5e344b1c46ae5177750bce999740191e72522c +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-redox.tar.xz=caaa6bbf4b9b60d9f5b78d5d4bfc7afaa833398b400484acd8c3e86745f1c7a9 +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-uefi.tar.gz=46c75836427094d7925be0a9af7cb62e31a37b8933df4b96b939d6903e0ba2ff +dist/2025-09-18/rust-std-1.90.0-x86_64-unknown-uefi.tar.xz=1e3df3bac5f1451675e06118f7cd197e52cc1413d7bf1f1c38df0d28a8e5c916 +dist/2025-09-18/cargo-1.90.0-aarch64-apple-darwin.tar.gz=a242bb8d88d4d1b621f33742d0c718ebb5a551b07d21240e8b8c31152dc29737 +dist/2025-09-18/cargo-1.90.0-aarch64-apple-darwin.tar.xz=17a4410a27bf7dad4765f3809265c225f25f8b009da3d4b76cd0927acdae04b5 +dist/2025-09-18/cargo-1.90.0-aarch64-pc-windows-msvc.tar.gz=6443553c44608439c1858f95ff57e3e15fea85295c28af081239f8b45750ac79 +dist/2025-09-18/cargo-1.90.0-aarch64-pc-windows-msvc.tar.xz=7c3e8bdb15ea6962e9b5546d6afd20052bcd9ab2429c870b3f349c59da8e2d98 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-gnu.tar.gz=33527828bc38026702d85996a28c08a894d5376a5756dd9085247d36aa208405 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-gnu.tar.xz=bd8d1da6fe88ea7e29338f24277c22156267447adbfc47d690467ad32d02c2a7 +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-musl.tar.gz=6eedfd1251d969cea2ecd971e8e39c437a9b643f7de4d3472c699a1f4c65812f +dist/2025-09-18/cargo-1.90.0-aarch64-unknown-linux-musl.tar.xz=a9ad4ca5612aebfcf43cc4825d743765d5179a15fc1cc1bcf24507d169988bd4 +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabi.tar.gz=625ec0d3d27d1eeef044a109560e1060a9472886d770fca3b3636c06493cf238 +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9cabfa20559414319e326f6a548cf10f4bf23b5772e48cd29ad3d57bf7848aff +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=455ac4e24f8da188bcf890ddfb871ce20226970e3e439f43500e82cc21d41dbc +dist/2025-09-18/cargo-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=f556cb4aecf8faa51bd3ca888eaccd85015aa8ada7a82c6b0554690e23246e57 +dist/2025-09-18/cargo-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=ea37292c265115c86e880896c90a4d0d35d38a0d7fdb37cb42e4d6d3669f0fc9 +dist/2025-09-18/cargo-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=21592e98e5370921a9363d6c8ef1b05198dd7cc32be91809f0f98cfa28de1edf +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-gnu.tar.gz=b0a70e77f2191981dc230dc8bf5634d47fc52458cd393a7e388b577bd0f1b4dd +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-gnu.tar.xz=5aa5720799d5b1b438c6828b90f4cd889a68fb72c86b6cd1ecf7de9106780848 +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-msvc.tar.gz=8453ed9c0d82e95b03748acb8cd395268da552aafce024bdc8d630d9254ae121 +dist/2025-09-18/cargo-1.90.0-i686-pc-windows-msvc.tar.xz=0548f668f52dff4df274739cd85032cecfa14a0eb88585d4aa3335a882f10dd4 +dist/2025-09-18/cargo-1.90.0-i686-unknown-linux-gnu.tar.gz=d96e439702f269d61ea49b628b81df24e98510ec33168b7761902f52a7126527 +dist/2025-09-18/cargo-1.90.0-i686-unknown-linux-gnu.tar.xz=c1e9b24bbfa95550b5dba9de2045a4c906bea108625781758692b2a407428391 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=b587b6e6acf3d919a690e6e4c4f777163d167679099b3d68402ba3a4a522bebb +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=6ae37dc8eb3ff4655053a39d5f973613a82a8a8e2fff42c423ca33d8cf19e6c1 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-musl.tar.gz=b3c82f952339c2c352acb0f42e6eac390a38186790ee8900b30f890705ce76e1 +dist/2025-09-18/cargo-1.90.0-loongarch64-unknown-linux-musl.tar.xz=253180784cbd7eba742e95a7662df565ec857e7a7ba9efb334e51c1915e00dd0 +dist/2025-09-18/cargo-1.90.0-powerpc-unknown-linux-gnu.tar.gz=324de3898ba142de96ddc139eb0a2aa2ccb8189dee25d5bbc9e301f034ffc7f4 +dist/2025-09-18/cargo-1.90.0-powerpc-unknown-linux-gnu.tar.xz=5b160a2bf0e6f470b83c5988db5b6f02b6d65d3d97a9b965acbfe940b4143b34 +dist/2025-09-18/cargo-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=ad4424305b864223892d882a5633d71293e89c3a0598dfccadaff27b0927f782 +dist/2025-09-18/cargo-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=fdf90d22476c88d5b9cf8a3ac0937d0b9c6b7dafbf6b3afde369c2f5b8faec88 +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=b2f52bc70cbede869244813baddd16a61220d4684555e03f4122c5b7169adadc +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=f029151dfeed6570b8b347e04a5bb7dcb9c59d8e5454c535c05bb5069c216354 +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=2f255c7d4224ed662436daf0638d9b48b56fc5bd5f0cd1510aac640544c810dc +dist/2025-09-18/cargo-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=456e87fd1268f4a1618439b845524d4c937a3d71ca084327de26cd9bf0b4bbe1 +dist/2025-09-18/cargo-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=caa3d7ce6f672026135344d6c974d975b365cb66657198c23c293a5b8b30bf87 +dist/2025-09-18/cargo-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=8a09de014f7cec749b338c6636d190a1b73fd377bab6a223eb715d3c76c49e79 +dist/2025-09-18/cargo-1.90.0-s390x-unknown-linux-gnu.tar.gz=4309d80687b83a11127ccd99729f5f34e609faf663567581e506a5a3b65a895c +dist/2025-09-18/cargo-1.90.0-s390x-unknown-linux-gnu.tar.xz=468ace270ee4edac0a10185ea876ea555e41bacc0137ff08985d2155fe8cc777 +dist/2025-09-18/cargo-1.90.0-sparcv9-sun-solaris.tar.gz=44f43a409ee88098de38630f9b6555bb2c459947280b0bbfb48643b69e60d592 +dist/2025-09-18/cargo-1.90.0-sparcv9-sun-solaris.tar.xz=128e91be2066d93d60a3e2b243ce2de11ca0e601db078b6f5217fde5ec591e36 +dist/2025-09-18/cargo-1.90.0-x86_64-apple-darwin.tar.gz=0352cd2b1812363228948a310cc49d590b1ca9fc00e2cf3b00ae88c93f1e148c +dist/2025-09-18/cargo-1.90.0-x86_64-apple-darwin.tar.xz=b2fa21c8fed854775e379bb4617145abd047d1be729e8383148139ba1d05c88f +dist/2025-09-18/cargo-1.90.0-x86_64-pc-solaris.tar.gz=ea6f83c9de71c2a4af6e423228fdd94a1ec5b6846fb501dfd5cb37ce4e80a1b6 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-solaris.tar.xz=0f560b1411b6d83b8ef47316e449fe3d061b928a6dd331e10a33a64a70e5a0d4 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-gnu.tar.gz=3bd189735b120530bc66d50f9d18ff1def03c373f46b8d153e4d9d411ebb16df +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-gnu.tar.xz=b7806005e41b7733b1f4ec9111b43c2590e1535a7713644660346161cdc71c46 +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-msvc.tar.gz=06a25c49843528ad1809eacd72d677a659f013a67cc005253841153a3b82eebf +dist/2025-09-18/cargo-1.90.0-x86_64-pc-windows-msvc.tar.xz=a238d6a87cb0935e4f1bf0b4d093cbac3833d2f8b04413417bb622779669bec5 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-freebsd.tar.gz=82d3aa7fc1362b337fac8499106e6f1adacfb757cff8761c1a21df2f51eba6dd +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-freebsd.tar.xz=58d094940c719267f2cc1bb517263019d3c2c337dad8c8a385a36e59c46bdcee +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-illumos.tar.gz=15f210f727a22b3462fe9259a176433e2c7cf8aff414de5a38401aaf16e1e993 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-illumos.tar.xz=2a7a0610e95d999494cefaf3256c556fed1a4fc54a28f92f29dc1112750c164e +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-gnu.tar.gz=dc0f70c6e681776d0c5e01953b50488e8b2f972eed5aece6d094e497ea480ab0 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-gnu.tar.xz=9853db03d68578a30972e2755c89c66aec035fec641cf8f3a7117c81eec2578d +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-musl.tar.gz=d616d83146b254cc62cd2f90258d9743586944c294cd39b48c26e9b962dc0e30 +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-linux-musl.tar.xz=dddd1ee3da59440d5aa4d149ebb5fbbe0d7252dd94e171d5f2b071d7354f9b3a +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-netbsd.tar.gz=badf108c3362ff4fe5501ffda2eecfc7579b42324500c82ba012b2fc7a26790d +dist/2025-09-18/cargo-1.90.0-x86_64-unknown-netbsd.tar.xz=ac72f885666fbce5c2b624b2c923bde7949214b51f6b2b53079342cb792e90ab +dist/2025-09-18/clippy-1.90.0-aarch64-apple-darwin.tar.gz=323a3ebca03d5aa7dc8d8d54ac05963e08a1c4fb22066ef6b05ee5398e397b12 +dist/2025-09-18/clippy-1.90.0-aarch64-apple-darwin.tar.xz=3a0514b40b967810dd318a43cdc3d97bc47c3ad3844bde759c93223a28d56903 +dist/2025-09-18/clippy-1.90.0-aarch64-pc-windows-msvc.tar.gz=99c64c890e1d8320b1d48d50f4f7e8718f4e7c8db2bdb11db196ea7620b6d23a +dist/2025-09-18/clippy-1.90.0-aarch64-pc-windows-msvc.tar.xz=0d53737e4f66adccdd5c8fe7fcb7adf91e522ed5b986ec1fbd28e343eee7c1e2 +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-gnu.tar.gz=e0a970c0997db493e489bb27781ee3488e09815de175b99f843b98934db137ff +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-gnu.tar.xz=1a7f969c5712c17d960d6fba8235b33f264a9484b369dc388766a540f1ba464f +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-musl.tar.gz=5e60f59aaa2b6cee457a07585863012a1fe435f5ef864c6f2407714f25a1cfdb +dist/2025-09-18/clippy-1.90.0-aarch64-unknown-linux-musl.tar.xz=b461300782ce55a4a67acec4f21366c9dc96c4a1e073c4e8823876be1bbd7e42 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabi.tar.gz=45dda2c7de1d182fa6bd8824630836bfcea429230e5fcc20fc19e7185583aa32 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabi.tar.xz=9af18a37afc55fc08fde139ab18391f195ae583cc8cf3714e2440855fb5cc808 +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabihf.tar.gz=0227f0114e85725fe83c0bff6460e47e3e5f78a23fbd9e5248a0f6a20151bdbb +dist/2025-09-18/clippy-1.90.0-arm-unknown-linux-gnueabihf.tar.xz=99b6bf1db1de4b35f9bef774a78ead28a9c97b24b8799503d3492eca65994dc4 +dist/2025-09-18/clippy-1.90.0-armv7-unknown-linux-gnueabihf.tar.gz=fe17099b96f3e383b5d2a0388d86050f15b7bf244a4e41e62ffdc61dbe56030d +dist/2025-09-18/clippy-1.90.0-armv7-unknown-linux-gnueabihf.tar.xz=9cb09e749dd1162f02376ce70c1ee74f95b55ab134ceb50dc3c23f40027f5196 +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-gnu.tar.gz=4e2ebe77044f41c80c4bd13385080506bb17c8a6c02f492b7206f8a4b6ccc40a +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-gnu.tar.xz=19b64336455e2c1d78132de2d1fa2ea10f794e0f741dbfd7eaec4db06cc98b5d +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-msvc.tar.gz=b0cd1a85441a681b16a945f0991788cfa584de6536efd245eab961ecc61828bd +dist/2025-09-18/clippy-1.90.0-i686-pc-windows-msvc.tar.xz=ddb0ab9cf4b63a019b22ee183258607d377fed53a8a57e8cc10f7577416acbcc +dist/2025-09-18/clippy-1.90.0-i686-unknown-linux-gnu.tar.gz=49938b7213313ed846bc5c9c33e7f2708c30ecc7475568269eb9b49dc7743b8d +dist/2025-09-18/clippy-1.90.0-i686-unknown-linux-gnu.tar.xz=3e902971ef6b44ccb804af73aba5dc8c6199ed09a76f178b0eed6f53f7f56eab +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-gnu.tar.gz=d5c0e41cff60e70274b2b1f96cb9a53aff2292f56922f85c3e487be4c36f9fd1 +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-gnu.tar.xz=847b3d4bd3d2be23bafbb90cd2ed5e1bf1aacb2e7152e7d2f99bee1078aa0eaa +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-musl.tar.gz=236e57e5d28dfba7c24fff52840fe448d284cf5882b0b127f10edf0c566dd8bf +dist/2025-09-18/clippy-1.90.0-loongarch64-unknown-linux-musl.tar.xz=8e7a8ee3b048fe863710dcafbecf0550e47cebda8f0d1679278ab77dacea913d +dist/2025-09-18/clippy-1.90.0-powerpc-unknown-linux-gnu.tar.gz=a1cd64461aca05901a532716ded08f63197b548a765df3247b86dbb44d577744 +dist/2025-09-18/clippy-1.90.0-powerpc-unknown-linux-gnu.tar.xz=42ac7480dcac12a843803f5ee398d2a42389359178774cab20c66eda4f6927a5 +dist/2025-09-18/clippy-1.90.0-powerpc64-unknown-linux-gnu.tar.gz=23e576086a58ac3544214a91e8bdccb2540b53e1ec4f8395bf25f47a2605a954 +dist/2025-09-18/clippy-1.90.0-powerpc64-unknown-linux-gnu.tar.xz=071e06a50d5b2975905bb2d6211f2d2372ab0dbd50b7b0097168cb64e77a4bb0 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-gnu.tar.gz=c78cf5f24a49ad5857092e2955317f489c1edd5bf4458d8828f079808baf83a1 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-gnu.tar.xz=12d19dbec34c5a35cd285fe74dcd0226563c0b25be5d041479744060e9374c98 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-musl.tar.gz=7d1a99da80ed5051fcac569a06c08eec8006bec1c9e3f0c785189172e95e8c86 +dist/2025-09-18/clippy-1.90.0-powerpc64le-unknown-linux-musl.tar.xz=b77a4daf504100396fe0df8db5f8eeedc2b7ea30d0b1af2e48961364e483f133 +dist/2025-09-18/clippy-1.90.0-riscv64gc-unknown-linux-gnu.tar.gz=02ca569b044f919df7d43a1fcf9d957444d6ef2b3eee1aaff7fe05937597aec4 +dist/2025-09-18/clippy-1.90.0-riscv64gc-unknown-linux-gnu.tar.xz=02338e25b3d2b61d9dbee7bee4c9ed148f18e2d010c6297ffd36df98042f41a2 +dist/2025-09-18/clippy-1.90.0-s390x-unknown-linux-gnu.tar.gz=e9f5ec0fc78c9e43a4d17cf0b7ee53d5f64503fffcc3c53ece4cf7b595ebc51e +dist/2025-09-18/clippy-1.90.0-s390x-unknown-linux-gnu.tar.xz=bb0a9483a36fdbdab08b433613b374c036779d247a8d508e31265193c3759a8d +dist/2025-09-18/clippy-1.90.0-sparcv9-sun-solaris.tar.gz=c0fd7946ffa7d326a3ac28b40e5aa16bb7c4735f794abc4065030358d14bd240 +dist/2025-09-18/clippy-1.90.0-sparcv9-sun-solaris.tar.xz=cc830dcecde477232d6c47ad94ef8cd36c116a878da95abb38b791cee0039277 +dist/2025-09-18/clippy-1.90.0-x86_64-apple-darwin.tar.gz=36294e19b84bdd36139b5a46ffe2dd7ee9e27707296762909aa467573cdb51df +dist/2025-09-18/clippy-1.90.0-x86_64-apple-darwin.tar.xz=4c5736f0e6c8b10dd9274e1c7cbf370050aa345c013bc321c3943a4fea55d078 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-solaris.tar.gz=7b7eb300a0505d1eb02a3cc8f24118c1a61f82535233a2a0c17018d8e70306d7 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-solaris.tar.xz=a1ad3894a3eba067a70b6fd001dd640c2b154d179e2b17e1716cb7c1f6d89069 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-gnu.tar.gz=6c9d6d370550886291570062aa82ef4e61781e200cf8c7cf402e8aa5f6824fd3 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-gnu.tar.xz=a99055503a4d95a730f7205a7a2a2ab4af3b749610c9c3384fed56a39947ce96 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-msvc.tar.gz=c27d21c9400abab4cf14819e3e31e110acefe05ea7d2ccc2b5f81ea3ec9f8538 +dist/2025-09-18/clippy-1.90.0-x86_64-pc-windows-msvc.tar.xz=d7d71f603ea9c2f79ba186cd3572ea41593907f933d26bd028d60b7b0943b49e +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-freebsd.tar.gz=7301156ec837ae70bdd38e4dc11779e891091e2b40b82ea84e7248eb1cfae9ab +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-freebsd.tar.xz=de5d1a2a35c39a32f1f37b6438cad56311fdb1287fd23a9d6fa7397480044e08 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-illumos.tar.gz=b5832425f90e213c54ae1312ca40c69b4a7b41cb126e1376620f238550fccc84 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-illumos.tar.xz=d8dc3f25ce1b3588a9a383642676fab68ce50f4d419b13c19b82fc266899c878 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-gnu.tar.gz=0e1db6adef940dd21896dbd7a051e25056df2fede90591c583552f94e913af22 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-gnu.tar.xz=5b6466419693a05365827378145014a37ae74fb2948fab390d5210a524792ed8 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-musl.tar.gz=3d9683996a016c131fb6e09859c3246b5ba996bdf1095cf21f370a6bb4001681 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-linux-musl.tar.xz=80e29439beb1794e11939508d2a939fe82e6a1f9948a79349ae6655c71b2a79d +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-netbsd.tar.gz=8b967a3e0d4b6292c7750c1d7824ce88ca9e29d8734036101ad80bcb05b050d8 +dist/2025-09-18/clippy-1.90.0-x86_64-unknown-netbsd.tar.xz=363aa8d9241f94f10c03e1c9ed77f68640c74380d483a13621cc7d042e96a72d diff --git a/src/tools/cargo b/src/tools/cargo index 24bb93c388fb8..ea2d97820c161 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 24bb93c388fb8c211a37986539f24a819dc669d3 +Subproject commit ea2d97820c16195b0ca3fadb4319fe512c199a43 diff --git a/src/tools/clippy/clippy_lints/src/len_zero.rs b/src/tools/clippy/clippy_lints/src/len_zero.rs index f44a5fdf715e5..28a0fbc051158 100644 --- a/src/tools/clippy/clippy_lints/src/len_zero.rs +++ b/src/tools/clippy/clippy_lints/src/len_zero.rs @@ -371,9 +371,9 @@ fn parse_len_output<'tcx>(cx: &LateContext<'tcx>, sig: FnSig<'tcx>) -> Option Some(LenOutput::Integral), - ty::Adt(adt, subs) if subs.type_at(0).is_integral() => match cx.tcx.get_diagnostic_name(adt.did()) { - Some(sym::Option) => Some(LenOutput::Option(adt.did())), - Some(sym::Result) => Some(LenOutput::Result(adt.did())), + ty::Adt(adt, subs) => match cx.tcx.get_diagnostic_name(adt.did()) { + Some(sym::Option) => subs.type_at(0).is_integral().then(|| LenOutput::Option(adt.did())), + Some(sym::Result) => subs.type_at(0).is_integral().then(|| LenOutput::Result(adt.did())), _ => None, }, _ => None, diff --git a/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs b/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs index 11edb929d70b2..de162a12e47d3 100644 --- a/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs +++ b/src/tools/clippy/clippy_lints/src/loops/needless_range_loop.rs @@ -64,7 +64,7 @@ pub(super) fn check<'tcx>( if let Some(indexed_extent) = indexed_extent { let parent_def_id = cx.tcx.hir_get_parent_item(expr.hir_id); let region_scope_tree = cx.tcx.region_scope_tree(parent_def_id); - let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id).unwrap(); + let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id).0.unwrap(); if region_scope_tree.is_subscope_of(indexed_extent, pat_extent) { return; } @@ -298,6 +298,7 @@ impl<'tcx> VarVisitor<'_, 'tcx> { .tcx .region_scope_tree(parent_def_id) .var_scope(hir_id.local_id) + .0 .unwrap(); if index_used_directly { self.indexed_directly.insert( diff --git a/src/tools/clippy/clippy_lints/src/shadow.rs b/src/tools/clippy/clippy_lints/src/shadow.rs index 14399867f3181..ee80e75a9d1f5 100644 --- a/src/tools/clippy/clippy_lints/src/shadow.rs +++ b/src/tools/clippy/clippy_lints/src/shadow.rs @@ -180,8 +180,8 @@ impl<'tcx> LateLintPass<'tcx> for Shadow { fn is_shadow(cx: &LateContext<'_>, owner: LocalDefId, first: ItemLocalId, second: ItemLocalId) -> bool { let scope_tree = cx.tcx.region_scope_tree(owner.to_def_id()); - if let Some(first_scope) = scope_tree.var_scope(first) - && let Some(second_scope) = scope_tree.var_scope(second) + if let Some(first_scope) = scope_tree.var_scope(first).0 + && let Some(second_scope) = scope_tree.var_scope(second).0 { return scope_tree.is_subscope_of(second_scope, first_scope); } diff --git a/src/tools/clippy/tests/ui/crashes/ice-15657.rs b/src/tools/clippy/tests/ui/crashes/ice-15657.rs new file mode 100644 index 0000000000000..c6f6506cd8d03 --- /dev/null +++ b/src/tools/clippy/tests/ui/crashes/ice-15657.rs @@ -0,0 +1,11 @@ +//@check-pass +#![warn(clippy::len_zero)] + +pub struct S1; +pub struct S2; + +impl S1 { + pub fn len(&self) -> S2 { + S2 + } +} diff --git a/tests/codegen-llvm/common_prim_int_ptr.rs b/tests/codegen-llvm/common_prim_int_ptr.rs index 53716adccbf21..2c906e86bd736 100644 --- a/tests/codegen-llvm/common_prim_int_ptr.rs +++ b/tests/codegen-llvm/common_prim_int_ptr.rs @@ -11,7 +11,7 @@ #[no_mangle] pub fn insert_int(x: usize) -> Result> { // CHECK: start: - // CHECK-NEXT: %[[WO_PROV:.+]] = getelementptr i8, ptr null, [[USIZE:i[0-9]+]] %x + // CHECK-NEXT: %[[WO_PROV:.+]] = inttoptr [[USIZE:i[0-9]+]] %x to ptr // CHECK-NEXT: %[[R:.+]] = insertvalue { [[USIZE]], ptr } { [[USIZE]] 0, ptr poison }, ptr %[[WO_PROV]], 1 // CHECK-NEXT: ret { [[USIZE]], ptr } %[[R]] Ok(x) diff --git a/tests/codegen-llvm/enum/enum-aggregate.rs b/tests/codegen-llvm/enum/enum-aggregate.rs index f58d7ef12b661..e87f43b2e27b9 100644 --- a/tests/codegen-llvm/enum/enum-aggregate.rs +++ b/tests/codegen-llvm/enum/enum-aggregate.rs @@ -71,7 +71,7 @@ fn make_ok_ptr(x: NonNull) -> Result, usize> { fn make_ok_int(x: usize) -> Result> { // CHECK-LABEL: { i64, ptr } @make_ok_int(i64 %x) // CHECK-NEXT: start: - // CHECK-NEXT: %[[NOPROV:.+]] = getelementptr i8, ptr null, i64 %x + // CHECK-NEXT: %[[NOPROV:.+]] = inttoptr i64 %x to ptr // CHECK-NEXT: %[[R:.+]] = insertvalue { i64, ptr } { i64 0, ptr poison }, ptr %[[NOPROV]], 1 // CHECK-NEXT: ret { i64, ptr } %[[R]] Ok(x) diff --git a/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs b/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs new file mode 100644 index 0000000000000..299c3bf8847b2 --- /dev/null +++ b/tests/codegen-llvm/int-ptr-int-enum-miscompile.rs @@ -0,0 +1,22 @@ +// This is a regression test for https://github.com/rust-lang/rust/issues/147265. + +//@ compile-flags: -Copt-level=3 + +#![crate_type = "lib"] + +#[no_mangle] +pub fn mk_result(a: usize) -> Result { + // CHECK-LABEL: @mk_result + // CHECK-NOT: unreachable + // CHECK: load i8, + // CHECK-NOT: unreachable + match g(a) { + Ok(b) => Ok(unsafe { *(b as *const u8) }), + Err(c) => Err(c), + } +} + +#[cold] +fn g(a: usize) -> Result { + Ok(a) +} diff --git a/tests/codegen-llvm/intrinsics/transmute-niched.rs b/tests/codegen-llvm/intrinsics/transmute-niched.rs index a886d9eee5909..8c647655f65bb 100644 --- a/tests/codegen-llvm/intrinsics/transmute-niched.rs +++ b/tests/codegen-llvm/intrinsics/transmute-niched.rs @@ -249,7 +249,7 @@ pub unsafe fn check_four_or_eight_to_nonnull(x: FourOrEight) -> NonNull { // OPT: call void @llvm.assume(i1 %1) // CHECK-NOT: icmp // CHECK-NOT: assume - // CHECK: %[[RET:.+]] = getelementptr i8, ptr null, i64 %x + // CHECK: %[[RET:.+]] = inttoptr i64 %x to ptr // CHECK-NEXT: ret ptr %[[RET]] transmute(x) diff --git a/tests/codegen-llvm/intrinsics/transmute.rs b/tests/codegen-llvm/intrinsics/transmute.rs index e327c100d7ddd..b86c6df3267e4 100644 --- a/tests/codegen-llvm/intrinsics/transmute.rs +++ b/tests/codegen-llvm/intrinsics/transmute.rs @@ -303,7 +303,7 @@ pub unsafe fn check_pair_with_bool(x: (u8, bool)) -> (bool, i8) { pub unsafe fn check_float_to_pointer(x: f64) -> *const () { // CHECK-NOT: alloca // CHECK: %0 = bitcast double %x to i64 - // CHECK: %_0 = getelementptr i8, ptr null, i64 %0 + // CHECK: %_0 = inttoptr i64 %0 to ptr // CHECK: ret ptr %_0 transmute(x) } @@ -378,7 +378,7 @@ pub unsafe fn check_issue_110005(x: (usize, bool)) -> Option> { // CHECK-LABEL: @check_pair_to_dst_ref( #[no_mangle] pub unsafe fn check_pair_to_dst_ref<'a>(x: (usize, usize)) -> &'a [u8] { - // CHECK: %_0.0 = getelementptr i8, ptr null, i64 %x.0 + // CHECK: %_0.0 = inttoptr i64 %x.0 to ptr // CHECK: %0 = icmp ne ptr %_0.0, null // CHECK: call void @llvm.assume(i1 %0) // CHECK: %1 = insertvalue { ptr, i64 } poison, ptr %_0.0, 0 diff --git a/tests/codegen-llvm/transmute-scalar.rs b/tests/codegen-llvm/transmute-scalar.rs index 21f7287047cf0..e1ce8e506066a 100644 --- a/tests/codegen-llvm/transmute-scalar.rs +++ b/tests/codegen-llvm/transmute-scalar.rs @@ -56,7 +56,7 @@ pub fn ptr_to_int(p: *mut u16) -> usize { } // CHECK: define{{.*}}ptr @int_to_ptr([[USIZE]] %i) -// CHECK: %_0 = getelementptr i8, ptr null, [[USIZE]] %i +// CHECK: %_0 = inttoptr [[USIZE]] %i to ptr // CHECK-NEXT: ret ptr %_0 #[no_mangle] pub fn int_to_ptr(i: usize) -> *mut u16 { diff --git a/tests/codegen-llvm/vec-calloc.rs b/tests/codegen-llvm/vec-calloc.rs index 15971bbfa0036..d1c320ead012e 100644 --- a/tests/codegen-llvm/vec-calloc.rs +++ b/tests/codegen-llvm/vec-calloc.rs @@ -1,6 +1,4 @@ -//@ revisions: normal llvm21 //@ compile-flags: -Copt-level=3 -Z merge-functions=disabled -//@ [llvm21] min-llvm-version: 21 //@ only-x86_64 #![crate_type = "lib"] @@ -178,24 +176,6 @@ pub fn vec_option_i32(n: usize) -> Vec> { vec![None; n] } -// LLVM21-LABEL: @vec_array -#[cfg(llvm21)] -#[no_mangle] -pub fn vec_array(n: usize) -> Vec<[u32; 1_000_000]> { - // LLVM21-NOT: call {{.*}}alloc::vec::from_elem - // LLVM21-NOT: call {{.*}}reserve - // LLVM21-NOT: call {{.*}}__rust_alloc( - - // LLVM21: call {{.*}}__rust_alloc_zeroed( - - // LLVM21-NOT: call {{.*}}alloc::vec::from_elem - // LLVM21-NOT: call {{.*}}reserve - // LLVM21-NOT: call {{.*}}__rust_alloc( - - // LLVM21: ret void - vec![[0; 1_000_000]; 3] -} - // Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away. // CHECK: declare noalias noundef ptr @{{.*}}__rust_alloc_zeroed(i64 noundef, i64 allocalign noundef) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]] diff --git a/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff new file mode 100644 index 0000000000000..92e5ccabedf9e --- /dev/null +++ b/tests/mir-opt/gvn_loop.loop_deref_mut.GVN.diff @@ -0,0 +1,115 @@ +- // MIR for `loop_deref_mut` before GVN ++ // MIR for `loop_deref_mut` after GVN + + fn loop_deref_mut(_1: &mut Value) -> Value { + debug val => _1; + let mut _0: Value; + let _2: &Value; + let _3: &Value; + let mut _4: &Value; + let mut _6: !; + let mut _8: isize; + let mut _9: !; + let mut _10: (); + let mut _12: i32; + let _13: (); + let mut _14: bool; + let mut _15: !; + let mut _16: Value; + scope 1 { + debug val_alias => _2; + let mut _5: bool; + scope 2 { + debug stop => _5; + let _7: i32; + scope 3 { + debug v => _7; + let _11: Value; + scope 4 { + debug v => _11; + } + } + } + } + + bb0: { + StorageLive(_2); +- StorageLive(_3); ++ nop; + StorageLive(_4); + _4 = &(*_1); + _3 = get::(move _4) -> [return: bb1, unwind unreachable]; + } + + bb1: { + _2 = &(*_3); + StorageDead(_4); +- StorageDead(_3); ++ nop; + StorageLive(_5); + _5 = const false; +- _8 = discriminant((*_2)); ++ _8 = discriminant((*_3)); + switchInt(move _8) -> [0: bb3, otherwise: bb2]; + } + + bb2: { + unreachable; + } + + bb3: { +- StorageLive(_7); +- _7 = copy (((*_2) as V0).0: i32); ++ nop; ++ _7 = copy (((*_3) as V0).0: i32); + StorageLive(_9); + goto -> bb4; + } + + bb4: { + StorageLive(_11); + StorageLive(_12); + _12 = copy _7; +- _11 = Value::V0(move _12); ++ _11 = Value::V0(copy _7); + StorageDead(_12); + StorageLive(_13); + StorageLive(_14); + _14 = copy _5; + switchInt(move _14) -> [0: bb6, otherwise: bb5]; + } + + bb5: { + _0 = move _11; + StorageDead(_14); + StorageDead(_13); + StorageDead(_11); + StorageDead(_9); +- StorageDead(_7); ++ nop; + StorageDead(_5); + StorageDead(_2); + return; + } + + bb6: { + _13 = const (); + StorageDead(_14); + StorageDead(_13); + _5 = const true; + StorageLive(_16); +- _16 = Value::V1; +- (*_1) = move _16; ++ _16 = const Value::V1; ++ (*_1) = const Value::V1; + StorageDead(_16); + _10 = const (); + StorageDead(_11); + goto -> bb4; + } ++ } ++ ++ ALLOC0 (size: 8, align: 4) { ++ 01 00 00 00 __ __ __ __ │ ....░░░░ + } + diff --git a/tests/mir-opt/gvn_loop.rs b/tests/mir-opt/gvn_loop.rs new file mode 100644 index 0000000000000..6e9df55a968dc --- /dev/null +++ b/tests/mir-opt/gvn_loop.rs @@ -0,0 +1,39 @@ +//@ test-mir-pass: GVN + +#![crate_type = "lib"] +#![feature(core_intrinsics, rustc_attrs)] + +pub enum Value { + V0(i32), + V1, +} + +// Check that we do not use the dereferenced value of `val_alias` when returning. + +// EMIT_MIR gvn_loop.loop_deref_mut.GVN.diff +fn loop_deref_mut(val: &mut Value) -> Value { + // CHECK-LABEL: fn loop_deref_mut( + // CHECK: [[VAL_REF:_.*]] = get::( + // CHECK: [[V:_.*]] = copy (((*[[VAL_REF]]) as V0).0: i32); + // CEHCK-NOT: copy (*[[VAL_REF]]); + // CHECK: [[RET:_*]] = Value::V0(copy [[V]]); + // CEHCK-NOT: copy (*[[VAL_REF]]); + // CHECK: _0 = move [[RET]] + let val_alias: &Value = get(val); + let mut stop = false; + let Value::V0(v) = *val_alias else { unsafe { core::intrinsics::unreachable() } }; + loop { + let v = Value::V0(v); + if stop { + return v; + } + stop = true; + *val = Value::V1; + } +} + +#[inline(never)] +#[rustc_nounwind] +fn get(v: &T) -> &T { + v +} diff --git a/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs b/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs new file mode 100644 index 0000000000000..410d4e503b7c2 --- /dev/null +++ b/tests/ui/async-await/higher-ranked-normalize-assumptions-2.rs @@ -0,0 +1,38 @@ +//@ revisions: stock hr +//@[hr] compile-flags: -Zhigher-ranked-assumptions +//@ edition: 2024 +//@ check-pass + +// Test that we don't normalize the higher-ranked assumptions of an auto trait goal +// unless we have `-Zhigher-ranked-assumptions`, since obligations that result from +// this normalization may lead to higher-ranked lifetime errors when the flag is not +// enabled. + +// Regression test for . + +pub fn a() -> impl Future + Send { + async { + let queries = core::iter::empty().map(Thing::f); + b(queries).await; + } +} + +async fn b(queries: impl IntoIterator) { + c(queries).await; +} + +fn c<'a, I>(_queries: I) -> impl Future +where + I: IntoIterator, + I::IntoIter: 'a, +{ + async {} +} + +pub struct Thing<'a>(pub &'a ()); + +impl Thing<'_> { + fn f(_: &Self) {} +} + +fn main() {} diff --git a/tests/ui/async-await/higher-ranked-normalize-assumptions.rs b/tests/ui/async-await/higher-ranked-normalize-assumptions.rs new file mode 100644 index 0000000000000..ec9cf3a152214 --- /dev/null +++ b/tests/ui/async-await/higher-ranked-normalize-assumptions.rs @@ -0,0 +1,51 @@ +//@ revisions: stock hr +//@[hr] compile-flags: -Zhigher-ranked-assumptions +//@ edition: 2024 +//@ check-pass + +// Test that we don't normalize the higher-ranked assumptions of an auto trait goal +// unless we have `-Zhigher-ranked-assumptions`, since obligations that result from +// this normalization may lead to higher-ranked lifetime errors when the flag is not +// enabled. + +// Regression test for . + +pub trait Service { + type Response; +} + +impl Service for T +where + T: FnMut() -> R, + R: 'static, +{ + type Response = R; +} + +async fn serve(_: C) +where + C: Service, + C::Response: 'static, +{ + connect::().await; +} + +async fn connect() +where + C: Service, + C::Response: 'static, +{ +} + +fn repro() -> impl Send { + async { + let server = || do_something(); + serve(server).await; + } +} + +fn do_something() -> Box { + unimplemented!() +} + +fn main() {} diff --git a/tests/ui/attributes/attr-on-mac-call.stderr b/tests/ui/attributes/attr-on-mac-call.stderr index a08d305916856..02c0ec8ea1d6c 100644 --- a/tests/ui/attributes/attr-on-mac-call.stderr +++ b/tests/ui/attributes/attr-on-mac-call.stderr @@ -82,7 +82,7 @@ LL | #[link_section = "x"] | ^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_ordinal]` attribute cannot be used on macro calls --> $DIR/attr-on-mac-call.rs:33:5 diff --git a/tests/ui/attributes/link-dl.allowed.stderr b/tests/ui/attributes/link-dl.allowed.stderr new file mode 100644 index 0000000000000..e0070d970595f --- /dev/null +++ b/tests/ui/attributes/link-dl.allowed.stderr @@ -0,0 +1,10 @@ +Future incompatibility report: Future breakage diagnostic: +warning: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + diff --git a/tests/ui/attributes/link-dl.default_fcw.stderr b/tests/ui/attributes/link-dl.default_fcw.stderr new file mode 100644 index 0000000000000..249895fd17d00 --- /dev/null +++ b/tests/ui/attributes/link-dl.default_fcw.stderr @@ -0,0 +1,23 @@ +error: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + = note: `#[deny(ill_formed_attribute_input)]` (part of `#[deny(future_incompatible)]`) on by default + +error: aborting due to 1 previous error + +Future incompatibility report: Future breakage diagnostic: +error: valid forms for the attribute are `#[link(name = "...")]`, `#[link(name = "...", import_name_type = "decorated|noprefix|undecorated")]`, `#[link(name = "...", kind = "dylib|static|...")]`, `#[link(name = "...", kind = "dylib|static|...", wasm_import_module = "...", import_name_type = "decorated|noprefix|undecorated")]`, and `#[link(name = "...", wasm_import_module = "...")]` + --> $DIR/link-dl.rs:14:1 + | +LL | #[link="dl"] + | ^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #57571 + = note: `#[deny(ill_formed_attribute_input)]` (part of `#[deny(future_incompatible)]`) on by default + diff --git a/tests/ui/attributes/link-dl.rs b/tests/ui/attributes/link-dl.rs new file mode 100644 index 0000000000000..0785c83cb442f --- /dev/null +++ b/tests/ui/attributes/link-dl.rs @@ -0,0 +1,19 @@ +// Regression test for an issue discovered in https://github.com/rust-lang/rust/pull/143193/files and rediscovered in https://github.com/rust-lang/rust/issues/147254#event-20049906781 +// Malformed #[link] attribute was supposed to be deny-by-default report-in-deps FCW, +// but accidentally was landed as a hard error. +// +// revision `default_fcw` tests that with `ill_formed_attribute_input` (the default) denied, +// the attribute produces an FCW +// revision `allowed` tests that with `ill_formed_attribute_input` allowed the test passes + +//@ revisions: default_fcw allowed +//@[allowed] check-pass + +#[cfg_attr(allowed, allow(ill_formed_attribute_input))] + +#[link="dl"] +//[default_fcw]~^ ERROR valid forms for the attribute are +//[default_fcw]~| WARN previously accepted +extern "C" { } + +fn main() {} diff --git a/tests/ui/coroutine/copy-fast-path-query-cycle.rs b/tests/ui/coroutine/copy-fast-path-query-cycle.rs new file mode 100644 index 0000000000000..644cba0d47af2 --- /dev/null +++ b/tests/ui/coroutine/copy-fast-path-query-cycle.rs @@ -0,0 +1,40 @@ +//@ edition: 2024 +//@ revisions: current next +//@[next] compile-flags: -Znext-solver +//@ check-pass + +// Regression test for #146813. We previously used a pseudo-canonical +// query during HIR typeck which caused a query cycle when looking at the +// witness of a coroutine. + +use std::future::Future; + +trait ConnectMiddleware {} + +trait ConnectHandler: Sized { + fn with(self, _: M) -> impl ConnectHandler + where + M: ConnectMiddleware, + { + LayeredConnectHandler + } +} + +struct LayeredConnectHandler; +impl ConnectHandler for LayeredConnectHandler {} +impl ConnectHandler for F where F: FnOnce() {} + +impl ConnectMiddleware for F +where + F: FnOnce() -> Fut, + Fut: Future + Send, +{ +} + +pub async fn fails() { + { || {} } + .with(async || ()) + .with(async || ()) + .with(async || ()); +} +fn main() {} diff --git a/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs b/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs index 198f8d1bc10c1..6d12ab1e4cf6f 100644 --- a/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs +++ b/tests/ui/dist/cranelift-x86_64-unknown-linux-gnu-dist.rs @@ -2,6 +2,7 @@ // dist artifacts. //@ only-dist +//@ only-nightly (cranelift is not stable yet) //@ only-x86_64-unknown-linux-gnu //@ compile-flags: -Z codegen-backend=cranelift //@ run-pass diff --git a/tests/ui/feature-gates/feature-gate-sanitize.stderr b/tests/ui/feature-gates/feature-gate-sanitize.stderr index 513999636a95c..59e8b69de2e3d 100644 --- a/tests/ui/feature-gates/feature-gate-sanitize.stderr +++ b/tests/ui/feature-gates/feature-gate-sanitize.stderr @@ -4,7 +4,7 @@ error[E0557]: feature has been removed LL | #![feature(no_sanitize)] | ^^^^^^^^^^^ feature has been removed | - = note: removed in CURRENT_RUSTC_VERSION; see for more information + = note: removed in 1.91.0; see for more information = note: renamed to sanitize(xyz = "on|off") error[E0658]: the `#[sanitize]` attribute is an experimental feature diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs index 546aa4052d333..92fe512aef3c2 100644 --- a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs +++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs @@ -687,6 +687,32 @@ mod link_section { //~| WARN previously accepted //~| HELP can be applied to //~| HELP remove the attribute + + #[link_section = "1800"] + //~^ WARN attribute cannot be used on + //~| WARN previously accepted + //~| HELP can be applied to + //~| HELP remove the attribute + trait Tr { + #[link_section = "1800"] + fn inside_tr_no_default(&self); + + #[link_section = "1800"] + fn inside_tr_default(&self) { } + } + + impl S { + #[link_section = "1800"] + fn inside_abc_123(&self) { } + } + + impl Tr for S { + #[link_section = "1800"] + fn inside_tr_no_default(&self) { } + } + + #[link_section = "1800"] + fn should_always_link() { } } diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr index 3c835be5cffab..8a6102d7aa05c 100644 --- a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr +++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr @@ -210,7 +210,7 @@ LL | #![reexport_test_harness_main = "2900"] | + warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:695:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:721:1 | LL | #[link(name = "x")] | ^^^^^^^^^^^^^^^^^^^ @@ -226,7 +226,7 @@ LL | | } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:771:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:797:1 | LL | #[windows_subsystem = "windows"] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -237,7 +237,7 @@ LL | #![windows_subsystem = "windows"] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:821:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:847:1 | LL | #[crate_type = "0800"] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -248,7 +248,7 @@ LL | #![crate_type = "0800"] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:845:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:871:1 | LL | #[feature(x0600)] | ^^^^^^^^^^^^^^^^^ @@ -259,7 +259,7 @@ LL | #![feature(x0600)] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:870:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:896:1 | LL | #[no_main] | ^^^^^^^^^^ @@ -270,7 +270,7 @@ LL | #![no_main] | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:894:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:920:1 | LL | #[no_builtins] | ^^^^^^^^^^^^^^ @@ -377,7 +377,7 @@ LL | #![reexport_test_harness_main = "2900"] impl S { } | + warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:727:17 | LL | mod inner { #![link(name = "x")] } | ------------^^^^^^^^^^^^^^^^^^^^-- not an `extern` block @@ -385,7 +385,7 @@ LL | mod inner { #![link(name = "x")] } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:706:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:732:5 | LL | #[link(name = "x")] fn f() { } | ^^^^^^^^^^^^^^^^^^^ ---------- not an `extern` block @@ -393,7 +393,7 @@ LL | #[link(name = "x")] fn f() { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:711:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:737:5 | LL | #[link(name = "x")] struct S; | ^^^^^^^^^^^^^^^^^^^ --------- not an `extern` block @@ -401,7 +401,7 @@ LL | #[link(name = "x")] struct S; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:716:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:742:5 | LL | #[link(name = "x")] type T = S; | ^^^^^^^^^^^^^^^^^^^ ----------- not an `extern` block @@ -409,7 +409,7 @@ LL | #[link(name = "x")] type T = S; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:721:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:747:5 | LL | #[link(name = "x")] impl S { } | ^^^^^^^^^^^^^^^^^^^ ---------- not an `extern` block @@ -417,7 +417,7 @@ LL | #[link(name = "x")] impl S { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: attribute should be applied to an `extern` block with non-Rust ABI - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:726:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:752:5 | LL | #[link(name = "x")] extern "Rust" {} | ^^^^^^^^^^^^^^^^^^^ @@ -425,13 +425,13 @@ LL | #[link(name = "x")] extern "Rust" {} = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:775:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:801:17 | LL | mod inner { #![windows_subsystem="windows"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:5 | LL | #[windows_subsystem = "windows"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -442,7 +442,7 @@ LL | #![windows_subsystem = "windows"] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:5 | LL | #[windows_subsystem = "windows"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -453,7 +453,7 @@ LL | #![windows_subsystem = "windows"] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:5 | LL | #[windows_subsystem = "windows"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -464,7 +464,7 @@ LL | #![windows_subsystem = "windows"] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:5 | LL | #[windows_subsystem = "windows"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -475,13 +475,13 @@ LL | #![windows_subsystem = "windows"] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:825:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:851:17 | LL | mod inner { #![crate_type="0800"] } | ^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:828:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:854:5 | LL | #[crate_type = "0800"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^ @@ -492,7 +492,7 @@ LL | #![crate_type = "0800"] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:832:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:858:5 | LL | #[crate_type = "0800"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^ @@ -503,7 +503,7 @@ LL | #![crate_type = "0800"] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:836:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:862:5 | LL | #[crate_type = "0800"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^ @@ -514,7 +514,7 @@ LL | #![crate_type = "0800"] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:840:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:866:5 | LL | #[crate_type = "0800"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ @@ -525,13 +525,13 @@ LL | #![crate_type = "0800"] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:849:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:875:17 | LL | mod inner { #![feature(x0600)] } | ^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:852:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:878:5 | LL | #[feature(x0600)] fn f() { } | ^^^^^^^^^^^^^^^^^ @@ -542,7 +542,7 @@ LL | #![feature(x0600)] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:856:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:882:5 | LL | #[feature(x0600)] struct S; | ^^^^^^^^^^^^^^^^^ @@ -553,7 +553,7 @@ LL | #![feature(x0600)] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:860:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:886:5 | LL | #[feature(x0600)] type T = S; | ^^^^^^^^^^^^^^^^^ @@ -564,7 +564,7 @@ LL | #![feature(x0600)] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:864:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:890:5 | LL | #[feature(x0600)] impl S { } | ^^^^^^^^^^^^^^^^^ @@ -575,13 +575,13 @@ LL | #![feature(x0600)] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:874:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:900:17 | LL | mod inner { #![no_main] } | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:877:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:903:5 | LL | #[no_main] fn f() { } | ^^^^^^^^^^ @@ -592,7 +592,7 @@ LL | #![no_main] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:881:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:907:5 | LL | #[no_main] struct S; | ^^^^^^^^^^ @@ -603,7 +603,7 @@ LL | #![no_main] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:885:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:911:5 | LL | #[no_main] type T = S; | ^^^^^^^^^^ @@ -614,7 +614,7 @@ LL | #![no_main] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:889:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:915:5 | LL | #[no_main] impl S { } | ^^^^^^^^^^ @@ -625,13 +625,13 @@ LL | #![no_main] impl S { } | + warning: crate-level attribute should be in the root module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:898:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:924:17 | LL | mod inner { #![no_builtins] } | ^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:901:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:927:5 | LL | #[no_builtins] fn f() { } | ^^^^^^^^^^^^^^ @@ -642,7 +642,7 @@ LL | #![no_builtins] fn f() { } | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:905:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:931:5 | LL | #[no_builtins] struct S; | ^^^^^^^^^^^^^^ @@ -653,7 +653,7 @@ LL | #![no_builtins] struct S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:909:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:935:5 | LL | #[no_builtins] type T = S; | ^^^^^^^^^^^^^^ @@ -664,7 +664,7 @@ LL | #![no_builtins] type T = S; | + warning: crate-level attribute should be an inner attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:913:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:939:5 | LL | #[no_builtins] impl S { } | ^^^^^^^^^^^^^^ @@ -1219,7 +1219,7 @@ LL | #[link_section = "1800"] | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on modules --> $DIR/issue-43106-gating-of-builtin-attrs.rs:665:17 @@ -1228,7 +1228,7 @@ LL | mod inner { #![link_section="1800"] } | ^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on structs --> $DIR/issue-43106-gating-of-builtin-attrs.rs:673:5 @@ -1237,7 +1237,7 @@ LL | #[link_section = "1800"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on type aliases --> $DIR/issue-43106-gating-of-builtin-attrs.rs:679:5 @@ -1246,7 +1246,7 @@ LL | #[link_section = "1800"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[link_section]` attribute cannot be used on inherent impl blocks --> $DIR/issue-43106-gating-of-builtin-attrs.rs:685:5 @@ -1255,10 +1255,19 @@ LL | #[link_section = "1800"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics + +warning: `#[link_section]` attribute cannot be used on traits + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:691:5 + | +LL | #[link_section = "1800"] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = help: `#[link_section]` can be applied to functions and statics warning: `#[must_use]` attribute cannot be used on modules - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:746:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:772:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -1267,7 +1276,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on modules - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:751:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:777:17 | LL | mod inner { #![must_use] } | ^^^^^^^^^^^^ @@ -1276,7 +1285,7 @@ LL | mod inner { #![must_use] } = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on type aliases - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:760:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5 | LL | #[must_use] type T = S; | ^^^^^^^^^^^ @@ -1285,7 +1294,7 @@ LL | #[must_use] type T = S; = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: `#[must_use]` attribute cannot be used on inherent impl blocks - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:765:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:791:5 | LL | #[must_use] impl S { } | ^^^^^^^^^^^ @@ -1294,13 +1303,13 @@ LL | #[must_use] impl S { } = help: `#[must_use]` can be applied to functions, data types, unions, and traits warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:797:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:823:1 | LL | #[crate_name = "0900"] | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:799:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:825:1 | LL | / mod crate_name { LL | | @@ -1310,67 +1319,67 @@ LL | | } | |_^ warning: the `#![crate_name]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:801:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:827:17 | LL | mod inner { #![crate_name="0900"] } | ^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:830:5 | LL | #[crate_name = "0900"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:804:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:830:28 | LL | #[crate_name = "0900"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:834:5 | LL | #[crate_name = "0900"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:808:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:834:28 | LL | #[crate_name = "0900"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:838:5 | LL | #[crate_name = "0900"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:812:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:838:28 | LL | #[crate_name = "0900"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![crate_name]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:842:5 | LL | #[crate_name = "0900"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:816:28 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:842:28 | LL | #[crate_name = "0900"] impl S { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:918:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:944:1 | LL | #[recursion_limit="0200"] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:920:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:946:1 | LL | / mod recursion_limit { LL | | @@ -1380,67 +1389,67 @@ LL | | } | |_^ warning: the `#![recursion_limit]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:922:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:948:17 | LL | mod inner { #![recursion_limit="0200"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:925:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:951:5 | LL | #[recursion_limit="0200"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:925:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:951:31 | LL | #[recursion_limit="0200"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:929:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:955:5 | LL | #[recursion_limit="0200"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:929:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:955:31 | LL | #[recursion_limit="0200"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:933:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:959:5 | LL | #[recursion_limit="0200"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:933:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:959:31 | LL | #[recursion_limit="0200"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![recursion_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:937:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:963:5 | LL | #[recursion_limit="0200"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:937:31 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:963:31 | LL | #[recursion_limit="0200"] impl S { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:942:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:968:1 | LL | #[type_length_limit="0100"] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this module - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:944:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:970:1 | LL | / mod type_length_limit { LL | | @@ -1450,55 +1459,55 @@ LL | | } | |_^ warning: the `#![type_length_limit]` attribute can only be used at the crate root - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:946:17 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:972:17 | LL | mod inner { #![type_length_limit="0100"] } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:949:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:975:5 | LL | #[type_length_limit="0100"] fn f() { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this function - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:949:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:975:33 | LL | #[type_length_limit="0100"] fn f() { } | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:953:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:979:5 | LL | #[type_length_limit="0100"] struct S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this struct - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:953:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:979:33 | LL | #[type_length_limit="0100"] struct S; | ^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:957:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:983:5 | LL | #[type_length_limit="0100"] type T = S; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this type alias - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:957:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:983:33 | LL | #[type_length_limit="0100"] type T = S; | ^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![type_length_limit]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:961:5 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:987:5 | LL | #[type_length_limit="0100"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: This attribute does not have an `!`, which means it is applied to this implementation block - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:961:33 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:987:33 | LL | #[type_length_limit="0100"] impl S { } | ^^^^^^^^^^ @@ -1555,7 +1564,7 @@ LL | #![link_section = "1800"] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = help: `#[link_section]` can be applied to statics and functions + = help: `#[link_section]` can be applied to functions and statics warning: `#[must_use]` attribute cannot be used on crates --> $DIR/issue-43106-gating-of-builtin-attrs.rs:84:1 @@ -1566,5 +1575,5 @@ LL | #![must_use] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = help: `#[must_use]` can be applied to functions, data types, unions, and traits -warning: 173 warnings emitted +warning: 174 warnings emitted diff --git a/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs b/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs new file mode 100644 index 0000000000000..ff52b70c2528d --- /dev/null +++ b/tests/ui/impl-trait/member-constraints/placeholders_lift_to_static.rs @@ -0,0 +1,33 @@ +//@ check-pass + +// We have some `RPIT` with an item bound of `for<'a> Outlives<'a>`. We +// infer a hidden type of `&'?x i32` where `'?x` is required to outlive +// some placeholder `'!a` due to the `for<'a> Outlives<'a>` item bound. +// +// We previously did not write constraints of the form `'?x: '!a` into +// `'?x: 'static`. This caused member constraints to bail and not consider +// `'?x` to be constrained to an arg region. + +pub trait Outlives<'a> {} +impl<'a, T: 'a> Outlives<'a> for T {} + +pub fn foo() -> impl for<'a> Outlives<'a> { + let x: &'static i32 = &1; + x +} + +// This *didn't* regress but feels like it's "the same thing" so +// test it anyway +pub fn bar() -> impl Sized { + let x: &'static i32 = &1; + hr_outlives(x) +} + +fn hr_outlives(v: T) -> T +where + for<'a> T: 'a +{ + v +} + +fn main() {} diff --git a/tests/ui/impl-trait/nested-rpit-hrtb.rs b/tests/ui/impl-trait/nested-rpit-hrtb.rs index f4ff13d6c20f9..11d79bcff7371 100644 --- a/tests/ui/impl-trait/nested-rpit-hrtb.rs +++ b/tests/ui/impl-trait/nested-rpit-hrtb.rs @@ -48,7 +48,6 @@ fn one_hrtb_mention_fn_trait_param_uses<'b>() -> impl for<'a> Bar<'a, Assoc = im // This should resolve. fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'b> {} //~^ ERROR implementation of `Bar` is not general enough -//~| ERROR lifetime may not live long enough // This should resolve. fn two_htrb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Qux<'b>> {} diff --git a/tests/ui/impl-trait/nested-rpit-hrtb.stderr b/tests/ui/impl-trait/nested-rpit-hrtb.stderr index 93cd7bd788f45..2e95ef370c7fd 100644 --- a/tests/ui/impl-trait/nested-rpit-hrtb.stderr +++ b/tests/ui/impl-trait/nested-rpit-hrtb.stderr @@ -1,5 +1,5 @@ error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/nested-rpit-hrtb.rs:57:77 + --> $DIR/nested-rpit-hrtb.rs:56:77 | LL | fn two_htrb_outlives() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Sized + 'b> {} | ^^ undeclared lifetime @@ -15,7 +15,7 @@ LL | fn two_htrb_outlives<'b>() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Siz | ++++ error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/nested-rpit-hrtb.rs:65:82 + --> $DIR/nested-rpit-hrtb.rs:64:82 | LL | fn two_htrb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Sized + 'b> {} | ^^ undeclared lifetime @@ -87,12 +87,6 @@ LL | fn one_hrtb_mention_fn_trait_param_uses<'b>() -> impl for<'a> Bar<'a, Assoc but trait `Qux<'_>` is implemented for `()` = help: for that trait implementation, expected `()`, found `&'a ()` -error: lifetime may not live long enough - --> $DIR/nested-rpit-hrtb.rs:49:93 - | -LL | fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'b> {} - | -- lifetime `'b` defined here ^^ opaque type requires that `'b` must outlive `'static` - error: implementation of `Bar` is not general enough --> $DIR/nested-rpit-hrtb.rs:49:93 | @@ -103,7 +97,7 @@ LL | fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = = note: ...but it actually implements `Bar<'0>`, for some specific lifetime `'0` error[E0277]: the trait bound `for<'a, 'b> &'a (): Qux<'b>` is not satisfied - --> $DIR/nested-rpit-hrtb.rs:61:64 + --> $DIR/nested-rpit-hrtb.rs:60:64 | LL | fn two_htrb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Qux<'b>> {} | ^^^^^^^^^^^^^^^^^^^^ the trait `for<'a, 'b> Qux<'b>` is not implemented for `&'a ()` @@ -112,7 +106,7 @@ LL | fn two_htrb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> but trait `Qux<'_>` is implemented for `()` = help: for that trait implementation, expected `()`, found `&'a ()` -error: aborting due to 10 previous errors +error: aborting due to 9 previous errors Some errors have detailed explanations: E0261, E0277, E0657. For more information about an error, try `rustc --explain E0261`. diff --git a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs b/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs deleted file mode 100644 index 35d5d079c6894..0000000000000 --- a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![feature(lang_items, no_core)] -#![no_core] -#![no_main] - -#[lang = "pointee_sized"] -pub trait PointeeSized {} - -#[lang = "meta_sized"] -pub trait MetaSized: PointeeSized {} - -#[lang = "sized"] -trait Sized: MetaSized { } - -struct S; - -#[no_mangle] -extern "C" fn main(argc: i32, _argv: *const *const u8) -> i32 { - argc //~ ERROR requires `copy` lang_item -} diff --git a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr b/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr deleted file mode 100644 index 7b9541f734fa8..0000000000000 --- a/tests/ui/lang-items/missing-copy-lang-item-issue-19660.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: requires `copy` lang_item - --> $DIR/missing-copy-lang-item-issue-19660.rs:18:5 - | -LL | argc - | ^^^^ - -error: aborting due to 1 previous error - diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs new file mode 100644 index 0000000000000..74717755ca336 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/auxiliary/external-macros.rs @@ -0,0 +1,12 @@ +//! The macros that are in `../user-defined-macros.rs`, but external to test diagnostics. +//@ edition: 2024 + +#[macro_export] +macro_rules! wrap { + ($arg:expr) => { { &$arg } } +} + +#[macro_export] +macro_rules! print_with_internal_wrap { + () => { println!("{:?}{}", (), $crate::wrap!(String::new())) } +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs new file mode 100644 index 0000000000000..c3f407633dcb8 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.rs @@ -0,0 +1,12 @@ +//! Some temporaries are implemented as local variables bound with `super let`. These can be +//! lifetime-extended, and as such are subject to shortening after #145838. +//@ edition: 2024 +//@ check-pass + +fn main() { + // The `()` argument to the inner `format_args!` is promoted, but the lifetimes of the internal + // `super let` temporaries in its expansion shorten, making this an error in Rust 1.92. + println!("{:?}{}", (), { format_args!("{:?}", ()) }); + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr new file mode 100644 index 0000000000000..4dee6f4fc3212 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/extended-super-let-bindings.stderr @@ -0,0 +1,15 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/extended-super-let-bindings.rs:9:30 + | +LL | println!("{:?}{}", (), { format_args!("{:?}", ()) }); + | ^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: 1 warning emitted + diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr new file mode 100644 index 0000000000000..c7a7e1b3238e9 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2021.stderr @@ -0,0 +1,92 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:33:43 + | +LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + | ^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:36:43 + | +LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + | ^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:39:43 + | +LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:58:17 + | +LL | &*&*smart_ptr_temp() + | ^^^^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:54:14 + | +LL | &struct_temp().field + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:50:14 + | +LL | &tuple_temp().0 + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:46:14 + | +LL | &array_temp()[0] + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: 7 warnings emitted + diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr new file mode 100644 index 0000000000000..0c61fd8d1b0e1 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.e2024.stderr @@ -0,0 +1,188 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:26:29 + | +LL | println!("{:?}{:?}", { &temp() }, ()); + | ^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:33:43 + | +LL | println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + | ^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:36:43 + | +LL | println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + | ^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:39:43 + | +LL | println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:58:17 + | +LL | &*&*smart_ptr_temp() + | ^^^^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:54:14 + | +LL | &struct_temp().field + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:50:14 + | +LL | &tuple_temp().0 + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:46:14 + | +LL | &array_temp()[0] + | ^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | } else if cond() { + | - ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:65:18 + | +LL | pin!(pin!({ &temp() })); + | ^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:96:13 + | +LL | pin!({ &(1 / 0) }); + | ^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:99:17 + | +LL | pin!({ &mut [()] }); + | ^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:102:13 + | +LL | pin!({ &Some(String::new()) }); + | ^^^^^^^^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:105:13 + | +LL | pin!({ &(|| ())() }); + | ^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:108:13 + | +LL | pin!({ &|| &local }); + | ^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/macro-extended-temporary-scopes.rs:111:13 + | +LL | pin!({ &CONST_STRING }); + | ^^^^^^^^^^^^ - ...which will be dropped at the end of this block in Rust 1.92 + | | + | this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: 15 warnings emitted + diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs new file mode 100644 index 0000000000000..b6ffa5247e30c --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/macro-extended-temporary-scopes.rs @@ -0,0 +1,117 @@ +//! Future-compatibility warning test for #145838: make sure we catch all expected breakage. +//! Shortening temporaries in the tails of block expressions should warn in Rust 2024, and +//! shortening temporaries in the tails of `if` expressions' blocks should warn in all editions. +//@ revisions: e2021 e2024 +//@ [e2021] edition: 2021 +//@ [e2024] edition: 2024 +//@ check-pass +use std::pin::pin; + +struct Struct { field: () } + +fn cond() -> bool { true } +fn temp() {} +fn array_temp() -> [(); 1] { [()] } +fn tuple_temp() -> ((),) { ((),) } +fn struct_temp() -> Struct { Struct { field: () } } +fn smart_ptr_temp() -> Box<()> { Box::new(()) } + +const CONST_STRING: String = String::new(); +static STATIC_UNIT: () = (); + +fn main() { + let local = String::new(); + + // #145880 doesn't apply here, so this `temp()`'s lifetime is reduced by #145838 in Rust 2024. + println!("{:?}{:?}", { &temp() }, ()); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + + // In real-world projects, this breakage typically appeared in `if` expressions with a reference + // to a `String` temporary in one branch's tail expression. This is edition-independent since + // `if` expressions' blocks are temporary scopes in all editions. + println!("{:?}{:?}", (), if cond() { &format!("") } else { "" }); + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + println!("{:?}{:?}", (), if cond() { &"".to_string() } else { "" }); + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + println!("{:?}{:?}", (), if cond() { &("string".to_owned() + "string") } else { "" }); + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + + // Make sure we catch indexed and dereferenced temporaries. + pin!( + if cond() { + &array_temp()[0] + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + } else if cond() { + &tuple_temp().0 + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + } else if cond() { + &struct_temp().field + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + } else { + &*&*smart_ptr_temp() + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + } + ); + + // Test that `super let` extended by parent `super let`s in non-extending blocks are caught. + pin!(pin!({ &temp() })); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + + // We shouldn't warn when lifetime extension applies. + let _ = format_args!("{:?}{:?}", { &temp() }, if cond() { &temp() } else { &temp() }); + let _ = pin!( + if cond() { + &array_temp()[0] + } else if cond() { + &tuple_temp().0 + } else if cond() { + &struct_temp().field + } else { + &*&*smart_ptr_temp() + } + ); + let _ = pin!(pin!({ &temp() })); + + // We shouldn't warn when borrowing from non-temporary places. + pin!({ &local }); + pin!({ &STATIC_UNIT }); + + // We shouldn't warn for promoted constants. + pin!({ &size_of::<()>() }); + pin!({ &(1 / 1) }); + pin!({ &mut ([] as [(); 0]) }); + pin!({ &None:: }); + pin!({ &|| String::new() }); + + // But we do warn on these temporaries, since they aren't promoted. + pin!({ &(1 / 0) }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + pin!({ &mut [()] }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + pin!({ &Some(String::new()) }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + pin!({ &(|| ())() }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + pin!({ &|| &local }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + pin!({ &CONST_STRING }); + //[e2024]~^ WARN temporary lifetime will be shortened in Rust 1.92 + //[e2024]~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + + // This lint only catches future errors. Future dangling pointers do not produce warnings. + pin!({ &raw const *&temp() }); +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs new file mode 100644 index 0000000000000..ba84489bab23e --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.rs @@ -0,0 +1,15 @@ +//! Test that `macro_extended_temporary_scopes` doesn't warn on non-extended temporaries. +//@ edition: 2024 +#![deny(macro_extended_temporary_scopes)] + +fn temp() {} + +fn main() { + // Due to #145880, this argument isn't an extending context. + println!("{:?}", { &temp() }); + //~^ ERROR temporary value dropped while borrowed + + // Subexpressions of function call expressions are not extending. + println!("{:?}{:?}", (), { std::convert::identity(&temp()) }); + //~^ ERROR temporary value dropped while borrowed +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr new file mode 100644 index 0000000000000..9e981874651f9 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/non-extended.stderr @@ -0,0 +1,27 @@ +error[E0716]: temporary value dropped while borrowed + --> $DIR/non-extended.rs:9:25 + | +LL | println!("{:?}", { &temp() }); + | ---^^^^^--- + | | | | + | | | temporary value is freed at the end of this statement + | | creates a temporary value which is freed while still in use + | borrow later used here + | + = note: consider using a `let` binding to create a longer lived value + +error[E0716]: temporary value dropped while borrowed + --> $DIR/non-extended.rs:13:56 + | +LL | println!("{:?}{:?}", (), { std::convert::identity(&temp()) }); + | --------------------------^^^^^^--- + | | | | + | | | temporary value is freed at the end of this statement + | | creates a temporary value which is freed while still in use + | borrow later used here + | + = note: consider using a `let` binding to create a longer lived value + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0716`. diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs new file mode 100644 index 0000000000000..6290b0eab8dac --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.rs @@ -0,0 +1,55 @@ +//! Test that the future-compatibility warning for #145838 doesn't break in the presence of +//! user-defined macros. +//@ build-pass +//@ edition: 2024 +//@ aux-build:external-macros.rs +//@ dont-require-annotations: NOTE + +extern crate external_macros; + +macro_rules! wrap { + ($arg:expr) => { { &$arg } } +} + +macro_rules! print_with_internal_wrap { + () => { println!("{:?}{}", (), wrap!(String::new())) } + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! +} + +fn main() { + print!( + "{:?}{}", + (), + format_args!( + "{:?}{:?}", + + // This is promoted; do not warn. + wrap!(None::), + + // This does not promote; warn. + wrap!(String::new()) + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + ) + ); + + print_with_internal_wrap!(); + //~^ NOTE in this expansion of print_with_internal_wrap! + + print!( + "{:?}{:?}", + + // This is promoted; do not warn. + external_macros::wrap!(None::), + + // This does not promote; warn. + external_macros::wrap!(String::new()) + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + ); + + external_macros::print_with_internal_wrap!(); + //~^ WARN temporary lifetime will be shortened in Rust 1.92 + //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! +} diff --git a/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr new file mode 100644 index 0000000000000..b4996952f4f11 --- /dev/null +++ b/tests/ui/lifetimes/lint-macro-extended-temporary-scopes/user-defined-macros.stderr @@ -0,0 +1,60 @@ +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:31:19 + | +LL | ($arg:expr) => { { &$arg } } + | - ...which will be dropped at the end of this block in Rust 1.92 +... +LL | wrap!(String::new()) + | ^^^^^^^^^^^^^ this expression creates a temporary value... + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: `#[warn(macro_extended_temporary_scopes)]` (part of `#[warn(future_incompatible)]`) on by default + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:15:42 + | +LL | ($arg:expr) => { { &$arg } } + | - ...which will be dropped at the end of this block in Rust 1.92 +... +LL | () => { println!("{:?}{}", (), wrap!(String::new())) } + | ^^^^^^^^^^^^^ this expression creates a temporary value... +... +LL | print_with_internal_wrap!(); + | --------------------------- in this macro invocation + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:47:32 + | +LL | external_macros::wrap!(String::new()) + | -----------------------^^^^^^^^^^^^^- + | | | + | | this expression creates a temporary value... + | ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + +warning: temporary lifetime will be shortened in Rust 1.92 + --> $DIR/user-defined-macros.rs:52:5 + | +LL | external_macros::print_with_internal_wrap!(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | this expression creates a temporary value... + | ...which will be dropped at the end of this block in Rust 1.92 + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see + = note: consider using a `let` binding to create a longer lived value + = note: this warning originates in the macro `external_macros::print_with_internal_wrap` (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: 4 warnings emitted + diff --git a/tests/ui/mir/gvn-loop-miscompile.rs b/tests/ui/mir/gvn-loop-miscompile.rs new file mode 100644 index 0000000000000..8e987c5c94662 --- /dev/null +++ b/tests/ui/mir/gvn-loop-miscompile.rs @@ -0,0 +1,34 @@ +//@ compile-flags: -O +//@ run-pass + +pub enum Value { + V0(i32), + V1, +} + +fn set_discriminant(val: &mut Value) -> Value { + let val_alias: &Value = get(val); + let mut stop = false; + let Value::V0(v) = *val_alias else { + unreachable!(); + }; + loop { + let v = Value::V0(v); + if stop { + return v; + } + stop = true; + *val = Value::V1; + } +} + +fn main() { + let mut v = Value::V0(1); + let v = set_discriminant(&mut v); + assert!(matches!(v, Value::V0(1))); +} + +#[inline(never)] +fn get(v: &T) -> &T { + v +} diff --git a/tests/ui/nll/ice-106874.stderr b/tests/ui/nll/ice-106874.stderr index 0edbd7b44ef1c..629570b602ed6 100644 --- a/tests/ui/nll/ice-106874.stderr +++ b/tests/ui/nll/ice-106874.stderr @@ -17,6 +17,20 @@ LL | A(B(C::new(D::new(move |st| f(st))))) = note: ...but it actually implements `FnOnce<(&'1 mut V,)>`, for some specific lifetime `'1` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` +error: higher-ranked subtype error + --> $DIR/ice-106874.rs:8:5 + | +LL | A(B(C::new(D::new(move |st| f(st))))) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/ice-106874.rs:8:5 + | +LL | A(B(C::new(D::new(move |st| f(st))))) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` + error: implementation of `FnOnce` is not general enough --> $DIR/ice-106874.rs:8:7 | @@ -75,17 +89,5 @@ LL | A(B(C::new(D::new(move |st| f(st))))) = note: ...but it actually implements `Fn<(&'2 mut V,)>`, for some specific lifetime `'2` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` -error: higher-ranked subtype error - --> $DIR/ice-106874.rs:8:7 - | -LL | A(B(C::new(D::new(move |st| f(st))))) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: higher-ranked subtype error - --> $DIR/ice-106874.rs:8:41 - | -LL | A(B(C::new(D::new(move |st| f(st))))) - | ^ - error: aborting due to 10 previous errors