The Rust Project Developers·Rustlang.Rust.GNU.LLVM
A language empowering everyone to build reliable and efficient software.
The Rust programming language helps you write faster, more reliable software. High-level ergonomics and low-level control are often at odds in programming language design; Rust challenges that conflict. Through balancing powerful technical capacity and a great developer experience, Rust gives you the option to control low-level details (such as memory usage) without all the hassle traditionally associated with such control.
Allow shortening lifetime of &mut when unsize-coercing, even in an invariant position. For example, you can now coerce a Cell<&'long mut i32> to a Cell<&'short mut dyn Send>. Such shortenings were already previously allowed when coercing a &mut to a &, or coercing a & to a &.
Add deny-by-default invalid_runtime_symbol_definitions lint and warn-by-default suspicious_runtime_symbol_definitions lint
The lints currently specifically targets core runtime symbols like memcmp, memset, strlen, ... and is planned to be expanded in the next few releases.
Add warn-by-default c_void_returns lint to check core::ffi::c_void as a return type
Platform Support
Add powerpc64-unknown-linux-gnuelfv2 as Tier 3
Add aarch64-unknown-linux-pauthtest as Tier 3 target
Promote thumbv7a-none-eabi to Tier 2
Promote thumbv7a-none-eabihf to Tier 2
Promote thumbv7r-none-eabi to Tier 2
Promote thumbv7r-none-eabihf to Tier 2
Promote thumbv8r-none-eabihf to Tier 2
Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
Change Location<'_> lifetime to 'static in Panic[Hook]Info
Document panic in RangeInclusive::from(legacy::RangeInclusive)
Document that ManuallyDrop's Box interaction has been fixed
Stabilize LoongArch CRC Intrinsics
The derive macro is available at {core,std}::derive. This was previously unintentionally stabilized in 1.96, but is now explicitly accepted as a stabilized API.
Please note that the MSRV for {core,std}::derive will be 1.96, and not 1.98.
Stabilized APIs
str::substr_range
core::fmt::NumBuffer
<{integer}>::format_into
Send/Sync for std::process::CommandArgs
{fN}::algebraic_add
{fN}::algebraic_sub
{fN}::algebraic_mul
{fN}::algebraic_div
{fN}::algebraic_rem
NonZero<{integer}>::from_str_radix
String::from_utf16le
String::from_utf16le_lossy
String::from_utf16be
String::from_utf16be_lossy
str::strip_circumfix
Atomic::from_mut
Atomic::get_mut_slice
Atomic::from_mut_slice
std::range::legacy
Compatibility Notes
If fully elided, lifetime bounds of trait object types may now resolve differently or even get rejected in very specific niche scenarios
Error in more cases of ambiguous imports
Switch the destructors implementation for thread locals on Windows to use Fiber Local Storage (FLS)
Convert some cases of the ambiguous_glob_imports lint into a hard error
Where-bounds of the form Type = Type and Type == Type are no longer syntactically allowed
Ensure Send/Sync is not implemented for std::env::Vars{,Os}
Fix that in some attributes, arguments were not properly rejected
repr(transparent) is now more strict about which fields have "trivial" layout and hence can be ignored: repr(C) types, types with private fields, and #[non_exhaustive] types are no longer considered "trivial"
Correctly check whether types have equal size in transmute() when some repr attributes are involved.
More characters are escaped when printing strings and chars
Implement fast path for derive(PartialOrd) when deriving Ord This can break crates in practice where a type's PartialOrd and Ord impls were inconsistent with each other.
Add temporary scope to assert_eq and assert_ne
Closed a hole in the pattern matching structural equality check, preventing cases where a match of a constant would be allowed, despite disagreeing with a manually written PartialEq implementation, when a derive(PartialEq) implementation for that type also exists.
On Emscripten the WASM exception handling ABI is now unconditionally used The -Zemscripten-wasm-eh=false flag to switch back to JS exceptions has been removed.
The UNSAFE_CODE lint is now consistently emitted for all unsafe attributes
Solaris: remove File::lock implementation, it has the wrong semantics (return "unsupported" instead)
Windows-gnu targets now specify baseline tools versions
rustfmt now discovers module files that are defined in cfg_select! This may cause more code to be formatted which was previously ignored.