Releases: rust-lang/rust
Releases · rust-lang/rust
Rust 1.26.1
Tools
Compatibility Notes
Rust 1.26.0
Language
- Closures now implement
Copy
and/orClone
if all captured variables implement either or both traits. - The inclusive range syntax e.g.
for x in 0..=10
is now stable. - The
'_
lifetime is now stable. The underscore lifetime can be used anywhere a lifetime can be elided. impl Trait
is now stable allowing you to have abstract types in returns or in function parameters. E.g.fn foo() -> impl Iterator<Item=u8>
orfn open(path: impl AsRef<Path>)
.- Pattern matching will now automatically apply dereferences.
- 128-bit integers in the form of
u128
andi128
are now stable. main
can now returnResult<(), E: Debug>
in addition to()
.- A lot of operations are now available in a const context. E.g. You can now index into constant arrays, reference and dereference into constants, and use tuple struct constructors.
- Fixed entry slice patterns are now stable. E.g.
let points = [1, 2, 3, 4]; match points { [1, 2, 3, 4] => println!("All points were sequential."), _ => println!("Not all points were sequential."), }
Compiler
- LLD is now used as the default linker for
wasm32-unknown-unknown
. - Fixed exponential projection complexity on nested types. This can provide up to a ~12% reduction in compile times for certain crates.
- Added the
--remap-path-prefix
option to rustc. Allowing you to remap path prefixes outputted by the compiler. - Added
powerpc-unknown-netbsd
target.
Libraries
- Implemented
From<u16> for usize
&From<{u8, i16}> for isize
. - Added hexadecimal formatting for integers with fmt::Debug e.g.
assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")
- Implemented
Default, Hash
forcmp::Reverse
. - Optimized
str::repeat
being 8x faster in large cases. ascii::escape_default
is now available in libcore.- Trailing commas are now supported in std and core macros.
- Implemented
Copy, Clone
forcmp::Reverse
- Implemented
Clone
forchar::{ToLowercase, ToUppercase}
.
Stabilized APIs
*const T::add
*const T::copy_to_nonoverlapping
*const T::copy_to
*const T::read_unaligned
*const T::read_volatile
*const T::read
*const T::sub
*const T::wrapping_add
*const T::wrapping_sub
*mut T::add
*mut T::copy_to_nonoverlapping
*mut T::copy_to
*mut T::read_unaligned
*mut T::read_volatile
*mut T::read
*mut T::replace
*mut T::sub
*mut T::swap
*mut T::wrapping_add
*mut T::wrapping_sub
*mut T::write_bytes
*mut T::write_unaligned
*mut T::write_volatile
*mut T::write
Box::leak
FromUtf8Error::as_bytes
LocalKey::try_with
Option::cloned
btree_map::Entry::and_modify
fs::read_to_string
fs::read
fs::write
hash_map::Entry::and_modify
iter::FusedIterator
ops::RangeInclusive
ops::RangeToInclusive
process::id
slice::rotate_left
slice::rotate_right
String::retain
Cargo
- Cargo will now output path to custom commands when
-v
is passed with--list
- The Cargo binary version is now the same as the Rust version
Misc
Compatibility Notes
- aliasing a
Fn
trait asdyn
no longer works. E.g. the following syntax is now invalid.
use std::ops::Fn as dyn;
fn g(_: Box<dyn(std::fmt::Debug)>) {} - The result of dereferences are no longer promoted to
'static
. e.g.fn main() { const PAIR: &(i32, i32) = &(0, 1); let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work }
- Deprecate
AsciiExt
trait in favor of inherent methods. ".e0"
will now no longer parse as0.0
and will instead cause an error.- Removed hoedown from rustdoc.
- Bounds on higher-kinded lifetimes a hard error.
Rust 1.25.0
Language
- The
#[repr(align(x))]
attribute is now stable. RFC 1358 - You can now use nested groups of imports. e.g.
use std::{fs::File, io::Read, path::{Path, PathBuf}};
- You can now have
|
at the start of a match arm. e.g.
enum Foo { A, B, C }
fn main() {
let x = Foo::A;
match x {
| Foo::A
| Foo::B => println!("AB"),
| Foo::C => println!("C"),
}
}
Compiler
Libraries
- Impl Send for
process::Command
on Unix. - Impl PartialEq and Eq for
ParseCharError
. UnsafeCell::into_inner
is now safe.- Implement libstd for CloudABI.
Float::{from_bits, to_bits}
is now available in libcore.- Implement
AsRef<Path>
for Component - Implemented
Write
forCursor<&mut Vec<u8>>
- Moved
Duration
to libcore.
Stabilized APIs
The following functions can now be used in a constant expression. eg. static MINUTE: Duration = Duration::from_secs(60);
Cargo
cargo new
no longer removesrust
orrs
prefixes/suffixes.cargo new
now defaults to creating a binary crate, instead of a library crate.
Misc
Compatibility Notes
- Deprecated
net::lookup_host
. rustdoc
has switched to pulldown as the default markdown renderer.- The borrow checker was sometimes incorrectly permitting overlapping borrows around indexing operations (see #47349). This has been fixed (which also enabled some correct code that used to cause errors (e.g. #33903 and #46095).
- Removed deprecated unstable attribute
#[simd]
.
Rust 1.24.1
Rust 1.24.0
Language
- External
sysv64
ffi is now available. eg.extern "sysv64" fn foo () {}
Compiler
- rustc now uses 16 codegen units by default for release builds. For the fastest builds, utilize
codegen-units=1
. - Added
armv4t-unknown-linux-gnueabi
target. - Add
aarch64-unknown-openbsd
support
Libraries
str::find::<char>
now uses memchr. This should lead to a 10x improvement in performance in the majority of cases.OsStr
'sDebug
implementation is now lossless and consistent with Windows.time::{SystemTime, Instant}
now implementHash
.- impl
From<bool>
forAtomicBool
- impl
From<{CString, &CStr}>
for{Arc<CStr>, Rc<CStr>}
- impl
From<{OsString, &OsStr}>
for{Arc<OsStr>, Rc<OsStr>}
- impl
From<{PathBuf, &Path}>
for{Arc<Path>, Rc<Path>}
- float::from_bits now just uses transmute. This provides some optimisations from LLVM.
- Copied
AsciiExt
methods ontochar
- Remove
T: Sized
requirement onptr::is_null()
- impl
From<RecvError>
for{TryRecvError, RecvTimeoutError}
- Optimised
f32::{min, max}
to generate more efficient x86 assembly [u8]::contains
now uses memchr which provides a 3x speed improvement
Stabilized APIs
The following functions can now be used in a constant expression. eg. let buffer: [u8; size_of::<usize>()];
, static COUNTER: AtomicUsize = AtomicUsize::new(1);
AtomicBool::new
AtomicUsize::new
AtomicIsize::new
AtomicPtr::new
Cell::new
{integer}::min_value
{integer}::max_value
mem::size_of
mem::align_of
ptr::null
ptr::null_mut
RefCell::new
UnsafeCell::new
Cargo
- Added a
workspace.default-members
config that overrides implied--all
in virtual workspaces. - Enable incremental by default on development builds. Also added configuration keys to
Cargo.toml
and.cargo/config
to disable on a per-project or global basis respectively.
Misc
Compatibility Notes
- Floating point types
Debug
impl now always prints a decimal point. Ipv6Addr
now rejects superfluous::
's in IPv6 addresses This is in accordance with IETF RFC 4291 §2.2.- Unwinding will no longer go past FFI boundaries, and will instead abort.
Formatter::flags
method is now deprecated. Thesign_plus
,sign_minus
,alternate
, andsign_aware_zero_pad
should be used instead.- Leading zeros in tuple struct members is now an error
column!()
macro is one-based instead of zero-basedfmt::Arguments
can no longer be shared across threads- Access to
#[repr(packed)]
struct fields is now unsafe - Cargo sets a different working directory for the compiler
Rust 1.23.0
Language
- Arbitrary
auto
traits are now permitted in trait objects. - rustc now uses subtyping on the left hand side of binary operations. Which should fix some confusing errors in some operations.
Compiler
- Enabled
TrapUnreachable
in LLVM which should mitigate the impact of undefined behavior. - rustc now suggests renaming import if names clash.
- Display errors/warnings correctly when there are zero-width or wide characters.
- rustc now avoids unnecessary copies of arguments that are simple bindings This should improve memory usage on average by 5-10%.
- Updated musl used to build musl rustc to 1.1.17
Libraries
- Allow a trailing comma in
assert_eq/ne
macro - Implement Hash for raw pointers to unsized types
- impl
From<*mut T>
forAtomicPtr<T>
- impl
From<usize/isize>
forAtomicUsize/AtomicIsize
. - Removed the
T: Sync
requirement forRwLock<T>: Send
- Removed
T: Sized
requirement for{<*const T>, <*mut T>}::as_ref
and<*mut T>::as_mut
- Optimized
Thread::{park, unpark}
implementation - Improved
SliceExt::binary_search
performance. - impl
FromIterator<()>
for()
- Copied
AsciiExt
trait methods to primitive types. Use ofAsciiExt
is now deprecated.
Stabilized APIs
Cargo
- Cargo now supports uninstallation of multiple packages eg.
cargo uninstall foo bar
uninstallsfoo
andbar
. - Added unit test checking to
cargo check
- Cargo now lets you install a specific version using
cargo install --version
Misc
- Releases now ship with the Cargo book documentation.
- rustdoc now prints rendering warnings on every run.
Compatibility Notes
- Changes have been made to type equality to make it more correct, in rare cases this could break some code. Tracking issue for further information
char::escape_debug
now uses Unicode 10 over 9.- Upgraded Android SDK to 27, and NDK to r15c. This drops support for Android 9, the minimum supported version is Android 14.
- Bumped the minimum LLVM to 3.9
Rust 1.22.1
Rust 1.22.0
Language
non_snake_case
lint now allows extern no-mangle functions- Now accepts underscores in unicode escapes
T op= &T
now works for numeric types. eg.let mut x = 2; x += &8;
- types that impl
Drop
are now allowed inconst
andstatic
types
Compiler
- rustc now defaults to having 16 codegen units at debug on supported platforms.
- rustc will no longer inline in codegen units when compiling for debug This should decrease compile times for debug builds.
- strict memory alignment now enabled on ARMv6
- Remove support for the PNaCl target
le32-unknown-nacl
Libraries
- Allow atomic operations up to 32 bits on
armv5te_unknown_linux_gnueabi
Box<Error>
now implsFrom<Cow<str>>
std::mem::Discriminant
is now guaranteed to beSend + Sync
fs::copy
now returns the length of the main stream on NTFS.- Properly detect overflow in
Instant += Duration
. - impl
Hasher
for{&mut Hasher, Box<Hasher>}
- impl
fmt::Debug
forSplitWhitespace
. Option<T>
now implsTry
This allows for using?
withOption
types.
Stabilized APIs
Cargo
- Cargo will now build multi file examples in subdirectories of the
examples
folder that have amain.rs
file. - Changed
[root]
to[package]
inCargo.lock
Packages with the old format will continue to work and can be updated withcargo update
. - Now supports vendoring git repositories
Misc
libbacktrace
is now available on Apple platforms.- Stabilised the
compile_fail
attribute for code fences in doc-comments. This now lets you specify that a given code example will fail to compile.
Compatibility Notes
Rust 1.21.0
Language
- You can now use static references for literals. Example:
fn main() { let x: &'static u32 = &0; }
- Relaxed path syntax. Optional
::
before<
is now allowed in all contexts. Example:my_macro!(Vec<i32>::new); // Always worked my_macro!(Vec::<i32>::new); // Now works
Compiler
- Upgraded jemalloc to 4.5.0
- Enabled unwinding panics on Redox
- Now runs LLVM in parallel during translation phase. This should reduce peak memory usage.
Libraries
- Generate builtin impls for
Clone
for all arrays and tuples that areT: Clone
Stdin
,Stdout
, andStderr
now implementAsRawFd
.Rc
andArc
now implementFrom<&[T]> where T: Clone
,From<str>
,From<String>
,From<Box<T>> where T: ?Sized
, andFrom<Vec<T>>
.
Stabilized APIs
Cargo
- You can now call
cargo install
with multiple package names - Cargo commands inside a virtual workspace will now implicitly pass
--all
- Added a
[patch]
section toCargo.toml
to handle prepublication dependencies RFC 1969 include
&exclude
fields inCargo.toml
now accept gitignore like patterns- Added the
--all-targets
option - Using required dependencies as a feature is now deprecated and emits a warning
Misc
- Cargo docs are moving to doc.rust-lang.org/cargo
- The rustdoc book is now available at doc.rust-lang.org/rustdoc
- Added a preview of RLS has been made available through rustup Install with
rustup component add rls-preview
std::os
documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org Previously only showedstd::os::unix
.
Compatibility Notes
- Changes in method matching against higher-ranked types This may cause breakage in subtyping corner cases. A more in-depth explanation is available.
- rustc's JSON error output's byte position start at top of file. Was previously relative to the rustc's internal
CodeMap
struct which required the unstable librarylibsyntax
to correctly use. unused_results
lint no longer ignores booleans
Rust 1.20.0
Language
Compiler
- Struct fields are now properly coerced to the expected field type.
- Enabled wasm LLVM backend WASM can now be built with the
wasm32-experimental-emscripten
target. - Changed some of the error messages to be more helpful.
- Add support for RELRO(RELocation Read-Only) for platforms that support it.
- rustc now reports the total number of errors on compilation failure previously this was only the number of errors in the pass that failed.
- Expansion in rustc has been sped up 29x.
- added
msp430-none-elf
target. - rustc will now suggest one-argument enum variant to fix type mismatch when applicable
- Fixes backtraces on Redox
- rustc now identifies different versions of same crate when absolute paths of different types match in an error message.
Libraries
- Relaxed Debug constraints on
{HashMap,BTreeMap}::{Keys,Values}
. - Impl
PartialEq
,Eq
,PartialOrd
,Ord
,Debug
,Hash
for unsized tuples. - Impl
fmt::{Display, Debug}
forRef
,RefMut
,MutexGuard
,RwLockReadGuard
,RwLockWriteGuard
- Impl
Clone
forDefaultHasher
. - Impl
Sync
forSyncSender
. - Impl
FromStr
forchar
- Fixed how
{f32, f64}::{is_sign_negative, is_sign_positive}
handles NaN. - allow messages in the
unimplemented!()
macro. ie.unimplemented!("Waiting for 1.21 to be stable")
pub(restricted)
is now supported in thethread_local!
macro.- Upgrade to Unicode 10.0.0
- Reimplemented
{f32, f64}::{min, max}
in Rust instead of using CMath. - Skip the main thread's manual stack guard on Linux
- Iterator::nth for
ops::{Range, RangeFrom}
is now done in O(1) time #[repr(align(N))]
attribute max number is now 2^31 - 1. This was previously 2^15.{OsStr, Path}::Display
now avoids allocations where possible
Stabilized APIs
CStr::into_c_string
CString::as_c_str
CString::into_boxed_c_str
Chain::get_mut
Chain::get_ref
Chain::into_inner
Option::get_or_insert_with
Option::get_or_insert
OsStr::into_os_string
OsString::into_boxed_os_str
Take::get_mut
Take::get_ref
Utf8Error::error_len
char::EscapeDebug
char::escape_debug
compile_error!
f32::from_bits
f32::to_bits
f64::from_bits
f64::to_bits
mem::ManuallyDrop
slice::sort_unstable_by_key
slice::sort_unstable_by
slice::sort_unstable
str::from_boxed_utf8_unchecked
str::as_bytes_mut
str::as_bytes_mut
str::from_utf8_mut
str::from_utf8_unchecked_mut
str::get_mut
str::get_unchecked_mut
str::get_unchecked
str::get
str::into_boxed_bytes
Cargo
- Cargo API token location moved from
~/.cargo/config
to~/.cargo/credentials
. - Cargo will now build
main.rs
binaries that are in sub-directories ofsrc/bin
. ie. Havingsrc/bin/server/main.rs
andsrc/bin/client/main.rs
generatestarget/debug/server
andtarget/debug/client
- You can now specify version of a binary when installed through
cargo install
using--vers
. - Added
--no-fail-fast
flag to cargo to run all benchmarks regardless of failure. - Changed the convention around which file is the crate root.