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.98.0 (2026-08-20)
Language
Compiler
Platform Support
Refer to Rust's platform support page
for more information on Rust's tiered platform support.
Libraries
Stabilized APIs
These previously stable APIs are now stable in const contexts:
Cargo
Rustdoc
Compatibility Notes
- If fully elided, lifetime bounds of trait object types may now resolve differently or even get rejected in very specific niche scenarios
📝
- Error in more cases of ambiguous imports
📝
- Switch the destructors implementation for thread locals on Windows to use FLS
📝
- Convert some cases of the
ambiguous_glob_imports lint into a hard error
📝
- Where-bounds of the form
Type = Type and Type == Type are no longer syntactically allowed
📝
- Ensure Send/Sync is not implemented for std::env::Vars{,Os}
📝
- Fix that in some attributes, arguments were not properly rejected
📝
repr(transparent) is now more strict about which fields have "trivial" layout and hence can be ignored: repr(C) types, types with private fields, and #[non_exhaustive] types are no longer considered "trivial"
📝
- Correctly check whether types have equal size in
transmute() when some repr attributes are involved.
📝
- Add deny-by-default
invalid_runtime_symbol_definitions lint and warn-by-default suspicious_runtime_symbol_definitions lint
- The lints currently specifically targets
core runtime symbols like memcmp, memset, strlen, ... and is planned be embellished in the next few releases.
📝
- More characters are escaped when printing strings an chars
📝
- Implement fast path for
derive(PartialOrd) when deriving Ord
This can break crates in practice where a type's PartialOrd and Ord impls were inconsistent with each other.
📝
- Add temporary scope to
assert_eq and assert_ne
📝
- lint on
core::ffi::c_void as a return type
📝
- Closed a hole in the pattern matching structural equality check, preventing cases where a match of a constant would be allowed, despite disagreeing with a manually written
PartialEq implementation, when a derive(PartialEq) implementation for that type also exists.
📝
- On Emscripten the WASM exception handling ABI is now unconditionally used The
-Zemscripten-wasm-eh=false flag to switch back to JS exceptions has been removed.
📝
- The UNSAFE_CODE lint is now consistently emitted for all unsafe attributes
📝
- Solaris: remove
File::lock implementation, it has the wrong semantics (return "unsupported" instead)
📝
- Windows-gnu targets now specify baseline tools versions
📝
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.
Other
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.98.0 (2026-08-20)
Language
&mutwhen unsize-coercing, even in an invariant position. For example, you can now coerce aCell<&'long mut i32>to aCell<&'short mut dyn Send>. Such shortenings were already previously allowed when coercing a&mutto a&, or coercing a&to a&.📝
d,e, andftarget_features are now stable incfg(target_feature = "?")📝
Compiler
Platform Support
powerpc64-unknown-linux-gnuelfv2as Tier 3📝
aarch64-unknown-linux-pauthtestas Tier 3 target📝
thumbv7a-none-eabiTier 2thumbv7a-none-eabihfTier 2thumbv7r-none-eabiTier 2thumbv7r-none-eabihfTier 2thumbv8r-none-eabihfTier 2📝
Refer to Rust's platform support page
for more information on Rust's tiered platform support.
Libraries
Location<'_>lifetime to'staticinPanic[Hook]Info📝
RangeInclusive::from(legacy::RangeInclusive)📝
ManuallyDrop'sBoxinteraction has been fixed📝
core::range::{legacy, RangeFull, RangeTo}Stabilized APIs
core::fmt::NumBuffer<{integer}>::format_into📝
Send/Sync for std::process::CommandArgs📝
{fN}::algebraic_add{fN}::algebraic_sub{fN}::algebraic_mul{fN}::algebraic_div{fN}::algebraic_rem📝
NonZero<{integer}>::from_str_radix📝
String::from_utf16leString::from_utf16le_lossyString::from_utf16beString:;from_utf16be_lossy📝
[T]::strip_circumfixstr::strip_circumfix📝
Atomic<T>::from_mutAtomic<T>::get_mut_sliceAtomic<T>::from_mut_slice📝
These previously stable APIs are now stable in const contexts:
Cargo
Rustdoc
Compatibility Notes
📝
📝
📝
ambiguous_glob_importslint into a hard error📝
Type = TypeandType == Typeare no longer syntactically allowed📝
📝
📝
repr(transparent)is now more strict about which fields have "trivial" layout and hence can be ignored:repr(C)types, types with private fields, and#[non_exhaustive]types are no longer considered "trivial"📝
transmute()when somereprattributes are involved.📝
invalid_runtime_symbol_definitionslint and warn-by-defaultsuspicious_runtime_symbol_definitionslintcoreruntime symbols likememcmp,memset,strlen, ... and is planned be embellished in the next few releases.📝
📝
derive(PartialOrd)when derivingOrdThis can break crates in practice where a type's PartialOrd and Ord impls were inconsistent with each other.
📝
assert_eqandassert_ne📝
core::ffi::c_voidas a return type📝
PartialEqimplementation, when aderive(PartialEq)implementation for that type also exists.📝
-Zemscripten-wasm-eh=falseflag to switch back to JS exceptions has been removed.📝
📝
File::lockimplementation, it has the wrong semantics (return "unsupported" instead)📝
📝
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.
Other