NOTE: Use the 📝 links to edit those that have a relnotes-tracking-issue,
and they will be updated when we regenerate the notes periodically (manually).
Version 1.96.0 (2026-05-28)
Language
Compiler
Libraries
Stabilized APIs
These previously stable APIs are now stable in const contexts:
Cargo
Rustdoc
Compatibility Notes
- Inhibit all-absent-variant optimization for
repr(iX) and repr(uX) enums
📝
- Prevent unsize-coercing into
Pin<Foo> where Foo doesn't implement Deref. Some such coercions were previously allowed, but produce a type with no useful public API.
📝
- rustc: Stop passing
--allow-undefined on wasm targets
📝
- Gate the accidentally stabilized #![reexport_test_harness_main] attribute
📝
- Error on return-position-impl-trait-in-traits whose types are too private
📝
- Report the
uninhabited_static lint in dependencies and make it deny-by-default
📝
- Distributed builds now contain non-split debuginfo for windows-gnu
This appears to improve the quality of backtraces. This change has no effect on the defaults for the output of rustc/cargo on these targets.
📝
- Check const generic arguments are correctly typed in more positions
📝
- Remove -Csoft-float
📝
-Importing structs with ::{self [as name]}, e.g., struct S {}; use S::{self as Other};, is now no longer permitted because {self} imports require a module parent.
📝
- For
export_name, link_name, and link_section attributes, if multiple of the same attribute is present, the first one now takes precedence.
📝
- Update the minimum external LLVM to 21
📝
- On
avr targets, C's double type is 32-bit by default, so change c_double to f32 on avr targets to match. This is a breaking change, but necessary to make c_double match C's double.
📝
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.
NOTE: Use the 📝 links to edit those that have a
relnotes-tracking-issue,and they will be updated when we regenerate the notes periodically (manually).
Version 1.96.0 (2026-05-28)
Language
exprmetavariable tocfg📝
📝
📝
📝
ManuallyDropas patterns (fixing a regression introduced in 1.94.0)📝
Compiler
📝
riscv64gc-unknown-fuchsiabaseline to RVA22 + vector📝
Libraries
NonZerointegers📝
📝
📝
Stabilized APIs
assert_matches!debug_assert_matches!📝
From<T> for AssertUnwindSafe<T>From<T> for LazyCell<T, F>From<T> for LazyLock<T, F>core::range::RangeToInclusivecore::range::RangeToInclusiveIter📝
core::range::RangeFromcore::range::RangeFromIter📝
📝
These previously stable APIs are now stable in const contexts:
Cargo
Rustdoc
white-space: pre-wrap;property and stripped any<p>elements from the rendered html, however this caused issues and unintuitive behavior. The new behavior should be more predictable, however some multi-line deprecation notes will now be rendered as as single lines. If this is undesirable, you can use the standard markdown method of forcing a linebreak, which is" \n"(two spaces followed by a newline).📝
missing_doc_code_exampleslint on impl items📝
📝
Compatibility Notes
repr(iX)andrepr(uX)enums📝
Pin<Foo>whereFoodoesn't implementDeref. Some such coercions were previously allowed, but produce a type with no useful public API.📝
--allow-undefinedon wasm targets📝
📝
📝
uninhabited_staticlint in dependencies and make it deny-by-default📝
This appears to improve the quality of backtraces. This change has no effect on the defaults for the output of rustc/cargo on these targets.
📝
📝
📝
-Importing structs with
::{self [as name]}, e.g.,struct S {}; use S::{self as Other};, is now no longer permitted because{self}imports require a module parent.📝
export_name,link_name, andlink_sectionattributes, if multiple of the same attribute is present, the first one now takes precedence.📝
📝
avrtargets, C'sdoubletype is 32-bit by default, so changec_doubletof32onavrtargets to match. This is a breaking change, but necessary to makec_doublematch C's double.📝
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.
aarch64softfloat targets now have to haverustc_abiset to"softfloat"📝
📝