Email me

Rust versions / 1.83

Rust release · Nov 28, 2024

Rust 1.83: what's new, what was stabilized

Short answerRust 1.83 was released on Nov 28, 2024: 2 language stabilizations (Stabilize &mut, *mut, &Cell, and *const Cell in const.); 113 newly stable APIs (BufRead::skip_until, ControlFlow::break_value, ControlFlow::continue_value, ControlFlow::map_break, ...); 15 compatibility notes that can affect existing code.

Nov 28, 2024release date
2language stabilizations
113APIs stabilized
-new edition

← Rust 1.82All versionsRust 1.84 →

Language features stabilized

  • Stabilize &mut, *mut, &Cell, and *const Cell in const.
  • Stabilize expr_2021 macro fragment specifier in all editions.

113 APIs stabilized

BufRead::skip_until, ControlFlow::break_value, ControlFlow::continue_value, ControlFlow::map_break, ControlFlow::map_continue, DebugList::finish_non_exhaustive, DebugMap::finish_non_exhaustive, DebugSet::finish_non_exhaustive, DebugTuple::finish_non_exhaustive, ErrorKind::ArgumentListTooLong, ErrorKind::Deadlock, ErrorKind::DirectoryNotEmpty, ErrorKind::ExecutableFileBusy, ErrorKind::FileTooLarge, ErrorKind::HostUnreachable, ErrorKind::IsADirectory, ErrorKind::NetworkDown, ErrorKind::NetworkUnreachable, ErrorKind::NotADirectory, ErrorKind::NotSeekable, ErrorKind::ReadOnlyFilesystem, ErrorKind::ResourceBusy, ErrorKind::StaleNetworkFileHandle, ErrorKind::StorageFull, ErrorKind::TooManyLinks, Option::get_or_insert_default, Waker::data, Waker::new, Waker::vtable, char::MIN, hash_map::Entry::insert_entry, hash_map::VacantEntry::insert_entry, Cell::into_inner, Duration::as_secs_f32, Duration::as_secs_f64, Duration::div_duration_f32, Duration::div_duration_f64, MaybeUninit::as_mut_ptr, NonNull::as_mut, NonNull::copy_from, NonNull::copy_from_nonoverlapping, NonNull::copy_to, NonNull::copy_to_nonoverlapping, NonNull::slice_from_raw_parts, NonNull::write, NonNull::write_bytes, NonNull::write_unaligned, OnceCell::into_inner, Option::as_mut, Option::expect, Option::replace, Option::take, Option::unwrap, Option::unwrap_unchecked, Option::<&_>::copied, Option::<&mut _>::copied, Option::<Option<_>>::flatten, Option::<Result<_, _>>::transpose, RefCell::into_inner, Result::as_mut, Result::<&_, _>::copied, Result::<&mut _, _>::copied, Result::<Option<_>, _>::transpose, UnsafeCell::get_mut, UnsafeCell::into_inner, array::from_mut, char::encode_utf8, {float}::classify, {float}::is_finite, {float}::is_infinite, {float}::is_nan, {float}::is_normal, {float}::is_sign_negative, {float}::is_sign_positive, {float}::is_subnormal, {float}::from_bits, {float}::from_be_bytes, {float}::from_le_bytes, {float}::from_ne_bytes, {float}::to_bits, {float}::to_be_bytes, {float}::to_le_bytes, {float}::to_ne_bytes, mem::replace, ptr::replace, ptr::slice_from_raw_parts_mut, ptr::write, ptr::write_unaligned, <*const _>::copy_to, <*const _>::copy_to_nonoverlapping, <*mut _>::copy_from, <*mut _>::copy_from_nonoverlapping, <*mut _>::copy_to, <*mut _>::copy_to_nonoverlapping, <*mut _>::write, <*mut _>::write_bytes, <*mut _>::write_unaligned, slice::from_mut, slice::from_raw_parts_mut, <[_]>::first_mut, <[_]>::last_mut, <[_]>::first_chunk_mut, <[_]>::last_chunk_mut, <[_]>::split_at_mut, <[_]>::split_at_mut_checked, <[_]>::split_at_mut_unchecked, <[_]>::split_first_mut, <[_]>::split_last_mut, <[_]>::split_first_chunk_mut, <[_]>::split_last_chunk_mut, str::as_bytes_mut, str::as_mut_ptr, str::from_utf8_unchecked_mut

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.83          # or exactly this one
rustup override set 1.83     # pin a project to it

To require at least this version from users of your crate, set rust-version = "1.83" 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.83.0-Compiler"></a>

Compiler

Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support.

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

Libraries

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

Stabilized APIs

These APIs are now stable in const contexts:

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

Cargo

<a id="1.83-Rustdoc"></a>

Rustdoc

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

Compatibility Notes

  • Warn against function pointers using unsupported ABI strings.
  • Check well-formedness of the source type's signature in fn pointer casts. This partly closes a soundness hole that comes when casting a function item to function pointer
  • Use equality instead of subtyping when resolving type dependent paths.
  • Linking on macOS now correctly includes Rust's default deployment target. Due to a linker bug, you might have to pass MACOSX_DEPLOYMENT_TARGET or fix your #[link] attributes to point to the correct frameworks. See <https://github.com/rust-lang/rust/pull/129369>.
  • Rust will now correctly raise an error for repr(Rust) written on non-struct/enum/union items, since it previously did not have any effect.
  • The future incompatibility lint deprecated_cfg_attr_crate_type_name has been made into a hard error. It was used to deny usage of #![crate_type] and #![crate_name] attributes in #![cfg_attr], which required a hack in the compiler to be able to change the used crate type and crate name after cfg expansion. Users can use --crate-type instead of #![cfg_attr(..., crate_type = "...")] and --crate-name instead of #![cfg_attr(..., crate_name = "...")] when running rustc/cargo rustc on the command line. Use of those two attributes outside of #![cfg_attr] continue to be fully supported.
  • Until now, paths into the sysroot were always prefixed with /rustc/$hash in diagnostics, codegen, backtrace, e.g. `` thread 'main' panicked at 'hello world', map-panic.rs:2:50 stack backtrace: 0: std::panicking::begin_panic at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:616:12 1: map_panic::main::{{closure}} at ./map-panic.rs:2:50 2: core::option::Option<T>::map at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/option.rs:929:29 3: map_panic::main at ./map-panic.rs:2:30 4: core::ops::function::FnOnce::call_once at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace. ` RFC 3127 said > We want to change this behaviour such that, when rust-src source files can be discovered, the virtual path is discarded and therefore the local path will be embedded, unless there is a --remap-path-prefix` that causes this local path to be remapped in the usual way.

#129687 implements this behaviour, when rust-src is present at compile time, rustc replaces /rustc/$hash with a real path into the local rust-src component with best effort. To sanitize this, users must explicitly supply --remap-path-prefix=<path to rust-src>=foo or not have the rust-src component installed.

Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.

← Rust 1.82All versionsRust 1.84 →

Up next

Next releaseRust 1.84Released Jan 9, 2025.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