Releases: pietroalbini/rust
Rust 1.41.0
Language
- You can now pass type parameters to foreign items when implementing traits. E.g. You can now write
impl<T> From<Foo> for Vec<T> {}
. - You can now arbitrarily nest receiver types in the
self
position. E.g. you can now writefn foo(self: Box<Box<Self>>) {}
. Previously onlySelf
,&Self
,&mut Self
,Arc<Self>
,Rc<Self>
, andBox<Self>
were allowed. - You can now use any valid identifier in a
format_args
macro. Previously identifiers starting with an underscore were not allowed. - Visibility modifiers (e.g.
pub
) are now syntactically allowed on trait items and enum variants. These are still rejected semantically, but can be seen and parsed by procedural macros and conditional compilation.
Compiler
- Rustc will now warn if you have unused loop
'label
s. - Removed support for the
i686-unknown-dragonfly
target. - Added tier 3 support* for the
riscv64gc-unknown-linux-gnu
target. - You can now pass an arguments file passing the
@path
syntax to rustc. Note that the format differs somewhat from what is found in other tooling; please see the documentation for more information. - You can now provide
--extern
flag without a path, indicating that it is available from the search path or specified with an-L
flag.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- The
core::panic
module is now stable. It was already stable throughstd
. NonZero*
numerics now implementFrom<NonZero*>
if it's a smaller integer width. E.g.NonZeroU16
now implementsFrom<NonZeroU8>
.MaybeUninit<T>
now implementsfmt::Debug
.
Stabilized APIs
Result::map_or
Result::map_or_else
std::rc::Weak::weak_count
std::rc::Weak::strong_count
std::sync::Weak::weak_count
std::sync::Weak::strong_count
Cargo
- Cargo will now document all the private items for binary crates by default.
cargo-install
will now reinstall the package if it detects that it is out of date.- Cargo.lock now uses a more git friendly format that should help to reduce merge conflicts.
- You can now override specific dependencies's build settings E.g.
[profile.dev.package.image] opt-level = 2
sets theimage
crate's optimisation level to2
for debug builds. You can also use[profile.<profile>.build-override]
to override build scripts and their dependencies.
Misc
- You can now specify
edition
in documentation code blocks to compile the block for that edition. E.g.edition2018
tells rustdoc that the code sample should be compiled the 2018 edition of Rust. - You can now provide custom themes to rustdoc with
--theme
, and check the current theme with--check-theme
. - You can use
#[cfg(doc)]
to compile an item when building documentation.
Compatibility Notes
- As previously announced 1.41.0 will be the last tier 1 release for 32-bit Apple targets. This means that the source code is still available to build, but the targets are no longer being tested and release binaries for those platforms will no longer be distributed by the Rust project. Please refer to the linked blog post for more information.
Rust 1.40.0
Language
-
You can now use tuple
struct
s and tupleenum
variant's constructors inconst
contexts. e.g.pub struct Point(i32, i32); const ORIGIN: Point = { let constructor = Point; constructor(0, 0) };
-
You can now mark
struct
s,enum
s, andenum
variants with the#[non_exhaustive]
attribute to indicate that there may be variants or fields added in the future. For example this requires adding a wild-card branch (_ => {}
) to any match statements on a non-exhaustiveenum
. (RFC 2008) -
You can now use function-like procedural macros in
extern
blocks and in type positions. e.g.type Generated = macro!();
-
The
meta
pattern matcher inmacro_rules!
now correctly matches the modern attribute syntax. For example(#[$m:meta])
now matches#[attr]
,#[attr{tokens}]
,#[attr[tokens]]
, and#[attr(tokens)]
.
Compiler
- Added tier 3 support* for the
thumbv7neon-unknown-linux-musleabihf
target. - Added tier 3 support for the
aarch64-unknown-none-softfloat
target. - Added tier 3 support for the
mips64-unknown-linux-muslabi64
, andmips64el-unknown-linux-muslabi64
targets.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
Stabilized APIs
BTreeMap::get_key_value
HashMap::get_key_value
Option::as_deref_mut
Option::as_deref
Option::flatten
UdpSocket::peer_addr
f32::to_be_bytes
f32::to_le_bytes
f32::to_ne_bytes
f64::to_be_bytes
f64::to_le_bytes
f64::to_ne_bytes
f32::from_be_bytes
f32::from_le_bytes
f32::from_ne_bytes
f64::from_be_bytes
f64::from_le_bytes
f64::from_ne_bytes
mem::take
slice::repeat
todo!
Cargo
- Cargo will now always display warnings, rather than only on fresh builds.
- Feature flags (except
--all-features
) passed to a virtual workspace will now produce an error. Previously these flags were ignored. - You can now publish
dev-dependencies
without including aversion
.
Misc
Compatibility Notes
- As previously announced, any previous NLL warnings in the 2015 edition are now hard errors.
- The
include!
macro will now warn if it failed to include the entire file. Theinclude!
macro unintentionally only includes the first expression in a file, and this can be unintuitive. This will become either a hard error in a future release, or the behavior may be fixed to include all expressions as expected. - Using
#[inline]
on function prototypes and consts now emits a warning underunused_attribute
lint. Using#[inline]
anywhere else inside traits orextern
blocks now correctly emits a hard error.
Rust 1.39.0
Language
- You can now create
async
functions and blocks withasync fn
,async move {}
, andasync {}
respectively, and you can now call.await
on async expressions. - You can now use certain attributes on function, closure, and function pointer parameters. These attributes include
cfg
,cfg_attr
,allow
,warn
,deny
,forbid
as well as inert helper attributes used by procedural macro attributes applied to items. e.g.fn len( #[cfg(windows)] slice: &[u16], #[cfg(not(windows))] slice: &[u8], ) -> usize { slice.len() }
- You can now take shared references to bind-by-move patterns in the
if
guards ofmatch
arms. e.g.fn main() { let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]); match array { nums // ---- `nums` is bound by move. if nums.iter().sum::<u8>() == 10 // ^------ `.iter()` implicitly takes a reference to `nums`. => { drop(nums); // ----------- Legal as `nums` was bound by move and so we have ownership. } _ => unreachable!(), } }
Compiler
- Added tier 3* support for the
i686-unknown-uefi
target. - Added tier 3 support for the
sparc64-unknown-openbsd
target. - rustc will now trim code snippets in diagnostics to fit in your terminal. Note Cargo currently doesn't use this feature. Refer to cargo#7315 to track this feature's progress.
- You can now pass
--show-output
argument to test binaries to print the output of successful tests.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
Vec::new
andString::new
are nowconst
functions.LinkedList::new
is now aconst
function.str::len
,[T]::len
andstr::as_bytes
are nowconst
functions.- The
abs
,wrapping_abs
, andoverflowing_abs
numeric functions are nowconst
.
Stabilized APIs
Cargo
- You can now publish git dependencies if supplied with a
version
. - The
--all
flag has been renamed to--workspace
. Using--all
is now deprecated.
Misc
Compatibility Notes
- Code that was previously accepted by the old borrow checker, but rejected by the NLL borrow checker is now a hard error in Rust 2018. This was previously a warning, and will also become a hard error in the Rust 2015 edition in the 1.40.0 release.
rustdoc
now requiresrustc
to be installed and in the same directory to run tests. This should improve performance when running a large amount of doctests.- The
try!
macro will now issue a deprecation warning. It is recommended to use the?
operator instead. asinh(-0.0)
now correctly returns-0.0
. Previously this returned0.0
.
Rust 1.38.0
Language
- The
#[global_allocator]
attribute can now be used in submodules. - The
#[deprecated]
attribute can now be used on macros.
Compiler
- Added pipelined compilation support to
rustc
. This will improve compilation times in some cases. For further information please refer to the "Evaluating pipelined rustc compilation" thread. - Added tier 3* support for the
aarch64-uwp-windows-msvc
,i686-uwp-windows-gnu
,i686-uwp-windows-msvc
,x86_64-uwp-windows-gnu
, andx86_64-uwp-windows-msvc
targets. - Added tier 3 support for the
armv7-unknown-linux-gnueabi
andarmv7-unknown-linux-musleabi
targets. - Added tier 3 support for the
hexagon-unknown-linux-musl
target. - Added tier 3 support for the
riscv32i-unknown-none-elf
target.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
ascii::EscapeDefault
now implementsClone
andDisplay
.- Derive macros for prelude traits (e.g.
Clone
,Debug
,Hash
) are now available at the same path as the trait. (e.g. TheClone
derive macro is available atstd::clone::Clone
). This also makes all built-in macros available instd
/core
root. e.g.std::include_bytes!
. str::Chars
now implementsDebug
.slice::{concat, connect, join}
now accepts&[T]
in addition to&T
.*const T
and*mut T
now implementmarker::Unpin
.Arc<[T]>
andRc<[T]>
now implementFromIterator<T>
.- Added euclidean remainder and division operations (
div_euclid
,rem_euclid
) to all numeric primitives. Additionallychecked
,overflowing
, andwrapping
versions are available for all integer primitives. thread::AccessError
now implementsClone
,Copy
,Eq
,Error
, andPartialEq
.iter::{StepBy, Peekable, Take}
now implementDoubleEndedIterator
.
Stabilized APIs
<*const T>::cast
<*mut T>::cast
Duration::as_secs_f32
Duration::as_secs_f64
Duration::div_f32
Duration::div_f64
Duration::from_secs_f32
Duration::from_secs_f64
Duration::mul_f32
Duration::mul_f64
any::type_name
Cargo
- Added pipelined compilation support to
cargo
. - You can now pass the
--features
option multiple times to enable multiple features.
Misc
Compatibility Notes
- The
x86_64-unknown-uefi
platform can not be built with rustc 1.38.0. - The
armv7-unknown-linux-gnueabihf
platform is known to have issues with certain crates such as libc.
Rust 1.37.0
Language
#[must_use]
will now warn if the type is contained in a tuple,Box
, or an array and unused.- You can now use the
cfg
andcfg_attr
attributes on generic parameters. - You can now use enum variants through type alias. e.g. You can write the following:
type MyOption = Option<u8>; fn increment_or_zero(x: MyOption) -> u8 { match x { MyOption::Some(y) => y + 1, MyOption::None => 0, } }
- You can now use
_
as an identifier for consts. e.g. You can writeconst _: u32 = 5;
. - You can now use
#[repr(align(X)]
on enums. - The
?
Kleene macro operator is now available in the 2015 edition.
Compiler
- You can now enable Profile-Guided Optimization with the
-C profile-generate
and-C profile-use
flags. For more information on how to use profile guided optimization, please refer to the rustc book. - The
rust-lldb
wrapper script should now work again.
Libraries
Stabilized APIs
BufReader::buffer
BufWriter::buffer
Cell::from_mut
Cell<[T]>::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
Wrapping::reverse_bits
i128::reverse_bits
i16::reverse_bits
i32::reverse_bits
i64::reverse_bits
i8::reverse_bits
isize::reverse_bits
slice::copy_within
u128::reverse_bits
u16::reverse_bits
u32::reverse_bits
u64::reverse_bits
u8::reverse_bits
usize::reverse_bits
Cargo
Cargo.lock
files are now included by default when publishing executable crates with executables.- You can now specify
default-run="foo"
in[package]
to specify the default executable to use forcargo run
.
Misc
Compatibility Notes
- Using
...
for inclusive range patterns will now warn by default. Please transition your code to using the..=
syntax for inclusive ranges instead. - Using a trait object without the
dyn
will now warn by default. Please transition your code to usedyn Trait
for trait objects instead.
Rust 1.36.0
Language
- Non-Lexical Lifetimes are now enabled on the 2015 edition.
- The order of traits in trait objects no longer affects the semantics of that object. e.g.
dyn Send + fmt::Debug
is now equivalent todyn fmt::Debug + Send
, where this was previously not the case.
Libraries
HashMap
's implementation has been replaced withhashbrown::HashMap
implementation.TryFromSliceError
now implementsFrom<Infallible>
.mem::needs_drop
is now available as a const fn.alloc::Layout::from_size_align_unchecked
is now available as a const fn.String
now implementsBorrowMut<str>
.io::Cursor
now implementsDefault
.- Both
NonNull::{dangling, cast}
are now const fns. - The
alloc
crate is now stable.alloc
allows you to use a subset ofstd
(e.g.Vec
,Box
,Arc
) in#![no_std]
environments if the environment has access to heap memory allocation. String
now implementsFrom<&String>
.- You can now pass multiple arguments to the
dbg!
macro.dbg!
will return a tuple of each argument when there is multiple arguments. Result::{is_err, is_ok}
are now#[must_use]
and will produce a warning if not used.
Stabilized APIs
VecDeque::rotate_left
VecDeque::rotate_right
Iterator::copied
io::IoSlice
io::IoSliceMut
Read::read_vectored
Write::write_vectored
str::as_mut_ptr
mem::MaybeUninit
pointer::align_offset
future::Future
task::Context
task::RawWaker
task::RawWakerVTable
task::Waker
task::Poll
Cargo
- Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.
- You can now pass the
--offline
flag to run cargo without accessing the network.
You can find further change's in Cargo's 1.36.0 release notes.
Clippy
There have been numerous additions and fixes to clippy, see Clippy's 1.36.0 release notes for more details.
Misc
Compatibility Notes
- With the stabilisation of
mem::MaybeUninit
,mem::uninitialized
use is no longer recommended, and will be deprecated in 1.39.0.
Rust 1.35.0
Language
FnOnce
,FnMut
, and theFn
traits are now implemented forBox<FnOnce>
,Box<FnMut>
, andBox<Fn>
respectively.- You can now coerce closures into unsafe function pointers. e.g.
unsafe fn call_unsafe(func: unsafe fn()) { func() } pub fn main() { unsafe { call_unsafe(|| {}); } }
Compiler
- Added the
armv6-unknown-freebsd-gnueabihf
andarmv7-unknown-freebsd-gnueabihf
targets. - Added the
wasm32-unknown-wasi
target.
Libraries
Thread
will now show its ID inDebug
output.StdinLock
,StdoutLock
, andStderrLock
now implementAsRawFd
.alloc::System
now implementsDefault
.- Expanded
Debug
output ({:#?}
) for structs now has a trailing comma on the last field. char::{ToLowercase, ToUppercase}
now implementExactSizeIterator
.- All
NonZero
numeric types now implementFromStr
. - Removed the
Read
trait bounds on theBufReader::{get_ref, get_mut, into_inner}
methods. - You can now call the
dbg!
macro without any parameters to print the file and line where it is called. - In place ASCII case conversions are now up to 4× faster. e.g.
str::make_ascii_lowercase
hash_map::{OccupiedEntry, VacantEntry}
now implementSync
andSend
.
Stabilized APIs
f32::copysign
f64::copysign
RefCell::replace_with
RefCell::map_split
ptr::hash
Range::contains
RangeFrom::contains
RangeTo::contains
RangeInclusive::contains
RangeToInclusive::contains
Option::copied
Cargo
- You can now set
cargo:rustc-cdylib-link-arg
at build time to pass custom linker arguments when building acdylib
. Its usage is highly platform specific.
Misc
Rust 1.34.2
Rust 1.34.1
Rust 1.34.0
Language
- You can now use
#[deprecated = "reason"]
as a shorthand for#[deprecated(note = "reason")]
. This was previously allowed by mistake but had no effect. - You can now accept token streams in
#[attr()]
,#[attr[]]
, and#[attr{}]
procedural macros. - You can now write
extern crate self as foo;
to import your crate's root into the extern prelude.
Compiler
- You can now target
riscv64imac-unknown-none-elf
andriscv64gc-unknown-none-elf
. - You can now enable linker plugin LTO optimisations with
-C linker-plugin-lto
. This allows rustc to compile your Rust code into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI boundaries. - You can now target
powerpc64-unknown-freebsd
.
Libraries
- The trait bounds have been removed on some of
HashMap<K, V, S>
's andHashSet<T, S>
's basic methods. Most notably you no longer require theHash
trait to create an iterator. - The
Ord
trait bounds have been removed on some ofBinaryHeap<T>
's basic methods. Most notably you no longer require theOrd
trait to create an iterator. - The methods
overflowing_neg
andwrapping_neg
are nowconst
functions for all numeric types. - Indexing a
str
is now generic over all types that implementSliceIndex<str>
. str::trim
,str::trim_matches
,str::trim_{start, end}
, andstr::trim_{start, end}_matches
are now#[must_use]
and will produce a warning if their returning type is unused.- The methods
checked_pow
,saturating_pow
,wrapping_pow
, andoverflowing_pow
are now available for all numeric types. These are equivalent to methods such aswrapping_add
for thepow
operation.
Stabilized APIs
std & core
Any::type_id
Error::type_id
atomic::AtomicI16
atomic::AtomicI32
atomic::AtomicI64
atomic::AtomicI8
atomic::AtomicU16
atomic::AtomicU32
atomic::AtomicU64
atomic::AtomicU8
convert::Infallible
convert::TryFrom
convert::TryInto
iter::from_fn
iter::successors
num::NonZeroI128
num::NonZeroI16
num::NonZeroI32
num::NonZeroI64
num::NonZeroI8
num::NonZeroIsize
slice::sort_by_cached_key
str::escape_debug
str::escape_default
str::escape_unicode
str::split_ascii_whitespace
std
Cargo
Misc
Compatibility Notes
Command::before_exec
is being replaced by the unsafe methodCommand::pre_exec
and will be deprecated with Rust 1.37.0.- Use of
ATOMIC_{BOOL, ISIZE, USIZE}_INIT
is now deprecated as you can now useconst
functions instatic
variables.