Rust 1.15.0
Language
- Basic procedural macros allowing custom
#[derive], aka "macros 1.1", are stable. This allows popular code-generating crates like Serde and Diesel to work ergonomically. RFC 1681. - Tuple structs may be empty. Unary and empty tuple structs may be instantiated with curly braces. Part of RFC 1506.
- A number of minor changes to name resolution have been activated. They add up to more consistent semantics, allowing for future evolution of Rust macros. Specified in RFC 1560, see its section on "changes" for details of what is different. The breaking changes here have been transitioned through the
legacy_importslint since 1.14, with no known regressions. - In
macro_rules,pathfragments can now be parsed as type parameter bounds ?Sizedcan be used inwhereclauses- There is now a limit on the size of monomorphized types and it can be modified with the
#![type_size_limit]crate attribute, similarly to the#![recursion_limit]attribute
Compiler
- On Windows, the compiler will apply dllimport attributes when linking to extern functions. Additional attributes and flags can control which library kind is linked and its name. RFC 1717.
- Rust-ABI symbols are no longer exported from cdylibs
- The
--testflag works with procedural macro crates - Fix
extern "aapcs" fnABI - The
-C no-stack-checkflag is deprecated. It does nothing. - The
format!expander recognizes incorrectprintfand shell-style formatting directives and suggests the correct format. - Only report one error for all unused imports in an import list
Compiler Performance
- Avoid unnecessary
mk_tycalls inTy::super_fold_with - Avoid more unnecessary
mk_tycalls inTy::super_fold_with - Don't clone in
UnificationTable::probe - Remove
scope_auxiliaryto cut RSS by 10% - Use small vectors in type walker
- Macro expansion performance was improved
- Change
HirVec<P<T>>toHirVec<T>inhir::Expr - Replace FNV with a faster hash function
Stabilized APIs
std::iter::Iterator::min_bystd::iter::Iterator::max_bystd::os::*::fs::FileExtstd::sync::atomic::Atomic*::get_mutstd::sync::atomic::Atomic*::into_innerstd::vec::IntoIter::as_slicestd::vec::IntoIter::as_mut_slicestd::sync::mpsc::Receiver::try_iterstd::os::unix::process::CommandExt::before_execstd::rc::Rc::strong_countstd::rc::Rc::weak_countstd::sync::Arc::strong_countstd::sync::Arc::weak_countstd::char::encode_utf8std::char::encode_utf16std::cell::Ref::clonestd::io::Take::into_inner
Libraries
- The standard sorting algorithm has been rewritten for dramatic performance improvements. It is a hybrid merge sort, drawing influences from Timsort. Previously it was a naive merge sort.
Iterator::nthno longer has aSizedboundExtend<&T>is specialized forVecwhereT: Copyto improve performance.chars().count()is much faster and so arechars().last()andchar_indices().last()- Fix ARM Objective-C ABI in
std::env::args - Chinese characters display correctly in
fmt::Debug - Derive
DefaultforDuration - Support creation of anonymous pipes on WinXP/2k
mpsc::RecvTimeoutErrorimplementsError- Don't pass overlapped handles to processes
Cargo
- In this release, Cargo build scripts no longer have access to the
OUT_DIRenvironment variable at build time viaenv!("OUT_DIR"). They should instead check the variable at runtime withstd::env. That the value was set at build time was a bug, and incorrect when cross-compiling. This change is known to cause breakage. - Add
--allflag tocargo test - Compile statically against the MSVC CRT
- Mix feature flags into fingerprint/metadata shorthash
- Link OpenSSL statically on OSX
- Apply new fingerprinting to build dir outputs
- Test for bad path overrides with summaries
- Require
cargo install --versto take a semver version - Fix retrying crate downloads for network errors
- Implement string lookup for
build.rustflagsconfig key - Emit more info on --message-format=json
- Assume
build.rsin the same directory asCargo.tomlis a build script - Don't ignore errors in workspace manifest
- Fix
--message-format JSONwhen rustc emits non-JSON warnings
Tooling
- Test runners (binaries built with
--test) now support a--listargument that lists the tests it contains - Test runners now support a
--exactargument that makes the test filter match exactly, instead of matching only a substring of the test name - rustdoc supports a
--playground-urlflag - rustdoc provides more details about
#[should_panic]errors
Misc
- The Rust build system is now written in Rust. The Makefiles may continue to be used in this release by passing
--disable-rustbuildto the configure script, but they will be deleted soon. Note that the new build system uses a different on-disk layout that will likely affect any scripts building Rust. - Rust supports i686-unknown-openbsd. Tier 3 support. No testing or releases.
- Rust supports the MSP430. Tier 3 support. No testing or releases.
- Rust supports the ARMv5TE architecture. Tier 3 support. No testing or releases.
Compatibility Notes
- A number of minor changes to name resolution have been activated. They add up to more consistent semantics, allowing for future evolution of Rust macros. Specified in RFC 1560, see its section on "changes" for details of what is different. The breaking changes here have been transitioned through the
legacy_importslint since 1.14, with no known regressions. - In this release, Cargo build scripts no longer have access to the
OUT_DIRenvironment variable at build time viaenv!("OUT_DIR"). They should instead check the variable at runtime withstd::env. That the value was set at build time was a bug, and incorrect when cross-compiling. This change is known to cause breakage. - Higher-ranked lifetimes are no longer allowed to appear only in associated types. The
hr_lifetime_in_assoc_typelint has been a warning since 1.10 and is now an error by default. It will become a hard error in the near future. - The semantics relating modules to file system directories are changing in minor ways. This is captured in the new
legacy_directory_ownershiplint, which is a warning in this release, and will become a hard error in the future. - Rust-ABI symbols are no longer exported from cdylibs
- Once
Peekablepeeks aNoneit will return thatNonewithout re-querying the underlying iterator