Rust versions / 1.78
Rust release · May 2, 2024
Rust 1.78: what's new, what was stabilized
Short answerRust 1.78 was released on May 2, 2024: 2 language stabilizations ([Stabilize #[cfg(target_abi = ...)]](https://github.com/rust-lang/rust/pull/119590/)); 5 newly stable APIs (impl Read for &Stdin, 'static, impl<Fd: AsFd>, impl From<TryReserveError> for io::Error, ...); 7 compatibility notes that can affect existing code.
← Rust 1.77All versionsRust 1.79 →
Language features stabilized
- [Stabilize #[cfg(target_abi = ...)]](https://github.com/rust-lang/rust/pull/119590/)
- [Stabilize the #[diagnostic] namespace and #[diagnostic::on_unimplemented] attribute](https://github.com/rust-lang/rust/pull/119888/)
5 APIs stabilized
impl Read for &Stdin, 'static, impl<Fd: AsFd>, impl From<TryReserveError> for io::Error, Barrier::new
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:
- Many unsafe precondition checks now run for user code with debug assertions enabled
- riscv only supports split_debuginfo=off for now
- Consistently check bounds on hidden types of
impl Trait - Change equality of higher ranked types to not rely on subtyping
- When called, additionally check bounds on normalized function return type
- Expand coverage for
arithmetic_overflowlint - Fix detection of potential interior mutability in
constinitializers
Use it
rustup update stable # get the newest release
rustup install 1.78 # or exactly this one
rustup override set 1.78 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.78" 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
- [Stabilize
#[cfg(target_abi = ...)]](https://github.com/rust-lang/rust/pull/119590/) - [Stabilize the
#[diagnostic]namespace and#[diagnostic::on_unimplemented]attribute](https://github.com/rust-lang/rust/pull/119888/) - Make async-fn-in-trait implementable with concrete signatures
- Make matching on NaN a hard error, and remove the rest of
illegal_floating_point_literal_pattern - static mut: allow mutable reference to arbitrary types, not just slices and arrays
- Extend
invalid_reference_castingto include references casting to bigger memory layout - Add
non_contiguous_range_endpointslint for singleton gaps after exclusive ranges - Add
wasm_c_abilint for use of older wasm-bindgen versions This lint currently only works when using Cargo. - Update
indirect_structural_matchandpointer_structural_matchlints to match RFC - Make non-
PartialEq-typed consts as patterns a hard error - Split
refining_impl_traitlint into_reachable,_internalvariants - Remove unnecessary type inference when using associated types inside of higher ranked
where-bounds - Weaken eager detection of cyclic types during type inference
trait Trait: Auto {}: allow upcasting fromdyn Traittodyn Trait + Auto
<a id="1.78.0-Compiler"></a>
Compiler
- Made
INVALID_DOC_ATTRIBUTESlint deny by default - Increase accuracy of redundant
usechecking - Suggest moving definition if non-found macro_rules! is defined later
- Lower transmutes from int to pointer type as gep on null
Target changes:
- Windows tier 1 targets now require at least Windows 10
- Enable CMPXCHG16B, SSE3, SAHF/LAHF and 128-bit Atomics in tier 1 Windows
- Add
wasm32-wasip1tier 2 (without host tools) target - Add
wasm32-wasip2tier 3 target - Rename
wasm32-wasi-preview1-threadstowasm32-wasip1-threads - Add
arm64ec-pc-windows-msvctier 3 target - Add
armv8r-none-eabihftier 3 target for the Cortex-R52 - Add
loongarch64-unknown-linux-musltier 3 target
Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support.
<a id="1.78.0-Libraries"></a>
Libraries
- Bump Unicode to version 15.1.0, regenerate tables
- Make align_offset, align_to well-behaved in all cases
- PartialEq, PartialOrd: document expectations for transitive chains
- Optimize away poison guards when std is built with panic=abort
- Replace pthread
RwLockwith custom implementation - Implement unwind safety for Condvar on all platforms
- Add ASCII fast-path for
char::is_grapheme_extended
<a id="1.78.0-Stabilized-APIs"></a>
Stabilized APIs
impl Read for &Stdin- Accept non
'staticlifetimes for severalstd::error::Errorrelated implementations - Make
impl<Fd: AsFd>impl take?Sized impl From<TryReserveError> for io::Error
These APIs are now stable in const contexts:
<a id="1.78.0-Cargo"></a>
Cargo
- Stabilize lockfile v4
- Respect
rust-versionwhen generating lockfile - Control
--charsetvia auto-detecting config value - Support
target.<triple>.rustdocflagsofficially - Stabilize global cache data tracking
<a id="1.78.0-Compatibility-Notes"></a>
Compatibility Notes
- Many unsafe precondition checks now run for user code with debug assertions enabled This change helps users catch undefined behavior in their code, though the details of how much is checked are generally not stable.
- riscv only supports split_debuginfo=off for now
- Consistently check bounds on hidden types of
impl Trait - Change equality of higher ranked types to not rely on subtyping
- When called, additionally check bounds on normalized function return type
- Expand coverage for
arithmetic_overflowlint - Fix detection of potential interior mutability in
constinitializers This code was accidentally accepted. The fix can break generic code that borrows a value of unknown type, as there is currently no way to declare "this type has no interior mutability". In the future, stabilizing theFreezetrait will allow proper support for such code.
<a id="1.78.0-Internal-Changes"></a>
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.
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.79Released Jun 13, 2024.Read it next →Also worth your time
Did this answer your question?