← Back to all releases

Rust 1.65.0

Released on November 3, 2022

What's Changed

Full Changelog

Language

--------

- Error on as casts of enums with #[non_exhaustive] variants

- Stabilize let else

- Stabilize generic associated types (GATs)

- Add lints let_underscore_drop and let_underscore_lock from Clippy

- Stabilize breaking from arbitrary labeled blocks ("label-break-value")

- Uninitialized integers, floats, and raw pointers are now considered immediate UB.

Usage of MaybeUninit is the correct way to work with uninitialized memory.

- Stabilize raw-dylib for Windows x86_64, aarch64, and thumbv7a

- Do not allow Drop impl on foreign ADTs

Compiler

--------

- Stabilize -Csplit-debuginfo on Linux

- Use niche-filling optimization even when multiple variants have data

- Associated type projections are now verified to be well-formed prior to resolving the underlying type

- Stringify non-shorthand visibility correctly

- Normalize struct field types when unsizing

- Update to LLVM 15

- Fix aarch64 call abi to correctly zeroext when needed

- debuginfo: Generalize C++-like encoding for enums

- Add special_module_name lint

- Add support for generating unique profraw files by default when using -C instrument-coverage

- Allow dynamic linking for iOS/tvOS targets

New targets:

- Add armv4t-none-eabi as a tier 3 target

- Add powerpc64-unknown-openbsd and riscv64-unknown-openbsd as tier 3 targets

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

information on Rust's tiered platform support.

Libraries

---------

- Don't generate PartialEq::ne in derive(PartialEq)

- Windows RNG: Use BCRYPT_RNG_ALG_HANDLE by default

- Forbid mixing System with direct system allocator calls

- Document no support for writing to non-blocking stdio/stderr

- std::layout::Layout size must not overflow isize::MAX when rounded up to align

This also changes the safety conditions on Layout::from_size_align_unchecked.

Stabilized APIs

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

- std::backtrace::Backtrace

- Bound::as_ref

- std::io::read_to_string

- <*const T>::cast_mut

- <*mut T>::cast_const

These APIs are now stable in const contexts:

- <*const T>::offset_from

- <*mut T>::offset_from

Cargo

-----

- Apply GitHub fast path even for partial hashes

- Do not add home bin path to PATH if it's already there

- Take priority into account within the pending queue.

This slightly optimizes job scheduling by Cargo, with typically small improvements on larger crate graph builds.

Compatibility Notes

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

- std::layout::Layout size must not overflow isize::MAX when rounded up to align.

This also changes the safety conditions on Layout::from_size_align_unchecked.

- PollFn now only implements Unpin if the closure is Unpin.

This is a possible breaking change if users were relying on the blanket unpin implementation.

See discussion on the PR for details of why this change was made.

- Drop ExactSizeIterator impl from std::char::EscapeAscii

This is a backwards-incompatible change to the standard library's surface

area, but is unlikely to affect real world usage.

- Do not consider a single repeated lifetime eligible for elision in the return type

This behavior was unintentionally changed in 1.64.0, and this release reverts that change by making this an error again.

- Reenable disabled early syntax gates as future-incompatibility lints

- Update the minimum external LLVM to 13

- Don't duplicate file descriptors into stdio fds

- Sunset RLS

- Deny usage of #![cfg_attr(..., crate_type = ...)] to set the crate type

This strengthens the forward compatibility lint deprecated_cfg_attr_crate_type_name to deny.

- llvm-has-rust-patches allows setting the build system to treat the LLVM as having Rust-specific patches

This option may need to be set for distributions that are building Rust with a patched LLVM via llvm-config, not the built-in LLVM.

- Combining three or more languages (e.g. Objective C, C++ and Rust) into one binary may hit linker limitations when using lld. For more information, see [issue 102754][102754].

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

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.

- Add x.sh and x.ps1 shell scripts

- compiletest: use target cfg instead of hard-coded tables

- Use object instead of LLVM for reading bitcode from rlibs

- Enable MIR inlining for optimized compilations

This provides a 3-10% improvement in compiletimes for real world crates. See perf results.