Releases: rust-lang/rust
Rust 1.42.0
Language
-
You can now use the slice pattern syntax with subslices. e.g.
fn foo(words: &[&str]) { match words { ["Hello", "World", "!", ..] => println!("Hello World!"), ["Foo", "Bar", ..] => println!("Baz"), rest => println!("{:?}", rest), } }
-
You can now use
#[repr(transparent)]on univariantenums. Meaning that you can create an enum that has the exact layout and ABI of the type it contains. -
You can now use outer attribute procedural macros on inline modules.
-
There are some syntax-only changes:
defaultis syntactically allowed before items intraitdefinitions.- Items in
impls (i.e.consts,types, andfns) may syntactically leave out their bodies in favor of;. - Bounds on associated types in
impls are now syntactically allowed (e.g.type Foo: Ord;). ...(the C-variadic type) may occur syntactically directly as the type of any function parameter.
These are still rejected semantically, so you will likely receive an error but these changes can be seen and parsed by procedural macros and conditional compilation.
Compiler
- Added tier 2* support for
armv7a-none-eabi. - Added tier 2 support for
riscv64gc-unknown-linux-gnu. Option::{expect,unwrap}andResult::{expect, expect_err, unwrap, unwrap_err}now produce panic messages pointing to the location where they were called, rather thancore's internals.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
iter::Empty<T>now implementsSendandSyncfor anyT.Pin::{map_unchecked, map_unchecked_mut}no longer require the return type to implementSized.io::Cursornow derivesPartialEqandEq.Layout::newis nowconst.- Added Standard Library support for
riscv64gc-unknown-linux-gnu.
Stabilized APIs
CondVar::wait_whileCondVar::wait_timeout_whileDebugMap::keyDebugMap::valueManuallyDrop::takematches!ptr::slice_from_raw_parts_mutptr::slice_from_raw_parts
Cargo
Compatibility Notes
Error::descriptionhas been deprecated, and its use will now produce a warning. It's recommended to useDisplay/to_stringinstead.
Rust 1.41.1
- Always check types of static items
- Always check lifetime bounds of
Copyimpls - Fix miscompilation in callers of
Layout::repeat - Rust 1.41.0 was announced as the last Rust release with tier 1 or tier 2 support for 32-bit Apple targets. That announcement did not expect a patch release. 1.41.1 also includes release binaries for these targets.
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
selfposition. 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_argsmacro. 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. - You can now define a Rust
extern "C"function withBox<T>and useT*as the corresponding type on the C side. Please see the documentation for more information, including the important caveat about preferring to avoidBox<T>in Rust signatures for functions defined in C.
Compiler
- Rustc will now warn if you have unused loop
'labels. - Removed support for the
i686-unknown-dragonflytarget. - Added tier 3 support* for the
riscv64gc-unknown-linux-gnutarget. - You can now pass an arguments file passing the
@pathsyntax 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
--externflag without a path, indicating that it is available from the search path or specified with an-Lflag.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- The
core::panicmodule is now stable. It was already stable throughstd. NonZero*numerics now implementFrom<NonZero*>if it's a smaller integer width. E.g.NonZeroU16now implementsFrom<NonZeroU8>.MaybeUninit<T>now implementsfmt::Debug.
Stabilized APIs
Result::map_orResult::map_or_elsestd::rc::Weak::weak_countstd::rc::Weak::strong_countstd::sync::Weak::weak_countstd::sync::Weak::strong_count
Cargo
- Cargo will now document all the private items for binary crates by default.
cargo-installwill 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 = 2sets theimagecrate's optimisation level to2for debug builds. You can also use[profile.<profile>.build-override]to override build scripts and their dependencies.
Misc
- You can now specify
editionin documentation code blocks to compile the block for that edition. E.g.edition2018tells 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 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
structs and tupleenumvariant's constructors inconstcontexts. e.g.pub struct Point(i32, i32); const ORIGIN: Point = { let constructor = Point; constructor(0, 0) };
-
You can now mark
structs,enums, andenumvariants 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
externblocks and in type positions. e.g.type Generated = macro!(); -
The
metapattern 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-musleabihftarget. - Added tier 3 support for the
aarch64-unknown-none-softfloattarget. - Added tier 3 support for the
mips64-unknown-linux-muslabi64, andmips64el-unknown-linux-muslabi64targets.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
Stabilized APIs
BTreeMap::get_key_valueHashMap::get_key_valueOption::as_deref_mutOption::as_derefOption::flattenUdpSocket::peer_addrf32::to_be_bytesf32::to_le_bytesf32::to_ne_bytesf64::to_be_bytesf64::to_le_bytesf64::to_ne_bytesf32::from_be_bytesf32::from_le_bytesf32::from_ne_bytesf64::from_be_bytesf64::from_le_bytesf64::from_ne_bytesmem::takeslice::repeattodo!
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-dependencieswithout 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_attributelint. Using#[inline]anywhere else inside traits orexternblocks now correctly emits a hard error.
Rust 1.39.0
Language
- You can now create
asyncfunctions and blocks withasync fn,async move {}, andasync {}respectively, and you can now call.awaiton async expressions. - You can now use certain attributes on function, closure, and function pointer parameters. These attributes include
cfg,cfg_attr,allow,warn,deny,forbidas 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
ifguards ofmatcharms. 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-uefitarget. - Added tier 3 support for the
sparc64-unknown-openbsdtarget. - 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-outputargument 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::newandString::neware nowconstfunctions.LinkedList::newis now aconstfunction.str::len,[T]::lenandstr::as_bytesare nowconstfunctions.- The
abs,wrapping_abs, andoverflowing_absnumeric functions are nowconst.
Stabilized APIs
Cargo
- You can now publish git dependencies if supplied with a
version. - The
--allflag has been renamed to--workspace. Using--allis 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.
rustdocnow requiresrustcto 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-msvctargets. - Added tier 3 support for the
armv7-unknown-linux-gnueabiandarmv7-unknown-linux-musleabitargets. - Added tier 3 support for the
hexagon-unknown-linux-musltarget. - Added tier 3 support for the
riscv32i-unknown-none-elftarget. - Upgraded to LLVM 9.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
ascii::EscapeDefaultnow implementsCloneandDisplay.- Derive macros for prelude traits (e.g.
Clone,Debug,Hash) are now available at the same path as the trait. (e.g. TheClonederive macro is available atstd::clone::Clone). This also makes all built-in macros available instd/coreroot. e.g.std::include_bytes!. str::Charsnow implementsDebug.slice::{concat, connect, join}now accepts&[T]in addition to&T.*const Tand*mut Tnow 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, andwrappingversions are available for all integer primitives. thread::AccessErrornow implementsClone,Copy,Eq,Error, andPartialEq.iter::{StepBy, Peekable, Take}now implementDoubleEndedIterator.
Stabilized APIs
<*const T>::cast<*mut T>::castDuration::as_secs_f32Duration::as_secs_f64Duration::div_f32Duration::div_f64Duration::from_secs_f32Duration::from_secs_f64Duration::mul_f32Duration::mul_f64any::type_name
Cargo
- Added pipelined compilation support to
cargo. - You can now pass the
--featuresoption multiple times to enable multiple features.
Rustdoc
Misc
Compatibility Notes
- The
x86_64-unknown-uefiplatform can not be built with rustc 1.38.0. - The
armv7-unknown-linux-gnueabihfplatform 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
cfgandcfg_attrattributes 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-generateand-C profile-useflags. For more information on how to use profile guided optimization, please refer to the rustc book. - The
rust-lldbwrapper script should now work again.
Libraries
Stabilized APIs
BufReader::bufferBufWriter::bufferCell::from_mutCell<[T]>::as_slice_of_cellsDoubleEndedIterator::nth_backOption::xorWrapping::reverse_bitsi128::reverse_bitsi16::reverse_bitsi32::reverse_bitsi64::reverse_bitsi8::reverse_bitsisize::reverse_bitsslice::copy_withinu128::reverse_bitsu16::reverse_bitsu32::reverse_bitsu64::reverse_bitsu8::reverse_bitsusize::reverse_bits
Cargo
Cargo.lockfiles 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
dynwill now warn by default. Please transition your code to usedyn Traitfor 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::Debugis now equivalent todyn fmt::Debug + Send, where this was previously not the case.
Libraries
HashMap's implementation has been replaced withhashbrown::HashMapimplementation.TryFromSliceErrornow implementsFrom<Infallible>.mem::needs_dropis now available as a const fn.alloc::Layout::from_size_align_uncheckedis now available as a const fn.Stringnow implementsBorrowMut<str>.io::Cursornow implementsDefault.- Both
NonNull::{dangling, cast}are now const fns. - The
alloccrate is now stable.allocallows you to use a subset ofstd(e.g.Vec,Box,Arc) in#![no_std]environments if the environment has access to heap memory allocation. Stringnow 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_leftVecDeque::rotate_rightIterator::copiedio::IoSliceio::IoSliceMutRead::read_vectoredWrite::write_vectoredstr::as_mut_ptrmem::MaybeUninitpointer::align_offsetfuture::Futuretask::Contexttask::RawWakertask::RawWakerVTabletask::Wakertask::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
--offlineflag 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::uninitializeduse is no longer recommended, and will be deprecated in 1.39.0.
Rust 1.35.0
Language
FnOnce,FnMut, and theFntraits 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-gnueabihfandarmv7-unknown-freebsd-gnueabihftargets. - Added the
wasm32-unknown-wasitarget.
Libraries
Threadwill now show its ID inDebugoutput.StdinLock,StdoutLock, andStderrLocknow implementAsRawFd.alloc::Systemnow implementsDefault.- Expanded
Debugoutput ({:#?}) for structs now has a trailing comma on the last field. char::{ToLowercase, ToUppercase}now implementExactSizeIterator.- All
NonZeronumeric types now implementFromStr. - Removed the
Readtrait 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 implementSyncandSend.
Stabilized APIs
f32::copysignf64::copysignRefCell::replace_withRefCell::map_splitptr::hashRange::containsRangeFrom::containsRangeTo::containsRangeInclusive::containsRangeToInclusive::containsOption::copied
Cargo
- You can now set
cargo:rustc-cdylib-link-argat build time to pass custom linker arguments when building acdylib. Its usage is highly platform specific.