← Back to all releases

Rust 1.80.0

Released on July 25, 2024

What's Changed

Full Changelog

Language

--------

- Document maximum allocation size

- Allow zero-byte offsets and ZST read/writes on arbitrary pointers

- Support C23's variadics without a named parameter

- Stabilize exclusive_range_pattern feature

- Guarantee layout and ABI of Result in some scenarios

Compiler

--------

- Update cc crate to v1.0.97 allowing additional spectre mitigations on MSVC targets

- Allow field reordering on types marked repr(packed(1))

- Add a lint against never type fallback affecting unsafe code

- Disallow cast with trailing braced macro in let-else

- Expand for_loops_over_fallibles lint to lint on fallibles behind references.

- self-contained linker: retry linking without -fuse-ld=lld on CCs that don't support it

- Do not parse CVarArgs (...) as a type in trait bounds

- Improvements to LLDB formatting #124458 #124500

- For the wasm32-wasip2 target default to PIC and do not use -fuse-ld=lld

- Add x86_64-unknown-linux-none as a tier 3 target

- Lint on foo.into_iter() resolving to &Box<[T]>: IntoIterator

Libraries

---------

- Add size_of and size_of_val and align_of and align_of_val to the prelude

- Abort a process when FD ownership is violated

- io::Write::write_fmt: panic if the formatter fails when the stream does not fail

- Panic if PathBuf::set_extension would add a path separator

- Add assert_unsafe_precondition to unchecked_{add,sub,neg,mul,shl,shr} methods

- Update c_char on AIX to use the correct type

- offset_of! no longer returns a temporary

- Handle sigma in str.to_lowercase correctly

- Raise DEFAULT_MIN_STACK_SIZE to at least 64KiB

Stabilized APIs

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

- impl Default for Rc

- impl Default for Rc

- impl Default for Rc<[T]>

- impl Default for Arc

- impl Default for Arc

- impl Default for Arc<[T]>

- impl IntoIterator for Box<[T]>

- impl FromIterator for Box

- impl FromIterator for Box

- LazyCell

- LazyLock

- Duration::div_duration_f32

- Duration::div_duration_f64

- Option::take_if

- Seek::seek_relative

- BinaryHeap::as_slice

- NonNull::offset

- NonNull::byte_offset

- NonNull::add

- NonNull::byte_add

- NonNull::sub

- NonNull::byte_sub

- NonNull::offset_from

- NonNull::byte_offset_from

- NonNull::read

- NonNull::read_volatile

- NonNull::read_unaligned

- NonNull::write

- NonNull::write_volatile

- NonNull::write_unaligned

- NonNull::write_bytes

- NonNull::copy_to

- NonNull::copy_to_nonoverlapping

- NonNull::copy_from

- NonNull::copy_from_nonoverlapping

- NonNull::replace

- NonNull::swap

- NonNull::drop_in_place

- NonNull::align_offset

- <[T]>::split_at_checked

- <[T]>::split_at_mut_checked

- str::split_at_checked

- str::split_at_mut_checked

- str::trim_ascii

- str::trim_ascii_start

- str::trim_ascii_end

- <[u8]>::trim_ascii

- <[u8]>::trim_ascii_start

- <[u8]>::trim_ascii_end

- Ipv4Addr::BITS

- Ipv4Addr::to_bits

- Ipv4Addr::from_bits

- Ipv6Addr::BITS

- Ipv6Addr::to_bits

- Ipv6Addr::from_bits

- Vec::<[T; N]>::into_flattened

- [<[[T; N]]>::as_flattened](https://doc.rust-lang.org/beta/core/primitive.slice.html#method.as_flattened)

- [<[[T; N]]>::as_flattened_mut](https://doc.rust-lang.org/beta/core/primitive.slice.html#method.as_flattened_mut)

These APIs are now stable in const contexts:

- <[T]>::last_chunk

- BinaryHeap::new

Cargo

-----

- Stabilize -Zcheck-cfg as always enabled

- Warn, rather than fail publish, if a target is excluded

- Add special check-cfg lint config for the unexpected_cfgs lint

- Stabilize cargo update --precise

- Don't change file permissions on Cargo.toml when using cargo add

- Support using cargo fix on IPv6-only networks

Rustdoc

-----

- Allow searching for references

- Stabilize custom_code_classes_in_docs feature

- fix: In cross-crate scenarios show enum variants on type aliases of enums

Compatibility Notes

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

- rustfmt estimates line lengths differently when using non-ascii characters

- Type aliases are now handled correctly in orphan check

- Allow instructing rustdoc to read from stdin via -

- std::env::{set_var, remove_var} can no longer be converted to safe function pointers and no longer implement the Fn family of traits

- Warn (or error) when Self constructor from outer item is referenced in inner nested item

- Turn indirect_structural_match and pointer_structural_match lints into hard errors

- Make where_clause_object_safety lint a regular object safety violation

- Turn proc_macro_back_compat lint into a hard error.

- Detect unused structs even when implementing private traits

- std::sync::ReentrantLockGuard is no longer Sync if T: !Sync which means std::io::StdoutLock and std::io::StderrLock are no longer Sync

- Type inference will fail in some cases due to new implementations of FromIterator for Box.

Notably, this breaks versions of the time crate before 0.3.35, due to no longer inferring the implementation for Box<[_]>.

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.

- Misc improvements to size of generated html by rustdoc e.g. #124738 and #123734

- MSVC targets no longer depend on libc