← Back to all releases

Rust 1.67.0

Released on January 26, 2023

What's Changed

Full Changelog

Language

--------

- Make Sized predicates coinductive, allowing cycles.

- #[must_use] annotations on async fn also affect the Future::Output.

- Elaborate supertrait obligations when deducing closure signatures.

- Invalid literals are no longer an error under cfg(FALSE).

- Unreserve braced enum variants in value namespace.

Compiler

--------

- Enable varargs support for calling conventions other than C or cdecl.

- Add new MIR constant propagation based on dataflow analysis.

- Optimize field ordering by grouping m\*2^n-sized fields with equivalently aligned ones.

- Stabilize native library modifier verbatim.

Added, updated, and removed targets:

- Add a tier 3 target for PowerPC on AIX, powerpc64-ibm-aix.

- Add a tier 3 target for the Sony PlayStation 1, mipsel-sony-psx.

- Add tier 3 no_std targets for the QNX Neutrino RTOS,

aarch64-unknown-nto-qnx710 and x86_64-pc-nto-qnx710.

- Promote UEFI targets to tier 2, aarch64-unknown-uefi, i686-unknown-uefi, and x86_64-unknown-uefi.

- Remove tier 3 linuxkernel targets (not used by the actual kernel).

Refer to Rust's [platform support page][platform-support-doc]

for more information on Rust's tiered platform support.

Libraries

---------

- Merge crossbeam-channel into std::sync::mpsc.

- Fix inconsistent rounding of 0.5 when formatted to 0 decimal places.

- Derive Eq and Hash for ControlFlow.

- Don't build compiler_builtins with -C panic=abort.

Stabilized APIs

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

- {integer}::checked_ilog

- {integer}::checked_ilog2

- {integer}::checked_ilog10

- {integer}::ilog

- {integer}::ilog2

- {integer}::ilog10

- NonZeroU*::ilog2

- NonZeroU*::ilog10

- NonZero*::BITS

These APIs are now stable in const contexts:

- char::from_u32

- char::from_digit

- char::to_digit

- core::char::from_u32

- core::char::from_digit

Compatibility Notes

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

- The layout of repr(Rust) types now groups m\*2^n-sized fields with

equivalently aligned ones.

This is intended to be an optimization, but it is also known to increase type

sizes in a few cases for the placement of enum tags. As a reminder, the layout

of repr(Rust) types is an implementation detail, subject to change.

- 0.5 now rounds to 0 when formatted to 0 decimal places.

This makes it consistent with the rest of floating point formatting that

rounds ties toward even digits.

- Chains of && and || will now drop temporaries from their sub-expressions in

evaluation order, left-to-right.

Previously, it was "twisted" such that the _first_ expression dropped its

temporaries _last_, after all of the other expressions dropped in order.

- Underscore suffixes on string literals are now a hard error.

This has been a future-compatibility warning since 1.20.0.

- Stop passing -export-dynamic to wasm-ld.

- main is now mangled as __main_void on wasm32-wasi.

- Cargo now emits an error if there are multiple registries in the configuration

with the same index URL.

Internal Changes

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

These changes do not affect any public interfaces of Rust, but they represent

significant improvements to the performance or internals of rustc and related

tools.

- Rewrite LLVM's archive writer in Rust.