← Back to all releases

Rust 1.34.0

Released on April 11, 2019

What's Changed

  • [You can now use #[deprecated = "reason"]][58166] as a shorthand for
  • [You can now accept token streams in #[attr()],#[attr[]], and
  • [You can now write extern crate self as foo;][57407] to import your

  • [You can now target riscv64imac-unknown-none-elf and
  • [You can now enable linker plugin LTO optimisations with
  • [You can now target powerpc64-unknown-freebsd.][57809]

  • [The trait bounds have been removed on some of HashMap's and
  • [The Ord trait bounds have been removed on some of BinaryHeap's basic
  • [The methods overflowing_neg and wrapping_neg are now const functions
  • [Indexing a str is now generic over all types that
  • [str::trim, str::trim_matches, str::trim_{start, end}, and
  • [The methods checked_pow, saturating_pow, wrapping_pow, and
  • [Any::type_id]
  • [Error::type_id]
  • [atomic::AtomicI16]
  • [atomic::AtomicI32]
  • [atomic::AtomicI64]
  • [atomic::AtomicI8]
  • [atomic::AtomicU16]
  • [atomic::AtomicU32]
  • [atomic::AtomicU64]
  • [atomic::AtomicU8]
  • [convert::Infallible]
  • [convert::TryFrom]
  • [convert::TryInto]
  • [iter::from_fn]
  • [iter::successors]
  • [num::NonZeroI128]
  • [num::NonZeroI16]
  • [num::NonZeroI32]
  • [num::NonZeroI64]
  • [num::NonZeroI8]
  • [num::NonZeroIsize]
  • [slice::sort_by_cached_key]
  • [str::escape_debug]
  • [str::escape_default]
  • [str::escape_unicode]
  • [str::split_ascii_whitespace]
  • [Instant::checked_add]
  • [Instant::checked_sub]
  • [SystemTime::checked_add]
  • [SystemTime::checked_sub]

  • [You can now use alternative registries to crates.io.][cargo/6654]

  • [Command::before_exec is being replaced by the unsafe method
  • [Use of ATOMIC_{BOOL, ISIZE, USIZE}_INIT is now deprecated][57425] as you

  • [You can now use the ? operator in your documentation tests without manually
Full Changelog

Language

--------

- [You can now use #[deprecated = "reason"]][58166] as a shorthand for

#[deprecated(note = "reason")]. This was previously allowed by mistake

but had no effect.

- [You can now accept token streams in #[attr()],#[attr[]], and

#[attr{}] procedural macros.][57367]

- [You can now write extern crate self as foo;][57407] to import your

crate's root into the extern prelude.

Compiler

--------

- [You can now target riscv64imac-unknown-none-elf and

riscv64gc-unknown-none-elf.][58406]

- [You can now enable linker plugin LTO optimisations with

-C linker-plugin-lto.][58057] This allows rustc to compile your Rust code

into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI

boundaries.

- [You can now target powerpc64-unknown-freebsd.][57809]

Libraries

---------

- [The trait bounds have been removed on some of HashMap's and

HashSet's basic methods.][58370] Most notably you no longer require

the Hash trait to create an iterator.

- [The Ord trait bounds have been removed on some of BinaryHeap's basic

methods.][58421] Most notably you no longer require the Ord trait to create

an iterator.

- [The methods overflowing_neg and wrapping_neg are now const functions

for all numeric types.][58044]

- [Indexing a str is now generic over all types that

implement SliceIndex.][57604]

- [str::trim, str::trim_matches, str::trim_{start, end}, and

str::trim_{start, end}_matches are now #[must_use]][57106] and will

produce a warning if their returning type is unused.

- [The methods checked_pow, saturating_pow, wrapping_pow, and

overflowing_pow are now available for all numeric types.][57873] These are

equivalent to methods such as wrapping_add for the pow operation.

Stabilized APIs

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

std & core

* [Any::type_id]

* [Error::type_id]

* [atomic::AtomicI16]

* [atomic::AtomicI32]

* [atomic::AtomicI64]

* [atomic::AtomicI8]

* [atomic::AtomicU16]

* [atomic::AtomicU32]

* [atomic::AtomicU64]

* [atomic::AtomicU8]

* [convert::Infallible]

* [convert::TryFrom]

* [convert::TryInto]

* [iter::from_fn]

* [iter::successors]

* [num::NonZeroI128]

* [num::NonZeroI16]

* [num::NonZeroI32]

* [num::NonZeroI64]

* [num::NonZeroI8]

* [num::NonZeroIsize]

* [slice::sort_by_cached_key]

* [str::escape_debug]

* [str::escape_default]

* [str::escape_unicode]

* [str::split_ascii_whitespace]

std

* [Instant::checked_add]

* [Instant::checked_sub]

* [SystemTime::checked_add]

* [SystemTime::checked_sub]

Cargo

-----

- [You can now use alternative registries to crates.io.][cargo/6654]

Misc

----

- [You can now use the ? operator in your documentation tests without manually

adding fn main() -> Result<(), _> {}.][56470]

Compatibility Notes

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

- [Command::before_exec is being replaced by the unsafe method

Command::pre_exec][58059] and will be deprecated with Rust 1.37.0.

- [Use of ATOMIC_{BOOL, ISIZE, USIZE}_INIT is now deprecated][57425] as you

can now use const functions in static variables.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[Any::type_id]: https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id

[Error::type_id]: https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id

[atomic::AtomicI16]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI16.html

[atomic::AtomicI32]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html

[atomic::AtomicI64]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI64.html

[atomic::AtomicI8]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI8.html

[atomic::AtomicU16]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU16.html

[atomic::AtomicU32]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU32.html

[atomic::AtomicU64]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU64.html

[atomic::AtomicU8]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html

[convert::Infallible]: https://doc.rust-lang.org/std/convert/enum.Infallible.html

[convert::TryFrom]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html

[convert::TryInto]: https://doc.rust-lang.org/std/convert/trait.TryInto.html

[iter::from_fn]: https://doc.rust-lang.org/std/iter/fn.from_fn.html

[iter::successors]: https://doc.rust-lang.org/std/iter/fn.successors.html

[num::NonZeroI128]: https://doc.rust-lang.org/std/num/struct.NonZeroI128.html

[num::NonZeroI16]: https://doc.rust-lang.org/std/num/struct.NonZeroI16.html

[num::NonZeroI32]: https://doc.rust-lang.org/std/num/struct.NonZeroI32.html

[num::NonZeroI64]: https://doc.rust-lang.org/std/num/struct.NonZeroI64.html

[num::NonZeroI8]: https://doc.rust-lang.org/std/num/struct.NonZeroI8.html

[num::NonZeroIsize]: https://doc.rust-lang.org/std/num/struct.NonZeroIsize.html

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

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

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

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

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

[Instant::checked_add]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add

[Instant::checked_sub]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub

[SystemTime::checked_add]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add

[SystemTime::checked_sub]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub