Rust 1.81.0
Released on September 5, 2024
What's Changed
- 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_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.
- 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.
- 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::sortandslice::select_nthmethods 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). core::errorhint::assert_uncheckedfs::existsAtomicBool::fetch_notDuration::abs_diffIoSlice::advanceIoSlice::advance_slicesIoSliceMut::advanceIoSliceMut::advance_slicesPanicHookInfoPanicInfo::messagePanicMessagechar::from_u32_unchecked(function)char::from_u32_unchecked(method)CStr::count_bytesCStr::from_ptr
- 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.
- 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
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
---------------
These APIs are now stable in const contexts:
- char::from_u32_unchecked (function)
- char::from_u32_unchecked (method)
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.
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.