Rust 1.83.0
Language
- Stabilize
&mut,*mut,&Cell, and*const Cellin const. - Allow creating references to statics in
constinitializers. - Implement raw lifetimes and labels (
'r#ident). - Define behavior when atomic and non-atomic reads race.
- Non-exhaustive structs may now be empty.
- Disallow implicit coercions from places of type
! const externfunctions can now be defined for other calling conventions.- Stabilize
expr_2021macro fragment specifier in all editions. - The
non_local_definitionslint now fires on less code and warns by default.
Compiler
- Deprecate unsound
-Csoft-floatflag. - Add many new tier 3 targets:
Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- Implement
PartialEqforExitCode. - Document that
catch_unwindcan deal with foreign exceptions without UB, although the exact behavior is unspecified. - Implement
DefaultforHashMap/HashSetiterators that don't already have it. - Bump Unicode to version 16.0.0.
- Change documentation of
ptr::add/subto not claim equivalence withoffset.
Stabilized APIs
BufRead::skip_untilControlFlow::break_valueControlFlow::continue_valueControlFlow::map_breakControlFlow::map_continueDebugList::finish_non_exhaustiveDebugMap::finish_non_exhaustiveDebugSet::finish_non_exhaustiveDebugTuple::finish_non_exhaustiveErrorKind::ArgumentListTooLongErrorKind::DeadlockErrorKind::DirectoryNotEmptyErrorKind::ExecutableFileBusyErrorKind::FileTooLargeErrorKind::HostUnreachableErrorKind::IsADirectoryErrorKind::NetworkDownErrorKind::NetworkUnreachableErrorKind::NotADirectoryErrorKind::NotSeekableErrorKind::ReadOnlyFilesystemErrorKind::ResourceBusyErrorKind::StaleNetworkFileHandleErrorKind::StorageFullErrorKind::TooManyLinksOption::get_or_insert_defaultWaker::dataWaker::newWaker::vtablechar::MINhash_map::Entry::insert_entryhash_map::VacantEntry::insert_entry
These APIs are now stable in const contexts:
Cell::into_innerDuration::as_secs_f32Duration::as_secs_f64Duration::div_duration_f32Duration::div_duration_f64MaybeUninit::as_mut_ptrNonNull::as_mutNonNull::copy_fromNonNull::copy_from_nonoverlappingNonNull::copy_toNonNull::copy_to_nonoverlappingNonNull::slice_from_raw_partsNonNull::writeNonNull::write_bytesNonNull::write_unalignedOnceCell::into_innerOption::as_mutOption::expectOption::replaceOption::takeOption::unwrapOption::unwrap_uncheckedOption::<&_>::copiedOption::<&mut _>::copiedOption::<Option<_>>::flattenOption::<Result<_, _>>::transposeRefCell::into_innerResult::as_mutResult::<&_, _>::copiedResult::<&mut _, _>::copiedResult::<Option<_>, _>::transposeUnsafeCell::get_mutUnsafeCell::into_innerarray::from_mutchar::encode_utf8{float}::classify{float}::is_finite{float}::is_infinite{float}::is_nan{float}::is_normal{float}::is_sign_negative{float}::is_sign_positive{float}::is_subnormal{float}::from_bits{float}::from_be_bytes{float}::from_le_bytes{float}::from_ne_bytes{float}::to_bits{float}::to_be_bytes{float}::to_le_bytes{float}::to_ne_bytesmem::replaceptr::replaceptr::slice_from_raw_parts_mutptr::writeptr::write_unaligned<*const _>::copy_to<*const _>::copy_to_nonoverlapping<*mut _>::copy_from<*mut _>::copy_from_nonoverlapping<*mut _>::copy_to<*mut _>::copy_to_nonoverlapping<*mut _>::write<*mut _>::write_bytes<*mut _>::write_unalignedslice::from_mutslice::from_raw_parts_mut<[_]>::first_mut<[_]>::last_mut<[_]>::first_chunk_mut<[_]>::last_chunk_mut<[_]>::split_at_mut<[_]>::split_at_mut_checked<[_]>::split_at_mut_unchecked<[_]>::split_first_mut<[_]>::split_last_mut<[_]>::split_first_chunk_mut<[_]>::split_last_chunk_mutstr::as_bytes_mutstr::as_mut_ptrstr::from_utf8_unchecked_mut
Cargo
- Introduced a new
CARGO_MANIFEST_PATHenvironment variable, similar toCARGO_MANIFEST_DIRbut pointing directly to the manifest file. - Added
package.autolibto the manifest, allowing[lib]auto-discovery to be disabled. - Declare support level for each crate in Cargo's Charter / crate docs.
- Declare new Intentional Artifacts as 'small' changes.
Rustdoc
- The sidebar / hamburger menu table of contents now includes the
# headersfrom the main item's doc comment. This is similar to a third-party feature provided by the rustdoc-search-enhancements browser extension.
Compatibility Notes
-
Warn against function pointers using unsupported ABI strings.
-
Check well-formedness of the source type's signature in fn pointer casts. This partly closes a soundness hole that comes when casting a function item to function pointer
-
Use equality instead of subtyping when resolving type dependent paths.
-
Linking on macOS now correctly includes Rust's default deployment target. Due to a linker bug, you might have to pass
MACOSX_DEPLOYMENT_TARGETor fix your#[link]attributes to point to the correct frameworks. See #129369. -
The future incompatibility lint
deprecated_cfg_attr_crate_type_namehas been made into a hard error. It was used to deny usage of#![crate_type]and#![crate_name]attributes in#![cfg_attr], which required a hack in the compiler to be able to change the used crate type and crate name after cfg expansion. Users can use--crate-typeinstead of#![cfg_attr(..., crate_type = "...")]and--crate-nameinstead of#![cfg_attr(..., crate_name = "...")]when runningrustc/cargo rustcon the command line. Use of those two attributes outside of#![cfg_attr]continue to be fully supported. -
Until now, paths into the sysroot were always prefixed with
/rustc/$hashin diagnostics, codegen, backtrace, e.g.thread 'main' panicked at 'hello world', map-panic.rs:2:50 stack backtrace: 0: std::panicking::begin_panic at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:616:12 1: map_panic::main::{{closure}} at ./map-panic.rs:2:50 2: core::option::Option<T>::map at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/option.rs:929:29 3: map_panic::main at ./map-panic.rs:2:30 4: core::ops::function::FnOnce::call_once at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.We want to change this behaviour such that, when
rust-srcsource files can be discovered, the virtual path is discarded and therefore the local path will be embedded, unless there is a--remap-path-prefixthat causes this local path to be remapped in the usual way.#129687 implements this behaviour, when
rust-srcis present at compile time,rustcreplaces/rustc/$hashwith a real path into the localrust-srccomponent with best effort. To sanitize this, users must explicitly supply--remap-path-prefix=<path to rust-src>=fooor not have therust-srccomponent installed. -
The allow-by-default
missing_docslint used to disable itself when invoked throughrustc --test/cargo test, resulting in#[expect(missing_docs)]emitting false positives due to the expectation being wrongly unfulfilled. This behavior has now been removed, which allows#[expect(missing_docs)]to be fulfilled in all scenarios, but will also report newmissing_docsdiagnostics for publicly reachable#[cfg(test)]items, integration test crate-level documentation, and publicly reachable items in integration tests. -
The
armv8r-none-eabihftarget now uses the Armv8-R required set of floating-point features. -
The sysroot no longer contains the
stddynamic library in its top-levellib/dir.