The Rust team is happy to announce a new version of Rust, 1.74.0. Rust is a programming language empowering everyone to build reliable and efficient software.
If you have a previous version of Rust installed via rustup, you can get 1.74.0 with:
$ rustup update stable
If you don't have it already, you can get rustup
from the appropriate page on our website, and check out the detailed release notes for 1.74.0 on GitHub.
If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (rustup default beta
) or the nightly channel (rustup default nightly
). Please report any bugs you might come across!
What's in 1.74.0 stable
Lint configuration through Cargo
As proposed in RFC 3389,
the Cargo.toml
manifest now supports a [lints]
table to configure the
reporting level (forbid, deny, warn, allow) for lints from the compiler and
other tools. So rather than setting RUSTFLAGS
with -F
/-D
/-W
/-A
, which
would affect the entire build, or using crate-level attributes like:
#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]
You can now write those in your package manifest for Cargo to handle:
[lints.rust]
unsafe_code = "forbid"
[lints.clippy]
enum_glob_use = "deny"
These can also be configured in a [workspace.lints]
table, then inherited by
[lints] workspace = true
like many other workspace settings. Cargo will also
track changes to these settings when deciding which crates need to be rebuilt.
For more information, see the lints
and workspace.lints
sections of the
Cargo reference manual.
Cargo Registry Authentication
Two more related Cargo features are included in this release: credential providers and authenticated private registries.
Credential providers allow configuration of how Cargo gets credentials for a registry. Built-in providers are included for OS-specific secure secret storage on Linux, macOS, and Windows. Additionally, custom providers can be written to support arbitrary methods of storing or generating tokens. Using a secure credential provider reduces risk of registry tokens leaking.
Registries can now optionally require authentication for all operations, not just publishing. This enables private Cargo registries to offer more secure hosting of crates. Use of private registries requires the configuration of a credential provider.
For further information, see the Cargo docs.
Projections in opaque return types
If you have ever received the error that a "return type cannot contain a
projection or Self
that references lifetimes from a parent scope," you may
now rest easy! The compiler now allows mentioning Self
and
associated types in opaque return types, like async fn
and -> impl Trait
.
This is the kind of feature that gets Rust closer to how you might just
expect it to work, even if you have no idea about jargon like "projection".
This functionality had an unstable feature gate because its implementation originally didn't properly deal with captured lifetimes, and once that was fixed it was given time to make sure it was sound. For more technical details, see the stabilization pull request, which describes the following examples that are all now allowed:
struct Wrapper<'a, T>(&'a T);
// Opaque return types that mention `Self`:
impl Wrapper<'_, ()> {
async fn async_fn() -> Self { /* ... */ }
fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}
trait Trait<'a> {
type Assoc;
fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
type Assoc = ();
fn new() {}
}
// Opaque return types that mention an associated type:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
async fn mk_assoc() -> T::Assoc { /* ... */ }
fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}
Stabilized APIs
core::num::Saturating
impl From<io::Stdout> for std::process::Stdio
impl From<io::Stderr> for std::process::Stdio
impl From<OwnedHandle> for std::process::Child{Stdin, Stdout, Stderr}
impl From<OwnedFd> for std::process::Child{Stdin, Stdout, Stderr}
std::ffi::OsString::from_encoded_bytes_unchecked
std::ffi::OsString::into_encoded_bytes
std::ffi::OsStr::from_encoded_bytes_unchecked
std::ffi::OsStr::as_encoded_bytes
std::io::Error::other
impl TryFrom<char> for u16
impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T>
impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T>
impl<T, const N: usize> From<[T; N]> for Arc<[T]>
impl<T, const N: usize> From<[T; N]> for Rc<[T]>
These APIs are now stable in const contexts:
Compatibility notes
- As previously announced, Rust 1.74 has increased its
requirements on Apple platforms. The minimum versions are now:
- macOS: 10.12 Sierra (First released 2016)
- iOS: 10 (First released 2016)
- tvOS: 10 (First released 2016)
Other changes
Check out everything that changed in Rust, Cargo, and Clippy.
Contributors to 1.74.0
Many people came together to create Rust 1.74.0. We couldn't have done it without all of you. Thanks!