Releases: rust-lang/rust
Rust 1.56.1
- New lints to detect the presence of bidirectional-override Unicode codepoints in the compiled source code (CVE-2021-42574)
Rust 1.56.0
Language
- The 2021 Edition is now stable. See the edition guide for more details.
- The pattern in
binding @ patterncan now also introduce new bindings. - Union field access is permitted in
const fn.
Compiler
- Upgrade to LLVM 13.
- Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.
- Allow specifying a deployment target version for all iOS targets
- Warnings can be forced on with
--force-warn. This feature is primarily intended for usage bycargo fix, rather than end users. - Promote
aarch64-apple-ios-simto Tier 2*. - Add
powerpc-unknown-freebsdat Tier 3*. - Add
riscv32imc-esp-espidfat Tier 3*.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows. 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. For this use case, atomics scale much better under contention. - Implement
Extend<(A, B)>for(Extend<A>, Extend<B>) - impl Default, Copy, Clone for std::io::Sink and std::io::Empty
impl From<[(K, V); N]>for all collections.- Remove
P: Unpinbound on impl Future for Pin. - Treat invalid environment variable names as nonexistent. 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::chrootUnsafeCell::raw_getBufWriter::into_partscore::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}These APIs were previously stable instd, but are now also available incore.Vec::shrink_toString::shrink_toOsString::shrink_toPathBuf::shrink_toBinaryHeap::shrink_toVecDeque::shrink_toHashMap::shrink_toHashSet::shrink_to
These APIs are now usable in const contexts:
Cargo
- Cargo supports specifying a minimum supported Rust version in Cargo.toml. 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. 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 This was already not supported by LLVM; this change surfaces this lack of support with a better error message.
- Make
SEMICOLON_IN_EXPRESSIONS_FROM_MACROSwarn by default - Warn when an escaped newline skips multiple lines.
- Calls to
libc::getpid/std::process::idfromCommand::pre_execmay return different values on glibc <= 2.24. Rust now invokes theclone3system call directly, when available, to use new functionality available via that system call. Older versions of glibc cache the result ofgetpid, 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 cachegetpidfor 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. This improves the performance of most Rust builds.
- Unify representation of macros in internal data structures. This change fixes a host of bugs with the handling of macros by the compiler, as well as rustdoc.
Rust 1.55.0
Language
- You can now write open "from" range patterns (
X..), which will start atXand will end at the maximum value of the integer. - You can now explicitly import the prelude of different editions through
std::prelude(e.g.use std::prelude::rust_2021::*;).
Compiler
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- Updated std's float parsing to use the Eisel-Lemire algorithm. These improvements should in general provide faster string parsing of floats, no longer reject certain valid floating point values, and reduce the produced code size for non-stripped artifacts.
string::Drainnow implementsAsRef<str>andAsRef<[u8]>.
Stabilised APIs
Bound::clonedDrain::as_strIntoInnerError::into_errorIntoInnerError::into_partsMaybeUninit::assume_init_mutMaybeUninit::assume_init_refMaybeUninit::writearray::mapops::ControlFlowx86::_bittestx86::_bittestandcomplementx86::_bittestandresetx86::_bittestandsetx86_64::_bittest64x86_64::_bittestandcomplement64x86_64::_bittestandreset64x86_64::_bittestandset64
The following previously stable functions are now const.
Cargo
- Cargo will now deduplicate compiler diagnostics to the terminal when invoking rustc in parallel such as when using
cargo test. - The package definition in
cargo metadatanow includes the"default_run"field from the manifest. - Added
cargo das an alias forcargo doc. - Added
{lib}as formatting option forcargo treeto print the"lib_name"of packages.
Rustdoc
- Added "Go to item on exact match" search option.
- The "Implementors" section on traits no longer shows redundant method definitions.
- Trait implementations are toggled open by default. This should make the implementations more searchable by tools like
CTRL+Fin your browser. - Intra-doc links should now correctly resolve associated items (e.g. methods) through type aliases.
- Traits which are marked with
#[doc(hidden)]will no longer appear in the "Trait Implementations" section.
Compatibility Notes
- std functions that return an
io::Errorwill no longer use theErrorKind::Othervariant. This is to better reflect that these kinds of errors could be categorised into newer more specificErrorKindvariants, and that they do not represent a user error. - Using environment variable names with
process::Commandon Windows now behaves as expected. Previously using environment variables withCommandwould cause them to be ASCII-uppercased. - Rustdoc will now warn on using rustdoc lints that aren't prefixed with
rustdoc:: RUSTFLAGSis no longer set for build scripts. Build scripts should useCARGO_ENCODED_RUSTFLAGSinstead. See the documentation for more details.
Rust 1.54.0
Language
-
You can now use macros for values in some built-in attributes. This primarily allows you to call macros within the
#[doc]attribute. For example, to include external documentation in your crate, you can now write the following:#![doc = include_str!("README.md")] -
You can now cast between unsized slice types (and types which contain unsized slices) in
const fn. -
You can now use multiple generic lifetimes with
impl Traitwhere the lifetimes don't explicitly outlive another. In code this means that you can now haveimpl Trait<'a, 'b>where as before you could only haveimpl Trait<'a, 'b> where 'b: 'a.
Compiler
- Rustc will now search for custom JSON targets in
/lib/rustlib/<target-triple>/target.jsonwhere/is the "sysroot" directory. You can find your sysroot directory by runningrustc --print sysroot. - Added
wasmas atarget_familyfor WebAssembly platforms. - You can now use
#[target_feature]on safe functions when targeting WebAssembly platforms. - Improved debugger output for enums on Windows MSVC platforms.
- Added tier 3* support for
bpfel-unknown-noneandbpfeb-unknown-none. -Zmutable-noalias=yesis enabled by default when using LLVM 12 or above.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
panic::panic_anywill now#[track_caller].- Added
OutOfMemoryas a variant ofio::ErrorKind. -
proc_macro::Literalnow implementsFromStr. - The implementations of vendor intrinsics in core::arch have been significantly refactored. The main user-visible changes are a 50% reduction in the size of libcore.rlib and stricter validation of constant operands passed to intrinsics. The latter is technically a breaking change, but allows Rust to more closely match the C vendor intrinsics API.
Stabilized APIs
BTreeMap::into_keysBTreeMap::into_valuesHashMap::into_keysHashMap::into_valuesarch::wasm32VecDeque::binary_searchVecDeque::binary_search_byVecDeque::binary_search_by_keyVecDeque::partition_point
Cargo
- Added the
--prune <spec>option tocargo-treeto remove a package from the dependency graph. - Added the
--depthoption tocargo-treeto print only to a certain depth in the tree - Added the
no-proc-macrovalue tocargo-tree --edgesto hide procedural macro dependencies. - A new environment variable named
CARGO_TARGET_TMPDIRis available. This variable points to a directory that integration tests and benches can use as a "scratchpad" for testing filesystem operations.
Compatibility Notes
- Mixing Option and Result via
?is no longer permitted in closures for inferred types. - Previously unsound code is no longer permitted where different constructors in branches could require different lifetimes.
- As previously mentioned the
std::archintrinsics now uses stricter const checking than before and may reject some previously accepted code. i128multiplication on Cortex M0+ platforms currently unconditionally causes overflow when compiled withcodegen-units = 1.
Rust 1.53.0
Language
- You can now use unicode for identifiers. This allows multilingual identifiers but still doesn't allow glyphs that are not considered characters such as
◆or🦀. More specifically you can now use any identifier that matches the UAX #31 "Unicode Identifier and Pattern Syntax" standard. This is the same standard as languages like Python, however Rust uses NFC normalization which may be different from other languages. - You can now specify "or patterns" inside pattern matches. Previously you could only use
|(OR) on complete patterns. E.g.let x = Some(2u8); // Before matches!(x, Some(1) | Some(2)); // Now matches!(x, Some(1 | 2));
- Added the
:pat_parammacro_rules!matcher. This matcher has the same semantics as the:patmatcher. This is to allow:patto change semantics to being a pattern fragment in a future edition.
Compiler
- Updated the minimum external LLVM version to LLVM 10.
- Added Tier 3* support for the
wasm64-unknown-unknowntarget. - Improved debuginfo for closures and async functions on Windows MSVC.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
- Abort messages will now forward to
android_set_abort_messageon Android platforms when available. slice::IterMut<'_, T>now implementsAsRef<[T]>- Arrays of any length now implement
IntoIterator. Currently calling.into_iter()as a method on an array will returnimpl Iterator<Item=&T>, but this may change in a future edition to changeItemtoT. CallingIntoIterator::into_iterdirectly on arrays will provideimpl Iterator<Item=T>as expected. leading_zeros, andtrailing_zerosare now available on allNonZerointeger types.{f32, f64}::from_strnow parse and print special values (NaN,-0) according to IEEE 754.- You can now index into slices using
(Bound<usize>, Bound<usize>). - Add the
BITSassociated constant to all numeric types.
Stabilised APIs
AtomicBool::fetch_updateAtomicPtr::fetch_updateBTreeMap::retainBTreeSet::retainBufReader::seek_relativeDebugStruct::non_exhaustiveDuration::MAXDuration::ZERODuration::is_zeroDuration::saturating_addDuration::saturating_mulDuration::saturating_subErrorKind::UnsupportedOption::insertOrdering::is_eqOrdering::is_geOrdering::is_gtOrdering::is_leOrdering::is_ltOrdering::is_neOsStr::is_asciiOsStr::make_ascii_lowercaseOsStr::make_ascii_uppercaseOsStr::to_ascii_lowercaseOsStr::to_ascii_uppercasePeekable::peek_mutRc::decrement_strong_countRc::increment_strong_countVec::extend_from_withinarray::from_mutarray::from_refcmp::max_by_keycmp::max_bycmp::min_by_keycmp::min_byf32::is_subnormalf64::is_subnormal
Cargo
- Cargo now supports git repositories where the default
HEADbranch is not "master". This also includes a switch to the version 3Cargo.lockformat which can handle default branches correctly. - macOS targets now default to
unpackedsplit-debuginfo. - The
authorsfield is no longer included inCargo.tomlfor new projects.
Rustdoc
Compatibility Notes
- Implement token-based handling of attributes during expansion
Ipv4::from_strwill now reject octal format IP addresses in addition to rejecting hexadecimal IP addresses. The octal format can lead to confusion and potential security vulnerabilities and is no longer recommended.- The added
BITSconstant may conflict with external definitions. In particular, this was known to be a problem in thelexical-corecrate, but they have published fixes for semantic versions 0.4 through 0.7. To update this dependency alone, usecargo update -p lexical-core. - Incremental compilation remains off by default, unless one uses the
RUSTC_FORCE_INCREMENTAL=1environment variable added in 1.52.1.
Internal Only
These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools.
Rust 1.52.1
This release disables incremental compilation, unless the user has explicitly opted in via the newly added RUSTC_FORCE_INCREMENTAL=1 environment variable.
This is due to the widespread, and frequently occurring, breakage encountered by Rust users due to newly enabled incremental verification in 1.52.0. Notably, Rust users should upgrade to 1.52.0 or 1.52.1: the bugs that are detected by newly added incremental verification are still present in past stable versions, and are not yet fixed on any channel. These bugs can lead to miscompilation of Rust binaries.
These problems only affect incremental builds, so release builds with Cargo should not be affected unless the user has explicitly opted into incremental. Debug and check builds are affected.
See 84970 for more details.
Rust 1.52.0
Language
- Added the
unsafe_op_in_unsafe_fnlint, which checks whether the unsafe code in anunsafe fnis wrapped in aunsafeblock. This lint is allowed by default, and may become a warning or hard error in a future edition. - You can now cast mutable references to arrays to a pointer of the same type as the element.
Compiler
Added tier 3* support for the following targets.
s390x-unknown-linux-muslriscv32gc-unknown-linux-musl&riscv64gc-unknown-linux-muslpowerpc-unknown-openbsd
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
OsStringnow implementsExtendandFromIterator.cmp::Reversenow has#[repr(transparent)]representation.Arc<impl Error>now implementserror::Error.- All integer division and remainder operations are now
const.
Stabilised APIs
Arguments::as_strchar::MAXchar::REPLACEMENT_CHARACTERchar::UNICODE_VERSIONchar::decode_utf16char::from_digitchar::from_u32_uncheckedchar::from_u32slice::partition_pointstr::rsplit_oncestr::split_once
The following previously stable APIs are now const.
char::len_utf8char::len_utf16char::to_ascii_uppercasechar::to_ascii_lowercasechar::eq_ignore_ascii_caseu8::to_ascii_uppercaseu8::to_ascii_lowercaseu8::eq_ignore_ascii_case
Rustdoc
- Rustdoc lints are now treated as a tool lint, meaning that lints are now prefixed with
rustdoc::(e.g.#[warn(rustdoc::broken_intra_doc_links)]). Using the old style is still allowed, and will become a warning in a future release. - Rustdoc now supports argument files.
- Rustdoc now generates smart punctuation for documentation.
- You can now use "task lists" in Rustdoc Markdown. E.g.
- [x] Complete - [ ] Todo
Misc
- You can now pass multiple filters to tests. E.g.
cargo test -- foo barwill run all tests that matchfooandbar. - Rustup now distributes PDB symbols for the
stdlibrary on Windows, allowing you to seestdsymbols when debugging.
Internal Only
These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools.
- Check the result cache before the DepGraph when ensuring queries
- Try fast_reject::simplify_type in coherence before doing full check
- Only store a LocalDefId in some HIR nodes
- Store HIR attributes in a side table
Compatibility Notes
- Cargo build scripts are now forbidden from setting
RUSTC_BOOTSTRAP. - Removed support for the
x86_64-rumprun-netbsdtarget. - Deprecated the
x86_64-sun-solaristarget in favor ofx86_64-pc-solaris. - Rustdoc now only accepts
,,, and\tas delimiters for specifying languages in code blocks. - Rustc now catches more cases of
pub_use_of_private_extern_crate - Changes in how proc macros handle whitespace may lead to panics when used with older
proc-macro-hackversions. Acargo updateshould be sufficient to fix this in all cases. - Turn
#[derive]into a regular macro attribute
Rust 1.51.0
Language
- You can now parameterize items such as functions, traits, and
structs by constant values in addition to by types and lifetimes. Also known as "const generics" E.g. you can now write the following. Note: Only values of primitive integers,bool, orchartypes are currently permitted.struct GenericArray<T, const LENGTH: usize> { inner: [T; LENGTH] } impl<T, const LENGTH: usize> GenericArray<T, LENGTH> { const fn last(&self) -> Option<&T> { if LENGTH == 0 { None } else { Some(&self.inner[LENGTH - 1]) } } }
Compiler
- Added the
-Csplit-debuginfocodegen option for macOS platforms. This option controls whether debug information is split across multiple files or packed into a single file. Note This option is unstable on other platforms. - Added tier 3* support for
aarch64_be-unknown-linux-gnu,aarch64-unknown-linux-gnu_ilp32, andaarch64_be-unknown-linux-gnu_ilp32targets. - Added tier 3 support for
i386-unknown-linux-gnuandi486-unknown-linux-gnutargets. - The
target-cpu=nativeoption will now detect individual features of CPUs.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
Box::downcastis now also implemented for anydyn Any + Send + Syncobject.strnow implementsAsMut<str>.u64andu128now implementFrom<char>.Erroris now implemented for&TwhereTimplementsError.Poll::{map_ok, map_err}are now implemented forPoll<Option<Result<T, E>>>.unsigned_absis now implemented for all signed integer types.io::Emptynow implementsio::Seek.rc::Weak<T>andsync::Weak<T>'s methods such asas_ptrare now implemented forT: ?Sizedtypes.DivandRemby theirNonZerovariant is now implemented for all unsigned integers.
Stabilized APIs
Arc::decrement_strong_countArc::increment_strong_countOnce::call_once_forcePeekable::next_if_eqPeekable::next_ifSeek::stream_positionarray::IntoIterpanic::panic_anyptr::addr_of!ptr::addr_of_mut!slice::fill_withslice::split_inclusive_mutslice::split_inclusiveslice::strip_prefixslice::strip_suffixstr::split_inclusivesync::OnceStatetask::WakeVecDeque::rangeVecDeque::range_mut
Cargo
- Added the
split-debuginfoprofile option to control the -Csplit-debuginfo codegen option. - Added the
resolverfield toCargo.tomlto enable the new feature resolver and CLI option behavior. Version 2 of the feature resolver will try to avoid unifying features of dependencies where that unification could be unwanted. Such as using the same dependency with astdfeature in a build scripts and proc-macros, while using theno-stdfeature in the final binary. See the Cargo book documentation for more information on the feature.
Rustdoc
- Rustdoc will now include documentation for methods available from nested
Dereftraits. - You can now provide a
--default-themeflag which sets the default theme to use for documentation.
Various improvements to intra-doc links:
- You can link to non-path primitives such as
slice. - You can link to associated items.
- You can now include generic parameters when linking to items, like
Vec<T>.
Misc
Compatibility Notes
- WASI platforms no longer use the
wasm-bindgenABI, and instead use the wasm32 ABI. rustcno longer promotes division, modulo and indexing operations toconstthat could fail.- The minimum version of glibc for the following platforms has been bumped to version 2.31 for the distributed artifacts.
armv5te-unknown-linux-gnueabisparc64-unknown-linux-gnuthumbv7neon-unknown-linux-gnueabihfarmv7-unknown-linux-gnueabix86_64-unknown-linux-gnux32
atomic::spin_loop_hinthas been deprecated. It's recommended to usehint::spin_loopinstead.
Internal Only
Rust 1.50.0
Language
- You can now use
constvalues forxin[x; N]array expressions. This has been technically possible since 1.38.0, as it was unintentionally stabilized. - Assignments to
ManuallyDrop<T>union fields are now considered safe.
Compiler
- Added tier 3* support for the
armv5te-unknown-linux-uclibceabitarget. - Added tier 3 support for the
aarch64-apple-ios-macabitarget. - The
x86_64-unknown-freebsdis now built with the full toolset. - Dropped support for all cloudabi targets.
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
proc_macro::Punctnow implementsPartialEq<char>.ops::{Index, IndexMut}are now implemented for fixed sized arrays of any length.- On Unix platforms, the
std::fs::Filetype now has a "niche" of-1. This value cannot be a valid file descriptor, and now meansOption<File>takes up the same amount of space asFile.
Stabilized APIs
bool::thenbtree_map::Entry::or_insert_with_keyf32::clampf64::clamphash_map::Entry::or_insert_with_keyOrd::clampRefCell::takeslice::fillUnsafeCell::get_mut
The following previously stable methods are now const.
IpAddr::is_ipv4IpAddr::is_ipv6IpAddr::is_unspecifiedIpAddr::is_loopbackIpAddr::is_multicastIpv4Addr::octetsIpv4Addr::is_loopbackIpv4Addr::is_privateIpv4Addr::is_link_localIpv4Addr::is_multicastIpv4Addr::is_broadcastIpv4Addr::is_documentationIpv4Addr::to_ipv6_compatibleIpv4Addr::to_ipv6_mappedIpv6Addr::segmentsIpv6Addr::is_unspecifiedIpv6Addr::is_loopbackIpv6Addr::is_multicastIpv6Addr::to_ipv4Layout::sizeLayout::alignLayout::from_size_alignpowfor all integer types.checked_powfor all integer types.saturating_powfor all integer types.wrapping_powfor all integer types.next_power_of_twofor all unsigned integer types.checked_next_power_of_twofor all unsigned integer types.
Cargo
- Added the
[build.rustc-workspace-wrapper]option. This option sets a wrapper to execute instead ofrustc, for workspace members only. cargo:rerun-if-changedwill now, if provided a directory, scan the entire contents of that directory for changes.- Added the
--workspaceflag to thecargo updatecommand.
Misc
- The search results tab and the help button are focusable with keyboard in rustdoc.
- Running tests will now print the total time taken to execute.
Compatibility Notes
- The
compare_and_swapmethod on atomics has been deprecated. It's recommended to use thecompare_exchangeandcompare_exchange_weakmethods instead. - Changes in how
TokenStreams are checked have fixed some cases where you could write unhygenicmacro_rules!macros. #![test]as an inner attribute is now considered unstable like other inner macro attributes, and reports an error by default through thesoft_unstablelint.- Overriding a
forbidlint at the same level that it was set is now a hard error. - You can no longer intercept
panic!calls by supplying your own macro. It's recommended to use the#[panic_handler]attribute to provide your own implementation. - Semi-colons after item statements (e.g.
struct Foo {};) now produce a warning.
Rust 1.49.0
Language
- Unions can now implement
Drop, and you can now have a field in a union withManuallyDrop<T>. - You can now cast uninhabited enums to integers.
- You can now bind by reference and by move in patterns. This allows you to selectively borrow individual components of a type. E.g.
#[derive(Debug)] struct Person { name: String, age: u8, } let person = Person { name: String::from("Alice"), age: 20, }; // `name` is moved out of person, but `age` is referenced. let Person { name, ref age } = person; println!("{} {}", name, age);
Compiler
- Added tier 1* support for
aarch64-unknown-linux-gnu. - Added tier 2 support for
aarch64-apple-darwin. - Added tier 2 support for
aarch64-pc-windows-msvc. - Added tier 3 support for
mipsel-unknown-none. - Raised the minimum supported LLVM version to LLVM 9.
- Output from threads spawned in tests is now captured.
- Change os and vendor values to "none" and "unknown" for some targets
* Refer to Rust's platform support page for more information on Rust's tiered platform support.
Libraries
RangeInclusivenow checks for exhaustion when callingcontainsand indexing.ToString::to_stringnow no longer shrinks the internal buffer in the default implementation.
Stabilized APIs
The following previously stable methods are now const.
Cargo
- Building a crate with
cargo-packageshould now be independently reproducible. cargo-treenow marks proc-macro crates.- Added
CARGO_PRIMARY_PACKAGEbuild-time environment variable. This variable will be set if the crate being built is one the user selected to build, either with-por through defaults. - You can now use glob patterns when specifying packages & targets.
Compatibility Notes
- Demoted
i686-unknown-freebsdfrom host tier 2 to target tier 2 support. - Macros that end with a semi-colon are now treated as statements even if they expand to nothing.
- Rustc will now check for the validity of some built-in attributes on enum variants. Previously such invalid or unused attributes could be ignored.
- Leading whitespace is stripped more uniformly in documentation comments, which may change behavior. You read this post about the changes for more details.
- Trait bounds are no longer inferred for associated types.
Internal Only
These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools.