Rust versions / 1.8
Rust release · Apr 14, 2016
Rust 1.8: what's new, what was stabilized
Short answerRust 1.8 was released on Apr 14, 2016: 9 compatibility notes that can affect existing code.
← Rust 1.7All versionsRust 1.9 →
Can it break my build?
The release lists these compatibility notes. Most only affect rare code, but read them before you raise your toolchain in CI:
- [Unstable compiler flags have been further restricted][1.8u]. Since
- [It is no longer possible to
matchon empty enum variants using - The Unix-specific
MetadataExttraits, including - [Modules sourced from the filesystem cannot appear within arbitrary
- [
--cfgcompiler flags are parsed strictly as identifiers][1.8c]. - On Unix, [stack overflow triggers a runtime abort instead of a
- [
Command::spawnand its equivalents return an error if any of - [Tuple and unit enum variants from other crates are in the type
- [On Windows
rustcemits.libfiles for thestaticliblibrary
Use it
rustup update stable # get the newest release
rustup install 1.8 # or exactly this one
rustup override set 1.8 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.8" under [package] in Cargo.toml. Cargo then refuses to build it on older compilers with a clear message, and with resolver 3 (the default on the 2024 edition, Rust 1.85+) it also prefers dependency versions that support it.
Full release notes
Language
- Rust supports overloading of compound assignment statements like
+=by implementing the [AddAssign], [SubAssign], [MulAssign], [DivAssign], [RemAssign], [BitAndAssign], [BitOrAssign], [BitXorAssign], [ShlAssign], or [ShrAssign] traits. [RFC 953]. - Empty structs can be defined with braces, as in
struct Foo { }, in addition to the non-braced form,struct Foo;. [RFC 218].
Libraries
- Stabilized APIs:
- [
str::encode_utf16] (renamed fromutf16_units) - [
str::EncodeUtf16] (renamed fromUtf16Units) - [
Ref::map] - [
RefMut::map] - [
ptr::drop_in_place] - [
time::Instant] - [
time::SystemTime] - [
Instant::now] - [
Instant::duration_since] (renamed fromduration_from_earlier) - [
Instant::elapsed] - [
SystemTime::now] - [
SystemTime::duration_since] (renamed fromduration_from_earlier) - [
SystemTime::elapsed] - Various
Add/Subimpls forTimeandSystemTime - [
SystemTimeError] - [
SystemTimeError::duration] - Various impls for
SystemTimeError - [
UNIX_EPOCH] - [
AddAssign], [SubAssign], [MulAssign], [DivAssign], [RemAssign], [BitAndAssign], [BitOrAssign], [BitXorAssign], [ShlAssign], [ShrAssign]. - [The
write!andwriteln!macros correctly emit errors if any of their arguments can't be formatted][1.8w]. - [Various I/O functions support large files on 32-bit Linux][1.8l].
- [The Unix-specific
rawmodules, which contain a number of redefined C types are deprecated][1.8r], includingos::raw::unix,os::raw::macos, andos::raw::linux. These modules defined types such asino_tanddev_t. The inconsistency of these definitions across platforms was making it difficult to implementstdcorrectly. Those that need these definitions should use thelibccrate. [RFC 1415]. - The Unix-specific
MetadataExttraits, includingos::unix::fs::MetadataExt, which expose values such as inode numbers [no longer return platform-specific types][1.8r], but instead return widened integers. [RFC 1415]. - [
btree_set::{IntoIter, Iter, Range}are covariant][1.8cv]. - [Atomic loads and stores are not volatile][1.8a].
- [All types in
sync::mpscimplementfmt::Debug][1.8mp].
Performance
- [Inlining hash functions lead to a 3% compile-time improvement in some workloads][1.8h].
- When using jemalloc, its symbols are [unprefixed so that it overrides the libc malloc implementation][1.8h]. This means that for rustc, LLVM is now using jemalloc, which results in a 6% compile-time improvement on a specific workload.
- [Avoid quadratic growth in function size due to cleanups][1.8cu].
Misc
- [32-bit MSVC builds finally implement unwinding][1.8ms]. i686-pc-windows-msvc is now considered a tier-1 platform.
- [The
--print targetsflag prints a list of supported targets][1.8t]. - [The
--print cfgflag prints thecfgs defined for the current target][1.8cf]. - [
rustccan be built with an new Cargo-based build system, written in Rust][1.8b]. It will eventually replace Rust's Makefile-based build system. To enable it configure withconfigure --rustbuild. - [Errors for non-exhaustive
matchpatterns now list up to 3 missing variants while also indicating the total number of missing variants if more than 3][1.8m]. - [Executable stacks are disabled on Linux and BSD][1.8nx].
- The Rust Project now publishes binary releases of the standard library for a number of tier-2 targets:
armv7-unknown-linux-gnueabihf,powerpc-unknown-linux-gnu,powerpc64-unknown-linux-gnu,powerpc64le-unknown-linux-gnux86_64-rumprun-netbsd. These can be installed with tools such as [multirust][1.8mr].
Cargo
- [
cargo initcreates a new Cargo project in the current directory][1.8ci]. It is otherwise likecargo new. - [Cargo has configuration keys for
-vand--color][1.8cc].verboseandcolor, respectively, go in the[term]section of.cargo/config. - [Configuration keys that evaluate to strings or integers can be set via environment variables][1.8ce]. For example the
build.jobskey can be set viaCARGO_BUILD_JOBS. Environment variables take precedence over config files. - [Target-specific dependencies support Rust
cfgsyntax for describing targets][1.8cfg] so that dependencies for multiple targets can be specified together. [RFC 1361]. - [The environment variables
CARGO_TARGET_ROOT,RUSTC, andRUSTDOCtake precedence over thebuild.target-dir,build.rustc, andbuild.rustdocconfiguration values][1.8cfv]. - [The child process tree is killed on Windows when Cargo is killed][1.8ck].
- [The
build.targetconfiguration value sets the target platform, like--target][1.8ct].
Compatibility Notes
- Unstable compiler flags have been further restricted. Since 1.0
-Zflags have been considered unstable, and other flags that were considered unstable additionally required passing-Z unstable-optionsto access. Unlike unstable language and library features though, these options have been accessible on the stable release channel. Going forward, *new unstable flags will not be available on the stable release channel*, and old unstable flags will warn about their usage. In the future, all unstable flags will be unavailable on the stable release channel. - It is no longer possible to
matchon empty enum variants using theVariant(..)syntax. This has been a warning since 1.6. - The Unix-specific
MetadataExttraits, includingos::unix::fs::MetadataExt, which expose values such as inode numbers no longer return platform-specific types, but instead return widened integers. RFC 1415. - Modules sourced from the filesystem cannot appear within arbitrary blocks, but only within other modules.
--cfgcompiler flags are parsed strictly as identifiers.- On Unix, stack overflow triggers a runtime abort instead of a SIGSEGV.
Command::spawnand its equivalents return an error if any of its command-line arguments contain interiorNULs.- Tuple and unit enum variants from other crates are in the type namespace.
- On Windows
rustcemits.libfiles for thestaticliblibrary type instead of.afiles. Additionally, for the MSVC toolchain,rustcemits import libraries namedfoo.dll.libinstead offoo.lib.
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.9Released May 26, 2016.Read it next →Also worth your time
Did this answer your question?