← Back to all releases

Rust 1.17.0

Released on April 27, 2017

What's Changed

  • [The lifetime of statics and consts defaults to 'static][39265]. [RFC 1623]
  • [Fields of structs may be initialized without duplicating the field/variable
  • [Self may be included in the where clause of impls][38864]. [RFC 1647]
  • [When coercing to an unsized type lifetimes must be equal][40319]. That is,
  • [Values passed to the indexing operator, [], automatically coerce][40166]
  • [Static variables may contain references to other statics][40027]

  • [Exit quickly on only --emit dep-info][40336]
  • [Make -C relocation-model more correctly determine whether the linker
  • [Add -C overflow-checks to directly control whether integer overflow
  • [The rustc type checker now checks items on demand instead of in a single
  • [Optimize vtable loads][39995]
  • [Turn off vectorization for Emscripten targets][39990]
  • [Provide suggestions for unknown macros imported with use][39953]
  • [Fix ICEs in path resolution][39939]
  • [Strip exception handling code on Emscripten when panic=abort][39193]
  • [Add clearer error message using &str + &str][39116]

Full Changelog

Language

--------

* [The lifetime of statics and consts defaults to 'static][39265]. [RFC 1623]

* [Fields of structs may be initialized without duplicating the field/variable

names][39761]. [RFC 1682]

* [Self may be included in the where clause of impls][38864]. [RFC 1647]

* [When coercing to an unsized type lifetimes must be equal][40319]. That is,

there is no subtyping between T and U when T: Unsize. For example,

coercing &mut [&'a X; N] to &mut [&'b X] requires 'a be equal to

'b. Soundness fix.

* [Values passed to the indexing operator, [], automatically coerce][40166]

* [Static variables may contain references to other statics][40027]

Compiler

--------

* [Exit quickly on only --emit dep-info][40336]

* [Make -C relocation-model more correctly determine whether the linker

creates a position-independent executable][40245]

* [Add -C overflow-checks to directly control whether integer overflow

panics][40037]

* [The rustc type checker now checks items on demand instead of in a single

in-order pass][40008]. This is mostly an internal refactoring in support of

future work, including incremental type checking, but also resolves [RFC

1647], allowing Self to appear in impl where clauses.

* [Optimize vtable loads][39995]

* [Turn off vectorization for Emscripten targets][39990]

* [Provide suggestions for unknown macros imported with use][39953]

* [Fix ICEs in path resolution][39939]

* [Strip exception handling code on Emscripten when panic=abort][39193]

* [Add clearer error message using &str + &str][39116]

Stabilized APIs

---------------

* [Arc::into_raw]

* [Arc::from_raw]

* [Arc::ptr_eq]

* [Rc::into_raw]

* [Rc::from_raw]

* [Rc::ptr_eq]

* [Ordering::then]

* [Ordering::then_with]

* [BTreeMap::range]

* [BTreeMap::range_mut]

* [collections::Bound]

* [process::abort]

* [ptr::read_unaligned]

* [ptr::write_unaligned]

* [Result::expect_err]

* [Cell::swap]

* [Cell::replace]

* [Cell::into_inner]

* [Cell::take]

Libraries

---------

* [BTreeMap and BTreeSet can iterate over ranges][27787]

* [Cell can store non-Copy types][39793]. [RFC 1651]

* [String implements FromIterator<&char>][40028]

* Box [implements][40009] a number of new conversions:

From> for String, From> for Vec, From> for CString, From> for OsString, From> for PathBuf, Into> for String, Into> for Vec, Into> for CString, Into> for OsString, Into> for PathBuf, Default for Box, Default for Box, Default for Box, From<&CStr> for Box, From<&OsStr> for Box, From<&Path> for Box

* [ffi::FromBytesWithNulError implements Error and Display][39960]

* [Specialize PartialOrd for [A] where A: Ord][39642]

* [Slightly optimize slice::sort][39538]

* [Add ToString trait specialization for Cow<'a, str> and String][39440]

* [Box<[T]> implements From<&[T]> where T: Copy,

Box implements From<&str>][39438]

* [IpAddr implements From for various arrays. SocketAddr implements

From<(I, u16)> where I: Into][39372]

* [format! estimates the needed capacity before writing a string][39356]

* [Support unprivileged symlink creation in Windows][38921]

* [PathBuf implements Default][38764]

* [Implement PartialEq<[A]> for VecDeque][38661]

* [HashMap resizes adaptively][38368] to guard against DOS attacks

and poor hash functions.

Cargo

-----

* [Add cargo check --all][cargo/3731]

* [Add an option to ignore SSL revocation checking][cargo/3699]

* [Add cargo run --package][cargo/3691]

* [Add required_features][cargo/3667]

* [Assume build.rs is a build script][cargo/3664]

* [Find workspace via workspace_root link in containing member][cargo/3562]

Misc

----

* [Documentation is rendered with mdbook instead of the obsolete, in-tree

rustbook][39633]

* [The "Unstable Book" documents nightly-only features][ubook]

* [Improve the style of the sidebar in rustdoc output][40265]

* [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]

* [Fix MSP430 breakage due to i128][40257]

* [Preliminary Solaris/SPARCv9 support][39903]

* [rustc is linked statically on Windows MSVC targets][39837], allowing it to

run without installing the MSVC runtime.

* [rustdoc --test includes file names in test names][39788]

* This release includes builds of std for sparc64-unknown-linux-gnu,

aarch64-unknown-linux-fuchsia, and x86_64-unknown-linux-fuchsia.

* [Initial support for aarch64-unknown-freebsd][39491]

* [Initial support for i686-unknown-netbsd][39426]

* [This release no longer includes the old makefile build system][39431]. Rust

is built with a custom build system, written in Rust, and with Cargo.

* [Add Debug implementations for libcollection structs][39002]

* [TypeId implements PartialOrd and Ord][38981]

* [--test-threads=0 produces an error][38945]

* [rustup installs documentation by default][40526]

* [The Rust source includes NatVis visualizations][39843]. These can be used by

WinDbg and Visual Studio to improve the debugging experience.

Compatibility Notes

-------------------

* [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a

workaround, either use MSVC 2015 or run vcvars.bat.

* [When coercing to an unsized type lifetimes must be equal][40319]. That is,

disallow subtyping between T and U when T: Unsize, e.g. coercing

&mut [&'a X; N] to &mut [&'b X] requires 'a be equal to 'b. Soundness

fix.

* [format! and Display::to_string panic if an underlying formatting

implementation returns an error][40117]. Previously the error was silently

ignored. It is incorrect for write_fmt to return an error when writing

to a string.

* [In-tree crates are verified to be unstable][39851]. Previously, some minor

crates were marked stable and could be accessed from the stable toolchain.

* [Rust git source no longer includes vendored crates][39728]. Those that need

to build with vendored crates should build from release tarballs.

* [Fix inert attributes from proc_macro_derives][39572]

* [During crate resolution, rustc prefers a crate in the sysroot if two crates

are otherwise identical][39518]. Unlikely to be encountered outside the Rust

build system.

* [Fixed bugs around how type inference interacts with dead-code][39485]. The

existing code generally ignores the type of dead-code unless a type-hint is

provided; this can cause surprising inference interactions particularly around

defaulting. The new code uniformly ignores the result type of dead-code.

* [Tuple-struct constructors with private fields are no longer visible][38932]

* [Lifetime parameters that do not appear in the arguments are now considered

early-bound][38897], resolving a soundness bug (#[32330]). The

hr_lifetime_in_assoc_type future-compatibility lint has been in effect since

April of 2016.

* [rustdoc: fix doctests with non-feature crate attributes][38161]

* [Make transmuting from fn item types to pointer-sized types a hard

error][34198]

[27787]: https://github.com/rust-lang/rust/issues/27787

[32330]: https://github.com/rust-lang/rust/issues/32330

[34198]: https://github.com/rust-lang/rust/pull/34198

[38161]: https://github.com/rust-lang/rust/pull/38161

[38368]: https://github.com/rust-lang/rust/pull/38368

[38584]: https://github.com/rust-lang/rust/issues/38584

[38661]: https://github.com/rust-lang/rust/pull/38661

[38764]: https://github.com/rust-lang/rust/pull/38764

[38864]: https://github.com/rust-lang/rust/issues/38864

[38897]: https://github.com/rust-lang/rust/pull/38897

[38921]: https://github.com/rust-lang/rust/pull/38921

[38932]: https://github.com/rust-lang/rust/pull/38932

[38945]: https://github.com/rust-lang/rust/pull/38945

[38981]: https://github.com/rust-lang/rust/pull/38981

[39002]: https://github.com/rust-lang/rust/pull/39002

[39116]: https://github.com/rust-lang/rust/pull/39116

[39193]: https://github.com/rust-lang/rust/pull/39193

[39265]: https://github.com/rust-lang/rust/pull/39265

[39356]: https://github.com/rust-lang/rust/pull/39356

[39372]: https://github.com/rust-lang/rust/pull/39372

[39426]: https://github.com/rust-lang/rust/pull/39426

[39431]: https://github.com/rust-lang/rust/pull/39431

[39438]: https://github.com/rust-lang/rust/pull/39438

[39440]: https://github.com/rust-lang/rust/pull/39440

[39485]: https://github.com/rust-lang/rust/pull/39485

[39491]: https://github.com/rust-lang/rust/pull/39491

[39518]: https://github.com/rust-lang/rust/pull/39518

[39538]: https://github.com/rust-lang/rust/pull/39538

[39572]: https://github.com/rust-lang/rust/pull/39572

[39633]: https://github.com/rust-lang/rust/pull/39633

[39642]: https://github.com/rust-lang/rust/pull/39642

[39728]: https://github.com/rust-lang/rust/pull/39728

[39761]: https://github.com/rust-lang/rust/pull/39761

[39788]: https://github.com/rust-lang/rust/pull/39788

[39793]: https://github.com/rust-lang/rust/pull/39793

[39837]: https://github.com/rust-lang/rust/pull/39837

[39843]: https://github.com/rust-lang/rust/pull/39843

[39851]: https://github.com/rust-lang/rust/pull/39851

[39903]: https://github.com/rust-lang/rust/pull/39903

[39939]: https://github.com/rust-lang/rust/pull/39939

[39953]: https://github.com/rust-lang/rust/pull/39953

[39960]: https://github.com/rust-lang/rust/pull/39960

[39990]: https://github.com/rust-lang/rust/pull/39990

[39995]: https://github.com/rust-lang/rust/pull/39995

[40008]: https://github.com/rust-lang/rust/pull/40008

[40009]: https://github.com/rust-lang/rust/pull/40009

[40027]: https://github.com/rust-lang/rust/pull/40027

[40028]: https://github.com/rust-lang/rust/pull/40028

[40037]: https://github.com/rust-lang/rust/pull/40037

[40117]: https://github.com/rust-lang/rust/pull/40117

[40166]: https://github.com/rust-lang/rust/pull/40166

[40245]: https://github.com/rust-lang/rust/pull/40245

[40257]: https://github.com/rust-lang/rust/pull/40257

[40261]: https://github.com/rust-lang/rust/pull/40261

[40265]: https://github.com/rust-lang/rust/pull/40265

[40319]: https://github.com/rust-lang/rust/pull/40319

[40336]: https://github.com/rust-lang/rust/pull/40336

[40526]: https://github.com/rust-lang/rust/pull/40526

[RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md

[RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md

[RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md

[RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md

[Arc::from_raw]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw

[Arc::into_raw]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw

[Arc::ptr_eq]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq

[BTreeMap::range_mut]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut

[BTreeMap::range]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range

[Cell::into_inner]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner

[Cell::replace]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace

[Cell::swap]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap

[Cell::take]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take

[Ordering::then_with]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with

[Ordering::then]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then

[Rc::from_raw]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw

[Rc::into_raw]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw

[Rc::ptr_eq]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq

[Result::expect_err]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err

[collections::Bound]: https://doc.rust-lang.org/std/collections/enum.Bound.html

[process::abort]: https://doc.rust-lang.org/std/process/fn.abort.html

[ptr::read_unaligned]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html

[ptr::write_unaligned]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html

[cargo/3562]: https://github.com/rust-lang/cargo/pull/3562

[cargo/3664]: https://github.com/rust-lang/cargo/pull/3664

[cargo/3667]: https://github.com/rust-lang/cargo/pull/3667

[cargo/3691]: https://github.com/rust-lang/cargo/pull/3691

[cargo/3699]: https://github.com/rust-lang/cargo/pull/3699

[cargo/3731]: https://github.com/rust-lang/cargo/pull/3731

[ubook]: https://doc.rust-lang.org/unstable-book/