Rust 1.8.0
Language
- Rust supports overloading of compound assignment statements like
+=
by implementing theAddAssign
,SubAssign
,MulAssign
,DivAssign
,RemAssign
,BitAndAssign
,BitOrAssign
,BitXorAssign
,ShlAssign
, orShrAssign
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
/Sub
impls forTime
andSystemTime
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. - Various I/O functions support large files on 32-bit Linux.
- The Unix-specific
raw
modules, which contain a number of redefined C types are deprecated, includingos::raw::unix
,os::raw::macos
, andos::raw::linux
. These modules defined types such asino_t
anddev_t
. The inconsistency of these definitions across platforms was making it difficult to implementstd
correctly. Those that need these definitions should use thelibc
crate. RFC 1415. - The Unix-specific
MetadataExt
traits, includingos::unix::fs::MetadataExt
, which expose values such as inode numbers no longer return platform-specific types, but instead return widened integers. RFC 1415. btree_set::{IntoIter, Iter, Range}
are covariant.- Atomic loads and stores are not volatile.
- All types in
sync::mpsc
implementfmt::Debug
.
Performance
- Inlining hash functions lead to a 3% compile-time improvement in some workloads.
- When using jemalloc, its symbols are unprefixed so that it overrides the libc malloc implementation. 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.
Misc
- 32-bit MSVC builds finally implement unwinding. i686-pc-windows-msvc is now considered a tier-1 platform.
- The
--print targets
flag prints a list of supported targets. - The
--print cfg
flag prints thecfg
s defined for the current target. rustc
can be built with an new Cargo-based build system, written in Rust. It will eventually replace Rust's Makefile-based build system. To enable it configure withconfigure --rustbuild
.- Errors for non-exhaustive
match
patterns now list up to 3 missing variants while also indicating the total number of missing variants if more than 3. - Executable stacks are disabled on Linux and BSD.
- 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-gnu
x86_64-rumprun-netbsd
. These can be installed with tools such as multirust.
Cargo
cargo init
creates a new Cargo project in the current directory. It is otherwise likecargo new
.- Cargo has configuration keys for
-v
and--color
.verbose
andcolor
, respectively, go in the[term]
section of.cargo/config
. - Configuration keys that evaluate to strings or integers can be set via environment variables. For example the
build.jobs
key can be set viaCARGO_BUILD_JOBS
. Environment variables take precedence over config files. - Target-specific dependencies support Rust
cfg
syntax for describing targets so that dependencies for multiple targets can be specified together. RFC 1361. - The environment variables
CARGO_TARGET_ROOT
,RUSTC
, andRUSTDOC
take precedence over thebuild.target-dir
,build.rustc
, andbuild.rustdoc
configuration values. - The child process tree is killed on Windows when Cargo is killed.
- The
build.target
configuration value sets the target platform, like--target
.
Compatibility Notes
- Unstable compiler flags have been further restricted. Since 1.0
-Z
flags have been considered unstable, and other flags that were considered unstable additionally required passing-Z unstable-options
to 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
match
on empty enum variants using theVariant(..)
syntax. This has been a warning since 1.6. - The Unix-specific
MetadataExt
traits, 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.
--cfg
compiler flags are parsed strictly as identifiers.- On Unix, stack overflow triggers a runtime abort instead of a SIGSEGV.
Command::spawn
and its equivalents return an error if any of its command-line arguments contain interiorNUL
s.- Tuple and unit enum variants from other crates are in the type namespace.
- On Windows
rustc
emits.lib
files for thestaticlib
library type instead of.a
files. Additionally, for the MSVC toolchain,rustc
emits import libraries namedfoo.dll.lib
instead offoo.lib
.