← Back to all releases

Rust 1.83.0

Released on November 28, 2024

What's Changed

Full Changelog

Language

--------

- Stabilize &mut, mut, &Cell, and const Cell in const.

- Allow creating references to statics in const initializers.

- Implement raw lifetimes and labels ('r#ident).

- Define behavior when atomic and non-atomic reads race.

- Non-exhaustive structs may now be empty.

- Disallow implicit coercions from places of type !

- const extern functions can now be defined for other calling conventions.

- Stabilize expr_2021 macro fragment specifier in all editions.

- The non_local_definitions lint now fires on less code and warns by default.

Compiler

--------

- Deprecate unsound -Csoft-float flag.

- Add many new tier 3 targets:

- aarch64_unknown_nto_qnx700

- arm64e-apple-tvos

- armv7-rtems-eabihf

- loongarch64-unknown-linux-ohos

- riscv32-wrs-vxworks and riscv64-wrs-vxworks

- riscv32{e|em|emc}-unknown-none-elf

- x86_64-unknown-hurd-gnu

- x86_64-unknown-trusty

Refer to Rust's [platform support page][platform-support-doc]

for more information on Rust's tiered platform support.

Libraries

---------

- Implement PartialEq for ExitCode.

- Document that catch_unwind can deal with foreign exceptions without UB, although the exact behavior is unspecified.

- Implement Default for HashMap/HashSet iterators that don't already have it.

- Bump Unicode to version 16.0.0.

- Change documentation of ptr::add/sub to not claim equivalence with offset.

Stabilized APIs

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

- 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

These APIs are now stable in const contexts:

- 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::>::flatten

- Option::>::transpose

- RefCell::into_inner

- Result::as_mut

- Result::<&_, _>::copied

- Result::<&mut _, _>::copied

- Result::, _>::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

Cargo

-----

- Introduced a new CARGO_MANIFEST_PATH environment variable, similar to CARGO_MANIFEST_DIR but pointing directly to the manifest file.

- Added package.autolib to the manifest, allowing [lib] auto-discovery to be disabled.

- Declare support level for each crate in Cargo's Charter / crate docs.

- Declare new Intentional Artifacts as 'small' changes.

Rustdoc

-------

- The sidebar / hamburger menu table of contents now includes the # headers from the main item's doc comment. This is similar to a third-party feature provided by the rustdoc-search-enhancements browser extension.

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 .

- 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::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==foo or not have the rust-src component installed.

- The allow-by-default missing_docs lint used to disable itself when invoked through rustc --test/cargo test, resulting in #[expect(missing_docs)] emitting false positives due to the expectation being wrongly unfulfilled. This behavior has now been removed, which allows #[expect(missing_docs)] to be fulfilled in all scenarios, but will also report new missing_docs diagnostics for publicly reachable #[cfg(test)] items, integration test crate-level documentation, and publicly reachable items in integration tests.

- The armv8r-none-eabihf target now uses the Armv8-R required set of floating-point features.

- Fix a soundness bug where rustc wouldn't detect unconstrained higher-ranked lifetimes in a dyn Trait's associated types that occur due to supertraits.

- Update the minimum external LLVM version to 18.

- Remove aarch64-fuchsia and x86_64-fuchsia target aliases in favor of aarch64-unknown-fuchsia and x86_64-unknown-fuchsia respectively.

- The ABI-level exception class of a Rust panic is now encoded with native-endian bytes, so it is legible in hex dumps.

- Visual Studio 2013 is no longer supported for MSVC targets.

- The sysroot no longer contains the std dynamic library in its top-level lib/ dir.