Email me

Rust versions / 1.51

Rust release · Mar 25, 2021

Rust 1.51: what's new, what was stabilized

Short answerRust 1.51 was released on Mar 25, 2021: 20 newly stable APIs (Arc::decrement_strong_count, Arc::increment_strong_count, Once::call_once_force, Peekable::next_if_eq, ...); 4 compatibility notes that can affect existing code.

Mar 25, 2021release date
0language stabilizations
20APIs stabilized
-new edition

← Rust 1.50All versionsRust 1.52 →

20 APIs stabilized

Arc::decrement_strong_count, Arc::increment_strong_count, Once::call_once_force, Peekable::next_if_eq, Peekable::next_if, Seek::stream_position, array::IntoIter, panic::panic_any, ptr::addr_of!, ptr::addr_of_mut!, slice::fill_with, slice::split_inclusive_mut, slice::split_inclusive, slice::strip_prefix, slice::strip_suffix, str::split_inclusive, sync::OnceState, task::Wake, VecDeque::range, VecDeque::range_mut

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:

  • [WASI platforms no longer use the wasm-bindgen ABI, and instead use the wasm32 ABI.][79998]
  • [rustc no longer promotes division, modulo and indexing operations to const that
  • [The minimum version of glibc for the following platforms has been bumped to version 2.31
  • [atomic::spin_loop_hint has been deprecated.][80966] It's recommended to use hint::spin_loop instead.

Use it

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

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

  • [You can now parameterize items such as functions, traits, and structs by constant values in addition to by types and lifetimes.][79135] Also known as "const generics" E.g. you can now write the following. Note: Only values of primitive integers, bool, or char types are currently permitted. ```rust struct GenericArray<T, const LENGTH: usize> { inner: [T; LENGTH] }

impl<T, const LENGTH: usize> GenericArray<T, LENGTH> { const fn last(&self) -> Option<&T> { if LENGTH == 0 { None } else { Some(&self.inner[LENGTH - 1]) } } } ```

Compiler

  • [Added the -Csplit-debuginfo codegen option for macOS platforms.][79570] This option controls whether debug information is split across multiple files or packed into a single file. **Note** This option is unstable on other platforms.
  • [Added tier 3\* support for aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32, and aarch64_be-unknown-linux-gnu_ilp32 targets.][81455]
  • [Added tier 3 support for i386-unknown-linux-gnu and i486-unknown-linux-gnu targets.][80662]
  • [The target-cpu=native option will now detect individual features of CPUs.][80749]

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

Libraries

  • [Box::downcast is now also implemented for any dyn Any + Send + Sync object.][80945]
  • [str now implements AsMut<str>.][80279]
  • [u64 and u128 now implement From<char>.][79502]
  • [Error is now implemented for &T where T implements Error.][75180]
  • [Poll::{map_ok, map_err} are now implemented for Poll<Option<Result<T, E>>>.][80968]
  • [unsigned_abs is now implemented for all signed integer types.][80959]
  • [io::Empty now implements io::Seek.][78044]
  • [rc::Weak<T> and sync::Weak<T>'s methods such as as_ptr are now implemented for T: ?Sized types.][80764]
  • [Div and Rem by their NonZero variant is now implemented for all unsigned integers.][79134]

Stabilized APIs

  • [Arc::decrement_strong_count]
  • [Arc::increment_strong_count]
  • [Once::call_once_force]
  • [Peekable::next_if_eq]
  • [Peekable::next_if]
  • [Seek::stream_position]
  • [array::IntoIter]
  • [panic::panic_any]
  • [ptr::addr_of!]
  • [ptr::addr_of_mut!]
  • [slice::fill_with]
  • [slice::split_inclusive_mut]
  • [slice::split_inclusive]
  • [slice::strip_prefix]
  • [slice::strip_suffix]
  • [str::split_inclusive]
  • [sync::OnceState]
  • [task::Wake]
  • [VecDeque::range]
  • [VecDeque::range_mut]

Cargo

  • [Added the split-debuginfo profile option to control the -Csplit-debuginfo codegen option.][cargo/9112]
  • [Added the resolver field to Cargo.toml to enable the new feature resolver and CLI option behavior.][cargo/8997] Version 2 of the feature resolver will try to avoid unifying features of dependencies where that unification could be unwanted. Such as using the same dependency with a std feature in a build scripts and proc-macros, while using the no-std feature in the final binary. See the [Cargo book documentation][feature-resolver@2.0] for more information on the feature.

Rustdoc

  • [Rustdoc will now include documentation for methods available from _nested_ Deref traits.][80653]
  • [You can now provide a --default-theme flag which sets the default theme to use for documentation.][79642]

Various improvements to intra-doc links:

  • [You can link to non-path primitives such as slice.][80181]
  • [You can link to associated items.][74489]
  • [You can now include generic parameters when linking to items, like Vec<T>.][76934]

Misc

  • [You can now pass --include-ignored to tests (e.g. with cargo test -- --include-ignored) to include testing tests marked #[ignore].][80053]

Compatibility Notes

  • [WASI platforms no longer use the wasm-bindgen ABI, and instead use the wasm32 ABI.][79998]
  • [rustc no longer promotes division, modulo and indexing operations to const that could fail.][80579]
  • [The minimum version of glibc for the following platforms has been bumped to version 2.31 for the distributed artifacts.][81521]
  • armv5te-unknown-linux-gnueabi
  • sparc64-unknown-linux-gnu
  • thumbv7neon-unknown-linux-gnueabihf
  • armv7-unknown-linux-gnueabi
  • x86_64-unknown-linux-gnux32
  • [atomic::spin_loop_hint has been deprecated.][80966] It's recommended to use hint::spin_loop instead.

Internal Only

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

← Rust 1.50All versionsRust 1.52 →

Up next

Next releaseRust 1.52Released May 6, 2021.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