Rust 1.56.0
Released on October 21, 2021
What's Changed
- [The 2021 Edition is now stable.][rust#88100]
- [The pattern in
binding @ patterncan now also introduce new bindings.][rust#85305] - [Union field access is permitted in
const fn.][rust#85769]
- [Upgrade to LLVM 13.][rust#87570]
- [Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.][rust#88023]
- [Allow specifying a deployment target version for all iOS targets][rust#87699]
- [Warnings can be forced on with
--force-warn.][rust#87472] - [Promote
aarch64-apple-ios-simto Tier 2\*.][rust#87760] - [Add
powerpc-unknown-freebsdat Tier 3\*.][rust#87370] - [Add
riscv32imc-esp-espidfat Tier 3\*.][rust#87666]
- [Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows.][rust#83342]
- [Prefer
AtomicU{64,128}over Mutex for Instant backsliding protection.][rust#83093] - [Implement
Extend<(A, B)>for(Extend, Extend)][rust#85835] - [impl Default, Copy, Clone for std::io::Sink and std::io::Empty][rust#86744]
- [
impl From<[(K, V); N]>for all collections.][rust#84111] - [Remove
P: Unpinbound on impl Future for Pin.][rust#81363] - [Treat invalid environment variable names as nonexistent.][rust#86183]
- [Cargo supports specifying a minimum supported Rust version in Cargo.toml.][
rust-version]
- [Update to new argument parsing rules on Windows.][rust#87580]
- [Disallow the aapcs calling convention on aarch64][rust#88399]
- [Make
SEMICOLON_IN_EXPRESSIONS_FROM_MACROSwarn by default][rust#87385] - [Warn when an escaped newline skips multiple lines.][rust#87671]
- [Calls to
libc::getpid/std::process::idfromCommand::pre_exec
- [
std::os::unix::fs::chroot] - [
UnsafeCell::raw_get] - [
BufWriter::into_parts] - [
core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}] - [
Vec::shrink_to] - [
String::shrink_to] - [
OsString::shrink_to] - [
PathBuf::shrink_to] - [
BinaryHeap::shrink_to] - [
VecDeque::shrink_to] - [
HashMap::shrink_to] - [
HashSet::shrink_to] - [
std::mem::transmute] - [
[T]::first][slice::first] - [
[T]::split_first][slice::split_first] - [
[T]::last][slice::last] - [
[T]::split_last][slice::split_last] - [LLVM is compiled with PGO in published x86_64-unknown-linux-gnu artifacts.][rust#88069]
- [Unify representation of macros in internal data structures.][rust#88019]
Full Changelog
Language
--------
- [The 2021 Edition is now stable.][rust#88100]
See [the edition guide][rust-2021-edition-guide] for more details.
- [The pattern in binding @ pattern can now also introduce new bindings.][rust#85305]
- [Union field access is permitted in const fn.][rust#85769]
[rust-2021-edition-guide]: https://doc.rust-lang.org/nightly/edition-guide/rust-2021/index.html
Compiler
--------
- [Upgrade to LLVM 13.][rust#87570]
- [Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.][rust#88023]
- [Allow specifying a deployment target version for all iOS targets][rust#87699]
- [Warnings can be forced on with --force-warn.][rust#87472]
This feature is primarily intended for usage by cargo fix, rather than end users.
- [Promote aarch64-apple-ios-sim to Tier 2\*.][rust#87760]
- [Add powerpc-unknown-freebsd at Tier 3\*.][rust#87370]
- [Add riscv32imc-esp-espidf at Tier 3\*.][rust#87666]
\* Refer to Rust's [platform support page][platform-support-doc] for more
information on Rust's tiered platform support.
Libraries
---------
- [Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows.][rust#83342]
The Windows console still requires valid Unicode, but this change allows
splitting a UTF-8 character across multiple write calls. This allows, for
instance, programs that just read and write data buffers (e.g. copying a file
to stdout) without regard for Unicode or character boundaries.
- [Prefer AtomicU{64,128} over Mutex for Instant backsliding protection.][rust#83093]
For this use case, atomics scale much better under contention.
- [Implement Extend<(A, B)> for (Extend, Extend)][rust#85835]
- [impl Default, Copy, Clone for std::io::Sink and std::io::Empty][rust#86744]
- [impl From<[(K, V); N]> for all collections.][rust#84111]
- [Remove P: Unpin bound on impl Future for Pin.][rust#81363]
- [Treat invalid environment variable names as nonexistent.][rust#86183]
Previously, the environment functions would panic if given a variable name
with an internal null character or equal sign (=). Now, these functions will
just treat such names as nonexistent variables, since the OS cannot represent
the existence of a variable with such a name.
Stabilised APIs
---------------
- [std::os::unix::fs::chroot]
- [UnsafeCell::raw_get]
- [BufWriter::into_parts]
- [core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}]
These APIs were previously stable in std, but are now also available in core.
- [Vec::shrink_to]
- [String::shrink_to]
- [OsString::shrink_to]
- [PathBuf::shrink_to]
- [BinaryHeap::shrink_to]
- [VecDeque::shrink_to]
- [HashMap::shrink_to]
- [HashSet::shrink_to]
These APIs are now usable in const contexts:
- [std::mem::transmute]
- [[T]::first][slice::first]
- [[T]::split_first][slice::split_first]
- [[T]::last][slice::last]
- [[T]::split_last][slice::split_last]
Cargo
-----
- [Cargo supports specifying a minimum supported Rust version in Cargo.toml.][rust-version]
This has no effect at present on dependency version selection.
We encourage crates to specify their minimum supported Rust version, and we encourage CI systems
that support Rust code to include a crate's specified minimum version in the test matrix for that
crate by default.
Compatibility notes
-------------------
- [Update to new argument parsing rules on Windows.][rust#87580]
This adjusts Rust's standard library to match the behavior of the standard
libraries for C/C++. The rules have changed slightly over time, and this PR
brings us to the latest set of rules (changed in 2008).
- [Disallow the aapcs calling convention on aarch64][rust#88399]
This was already not supported by LLVM; this change surfaces this lack of
support with a better error message.
- [Make SEMICOLON_IN_EXPRESSIONS_FROM_MACROS warn by default][rust#87385]
- [Warn when an escaped newline skips multiple lines.][rust#87671]
- [Calls to libc::getpid / std::process::id from Command::pre_exec
may return different values on glibc <= 2.24.][rust#81825]
Rust now invokes the clone3 system call directly, when available, to use new functionality
available via that system call. Older versions of glibc cache the result of getpid, and only
update that cache when calling glibc's clone/fork functions, so a direct system call bypasses
that cache update. glibc 2.25 and newer no longer cache getpid for exactly this reason.
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.
- [LLVM is compiled with PGO in published x86_64-unknown-linux-gnu artifacts.][rust#88069]
This improves the performance of most Rust builds.
- [Unify representation of macros in internal data structures.][rust#88019]
This change fixes a host of bugs with the handling of macros by the compiler,
as well as rustdoc.
[std::os::unix::fs::chroot]: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html
[UnsafeCell::raw_get]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get
[BufWriter::into_parts]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
[core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}]: https://github.com/rust-lang/rust/pull/84662
[Vec::shrink_to]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to
[String::shrink_to]: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to
[OsString::shrink_to]: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to
[PathBuf::shrink_to]: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to
[BinaryHeap::shrink_to]: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to
[VecDeque::shrink_to]: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to
[HashMap::shrink_to]: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to
[HashSet::shrink_to]: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to
[std::mem::transmute]: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html
[slice::first]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.first
[slice::split_first]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_first
[slice::last]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.last
[slice::split_last]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_last
[rust-version]: https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-rust-version-field
[rust#87671]: https://github.com/rust-lang/rust/pull/87671
[rust#86183]: https://github.com/rust-lang/rust/pull/86183
[rust#87385]: https://github.com/rust-lang/rust/pull/87385
[rust#88100]: https://github.com/rust-lang/rust/pull/88100
[rust#85305]: https://github.com/rust-lang/rust/pull/85305
[rust#88069]: https://github.com/rust-lang/rust/pull/88069
[rust#87472]: https://github.com/rust-lang/rust/pull/87472
[rust#87699]: https://github.com/rust-lang/rust/pull/87699
[rust#87570]: https://github.com/rust-lang/rust/pull/87570
[rust#88023]: https://github.com/rust-lang/rust/pull/88023
[rust#87760]: https://github.com/rust-lang/rust/pull/87760
[rust#87370]: https://github.com/rust-lang/rust/pull/87370
[rust#87580]: https://github.com/rust-lang/rust/pull/87580
[rust#83342]: https://github.com/rust-lang/rust/pull/83342
[rust#83093]: https://github.com/rust-lang/rust/pull/83093
[rust#85835]: https://github.com/rust-lang/rust/pull/85835
[rust#86744]: https://github.com/rust-lang/rust/pull/86744
[rust#81363]: https://github.com/rust-lang/rust/pull/81363
[rust#84111]: https://github.com/rust-lang/rust/pull/84111
[rust#85769]: https://github.com/rust-lang/rust/pull/85769#issuecomment-854363720
[rust#88399]: https://github.com/rust-lang/rust/pull/88399
[rust#81825]: https://github.com/rust-lang/rust/pull/81825#issuecomment-808406918
[rust#88019]: https://github.com/rust-lang/rust/pull/88019
[rust#87666]: https://github.com/rust-lang/rust/pull/87666