Rust versions / 1.46
Rust release · Aug 27, 2020
Rust 1.46: what's new, what was stabilized
Short answerRust 1.46 was released on Aug 27, 2020: 2 newly stable APIs (Option::zip, vec::Drain::as_slice); 11 compatibility notes that can affect existing code.
← Rust 1.45All versionsRust 1.47 →
2 APIs stabilized
Option::zip, vec::Drain::as_slice
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:
- [The target configuration option
abi_blacklisthas been renamed - [Rustc will now warn if you cast a C-like enum that implements
Drop.][72331] - [Rustc will fail to compile if you have a struct with
- [Tokens passed to
macro_rules!are now always captured.][73293] This helps - [The InnoSetup installer for Windows is no longer available.][72569] This was
- [
{f32, f64}::asinhnow returns the correct values for negative numbers.][72486] - [Rustc will no longer accept overlapping trait implementations that only
- [Rustc now correctly relates the lifetime of an existential associated
- [Rustc now dynamically links to
libz(also calledzlib) on Linux.][74420] - [Tests annotated with
#[should_panic]are broken on ARMv7 while running - [Pretty printing of some tokens in procedural macros changed.][75453] The
Use it
rustup update stable # get the newest release
rustup install 1.46 # or exactly this one
rustup override set 1.46 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.46" 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
- [
if,match, andloopexpressions can now be used in const functions.][72437] - [Additionally you are now also able to coerce and cast to slices (
&[T]) in const functions.][73862] - [The
#[track_caller]attribute can now be added to functions to use the function's caller's location information for panic messages.][72445] - [Recursively indexing into tuples no longer needs parentheses.][71322] E.g.
x.0.0over(x.0).0. - [
mem::transmutecan now be used in statics and constants.][72920] **Note** You currently can't usemem::transmutein constant functions.
Compiler
- [You can now use the
cdylibtarget on Apple iOS and tvOS platforms.][73516] - [Enabled static "Position Independent Executables" by default for
x86_64-unknown-linux-musl.][70740]
Libraries
- [
mem::forgetis now aconst fn.][73887] - [
Stringnow implementsFrom<char>.][73466] - [The
leading_ones, andtrailing_onesmethods have been stabilised for all integer types.][73032] - [
vec::IntoIter<T>now implementsAsRef<[T]>.][72583] - [All non-zero integer types (
NonZeroU8) now implementTryFromfor their zero-able equivalent (e.g.TryFrom<u8>).][72717] - [
&[T]and&mut [T]now implementPartialEq<Vec<T>>.][71660] - [
(String, u16)now implementsToSocketAddrs.][73007] - [
vec::Drain<'_, T>now implementsAsRef<[T]>.][72584]
Stabilized APIs
- [
Option::zip] - [
vec::Drain::as_slice]
Cargo
Added a number of new environment variables that are now available when compiling your crate.
- [
CARGO_BIN_NAMEandCARGO_CRATE_NAME][cargo/8270] Providing the name of the specific binary being compiled and the name of the crate. - [
CARGO_PKG_LICENSE][cargo/8325] The license from the manifest of the package. - [
CARGO_PKG_LICENSE_FILE][cargo/8387] The path to the license file.
Compatibility Notes
- The target configuration option
abi_blacklisthas been renamed tounsupported_abis. The old name will still continue to work. - Rustc will now warn if you cast a C-like enum that implements
Drop. This was previously accepted but will become a hard error in a future release. - [Rustc will fail to compile if you have a struct with
#[repr(i128)]or#[repr(u128)].]74109 This representation is currently only allowed onenums. - Tokens passed to
macro_rules!are now always captured. This helps ensure that spans have the correct information, and may cause breakage if you were relying on receiving spans with dummy information. - The InnoSetup installer for Windows is no longer available. This was a legacy installer that was replaced by a MSI installer a few years ago but was still being built.
{f32, f64}::asinhnow returns the correct values for negative numbers.- Rustc will no longer accept overlapping trait implementations that only differ in how the lifetime was bound.
- Rustc now correctly relates the lifetime of an existential associated type. This fixes some edge cases where
rustcwould erroneously allow you to pass a shorter lifetime than expected. - Rustc now dynamically links to
libz(also calledzlib) on Linux. The library will need to be installed forrustcto work, even though we expect it to be already available on most systems. - [Tests annotated with
#[should_panic]are broken on ARMv7 while running under QEMU.]74820 - Pretty printing of some tokens in procedural macros changed. The exact output returned by rustc's pretty printing is an unstable implementation detail: we recommend any macro relying on it to switch to a more robust parsing system.
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.47Released Oct 8, 2020.Read it next →Also worth your time
Did this answer your question?