Rust 1.71.0
Language
- Stabilize
raw-dylib
,link_ordinal
,import_name_type
and-Cdlltool
. - Uplift
clippy::{drop,forget}_{ref,copy}
lints. - Type inference is more conservative around constrained vars.
- Use fulfillment to check
Drop
impl compatibility
Compiler
- Evaluate place expression in
PlaceMention
, makinglet _ =
patterns more consistent with respect to the borrow checker. - Add
--print deployment-target
flag for Apple targets. - Stabilize
extern "C-unwind"
and friends. The existingextern "C"
etc. may change behavior for cross-language unwinding in a future release. - Update the version of musl used on
*-linux-musl
targets to 1.2.3, enabling time64 on 32-bit systems. - Stabilize
debugger_visualizer
for embedding metadata like Microsoft's Natvis. - Enable flatten-format-args by default.
- Make
Self
respect tuple constructor privacy. - Improve niche placement by trying two strategies and picking the better result.
- Use
apple-m1
as the target CPU foraarch64-apple-darwin
. - Add Tier 3 support for the
x86_64h-apple-darwin
target. - Promote
loongarch64-unknown-linux-gnu
to Tier 2 with host tools.
Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- Rework handling of recursive panics. Additional panics are allowed while unwinding, as long as they are caught before escaping a
Drop
implementation, but panicking within a panic hook is now an immediate abort. - Loosen
From<&[T]> for Box<[T]>
bound toT: Clone
. - Remove unnecessary
T: Send
bound inError for mpsc::SendError<T>
andTrySendError<T>
. - Fix docs for
alloc::realloc
to matchLayout
requirements that the size must not exceedisize::MAX
. - Document
const {}
syntax forstd::thread_local
. This syntax was stabilized in Rust 1.59, but not previously mentioned in release notes.
Stabilized APIs
CStr::is_empty
BuildHasher::hash_one
NonZeroI*::is_positive
NonZeroI*::is_negative
NonZeroI*::checked_neg
NonZeroI*::overflowing_neg
NonZeroI*::saturating_neg
NonZeroI*::wrapping_neg
Neg for NonZeroI*
Neg for &NonZeroI*
From<[T; N]> for (T...)
(array to N-tuple for N in 1..=12)From<(T...)> for [T; N]
(N-tuple to array for N in 1..=12)windows::io::AsHandle for Box<T>
windows::io::AsHandle for Rc<T>
windows::io::AsHandle for Arc<T>
windows::io::AsSocket for Box<T>
windows::io::AsSocket for Rc<T>
windows::io::AsSocket for Arc<T>
These APIs are now stable in const contexts:
<*const T>::read
<*const T>::read_unaligned
<*mut T>::read
<*mut T>::read_unaligned
ptr::read
ptr::read_unaligned
<[T]>::split_at
Cargo
- Allow named debuginfo options in
Cargo.toml
. - Add
workspace_default_members
to the output ofcargo metadata
. - Automatically inherit workspace fields when running
cargo new
/cargo init
.
Rustdoc
- Add a new
rustdoc::unescaped_backticks
lint for broken inline code. - Support strikethrough with single tildes. (
~~old~~
vs.~new~
)
Misc
Compatibility Notes
- Remove structural match from
TypeId
. Code that uses a constantTypeId
in a pattern will potentially be broken. Known cases have already been fixed -- in particular, users of thelog
crate'skv_unstable
feature should update tolog v0.4.18
or later. - Add a
sysroot
crate to represent the standard library crates. This does not affect stable users, but may require adjustment in tools that build their own standard library. - Cargo optimizes its usage under
rustup
. When Cargo detects it will runrustc
pointing to a rustup proxy, it'll try bypassing the proxy and use the underlying binary directly. There are assumptions around the interaction with rustup andRUSTUP_TOOLCHAIN
. However, it's not expected to affect normal users. - When querying a package, Cargo tries only the original name, all hyphens, and all underscores to handle misspellings. Previously, Cargo tried each combination of hyphens and underscores, causing excessive requests to crates.io.
- Cargo now disallows
RUSTUP_HOME
andRUSTUP_TOOLCHAIN
in the[env]
configuration table. This is considered to be not a use case Cargo would like to support, since it will likely cause problems or lead to confusion.
Internal Changes
These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.