Email me

Rust versions / 1.82

Rust release · Oct 17, 2024

Rust 1.82: what's new, what was stabilized

Short answerRust 1.82 was released on Oct 17, 2024: 7 language stabilizations (Stabilize + use<'lt> opaque type precise capturing (RFC 3617)); 76 newly stable APIs (std::thread::Builder::spawn_unchecked, std::str::CharIndices::offset, std::option::Option::is_none_or, [T]::is_sorted, ...); 6 compatibility notes that can affect existing code.

Oct 17, 2024release date
7language stabilizations
76APIs stabilized
-new edition

← Rust 1.81All versionsRust 1.83 →

Language features stabilized

  • 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!
  • Stabilize const operands in inline assembly
  • Stabilize floating-point arithmetic in const fn
  • Stabilize explicit opt-in to unsafe attributes

76 APIs stabilized

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<T: Clone> DoubleEndedIterator for Take<Repeat<T>>, impl<T: Clone> ExactSizeIterator for Take<Repeat<T>>, impl<T: Clone> ExactSizeIterator for Take<RepeatWith<T>>, 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<T>::new_uninit, Rc<MaybeUninit<T>>::assume_init, Rc<[T]>::new_uninit_slice, Rc<[MaybeUninit<T>]>::assume_init, Arc<T>::new_uninit, Arc<MaybeUninit<T>>::assume_init, Arc<[T]>::new_uninit_slice, Arc<[MaybeUninit<T>]>::assume_init, Box<T>::new_uninit, Box<MaybeUninit<T>>::assume_init, Box<[T]>::new_uninit_slice, Box<[MaybeUninit<T>]>::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, std::task::Waker::from_raw, std::task::Context::from_waker, std::task::Context::waker, {integer}::from_str_radix, std::num::ParseIntError::kind

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:

Use it

rustup update stable        # get the newest release
rustup install 1.82          # or exactly this one
rustup override set 1.82     # pin a project to it

To require at least this version from users of your crate, set rust-version = "1.82" 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

<a id="1.82.0-Compiler"></a>

Compiler

<a id="1.82.0-Libraries"></a>

Libraries

<a id="1.82.0-Stabilized-APIs"></a>

Stabilized APIs

These APIs are now stable in const contexts:

<a id="1.82.0-Cargo"></a>

Cargo

<a id="1.82.0-Compatibility-Notes"></a>

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

<a id="1.82.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.

← Rust 1.81All versionsRust 1.83 →

Up next

Next releaseRust 1.83Released Nov 28, 2024.Read it next →

Did this answer your question?

Get the receipts by email.

What my AI agents tried this week, with the real numbers: what worked, what flopped, what made money. One email when there is something worth reading.

No spam, never sold. Every email has a one-click unsubscribe.

Popular in the shop

All 124 tools →

Browse: Bundles and kitsHome, family and schoolMoney and businessAI toolsSports and fitnessMaking and hobbiesFood and drinkIndie dev and launchTrading and quant

Free: Landing page teardown iPhone app cost calculator LLM API cost calculator Paid online: $49 Launch Check App builds Articles FAQ