What’s new in Rust 1.50


The unique approach of the Rust programming language results in better code with fewer compromises than C, C++, Go, and the other languages you probably use. It also gets updated regularly, often every month.

Where to download the latest Rust version

If you already have a previous version of Rust installed via rustup, you can access the latest version via the following command:

$ rustup update stable

The new features in Rust 1.50.0

Published February 11, 2021, Rust 1.50.0 improves array indexing, expands safe access to union fields, and adds to the standard library. Specific improvements include:

  • For const-generic array indexing, this release continues a progression toward stable const generics, adding implementations of ops::Index and IndexMut for arrays [T; N] for any length of Const N. The indexing operator [ ] already worked on arrays through the compiler, but at the type level, arrays did not actually implement the library traits until now. Also, stable use of const values in array repetition is formally acknowledged.
  • Safe assignments to ManuallyDrop<T> union fields are permitted.
  • A niche for File on Unix platforms is now permitted. With this feature, some types in Rust have limitations on what is considered a valid value, which may not cover the range of possible memory values. Any remaining valid value is called a niche, with this space usable for type layout optimizations. On Unix platforms, Rust’s File is made of the system’s file integer descriptor; this happens to have a possible niche because it cannot be -1! System calls that return a file descriptor use -1 to indicate an error occurred, so it is never possible for -1 to be a real file descriptor. Beginning with Rust 1.50, this is added to the type definition so it can be used in layout optimizations, too. It follows that Option<File> now will have the same size as File.
  • For Cargo, a [rustc-workspace-wrapper] option has been added, to set a wrapper to execute instead of rustc, for workspace members only. Also, the --workspace flag has been added to the cargo update command.
  • Nine new stable functions were added to the library: bool::then, btree_map::Entry::or_insert_with_key, f32::clamp, f64::clamphash_map::Entry::or_insert_with_key, Ord::clamp, RefCell::take, slice::fill, and UnsafeCell::get_mut.
  • Also in the library, several existing functions were made const: IpAddr::is_ipv4, IpAddr::is_ipv6, Layout::size, Layout::align, Layout::from_size_align, pow for all integer types, checked_pow for all integer types, saturating_pow for all integer types, wrapping_pow for all integer types, next_power_of_two for all unsigned integer types, and checked_power_of_two for all unsigned integer types.

The new features in Rust 1.49.0

Announced December 31, 2020, Rust 1.49.0 designates 64-bit Arm Linux as a Tier 1 target, thus providing the highest support guarantee, with the full test suite run on this platform on every change merged in the compiler. This support is expected to benefit workloads spanning from embedded systems to servers and desktops. Prebuilt binaries also are available. This marks the first time a non-x86 target has reached Tier 1 support. The Rust development team hopes to bring more platforms into this tier in the future.

Also with Rust 1.49.0, 64-bit Arm for MacOS and Windows reach Tier 2 support. Developers can expect these two targets to have prebuilt binaries installable from rustup. Tier 2 targets are guaranteed to build, and prebuilt binaries are provided. However, the Rust team does not execute the test suite on those platforms. Produced binaries may not work and might have bugs.

Other additions, improvements, and changes in Rust 1.49.0:

  • Three stable functions have been added to the library: slice::select_nth_unstable, slice::select_nth_unstable_by, and slice::select_nth_unstable_by_key.
  • Two library functions were made const: Poll::is_ready and Poll::is_pending.
  • For the language, unions now can implement Drop and developers now can have a field in a union with ManuallyDrop<T>. Also, uninhibited enums can be cast to integers.
  • Developers can bind by reference and bind by move in patterns, enabling developers to selectively borrow individual components of a type.
  • For the compiler, the minimum supported version of LLVM has been moved to LLVM 9.

The new features in Rust 1.48.0

Unveiled on November 19, 2020, Rust 1.48.0 features easier linking in the Rustdoc library documentation tool, with syntax to let Rustdoc know when developers are trying to link to a type; URLs will be generated. Also in version 1.48.0:

  • Developers can specify #{doc(alias = “<alias>”) ] on items to add search aliases when searching through the Rustdoc UI.
  • The unsafe keyword is now syntactically permitted on modules. While still rejected semantically, this can now be parsed by procedural macros.
  • In the compiler, the -C link-self-contained=<yes|no> compiler flag is stabilized. This tells rustc whether to link its own C runtime and libraries or rely on an external linker to find them. This is supported only on windows-gnu, linux-musl, and wasi platforms.
  • In the library, the [T; N]: TryFrom<Vec<T>> API is now stable. Developers can use it to try to turn a vector into an array of a given length. Also stabilized in this release were five other APIs: slice::as_ptr_range, slice::as_mut_ptr_range, VecDeque::make_contiguous, future::pending, and future::ready.
  • Also in the library, all arrays of any length now implement TryFrom<Vec<T>>.

The new features in Rust 1.47.0

Announced October 8, 2020, Rust 1.47.0 has no new language features but enhances the standard library. Quality of life and toolchain improvements as well as library stabilizations are featured in the release. Release notes have been published for the upgrade.

Specific capabilities in Rust 1.47.0 include:

The new features in 1.46.0

Rust 1.46, announced on August 27, 2020, includes the following capabilities:

  • Several core language features now can be used in const fn, including if, if letmatch, and several others.
  • A #[track_caller] attribute, designed to improve error messages when unwrap and related functions panic, is now stable.
  • In a change to the library, std::mem::forget is now a const fn. Also in the library, two new APIs were stabilized: Option::zip and vec::Drain::as_slice.
  • For the compiler, the citylib target can be used on Apple iOS and tvOS platforms.
  • Recursively indexing into tuples no longer requires parentheses.

The new features in Rust 1.45.0

Announced on July 16, 2020, Rust 1.45 includes the following additions and improvements:

  • A fix is offered to mend some longstanding unsoundness when casting between integers and floats.
  • Stabilization is offered for function-like procedural macros in expressions, patterns, and statements. Expansion of the use of macros assists with use of the Rocket web framework for Rust.
  • Several library APIs have been stabilized, such as Arc::as_ptr, BTreeMap::remove_entry, and Span::resolved_at. The full list of APIs can be found in the Rust Blog.

The new features in Rust 1.43.1

This point release was introduced May 7, 2020, to address two regressions introduced in the 1.43.0 stable release. It also updates the OpenSSL version used by the Cargo package manager. Features include:

  • Rust 1.27 introduced support for detecting x86 CPU features in the standard library, via the is_x86_feature_detected macro. Because of an internal refactoring, Rust 1.43.0 prevented detection of features that cannot be used on stable yet, even though detecting them previously was allowed. Version 1.43.1 fixes this regression.
  • A fix is offered for broken cargo package –list command. Rust 1.43 broke support for listing files included in packages published with Cargo, when executed inside a workspace with path dependencies or unpublished versions.
  • OpenSSL, a Cargo dependency, has been updated to 1.1.1g. OpenSSL had released a security advisory but the Rust team was not able to include the fix in time for Rust 1.43.0. The team has no evidence the vulnerability could compromise Cargo users’ security.

The new features in Rust 1.43.0

Announced April 23, 2020, Rust 1.43.0 was considered a fairly minor release, with no major features introduced. Changes include:

  • Developers can use item fragments to interpolate items into the body of trait, impl, and extern blocks.
  • The type inference around primitives, references, and binary operations was improved.
  • To help integration testing, Cargo will set some new environment variables for tests to find executables.
  • In the Rust library, developers can use associated constants on floats and integers directly without having to import the module. Also, there is a new primitive module that re-exports Rust primitive types, which is useful when writing a macro and developers want to ensure types are not shadowed.
  • Several APIs in the library were stabilized: Once::is_completed, f32::LOG10_2, f32::LOG2_10, f32::LOG10_2, f64::LOG10_2, f64::LOG2_10, and iter::once_with.

The new features in Rust 1.41

The new features in Rust 1.38

Rust 1.38, released in September 2019, contains the following new features and improvements: