Language
- You can now use the
cfg(target_vendor)
attribute. E.g.#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }
- Integer patterns such as in a match expression can now be exhaustive. E.g. You can have match statement on a
u8
that covers0..=255
and you would no longer be required to have a_ => unreachable!()
case. - You can now have multiple patterns in
if let
andwhile let
expressions. You can do this with the same syntax as amatch
expression. E.g.enum Creature { Crab(String), Lobster(String), Person(String), } fn main() { let state = Creature::Crab("Ferris"); if let Creature::Crab(name) | Creature::Person(name) = state { println!("This creature's name is: {}", name); } }
- You can now have irrefutable
if let
andwhile let
patterns. Using this feature will by default produce a warning as this behaviour can be unintuitive. E.g.if let _ = 5 {}
- You can now use
let
bindings, assignments, expression statements, and irrefutable pattern destructuring in const functions. - You can now call unsafe const functions. E.g.
const unsafe fn foo() -> i32 { 5 } const fn bar() -> i32 { unsafe { foo() } }
- You can now specify multiple attributes in a
cfg_attr
attribute. E.g.#[cfg_attr(all(), must_use, optimize)]
- You can now specify a specific alignment with the
#[repr(packed)]
attribute. E.g.#[repr(packed(2))] struct Foo(i16, i32);
is a struct with an alignment of 2 bytes and a size of 6 bytes. - You can now import an item from a module as an
_
. This allows you to import a trait's impls, and not have the name in the namespace. E.g.use std::io::Read as _; // Allowed as there is only one `Read` in the module. pub trait Read {}
- You may now use
Rc
,Arc
, andPin
as method receivers.
Compiler
- You can now set a linker flavor for
rustc
with the-Clinker-flavor
command line argument. - The minimum required LLVM version has been bumped to 6.0.
- Added support for the PowerPC64 architecture on FreeBSD.
- The
x86_64-fortanix-unknown-sgx
target support has been upgraded to tier 2 support. Visit the platform support page for information on Rust's platform support. - Added support for the
thumbv7neon-linux-androideabi
andthumbv7neon-unknown-linux-gnueabihf
targets. - Added support for the
x86_64-unknown-uefi
target.
Libraries
- The methods
overflowing_{add, sub, mul, shl, shr}
are nowconst
functions for all numeric types. - The methods
rotate_left
,rotate_right
, andwrapping_{add, sub, mul, shl, shr}
are nowconst
functions for all numeric types. - The methods
is_positive
andis_negative
are nowconst
functions for all signed numeric types. - The
get
method for allNonZero
types is nowconst
. - The methods
count_ones
,count_zeros
,leading_zeros
,trailing_zeros
,swap_bytes
,from_be
,from_le
,to_be
,to_le
are nowconst
for all numeric types. Ipv4Addr::new
is now aconst
function
Stabilized APIs
unix::FileExt::read_exact_at
unix::FileExt::write_all_at
Option::transpose
Result::transpose
convert::identity
pin::Pin
marker::Unpin
marker::PhantomPinned
Vec::resize_with
VecDeque::resize_with
Duration::as_millis
Duration::as_micros
Duration::as_nanos
Cargo
- You can now publish crates that require a feature flag to compile with
cargo publish --features
orcargo publish --all-features
. - Cargo should now rebuild a crate if a file was modified during the initial build.
Compatibility Notes
- The methods
str::{trim_left, trim_right, trim_left_matches, trim_right_matches}
are now deprecated in the standard library, and their usage will now produce a warning. Please use thestr::{trim_start, trim_end, trim_start_matches, trim_end_matches}
methods instead. - The
Error::cause
method has been deprecated in favor ofError::source
which supports downcasting. - Libtest no longer creates a new thread for each test when
--test-threads=1
. It also runs the tests in deterministic order