← Back to all releases

Rust 1.20.0

Released on August 31, 2017

What's Changed

  • [Associated constants are now stabilised.][42809]
  • [A lot of macro bugs are now fixed.][42913]

  • [Struct fields are now properly coerced to the expected field type.][42807]
  • [Enabled wasm LLVM backend][42571] WASM can now be built with the
  • [Changed some of the error messages to be more helpful.][42033]
  • [Add support for RELRO(RELocation Read-Only) for platforms that support
  • [rustc now reports the total number of errors on compilation failure][43015]
  • [Expansion in rustc has been sped up 29x.][42533]
  • [added msp430-none-elf target.][43099]
  • [rustc will now suggest one-argument enum variant to fix type mismatch when
  • [Fixes backtraces on Redox][43228]
  • [rustc now identifies different versions of same crate when absolute paths of

  • [Relaxed Debug constraints on {HashMap,BTreeMap}::{Keys,Values}.][42854]
  • [Impl PartialEq, Eq, PartialOrd, Ord, Debug, Hash for unsized
  • [Impl fmt::{Display, Debug} for Ref, RefMut, MutexGuard,
  • [Impl Clone for DefaultHasher.][42799]
  • [Impl Sync for SyncSender.][42397]
  • [Impl FromStr for char][42271]
  • [Fixed how {f32, f64}::{is_sign_negative, is_sign_positive} handles
  • [allow messages in the unimplemented!() macro.][42155]
  • [pub(restricted) is now supported in the thread_local! macro.][43185]
  • [Upgrade to Unicode 10.0.0][42999]
  • [Reimplemented {f32, f64}::{min, max} in Rust instead of using CMath.][42430]
  • [Skip the main thread's manual stack guard on Linux][43072]
  • [Iterator::nth for ops::{Range, RangeFrom} is now done in O(1) time][43077]
  • [#[repr(align(N))] attribute max number is now 2^31 - 1.][43097] This was
  • [{OsStr, Path}::Display now avoids allocations where possible][42613]
  • [CStr::into_c_string]
  • [CString::as_c_str]
  • [CString::into_boxed_c_str]
  • [Chain::get_mut]
  • [Chain::get_ref]
  • [Chain::into_inner]
  • [Option::get_or_insert_with]
  • [Option::get_or_insert]
  • [OsStr::into_os_string]
  • [OsString::into_boxed_os_str]
  • [Take::get_mut]
  • [Take::get_ref]
  • [Utf8Error::error_len]
  • [char::EscapeDebug]
  • [char::escape_debug]
  • [compile_error!]
  • [f32::from_bits]
  • [f32::to_bits]
  • [f64::from_bits]
  • [f64::to_bits]
  • [mem::ManuallyDrop]
  • [slice::sort_unstable_by_key]
  • [slice::sort_unstable_by]
  • [slice::sort_unstable]
  • [str::from_boxed_utf8_unchecked]
  • [str::as_bytes_mut]
  • [str::as_bytes_mut]
  • [str::from_utf8_mut]
  • [str::from_utf8_unchecked_mut]
  • [str::get_mut]
  • [str::get_unchecked_mut]
  • [str::get_unchecked]
  • [str::get]
  • [str::into_boxed_bytes]

  • [Cargo API token location moved from ~/.cargo/config to
  • [Cargo will now build main.rs binaries that are in sub-directories of
  • [You can now specify version of a binary when installed through
  • [Added --no-fail-fast flag to cargo to run all benchmarks regardless of
  • [Changed the convention around which file is the crate root.][cargo/4259]

  • [Functions with 'static in their return types will now not be as usable as
  • [The reimplementation of {f32, f64}::is_sign_{negative, positive} now
Full Changelog

Language

--------

- [Associated constants are now stabilised.][42809]

- [A lot of macro bugs are now fixed.][42913]

Compiler

--------

- [Struct fields are now properly coerced to the expected field type.][42807]

- [Enabled wasm LLVM backend][42571] WASM can now be built with the

wasm32-experimental-emscripten target.

- [Changed some of the error messages to be more helpful.][42033]

- [Add support for RELRO(RELocation Read-Only) for platforms that support

it.][43170]

- [rustc now reports the total number of errors on compilation failure][43015]

previously this was only the number of errors in the pass that failed.

- [Expansion in rustc has been sped up 29x.][42533]

- [added msp430-none-elf target.][43099]

- [rustc will now suggest one-argument enum variant to fix type mismatch when

applicable][43178]

- [Fixes backtraces on Redox][43228]

- [rustc now identifies different versions of same crate when absolute paths of

different types match in an error message.][42826]

Libraries

---------

- [Relaxed Debug constraints on {HashMap,BTreeMap}::{Keys,Values}.][42854]

- [Impl PartialEq, Eq, PartialOrd, Ord, Debug, Hash for unsized

tuples.][43011]

- [Impl fmt::{Display, Debug} for Ref, RefMut, MutexGuard,

RwLockReadGuard, RwLockWriteGuard][42822]

- [Impl Clone for DefaultHasher.][42799]

- [Impl Sync for SyncSender.][42397]

- [Impl FromStr for char][42271]

- [Fixed how {f32, f64}::{is_sign_negative, is_sign_positive} handles

NaN.][42431]

- [allow messages in the unimplemented!() macro.][42155]

ie. unimplemented!("Waiting for 1.21 to be stable")

- [pub(restricted) is now supported in the thread_local! macro.][43185]

- [Upgrade to Unicode 10.0.0][42999]

- [Reimplemented {f32, f64}::{min, max} in Rust instead of using CMath.][42430]

- [Skip the main thread's manual stack guard on Linux][43072]

- [Iterator::nth for ops::{Range, RangeFrom} is now done in O(1) time][43077]

- [#[repr(align(N))] attribute max number is now 2^31 - 1.][43097] This was

previously 2^15.

- [{OsStr, Path}::Display now avoids allocations where possible][42613]

Stabilized APIs

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

- [CStr::into_c_string]

- [CString::as_c_str]

- [CString::into_boxed_c_str]

- [Chain::get_mut]

- [Chain::get_ref]

- [Chain::into_inner]

- [Option::get_or_insert_with]

- [Option::get_or_insert]

- [OsStr::into_os_string]

- [OsString::into_boxed_os_str]

- [Take::get_mut]

- [Take::get_ref]

- [Utf8Error::error_len]

- [char::EscapeDebug]

- [char::escape_debug]

- [compile_error!]

- [f32::from_bits]

- [f32::to_bits]

- [f64::from_bits]

- [f64::to_bits]

- [mem::ManuallyDrop]

- [slice::sort_unstable_by_key]

- [slice::sort_unstable_by]

- [slice::sort_unstable]

- [str::from_boxed_utf8_unchecked]

- [str::as_bytes_mut]

- [str::as_bytes_mut]

- [str::from_utf8_mut]

- [str::from_utf8_unchecked_mut]

- [str::get_mut]

- [str::get_unchecked_mut]

- [str::get_unchecked]

- [str::get]

- [str::into_boxed_bytes]

Cargo

-----

- [Cargo API token location moved from ~/.cargo/config to

~/.cargo/credentials.][cargo/3978]

- [Cargo will now build main.rs binaries that are in sub-directories of

src/bin.][cargo/4214] ie. Having src/bin/server/main.rs and src/bin/client/main.rs generates target/debug/server and target/debug/client

- [You can now specify version of a binary when installed through

cargo install using --vers.][cargo/4229]

- [Added --no-fail-fast flag to cargo to run all benchmarks regardless of

failure.][cargo/4248]

- [Changed the convention around which file is the crate root.][cargo/4259]

Compatibility Notes

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

- [Functions with 'static in their return types will now not be as usable as

if they were using lifetime parameters instead.][42417]

- [The reimplementation of {f32, f64}::is_sign_{negative, positive} now

takes the sign of NaN into account where previously didn't.][42430]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[CStr::into_c_string]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string

[CString::as_c_str]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str

[CString::into_boxed_c_str]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str

[Chain::get_mut]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut

[Chain::get_ref]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref

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

[Option::get_or_insert_with]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with

[Option::get_or_insert]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert

[OsStr::into_os_string]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string

[OsString::into_boxed_os_str]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str

[Take::get_mut]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut

[Take::get_ref]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref

[Utf8Error::error_len]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len

[char::EscapeDebug]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html

[char::escape_debug]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug

[compile_error!]: https://doc.rust-lang.org/std/macro.compile_error.html

[f32::from_bits]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits

[f32::to_bits]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits

[f64::from_bits]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits

[f64::to_bits]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits

[mem::ManuallyDrop]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html

[slice::sort_unstable_by_key]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key

[slice::sort_unstable_by]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by

[slice::sort_unstable]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable

[str::from_boxed_utf8_unchecked]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html

[str::as_bytes_mut]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut

[str::from_utf8_mut]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html

[str::from_utf8_unchecked_mut]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html

[str::get_mut]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut

[str::get_unchecked_mut]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut

[str::get_unchecked]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked

[str::get]: https://doc.rust-lang.org/std/primitive.str.html#method.get

[str::into_boxed_bytes]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes