Releases: rust-lang/rust
Releases · rust-lang/rust
Rust 1.29.0
Compiler
- Bumped minimum LLVM version to 5.0.
- Added
powerpc64le-unknown-linux-musltarget. - Added
aarch64-unknown-hermitandx86_64-unknown-hermittargets. - Upgraded to LLVM 7.
Libraries
Once::call_onceno longer requiresOnceto be'static.BuildHasherDefaultnow implementsPartialEqandEq.Box<CStr>,Box<OsStr>, andBox<Path>now implementClone.- Implemented
PartialEq<&str>forOsStringandPartialEq<OsString>for&str. Cell<T>now allowsTto be unsized.SocketAddris now stable on Redox.
Stabilized APIs
Cargo
- Cargo can silently fix some bad lockfiles. You can use
--lockedto disable this behavior. cargo-installwill now allow you to cross compile an install using--target.- Added the
cargo-fixsubcommand to automatically move project code from 2015 edition to 2018. cargo doccan now optionally document private types using the--document-private-itemsflag.
Misc
rustdocnow has the--cap-lintsoption which demotes all lints above the specified level to that level. For example--cap-lints warnwill demotedenyandforbidlints towarn.rustcandrustdocwill now have the exit code of1if compilation fails and101if there is a panic.- A preview of clippy has been made available through rustup. You can install the preview with
rustup component add clippy-preview.
Compatibility Notes
str::{slice_unchecked, slice_unchecked_mut}are now deprecated. Usestr::get_unchecked(begin..end)instead.std::env::home_diris now deprecated for its unintuitive behavior. Consider using thehome_dirfunction from https://crates.io/crates/dirs instead.rustcwill no longer silently ignore invalid data in target spec.cfgattributes and--cfgcommand line flags are now more strictly validated.
Rust 1.28.0
Language
- The
#[repr(transparent)]attribute is now stable. This attribute allows a Rust newtype wrapper (struct NewType<T>(T);) to be represented as the inner type across Foreign Function Interface (FFI) boundaries. - The keywords
pure,sizeof,alignof, andoffsetofhave been unreserved and can now be used as identifiers. - The
GlobalAlloctrait and#[global_allocator]attribute are now stable. This will allow users to specify a global allocator for their program. - Unit test functions marked with the
#[test]attribute can now returnResult<(), E: Debug>in addition to(). - The
lifetimespecifier formacro_rules!is now stable. This allows macros to easily target lifetimes.
Compiler
- The
sandzoptimisation levels are now stable. These optimisations prioritise making smaller binary sizes.zis the same asswith the exception that it does not vectorise loops, which typically results in an even smaller binary. - The short error format is now stable. Specified with
--error-format=shortthis option will provide a more compressed output of rust error messages. - Added a lint warning when you have duplicated
macro_exports. - Reduced the number of allocations in the macro parser. This can improve compile times of macro heavy crates on average by 5%.
Libraries
- Implemented
Defaultfor&mut str. - Implemented
From<bool>for all integer and unsigned number types. - Implemented
Extendfor(). - The
Debugimplementation oftime::Durationshould now be more easily human readable. Previously aDurationof one second would printed asDuration { secs: 1, nanos: 0 }and will now be printed as1s. - Implemented
From<&String>forCow<str>,From<&Vec<T>>forCow<[T]>,From<Cow<CStr>>forCString,From<CString>, From<CStr>, From<&CString>forCow<CStr>,From<OsString>, From<OsStr>, From<&OsString>forCow<OsStr>,From<&PathBuf>forCow<Path>, andFrom<Cow<Path>>forPathBuf. - Implemented
ShlandShrforWrapping<u128>andWrapping<i128>. DirEntry::metadatanow usesfstatatinstead oflstatwhen possible. This can provide up to a 40% speed increase.- Improved error messages when using
format!.
Stabilized APIs
Iterator::step_byPath::ancestorsSystemTime::UNIX_EPOCHalloc::GlobalAllocalloc::Layoutalloc::LayoutErralloc::Systemalloc::allocalloc::alloc_zeroedalloc::deallocalloc::reallocalloc::handle_alloc_errorbtree_map::Entry::or_defaultfmt::Alignmenthash_map::Entry::or_defaultiter::repeat_withnum::NonZeroUsizenum::NonZeroU128num::NonZeroU16num::NonZeroU32num::NonZeroU64num::NonZeroU8ops::RangeBoundsslice::SliceIndexslice::from_mutslice::from_ref{Any + Send + Sync}::downcast_mut{Any + Send + Sync}::downcast_ref{Any + Send + Sync}::is
Cargo
- Cargo will now no longer allow you to publish crates with build scripts that modify the
srcdirectory. Thesrcdirectory in a crate should be considered to be immutable.
Misc
- The
suggestion_applicabilityfield inrustc's json output is now stable. This will allow dev tools to check whether a code suggestion would apply to them.
Compatibility Notes
- Rust will consider trait objects with duplicated constraints to be the same type as without the duplicated constraint. For example the below code will now fail to compile.
trait Trait {} impl Trait + Send { fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test` } impl Trait + Send + Send { fn test(&self) { println!("two"); } }
Rust 1.27.2
Compatibility Notes
- The borrow checker was fixed to avoid potential unsoundness when using match ergonomics: #52213.
Rust 1.27.1
Security Notes
-
rustdoc would execute plugins in the /tmp/rustdoc/plugins directory when running, which enabled executing code as some other user on a given machine. This release fixes that vulnerability; you can read more about this on the blog. The associated CVE is CVE-2018-1000622.
Thank you to Red Hat for responsibly disclosing this vulnerability to us.
Compatibility Notes
Rust 1.27.0
Language
- Removed 'proc' from the reserved keywords list. This allows
procto be used as an identifier. - The dyn syntax is now available. This syntax is equivalent to the bare
Traitsyntax, and should make it clearer when being used in tandem withimpl Traitbecause it is equivalent to the following syntax:&Trait == &dyn Trait,&mut Trait == &mut dyn Trait, andBox<Trait> == Box<dyn Trait>. - Attributes on generic parameters such as types and lifetimes are now stable. e.g.
fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {} - The
#[must_use]attribute can now also be used on functions as well as types. It provides a lint that by default warns users when the value returned by a function has not been used.
Compiler
Libraries
- SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable. This includes
arch::x86&arch::x86_64modules which contain SIMD intrinsics, a new macro calledis_x86_feature_detected!, the#[target_feature(enable="")]attribute, and addingtarget_feature = ""to thecfgattribute. - A lot of methods for
[u8],f32, andf64previously only available in std are now available in core. - The generic
Rhstype parameter onops::{Shl, ShlAssign, Shr}now defaults toSelf. std::str::replacenow has the#[must_use]attribute to clarify that the operation isn't done in place.Clone::clone,Iterator::collect, andToOwned::to_ownednow have the#[must_use]attribute to warn about unused potentially expensive allocations.
Stabilized APIs
DoubleEndedIterator::rfindDoubleEndedIterator::rfoldDoubleEndedIterator::try_rfoldDuration::from_microsDuration::from_nanosDuration::subsec_microsDuration::subsec_millisHashMap::remove_entryIterator::try_foldIterator::try_for_eachNonNull::castOption::filterString::replace_rangeTake::set_limithint::unreachable_uncheckedos::unix::process::parent_idptr::swap_nonoverlappingslice::rsplit_mutslice::rsplitslice::swap_with_slice
Cargo
cargo-metadatanow includesauthors,categories,keywords,readme, andrepositoryfields.cargo-metadatanow includes a package'smetadatatable.- Added the
--target-diroptional argument. This allows you to specify a different directory thantargetfor placing compilation artifacts. - Cargo will be adding automatic target inference for binaries, benchmarks, examples, and tests in the Rust 2018 edition. If your project specifies specific targets, e.g. using
[[bin]], and have other binaries in locations where cargo would infer a binary, Cargo will produce a warning. You can disable this feature ahead of time by setting any of the following to false:autobins,autobenches,autoexamples,autotests. - Cargo will now cache compiler information. This can be disabled by setting
CARGO_CACHE_RUSTC_INFO=0in your environment.
Misc
- Added “The Rustc book” into the official documentation. “The Rustc book” documents and teaches how to use the rustc compiler.
- All books available on
doc.rust-lang.orgare now searchable.
Compatibility Notes
- Calling a
CharExtorStrExtmethod directly on core will no longer work. e.g.::core::prelude::v1::StrExt::is_empty("")will not compile,"".is_empty()will still compile. Debugoutput onatomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}will only print the inner type. E.g.print!("{:?}", AtomicBool::new(true))will printtrue, notAtomicBool(true).- The maximum number for
repr(align(N))is now 2²⁹. Previously you could enter higher numbers but they were not supported by LLVM. Up to 512MB alignment should cover all use cases. - The
.description()method on thestd::error::Errortrait has been soft-deprecated. It is no longer required to implement it.
Rust 1.26.2
Rust 1.26.1
Tools
Compatibility Notes
Rust 1.26.0
Language
- Closures now implement
Copyand/orCloneif all captured variables implement either or both traits. - The inclusive range syntax e.g.
for x in 0..=10is now stable. - The
'_lifetime is now stable. The underscore lifetime can be used anywhere a lifetime can be elided. impl Traitis 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
u128andi128are now stable. maincan 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-prefixoption to rustc. Allowing you to remap path prefixes outputted by the compiler. - Added
powerpc-unknown-netbsdtarget.
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, Hashforcmp::Reverse. - Optimized
str::repeatbeing 8x faster in large cases. ascii::escape_defaultis now available in libcore.- Trailing commas are now supported in std and core macros.
- Implemented
Copy, Cloneforcmp::Reverse - Implemented
Cloneforchar::{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::writeBox::leakFromUtf8Error::as_bytesLocalKey::try_withOption::clonedbtree_map::Entry::and_modifyfs::read_to_stringfs::readfs::writehash_map::Entry::and_modifyiter::FusedIteratorops::RangeInclusiveops::RangeToInclusiveprocess::idslice::rotate_leftslice::rotate_rightString::retain
Cargo
- Cargo will now output path to custom commands when
-vis passed with--list - The Cargo binary version is now the same as the Rust version
Misc
Compatibility Notes
- aliasing a
Fntrait asdynno 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
AsciiExttrait in favor of inherent methods. ".e0"will now no longer parse as0.0and 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::Commandon Unix. - Impl PartialEq and Eq for
ParseCharError. UnsafeCell::into_inneris now safe.- Implement libstd for CloudABI.
Float::{from_bits, to_bits}is now available in libcore.- Implement
AsRef<Path>for Component - Implemented
WriteforCursor<&mut Vec<u8>> - Moved
Durationto libcore.
Stabilized APIs
The following functions can now be used in a constant expression. eg. static MINUTE: Duration = Duration::from_secs(60);
Cargo
cargo newno longer removesrustorrsprefixes/suffixes.cargo newnow defaults to creating a binary crate, instead of a library crate.
Misc
Compatibility Notes
- Deprecated
net::lookup_host. rustdochas 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].