The Rust team is happy to announce a new version of Rust, 1.71.0. Rust is a programming language empowering everyone to build reliable and efficient software.
If you have a previous version of Rust installed via rustup, you can get 1.71.0 with:
$ rustup update stable
If you don't have it already, you can get rustup
from the appropriate page on our website, and check out the detailed release notes for 1.71.0 on GitHub.
If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (rustup default beta
) or the nightly channel (rustup default nightly
). Please report any bugs you might come across!
What's in 1.71.0 stable
C-unwind ABI
1.71.0 stabilizes C-unwind
(and other -unwind
suffixed ABI variants1).
The behavior for unforced unwinding (the typical case) is specified in this table from the RFC which proposed this feature. To summarize:
Each ABI is mostly equivalent to the same ABI without -unwind
, except that
with -unwind
the behavior is defined to be safe when an unwinding operation
(panic
or C++ style exception) crosses the ABI boundary. For panic=unwind
,
this is a valid way to let exceptions from one language unwind the stack in
another language without terminating the process (as long as the exception is
caught in the same language from which it originated); for panic=abort
, this
will typically abort the process immediately.
For this initial stabilization, no change is made to the existing ABIs (e.g.
"C"
), and unwinding across them remains undefined behavior. A future Rust
release will amend these ABIs to match the behavior specified in the RFC as the
final part in stabilizing this feature (usually aborting at the boundary).
Users are encouraged to start using the new unwind ABI variants in their code
to remain future proof if they need to unwind across the ABI boundary.
Debugger visualization attributes
1.71.0 stabilizes support for a new attribute, #[debug_visualizer(natvis_file = "...")]
and #[debug_visualizer(gdb_script_file = "...")]
, which allows
embedding Natvis descriptions and GDB scripts into Rust libraries to
improve debugger output when inspecting data structures created by those
libraries. Rust itself has packaged similar scripts for some time for the
standard library, but this feature makes it possible for library authors to
provide a similar experience to end users.
See the reference for details on usage.
raw-dylib linking
On Windows platforms, Rust now supports using functions from dynamic libraries without requiring those libraries to be available at build time, using the new kind="raw-dylib”
option for #[link]
.
This avoids requiring users to install those libraries (particularly difficult for cross-compilation), and avoids having to ship stub versions of libraries in crates to link against. This simplifies crates providing bindings to Windows libraries.
Rust also supports binding to symbols provided by DLLs by ordinal rather than named symbol, using the new #[link_ordinal]
attribute.
Upgrade to musl 1.2
As previously announced, Rust 1.71 updates the musl version to 1.2.3. Most users should not be affected by this change.
Const-initialized thread locals
Rust 1.59.0 stabilized const
initialized thread local support in the standard
library, which allows for more optimal code generation. However, until now this
feature was missed in release notes and
documentation.
Note that this stabilization does not make const { ... }
a valid expression
or syntax in other contexts; that is a separate and currently unstable
feature.
use std::cell::Cell;
thread_local! {
pub static FOO: Cell<u32> = const { Cell::new(1) };
}
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
Other changes
Check out everything that changed in Rust, Cargo, and Clippy.
Contributors to 1.71.0
Many people came together to create Rust 1.71.0. We couldn't have done it without all of you. Thanks!
-
List of stabilized ABIs can be found in the stabilization report ↩