← Back to all releases

Rust 1.82.0

Released on October 17, 2024

What's Changed

Full Changelog

Language

--------

- Don't make statement nonterminals match pattern nonterminals

- Patterns matching empty types can now be omitted in common cases

- Enforce supertrait outlives obligations when using trait impls

- addr_of(_mut)! macros and the newly stabilized &raw (const|mut) are now safe to use with all static items

- size_of_val_raw: for length 0 this is safe to call

- Reorder trait bound modifiers after for<...> binder in trait bounds

- Stabilize + use<'lt> opaque type precise capturing (RFC 3617)

- Stabilize &raw const and &raw mut operators (RFC 2582)

- Stabilize unsafe extern blocks (RFC 3484)

- Stabilize nested field access in offset_of!

- Do not require T to be live when dropping [T; 0]

- Stabilize const operands in inline assembly

- Stabilize floating-point arithmetic in const fn

- Stabilize explicit opt-in to unsafe attributes

- Document NaN bit patterns guarantees

Compiler

--------

- Promote riscv64gc-unknown-linux-musl to tier 2

- Promote Mac Catalyst targets aarch64-apple-ios-macabi and x86_64-apple-ios-macabi to Tier 2, and ship them with rustup

- Add tier 3 NuttX based targets for RISC-V and ARM

- Add tier 3 powerpc-unknown-linux-muslspe target

- Improved diagnostics to explain why a pattern is unreachable

- The compiler now triggers the unreachable code warning properly for async functions that don't return/are -> !

- Promote aarch64-apple-darwin to Tier 1

- Add Trusty OS target aarch64-unknown-trusty and armv7-unknown-trusty as tier 3 targets

- Promote wasm32-wasip2 to Tier 2.

Libraries

---------

- Generalize {Rc,Arc}::make_mut() to Path, OsStr, and CStr.

Stabilized APIs

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

- std::thread::Builder::spawn_unchecked

- std::str::CharIndices::offset

- std::option::Option::is_none_or

- [T]::is_sorted

- [T]::is_sorted_by

- [T]::is_sorted_by_key

- Iterator::is_sorted

- Iterator::is_sorted_by

- Iterator::is_sorted_by_key

- std::future::Ready::into_inner

- std::iter::repeat_n

- impl DoubleEndedIterator for Take>

- impl ExactSizeIterator for Take>

- impl ExactSizeIterator for Take>

- impl Default for std::collections::binary_heap::Iter

- impl Default for std::collections::btree_map::RangeMut

- impl Default for std::collections::btree_map::ValuesMut

- impl Default for std::collections::vec_deque::Iter

- impl Default for std::collections::vec_deque::IterMut

- Rc::new_uninit

- Rc>::assume_init

- Rc<[T]>::new_uninit_slice

- Rc<[MaybeUninit]>::assume_init

- Arc::new_uninit

- Arc>::assume_init

- Arc<[T]>::new_uninit_slice

- Arc<[MaybeUninit]>::assume_init

- Box::new_uninit

- Box>::assume_init

- Box<[T]>::new_uninit_slice

- Box<[MaybeUninit]>::assume_init

- core::arch::x86_64::_bextri_u64

- core::arch::x86_64::_bextri_u32

- core::arch::x86::_mm_broadcastsi128_si256

- core::arch::x86::_mm256_stream_load_si256

- core::arch::x86::_tzcnt_u16

- core::arch::x86::_mm_extracti_si64

- core::arch::x86::_mm_inserti_si64

- core::arch::x86::_mm_storeu_si16

- core::arch::x86::_mm_storeu_si32

- core::arch::x86::_mm_storeu_si64

- core::arch::x86::_mm_loadu_si16

- core::arch::x86::_mm_loadu_si32

- core::arch::wasm32::u8x16_relaxed_swizzle

- core::arch::wasm32::i8x16_relaxed_swizzle

- core::arch::wasm32::i32x4_relaxed_trunc_f32x4

- core::arch::wasm32::u32x4_relaxed_trunc_f32x4

- core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zero

- core::arch::wasm32::u32x4_relaxed_trunc_f64x2_zero

- core::arch::wasm32::f32x4_relaxed_madd

- core::arch::wasm32::f32x4_relaxed_nmadd

- core::arch::wasm32::f64x2_relaxed_madd

- core::arch::wasm32::f64x2_relaxed_nmadd

- core::arch::wasm32::i8x16_relaxed_laneselect

- core::arch::wasm32::u8x16_relaxed_laneselect

- core::arch::wasm32::i16x8_relaxed_laneselect

- core::arch::wasm32::u16x8_relaxed_laneselect

- core::arch::wasm32::i32x4_relaxed_laneselect

- core::arch::wasm32::u32x4_relaxed_laneselect

- core::arch::wasm32::i64x2_relaxed_laneselect

- core::arch::wasm32::u64x2_relaxed_laneselect

- core::arch::wasm32::f32x4_relaxed_min

- core::arch::wasm32::f32x4_relaxed_max

- core::arch::wasm32::f64x2_relaxed_min

- core::arch::wasm32::f64x2_relaxed_max

- core::arch::wasm32::i16x8_relaxed_q15mulr

- core::arch::wasm32::u16x8_relaxed_q15mulr

- core::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16

- core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16

- core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_add

- core::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add

These APIs are now stable in const contexts:

- std::task::Waker::from_raw

- std::task::Context::from_waker

- std::task::Context::waker

- {integer}::from_str_radix

- std::num::ParseIntError::kind

Cargo

-----

- feat: Add info cargo subcommand

Compatibility Notes

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

- We now disallow setting some built-in cfgs via the command-line with the newly added explicit_builtin_cfgs_in_flags lint in order to prevent incoherent state, eg. windows cfg active but target is Linux based. The appropriate rustc flag should be used instead.

- The standard library has a new implementation of binary_search which significantly improves performance (#128254). However when a sorted slice has multiple values which compare equal, the new implementation may select a different value among the equal ones than the old implementation.

- illumos/Solaris now sets MSG_NOSIGNAL when writing to sockets. This avoids killing the process with SIGPIPE when writing to a closed socket, which matches the existing behavior on other UNIX targets.

- Removes a problematic hack that always passed the --whole-archive linker flag for tests, which may cause linker errors for code accidentally relying on it.

- The WebAssembly target features multivalue and reference-types are now

both enabled by default. These two features both have subtle changes implied

for generated WebAssembly binaries. For the multivalue feature, WebAssembly

target support has changed when upgrading to LLVM 19. Support for generating

functions with multiple returns no longer works and

-Ctarget-feature=+multivalue has a different meaning than it did in LLVM 18

and prior. There is no longer any supported means to generate a module that has

a function with multiple returns in WebAssembly from Rust source code. For the

reference-types feature the encoding of immediates in the call_indirect, a

commonly used instruction by the WebAssembly backend, has changed. Validators

and parsers which don't understand the reference-types proposal will no

longer accept modules produced by LLVM due to this change in encoding of

immediates. Additionally these features being enabled are encoded in the

target_features custom section and may affect downstream tooling such as wasm-opt consuming the module. Generating a WebAssembly module that disables

default features requires -Zbuild-std support from Cargo and more information

can be found at

rust-lang/rust#128511.

- Rust now raises unsafety errors for union patterns in parameter-position

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.

- Update to LLVM 19