Rust 1.93.0
Released on January 22, 2026
What's Changed
- Stabilize several s390x
vector-related target features and theis_s390x_feature_detected!macro - Stabilize declaration of C-style variadic functions for the
systemABI - Emit error when using some keyword as a
cfgpredicate - Stabilize
asm_cfg - During const-evaluation, support copying pointers byte-by-byte
- LUB coercions now correctly handle function item types, and functions with differing safeties
- Allow
constitems that contain mutable references tostatic(which is very unsafe, but not always UB) - Add warn-by-default
const_item_interior_mutationslint to warn against calls which mutate interior mutableconstitems - Add warn-by-default
function_casts_as_integerlint
- Stabilize
-Cjump-tables=bool. The flag was previously called-Zno-jump-tables.
- Stop internally using
specializationon theCopytrait as it is unsound in the presence of lifetime dependentCopyimplementations. This may result in some performance regressions as some standard library APIs may now callClone::cloneinstead of performing bitwise copies - Allow the global allocator to use thread-local storage and
std::thread::current() - Make
BTree::appendnot update existing keys when appending an entry which already exists - Don't require
T: RefUnwindSafeforvec::IntoIter: UnwindSafe <[MaybeUninit]>::assume_init_drop <[MaybeUninit]>::assume_init_ref <[MaybeUninit]>::assume_init_mut <[MaybeUninit]>::write_copy_of_slice <[MaybeUninit]>::write_clone_of_slice String::into_raw_partsVec::into_raw_parts::unchecked_neg ::unchecked_shl ::unchecked_shr ::unchecked_shl ::unchecked_shr <[T]>::as_array<[T]>::as_mut_array<*const [T]>::as_array<*mut [T]>::as_mut_arrayVecDeque::pop_front_ifVecDeque::pop_back_ifDuration::from_nanos_u128char::MAX_LEN_UTF8char::MAX_LEN_UTF16std::fmt::from_fnstd::fmt::FromFn
- Introduce
pin_v2into the builtin attributes namespace - Update bundled musl to 1.2.5
- On Emscripten, the unwinding ABI used when compiling with
panic=unwindwas changed from the JS exception handling ABI to the wasm exception handling ABI. If linking C/C++ object files with Rust objects,-fwasm-exceptionsmust be passed to the linker now. On nightly Rust, it is possible to get the old behavior with-Zwasm-emscripten-eh=false -Zbuild-std, but it will be removed in a future release. - The
#[test]attribute, used to define tests, was previously ignored in various places where it had no meaning (e.g on trait methods or types). Putting the#[test]attribute in these places is no longer ignored, and will now result in an error; this may also result in errors when generating rustdoc. Error whentestattribute is applied to structs - Cargo now sets the
CARGO_CFG_DEBUG_ASSERTIONSenvironment variable in more situations. This will cause crates depending onstatic-initversions 1.0.1 to 1.0.3 to fail compilation with "failed to resolve: use of unresolved module or unlinked crateparking_lot". See the linked issue for details. - User written types in the
offset_of!macro are now checked to be well formed. cargo publishno longer emits.cratefiles as a final artifact for user access when thebuild.build-dirconfig is unset- Upgrade the
deref_nullptrlint from warn-by-default to deny-by-default - Add future-incompatibility warning for
...function parameters without a pattern outside ofexternblocks - Introduce future-compatibility warning for
repr(C)enums whose discriminant values do not fit into ac_intorc_uint - Introduce future-compatibility warning against ignoring
repr(C)types as part ofrepr(transparent)
- Promote
riscv64a23-unknown-linux-gnuto Tier 2 (without host tools) - Remove
#![doc(document_private_items)] - Include attribute and derive macros in search filters for "macros"
- Include extern crates in search filters for
import - Validate usage of crate-level doc attributes. This means if any of
html_favicon_url,html_logo_url,html_playground_url,issue_tracker_base_url, orhtml_no_sourceeither has a missing value, an unexpected value, or a value of the wrong type, rustdoc will emit the deny-by-default lintrustdoc::invalid_doc_attributes.
Full Changelog
Language
--------
- Stabilize several s390x vector-related target features and the is_s390x_feature_detected! macro
- Stabilize declaration of C-style variadic functions for the system ABI
- Emit error when using some keyword as a cfg predicate
- During const-evaluation, support copying pointers byte-by-byte
- LUB coercions now correctly handle function item types, and functions with differing safeties
- Add warn-by-default function_casts_as_integer lint
Compiler
--------
- Stabilize -Cjump-tables=bool. The flag was previously called -Zno-jump-tables.
Platform Support
----------------
- Promote riscv64a23-unknown-linux-gnu to Tier 2 (without host tools)
Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.
[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html
Libraries
---------
- Allow the global allocator to use thread-local storage and std::thread::current()
- Make BTree::append not update existing keys when appending an entry which already exists
- Don't require T: RefUnwindSafe for vec::IntoIter
Stabilized APIs
---------------
- <[MaybeUninit
- <[MaybeUninit
- <[MaybeUninit
- <[MaybeUninit
- <[MaybeUninit
Cargo
-----
- Enable CARGO_CFG_DEBUG_ASSERTIONS in build scripts based on profile
- In cargo tree, support long forms for --format variables
- Add --workspace to cargo clean
Rustdoc
-----
- Remove #![doc(document_private_items)]
- Include attribute and derive macros in search filters for "macros"
- Include extern crates in search filters for import
- Validate usage of crate-level doc attributes. This means if any of html_favicon_url, html_logo_url, html_playground_url, issue_tracker_base_url, or html_no_source either has a missing value, an unexpected value, or a value of the wrong type, rustdoc will emit the deny-by-default lint rustdoc::invalid_doc_attributes.
Compatibility Notes
-------------------
- Introduce pin_v2 into the builtin attributes namespace
- Update bundled musl to 1.2.5
- On Emscripten, the unwinding ABI used when compiling with panic=unwind was changed from the JS exception handling ABI to the wasm exception handling ABI. If linking C/C++ object files with Rust objects, -fwasm-exceptions must be passed to the linker now. On nightly Rust, it is possible to get the old behavior with -Zwasm-emscripten-eh=false -Zbuild-std, but it will be removed in a future release.
- The #[test] attribute, used to define tests, was previously ignored in various places where it had no meaning (e.g on trait methods or types). Putting the #[test] attribute in these places is no longer ignored, and will now result in an error; this may also result in errors when generating rustdoc. Error when test attribute is applied to structs
- Cargo now sets the CARGO_CFG_DEBUG_ASSERTIONS environment variable in more situations. This will cause crates depending on static-init versions 1.0.1 to 1.0.3 to fail compilation with "failed to resolve: use of unresolved module or unlinked crate parking_lot". See the linked issue for details.
- User written types in the offset_of! macro are now checked to be well formed.
- cargo publish no longer emits .crate files as a final artifact for user access when the build.build-dir config is unset
- Upgrade the deref_nullptr lint from warn-by-default to deny-by-default
- Introduce future-compatibility warning against ignoring repr(C) types as part of repr(transparent)