← Back to all releases

Rust 1.52.0

Released on May 6, 2021

What's Changed

  • [Added the unsafe_op_in_unsafe_fn lint, which checks whether the unsafe code
  • [You can now cast mutable references to arrays to a pointer of the same type as

  • [Upgraded the default LLVM to LLVM 12.][81451]
  • [s390x-unknown-linux-musl][82166]
  • [riscv32gc-unknown-linux-musl & riscv64gc-unknown-linux-musl][82202]
  • [powerpc-unknown-openbsd][82733]

  • [OsString now implements Extend and FromIterator.][82121]
  • [cmp::Reverse now has #[repr(transparent)] representation.][81879]
  • [Arc now implements error::Error.][80553]
  • [All integer division and remainder operations are now const.][80962]

  • [Cargo build scripts are now forbidden from setting RUSTC_BOOTSTRAP.][cargo/9181]
  • [Removed support for the x86_64-rumprun-netbsd target.][82594]
  • [Deprecated the x86_64-sun-solaris target in favor of x86_64-pc-solaris.][82216]
  • [Rustdoc now only accepts ,, , and \t as delimiters for specifying
  • [Rustc now catches more cases of pub_use_of_private_extern_crate][80763]
  • [Changes in how proc macros handle whitespace may lead to panics when used
  • [Turn #[derive] into a regular macro attribute][79078]

  • [Arguments::as_str]
  • [char::MAX]
  • [char::REPLACEMENT_CHARACTER]
  • [char::UNICODE_VERSION]
  • [char::decode_utf16]
  • [char::from_digit]
  • [char::from_u32_unchecked]
  • [char::from_u32]
  • [slice::partition_point]
  • [str::rsplit_once]
  • [str::split_once]
  • [char::len_utf8]
  • [char::len_utf16]
  • [char::to_ascii_uppercase]
  • [char::to_ascii_lowercase]
  • [char::eq_ignore_ascii_case]
  • [u8::to_ascii_uppercase]
  • [u8::to_ascii_lowercase]
  • [u8::eq_ignore_ascii_case]
  • [Rustdoc lints are now treated as a tool lint, meaning that
  • [Rustdoc now supports argument files.][82261]
  • [Rustdoc now generates smart punctuation for documentation.][79423]
  • [You can now use "task lists" in Rustdoc Markdown.][81766] E.g.
  • [x] Complete
  • [ ] Todo
  • [You can now pass multiple filters to tests.][81356] E.g.
  • [Rustup now distributes PDB symbols for the std library on Windows,
  • [Check the result cache before the DepGraph when ensuring queries][81855]
  • [Try fast_reject::simplify_type in coherence before doing full check][81744]
  • [Only store a LocalDefId in some HIR nodes][81611]
  • [Store HIR attributes in a side table][79519]
Full Changelog

Language

--------

- [Added the unsafe_op_in_unsafe_fn lint, which checks whether the unsafe code

in an unsafe fn is wrapped in a unsafe block.][79208] This lint

is allowed by default, and may become a warning or hard error in a

future edition.

- [You can now cast mutable references to arrays to a pointer of the same type as

the element.][81479]

Compiler

--------

- [Upgraded the default LLVM to LLVM 12.][81451]

Added tier 3\* support for the following targets.

- [s390x-unknown-linux-musl][82166]

- [riscv32gc-unknown-linux-musl & riscv64gc-unknown-linux-musl][82202]

- [powerpc-unknown-openbsd][82733]

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

information on Rust's tiered platform support.

Libraries

---------

- [OsString now implements Extend and FromIterator.][82121]

- [cmp::Reverse now has #[repr(transparent)] representation.][81879]

- [Arc now implements error::Error.][80553]

- [All integer division and remainder operations are now const.][80962]

Stabilised APIs

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

- [Arguments::as_str]

- [char::MAX]

- [char::REPLACEMENT_CHARACTER]

- [char::UNICODE_VERSION]

- [char::decode_utf16]

- [char::from_digit]

- [char::from_u32_unchecked]

- [char::from_u32]

- [slice::partition_point]

- [str::rsplit_once]

- [str::split_once]

The following previously stable APIs are now const.

- [char::len_utf8]

- [char::len_utf16]

- [char::to_ascii_uppercase]

- [char::to_ascii_lowercase]

- [char::eq_ignore_ascii_case]

- [u8::to_ascii_uppercase]

- [u8::to_ascii_lowercase]

- [u8::eq_ignore_ascii_case]

Rustdoc

-------

- [Rustdoc lints are now treated as a tool lint, meaning that

lints are now prefixed with rustdoc:: (e.g. #[warn(rustdoc::broken_intra_doc_links)]).][80527]

Using the old style is still allowed, and will become a warning in

a future release.

- [Rustdoc now supports argument files.][82261]

- [Rustdoc now generates smart punctuation for documentation.][79423]

- [You can now use "task lists" in Rustdoc Markdown.][81766] E.g.

  - [x] Complete

- [ ] Todo

Misc

----

- [You can now pass multiple filters to tests.][81356] E.g.

cargo test -- foo bar will run all tests that match foo and bar.

- [Rustup now distributes PDB symbols for the std library on Windows,

allowing you to see std symbols when debugging.][82218]

Internal Only

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

These changes provide no direct user facing benefits, but represent significant

improvements to the internals and overall performance of rustc and

related tools.

- [Check the result cache before the DepGraph when ensuring queries][81855]

- [Try fast_reject::simplify_type in coherence before doing full check][81744]

- [Only store a LocalDefId in some HIR nodes][81611]

- [Store HIR attributes in a side table][79519]

Compatibility Notes

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

- [Cargo build scripts are now forbidden from setting RUSTC_BOOTSTRAP.][cargo/9181]

- [Removed support for the x86_64-rumprun-netbsd target.][82594]

- [Deprecated the x86_64-sun-solaris target in favor of x86_64-pc-solaris.][82216]

- [Rustdoc now only accepts ,, , and \t as delimiters for specifying

languages in code blocks.][78429]

- [Rustc now catches more cases of pub_use_of_private_extern_crate][80763]

- [Changes in how proc macros handle whitespace may lead to panics when used

with older proc-macro-hack versions. A cargo update should be sufficient to fix this in all cases.][84136]

- [Turn #[derive] into a regular macro attribute][79078]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[Peekable::next_if]: https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if

[Peekable::next_if_eq]: https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if_eq

[Arguments::as_str]: https://doc.rust-lang.org/stable/std/fmt/struct.Arguments.html#method.as_str

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

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

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

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

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

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

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

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

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

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

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