← Back to all releases

Rust 1.81.0

Released on September 5, 2024

What's Changed

  • Usage of the wasm32-wasi target will now issue a compiler warning and request users switch to the wasm32-wasip1 target instead. Both targets are the same, wasm32-wasi is only being renamed, and this change to the WASI target is being done to enable removing wasm32-wasi in January 2025.
  • We have renamed std::panic::PanicInfo to std::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, and PartialEq) 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
Full Changelog

Language

--------

- Abort on uncaught panics in extern "C" functions.

- Fix ambiguous cases of multiple & in elided self lifetimes.

- Stabilize #[expect] for lints (RFC 2383), 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_constant to 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.

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 transmute size checks.

- Remove the box_pointers lint.

- 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_std Xtensa targets: xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf

- Add Tier 3 std Xtensa targets: xtensa-esp32-espidf, xtensa-esp32s2-espidf, xtensa-esp32s3-espidf

- Add Tier 3 i686 Redox OS target: i686-unknown-redox

- Promote arm64ec-pc-windows-msvc to Tier 2.

- Promote loongarch64-unknown-linux-musl to 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.

Libraries

---------

- Split core's PanicInfo and std's PanicInfo. (see compatibility note below)

- Generalize {Rc,Arc}::make_mut() to unsized types.

- Replace sort implementations with stable driftsort and unstable ipnsort. All slice::sort and slice::select_nth methods are expected to see significant performance improvements. See the research project for more details.

- Document behavior of create_dir_all with 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).

Stabilized APIs

---------------

- 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

These APIs are now stable in const contexts:

- char::from_u32_unchecked (function)

- char::from_u32_unchecked (method)

- CStr::count_bytes

- CStr::from_ptr

Cargo

-----

- Generated .cargo_vcs_info.json is always included, even when --allow-dirty is passed.

- Disallow package.license-file and package.readme pointing to non-existent files during packaging.

- Disallow passing --release/--debug flag along with the --profile flag.

- Remove lib.plugin key support in Cargo.toml. Rust plugin support has been deprecated for four years and was removed in 1.75.0.

Compatibility Notes

-------------------

* Usage of the wasm32-wasi target will now issue a compiler warning and request users switch to the wasm32-wasip1 target instead. Both targets are the same, wasm32-wasi is only being renamed, and this change to the WASI target is being done to enable removing wasm32-wasi in January 2025.

* We have renamed std::panic::PanicInfo to std::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] 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, and PartialEq) 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.

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.

- Add a Rust-for-Linux auto CI job to check kernel builds.