← Back to all releases

Rust 1.32.0

Released on January 17, 2019

What's Changed

  • [You can now use the ? operator in macro definitions.][56245] The ?
  • [Module paths with no leading keyword like super, self, or crate, will
  • [You can now match against PhantomData types.][55837]
  • [You can now match against literals in macros with the literal
  • [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.
  • [Self can also now be used in type definitions.][56366] E.g.
  • [You can now mark traits with #[must_use].][55663] This provides a warning if

  • [The default allocator has changed from jemalloc to the default allocator on
  • [Added the aarch64-pc-windows-msvc target.][55702]

  • [PathBuf now implements FromStr.][55148]
  • [Box<[T]> now implements FromIterator.][55843]
  • [The dbg! macro has been stabilized.][56395] This macro enables you to
  • [Cell::as_ptr]
  • [UnsafeCell::get]
  • [char::is_ascii]
  • [iter::empty]
  • [ManuallyDrop::new]
  • [ManuallyDrop::into_inner]
  • [RangeInclusive::start]
  • [RangeInclusive::end]
  • [NonNull::as_ptr]
  • [slice::as_ptr]
  • [str::as_ptr]
  • [Duration::as_secs]
  • [Duration::subsec_millis]
  • [Duration::subsec_micros]
  • [Duration::subsec_nanos]
  • [CStr::as_ptr]
  • [Ipv4Addr::is_unspecified]
  • [Ipv6Addr::new]
  • [Ipv6Addr::octets]
  • [i8::to_be_bytes]
  • [i8::to_le_bytes]
  • [i8::to_ne_bytes]
  • [i8::from_be_bytes]
  • [i8::from_le_bytes]
  • [i8::from_ne_bytes]
  • [i16::to_be_bytes]
  • [i16::to_le_bytes]
  • [i16::to_ne_bytes]
  • [i16::from_be_bytes]
  • [i16::from_le_bytes]
  • [i16::from_ne_bytes]
  • [i32::to_be_bytes]
  • [i32::to_le_bytes]
  • [i32::to_ne_bytes]
  • [i32::from_be_bytes]
  • [i32::from_le_bytes]
  • [i32::from_ne_bytes]
  • [i64::to_be_bytes]
  • [i64::to_le_bytes]
  • [i64::to_ne_bytes]
  • [i64::from_be_bytes]
  • [i64::from_le_bytes]
  • [i64::from_ne_bytes]
  • [i128::to_be_bytes]
  • [i128::to_le_bytes]
  • [i128::to_ne_bytes]
  • [i128::from_be_bytes]
  • [i128::from_le_bytes]
  • [i128::from_ne_bytes]
  • [isize::to_be_bytes]
  • [isize::to_le_bytes]
  • [isize::to_ne_bytes]
  • [isize::from_be_bytes]
  • [isize::from_le_bytes]
  • [isize::from_ne_bytes]
  • [u8::to_be_bytes]
  • [u8::to_le_bytes]
  • [u8::to_ne_bytes]
  • [u8::from_be_bytes]
  • [u8::from_le_bytes]
  • [u8::from_ne_bytes]
  • [u16::to_be_bytes]
  • [u16::to_le_bytes]
  • [u16::to_ne_bytes]
  • [u16::from_be_bytes]
  • [u16::from_le_bytes]
  • [u16::from_ne_bytes]
  • [u32::to_be_bytes]
  • [u32::to_le_bytes]
  • [u32::to_ne_bytes]
  • [u32::from_be_bytes]
  • [u32::from_le_bytes]
  • [u32::from_ne_bytes]
  • [u64::to_be_bytes]
  • [u64::to_le_bytes]
  • [u64::to_ne_bytes]
  • [u64::from_be_bytes]
  • [u64::from_le_bytes]
  • [u64::from_ne_bytes]
  • [u128::to_be_bytes]
  • [u128::to_le_bytes]
  • [u128::to_ne_bytes]
  • [u128::from_be_bytes]
  • [u128::from_le_bytes]
  • [u128::from_ne_bytes]
  • [usize::to_be_bytes]
  • [usize::to_le_bytes]
  • [usize::to_ne_bytes]
  • [usize::from_be_bytes]
  • [usize::from_le_bytes]
  • [usize::from_ne_bytes]

  • [You can now run cargo c as an alias for cargo check.][cargo/6218]
  • [Usernames are now allowed in alt registry URLs.][cargo/6242]

  • [The argument types for AVX's

  • [libproc_macro has been added to the rust-src distribution.][55280]
Full Changelog

Language

--------

2018 edition

- [You can now use the ? operator in macro definitions.][56245] The ?

operator allows you to specify zero or one repetitions similar to the * and

+ operators.

- [Module paths with no leading keyword like super, self, or crate, will

now always resolve to the item (enum, struct, etc.) available in the

module if present, before resolving to a external crate or an item the prelude.][56759]

E.g.

  enum Color { Red, Green, Blue }

use Color::*;

All editions

- [You can now match against PhantomData types.][55837]

- [You can now match against literals in macros with the literal

specifier.][56072] This will match against a literal of any type.

E.g. 1, 'A', "Hello World"

- [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.

  struct Point(i32, i32);

impl Point {

pub fn new(x: i32, y: i32) -> Self {

Self(x, y)

}

pub fn is_origin(&self) -> bool {

match self {

Self(0, 0) => true,

_ => false,

}

}

}

- [Self can also now be used in type definitions.][56366] E.g.

  enum List

where

Self: PartialOrd // can write Self instead of List

{

Nil,

Cons(T, Box) // likewise here

}

- [You can now mark traits with #[must_use].][55663] This provides a warning if

a impl Trait or dyn Trait is returned and unused in the program.

Compiler

--------

- [The default allocator has changed from jemalloc to the default allocator on

your system.][55238] The compiler itself on Linux & macOS will still use

jemalloc, but programs compiled with it will use the system allocator.

- [Added the aarch64-pc-windows-msvc target.][55702]

Libraries

---------

- [PathBuf now implements FromStr.][55148]

- [Box<[T]> now implements FromIterator.][55843]

- [The dbg! macro has been stabilized.][56395] This macro enables you to

easily debug expressions in your rust program. E.g.

  let a = 2;

let b = dbg!(a * 2) + 1;

// ^-- prints: [src/main.rs:4] a * 2 = 4

assert_eq!(b, 5);

The following APIs are now const functions and can be used in a

const context.

- [Cell::as_ptr]

- [UnsafeCell::get]

- [char::is_ascii]

- [iter::empty]

- [ManuallyDrop::new]

- [ManuallyDrop::into_inner]

- [RangeInclusive::start]

- [RangeInclusive::end]

- [NonNull::as_ptr]

- [slice::as_ptr]

- [str::as_ptr]

- [Duration::as_secs]

- [Duration::subsec_millis]

- [Duration::subsec_micros]

- [Duration::subsec_nanos]

- [CStr::as_ptr]

- [Ipv4Addr::is_unspecified]

- [Ipv6Addr::new]

- [Ipv6Addr::octets]

Stabilized APIs

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

- [i8::to_be_bytes]

- [i8::to_le_bytes]

- [i8::to_ne_bytes]

- [i8::from_be_bytes]

- [i8::from_le_bytes]

- [i8::from_ne_bytes]

- [i16::to_be_bytes]

- [i16::to_le_bytes]

- [i16::to_ne_bytes]

- [i16::from_be_bytes]

- [i16::from_le_bytes]

- [i16::from_ne_bytes]

- [i32::to_be_bytes]

- [i32::to_le_bytes]

- [i32::to_ne_bytes]

- [i32::from_be_bytes]

- [i32::from_le_bytes]

- [i32::from_ne_bytes]

- [i64::to_be_bytes]

- [i64::to_le_bytes]

- [i64::to_ne_bytes]

- [i64::from_be_bytes]

- [i64::from_le_bytes]

- [i64::from_ne_bytes]

- [i128::to_be_bytes]

- [i128::to_le_bytes]

- [i128::to_ne_bytes]

- [i128::from_be_bytes]

- [i128::from_le_bytes]

- [i128::from_ne_bytes]

- [isize::to_be_bytes]

- [isize::to_le_bytes]

- [isize::to_ne_bytes]

- [isize::from_be_bytes]

- [isize::from_le_bytes]

- [isize::from_ne_bytes]

- [u8::to_be_bytes]

- [u8::to_le_bytes]

- [u8::to_ne_bytes]

- [u8::from_be_bytes]

- [u8::from_le_bytes]

- [u8::from_ne_bytes]

- [u16::to_be_bytes]

- [u16::to_le_bytes]

- [u16::to_ne_bytes]

- [u16::from_be_bytes]

- [u16::from_le_bytes]

- [u16::from_ne_bytes]

- [u32::to_be_bytes]

- [u32::to_le_bytes]

- [u32::to_ne_bytes]

- [u32::from_be_bytes]

- [u32::from_le_bytes]

- [u32::from_ne_bytes]

- [u64::to_be_bytes]

- [u64::to_le_bytes]

- [u64::to_ne_bytes]

- [u64::from_be_bytes]

- [u64::from_le_bytes]

- [u64::from_ne_bytes]

- [u128::to_be_bytes]

- [u128::to_le_bytes]

- [u128::to_ne_bytes]

- [u128::from_be_bytes]

- [u128::from_le_bytes]

- [u128::from_ne_bytes]

- [usize::to_be_bytes]

- [usize::to_le_bytes]

- [usize::to_ne_bytes]

- [usize::from_be_bytes]

- [usize::from_le_bytes]

- [usize::from_ne_bytes]

Cargo

-----

- [You can now run cargo c as an alias for cargo check.][cargo/6218]

- [Usernames are now allowed in alt registry URLs.][cargo/6242]

Misc

----

- [libproc_macro has been added to the rust-src distribution.][55280]

Compatibility Notes

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

- [The argument types for AVX's

_mm256_stream_si256, _mm256_stream_pd, _mm256_stream_ps][55610] have

been changed from const to mut as the previous implementation

was unsound.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[Ipv4Addr::is_unspecified]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified

[Ipv6Addr::new]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new

[Ipv6Addr::octets]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets

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

[ManuallyDrop::new]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new

[NonNull::as_ptr]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr

[RangeInclusive::end]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end

[RangeInclusive::start]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start

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

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

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

[i128::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes

[i128::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes

[i128::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes

[i128::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes

[i128::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes

[i128::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes

[i16::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes

[i16::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes

[i16::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes

[i16::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes

[i16::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes

[i16::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes

[i32::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes

[i32::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes

[i32::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes

[i32::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes

[i32::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes

[i32::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes

[i64::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes

[i64::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes

[i64::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes

[i64::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes

[i64::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes

[i64::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes

[i8::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes

[i8::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes

[i8::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes

[i8::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes

[i8::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes

[i8::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes

[isize::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes

[isize::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes

[isize::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes

[isize::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes

[isize::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes

[isize::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes

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

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

[u128::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes

[u128::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes

[u128::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes

[u128::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes

[u128::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes

[u128::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes

[u16::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes

[u16::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes

[u16::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes

[u16::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes

[u16::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes

[u16::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes

[u32::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes

[u32::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes

[u32::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes

[u32::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes

[u32::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes

[u32::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes

[u64::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes

[u64::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes

[u64::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes

[u64::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes

[u64::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes

[u64::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes

[u8::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes

[u8::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes

[u8::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes

[u8::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes

[u8::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes

[u8::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes

[usize::from_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes

[usize::from_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes

[usize::from_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes

[usize::to_be_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes

[usize::to_le_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes

[usize::to_ne_bytes]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes