Email me

Rust versions / 1.58

Rust release · Jan 13, 2022

Rust 1.58: what's new, what was stabilized

Short answerRust 1.58 was released on Jan 13, 2022: 15 newly stable APIs (Metadata::is_symlink, Path::is_symlink, {integer}::saturating_div, Option::unwrap_unchecked, ...); 6 compatibility notes that can affect existing code. Point release: 1.58.1 (Jan 20, 2022).

Jan 13, 2022release date
0language stabilizations
15APIs stabilized
-new edition

← Rust 1.57All versionsRust 1.59 →

15 APIs stabilized

Metadata::is_symlink, Path::is_symlink, {integer}::saturating_div, Option::unwrap_unchecked, Result::unwrap_unchecked, Result::unwrap_err_unchecked, File::options, Duration::new, Duration::checked_add, Duration::saturating_add, Duration::checked_sub, Duration::saturating_sub, Duration::checked_mul, Duration::saturating_mul, Duration::checked_div

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:

  • [Try all stable method candidates first before trying unstable ones][90329]. This change ensures that adding new nightly-only methods to the Rust standard library will not break code invoking methods of the same name from traits outside the standard library.
  • Windows: [std::process::Command will no longer search the current directory for executables.][87704]
  • [All proc-macro backward-compatibility lints are now deny-by-default.][88041]
  • [proc_macro: Append .0 to unsuffixed float if it would otherwise become int token][90297]
  • [Refactor weak symbols in std::sys::unix][90846]. This optimizes accesses to glibc functions, by avoiding the use of dlopen. This does not increase the minimum expected version of glibc. However, software distributions that use symbol versions to detect library dependencies, and which take weak symbols into account in that analysis, may detect rust binaries as requiring newer versions of glibc.
  • [rustdoc now rejects some unexpected semicolons in doctests][91026]

Use it

rustup update stable        # get the newest release
rustup install 1.58          # or exactly this one
rustup override set 1.58     # pin a project to it

To require at least this version from users of your crate, set rust-version = "1.58" 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

  • [Format strings can now capture arguments simply by writing {ident} in the string.][90473] This works in all macros accepting format strings. Support for this in panic! (panic!("{ident}")) requires the 2021 edition; panic invocations in previous editions that appear to be trying to use this will result in a warning lint about not having the intended effect.
  • [*const T pointers can now be dereferenced in const contexts.][89551]
  • [The rules for when a generic struct implements Unsize have been relaxed.][90417]

Compiler

  • [Add LLVM CFI support to the Rust compiler][89652]
  • [Stabilize -Z strip as -C strip][90058]. Note that while release builds already don't add debug symbols for the code you compile, the compiled standard library that ships with Rust includes debug symbols, so you may want to use the strip option to remove these symbols to produce smaller release binaries. Note that this release only includes support in rustc, not directly in cargo.
  • [Add support for LLVM coverage mapping format versions 5 and 6][91207]
  • [Emit LLVM optimization remarks when enabled with -Cremark][90833]
  • [Update the minimum external LLVM to 12][90175]
  • [Add x86_64-unknown-none at Tier 3*][89062]
  • [Build musl dist artifacts with debuginfo enabled][90733]. When building release binaries using musl, you may want to use the newly stabilized strip option to remove these debug symbols, reducing the size of your binaries.
  • [Don't abort compilation after giving a lint error][87337]
  • [Error messages point at the source of trait bound obligations in more places][89580]

\* Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support.

Libraries

  • [All remaining functions in the standard library have #[must_use] annotations where appropriate][89692], producing a warning when ignoring their return value. This helps catch mistakes such as expecting a function to mutate a value in place rather than return a new value.
  • [Paths are automatically canonicalized on Windows for operations that support it][89174]
  • [Re-enable debug checks for copy and copy_nonoverlapping][90041]
  • [Implement RefUnwindSafe for Rc<T>][87467]
  • [Make RSplit<T, P>: Clone not require T: Clone][90117]
  • [Implement Termination for Result<Infallible, E>][88601]. This allows writing fn main() -> Result<Infallible, ErrorType>, for a program whose successful exits never involve returning from main (for instance, a program that calls exit, or that uses exec to run another program).

Stabilized APIs

  • [Metadata::is_symlink]
  • [Path::is_symlink]
  • [{integer}::saturating_div]
  • [Option::unwrap_unchecked]
  • [Result::unwrap_unchecked]
  • [Result::unwrap_err_unchecked]
  • [File::options]

These APIs are now usable in const contexts:

  • [Duration::new]
  • [Duration::checked_add]
  • [Duration::saturating_add]
  • [Duration::checked_sub]
  • [Duration::saturating_sub]
  • [Duration::checked_mul]
  • [Duration::saturating_mul]
  • [Duration::checked_div]

Cargo

  • [Add --message-format for install command][cargo/10107]
  • [Warn when alias shadows external subcommand][cargo/10082]

Rustdoc

  • [Show all Deref implementations recursively in rustdoc][90183]
  • [Use computed visibility in rustdoc][88447]

Compatibility Notes

  • [Try all stable method candidates first before trying unstable ones][90329]. This change ensures that adding new nightly-only methods to the Rust standard library will not break code invoking methods of the same name from traits outside the standard library.
  • Windows: [std::process::Command will no longer search the current directory for executables.][87704]
  • [All proc-macro backward-compatibility lints are now deny-by-default.][88041]
  • [proc_macro: Append .0 to unsuffixed float if it would otherwise become int token][90297]
  • [Refactor weak symbols in std::sys::unix][90846]. This optimizes accesses to glibc functions, by avoiding the use of dlopen. This does not increase the minimum expected version of glibc. However, software distributions that use symbol versions to detect library dependencies, and which take weak symbols into account in that analysis, may detect rust binaries as requiring newer versions of glibc.
  • [rustdoc now rejects some unexpected semicolons in doctests][91026]

Internal Changes

These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools.

1.58.1 (Jan 20, 2022)

Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.

← Rust 1.57All versionsRust 1.59 →

Up next

Next releaseRust 1.59Released Feb 24, 2022.Read it next →

Did this answer your question?

Get the receipts by email.

What my AI agents tried this week, with the real numbers: what worked, what flopped, what made money. One email when there is something worth reading.

No spam, never sold. Every email has a one-click unsubscribe.

Popular in the shop

All 124 tools →

Browse: Bundles and kitsHome, family and schoolMoney and businessAI toolsSports and fitnessMaking and hobbiesFood and drinkIndie dev and launchTrading and quant

Free: Landing page teardown iPhone app cost calculator LLM API cost calculator Paid online: $49 Launch Check App builds Articles FAQ