Rust versions / 1.81
Rust release · Sep 5, 2024
Rust 1.81: what's new, what was stabilized
Short answerRust 1.81 was released on Sep 5, 2024: 1 language stabilization ([Stabilize #[expect] for lints (RFC 2383),](https://github.com/rust-lang/rust/pull/120924/...); 16 newly stable APIs (core::error, hint::assert_unchecked, fs::exists, AtomicBool::fetch_not, ...); 4 compatibility notes that can affect existing code.
← Rust 1.80All versionsRust 1.82 →
Language features stabilized
- [Stabilize #[expect] for lints (RFC 2383),](https://github.com/rust-lang/rust/pull/120924/) like #[allow] with a warning if the lint is _not_ fulfilled.
16 APIs stabilized
core::error, hint::assert_unchecked, fs::exists, AtomicBool::fetch_not, Duration::abs_diff, IoSlice::advance, IoSlice::advance_slices, IoSliceMut::advance, IoSliceMut::advance_slices, PanicHookInfo, PanicInfo::message, PanicMessage, char::from_u32_unchecked, char::from_u32_unchecked, CStr::count_bytes, CStr::from_ptr
Can it break my build?
The release lists these compatibility notes. Most only affect rare code, but read them before you raise your toolchain in CI:
- Usage of the
wasm32-wasitarget will now issue a compiler warning and request users switch to thewasm32-wasip1target instead. Both targets are the same,wasm32-wasiis only being renamed, and this change to the WASI target is being done to enable removingwasm32-wasiin January 2025. - We have renamed
std::panic::PanicInfotostd::panic::PanicHookInfo. The old name will continue to work as an alias, but will result in a deprecation warning starting in Rust 1.82.0. - The new sort implementations may panic if a type's implementation of
Ord(or the given comparison function) does not implement a total order as the trait requires.Ord's supertraits (PartialOrd,Eq, andPartialEq) must also be consistent. The previous implementations would not "notice" any problem, but the new implementations have a good chance of detecting inconsistencies, throwing a panic rather than returning knowingly unsorted data. - [In very rare cases, a change in the internal evaluation order of the trait
Use it
rustup update stable # get the newest release
rustup install 1.81 # or exactly this one
rustup override set 1.81 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.81" under [package] in Cargo.toml. Cargo then refuses to build it on older compilers with a clear message, and with resolver 3 (the default on the 2024 edition, Rust 1.85+) it also prefers dependency versions that support it.
Full release notes
Language
- Abort on uncaught panics in
extern "C"functions. - Fix ambiguous cases of multiple
&in elided self lifetimes. - [Stabilize
#[expect]for lints (RFC 2383),](https://github.com/rust-lang/rust/pull/120924/) like#[allow]with a warning if the lint is _not_ fulfilled. - Change method resolution to constrain hidden types instead of rejecting method candidates.
- Bump
elided_lifetimes_in_associated_constantto deny. offset_from: always allow pointers to point to the same address.- Allow constraining opaque types during subtyping in the trait system.
- Allow constraining opaque types during various unsizing casts.
- Deny keyword lifetimes pre-expansion.
<a id="1.81.0-Compiler"></a>
Compiler
- Make casts of pointers to trait objects stricter.
- Check alias args for well-formedness even if they have escaping bound vars.
- Deprecate no-op codegen option
-Cinline-threshold=.... - Re-implement a type-size based limit.
- Properly account for alignment in
transmutesize checks. - Remove the
box_pointerslint. - Ensure the interpreter checks bool/char for validity when they are used in a cast.
- Improve coverage instrumentation for functions containing nested items.
- Target changes:
- Add Tier 3
no_stdXtensa targets:xtensa-esp32-none-elf,xtensa-esp32s2-none-elf,xtensa-esp32s3-none-elf - Add Tier 3
stdXtensa targets:xtensa-esp32-espidf,xtensa-esp32s2-espidf,xtensa-esp32s3-espidf - Add Tier 3 i686 Redox OS target:
i686-unknown-redox - Promote
arm64ec-pc-windows-msvcto Tier 2. - Promote
loongarch64-unknown-linux-muslto Tier 2 with host tools. - Enable full tools and profiler for LoongArch Linux targets.
- Unconditionally warn on usage of
wasm32-wasi. (see compatibility note below) - Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support.
<a id="1.81.0-Libraries"></a>
Libraries
- Split core's
PanicInfoand std'sPanicInfo. (see compatibility note below) - Generalize
{Rc,Arc}::make_mut()to unsized types. - Replace sort implementations with stable
driftsortand unstableipnsort. Allslice::sort*andslice::select_nth*methods are expected to see significant performance improvements. See the research project for more details. - Document behavior of
create_dir_allwith respect to empty paths. - Fix interleaved output in the default panic hook when multiple threads panic simultaneously.
- Fix
Command's batch files argument escaping not working when file name has trailing whitespace or periods (CVE-2024-43402).
<a id="1.81.0-Stabilized-APIs"></a>
Stabilized APIs
core::errorhint::assert_uncheckedfs::existsAtomicBool::fetch_notDuration::abs_diffIoSlice::advanceIoSlice::advance_slicesIoSliceMut::advanceIoSliceMut::advance_slicesPanicHookInfoPanicInfo::messagePanicMessage
These APIs are now stable in const contexts:
char::from_u32_unchecked(function)char::from_u32_unchecked(method)CStr::count_bytesCStr::from_ptr
<a id="1.81.0-Cargo"></a>
Cargo
- Generated
.cargo_vcs_info.jsonis always included, even when--allow-dirtyis passed. - Disallow
package.license-fileandpackage.readmepointing to non-existent files during packaging. - Disallow passing
--release/--debugflag along with the--profileflag. - Remove
lib.pluginkey support inCargo.toml. Rust plugin support has been deprecated for four years and was removed in 1.75.0.
<a id="1.81.0-Compatibility-Notes"></a>
Compatibility Notes
- Usage of the
wasm32-wasitarget will now issue a compiler warning and request users switch to thewasm32-wasip1target instead. Both targets are the same,wasm32-wasiis only being renamed, and this change to the WASI target is being done to enable removingwasm32-wasiin January 2025.
- We have renamed
std::panic::PanicInfotostd::panic::PanicHookInfo. The old name will continue to work as an alias, but will result in a deprecation warning starting in Rust 1.82.0.
core::panic::PanicInfo will remain unchanged, however, as this is now a *different type*.
The reason is that these types have different roles: std::panic::PanicHookInfo is the argument to the panic hook in std context (where panics can have an arbitrary payload), while core::panic::PanicInfo is the argument to the [#[panic_handler]](https://doc.rust-lang.org/nomicon/panic-handler.html) in no_std context (where panics always carry a formatted *message*). Separating these types allows us to add more useful methods to these types, such as std::panic::PanicHookInfo::payload_as_str() and core::panic::PanicInfo::message().
- The new sort implementations may panic if a type's implementation of
Ord(or the given comparison function) does not implement a total order as the trait requires.Ord's supertraits (PartialOrd,Eq, andPartialEq) must also be consistent. The previous implementations would not "notice" any problem, but the new implementations have a good chance of detecting inconsistencies, throwing a panic rather than returning knowingly unsorted data. - In very rare cases, a change in the internal evaluation order of the trait solver may result in new fatal overflow errors.
<a id="1.81.0-Internal-Changes"></a>
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.
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.82Released Oct 17, 2024.Read it next →Also worth your time
Did this answer your question?