Skip to content

release blog post for Rust 1.46.0 #675

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Aug 27, 2020
131 changes: 131 additions & 0 deletions posts/2020-08-27-Rust-1.46.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
---
layout: post
title: "Announcing Rust 1.46.0"
author: The Rust Release Team
release: true
---

The Rust team is happy to announce a new version of Rust, 1.46.0. Rust is a
programming language that is empowering everyone to build reliable and
efficient software.

If you have a previous version of Rust installed via rustup, getting Rust
1.46.0 is as easy as:

```console
rustup update stable
```

If you don't have it already, you can [get `rustup`][install] from the
appropriate page on our website, and check out the [detailed release notes for
1.46.0][notes] on GitHub.

[install]: https://www.rust-lang.org/tools/install
[notes]: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1460-2020-08-27

## What's in 1.46.0 stable

This release enables quite a lot of new things to appear in `const fn`, two
new standard library APIs, and one feature useful for library authors. See
the [detailed release notes][notes] to learn about other changes not covered
by this post.

### `const fn` improvements

There are [several core language features] you can now use in a `const fn`:

* `if`, `if let`, and `match`
* `while`, `while let`, and `loop`
* the `&&` and `||` operators

You can also [cast to a slice][cast-to-slice]:

```rust
const fn foo() {
let x = [1, 2, 3, 4, 5];

// cast the array to a slice
let y: &[_] = &x;
}
```

While these features may not feel *new*, given that you could use them all
outside of `const fn`, they add a lot of compile-time computation power! As
an example, the [`const-sha1` crate][sha1] can let you compute SHA-1 hashes
at compile time. This led to a [40x performance improvement][const-perf] in
Microsoft's WinRT bindings for Rust.

[several core language features]: https://github.com/rust-lang/rust/pull/72437/
[cast-to-slice]: https://github.com/rust-lang/rust/pull/73862/
[sha1]: https://github.com/rylev/const-sha1
[const-perf]: https://github.com/microsoft/winrt-rs/pull/279#issuecomment-668436700


### `#[track_caller]`

Back in March, the release of Rust 1.42 introduced [better error messages when `unwrap` and related functions would panic][better-errors]. At the time, we mentioned that the way
this was implemented was not yet stable. Rust 1.46 stabilizes this feature.

[better-errors]: https://blog.rust-lang.org/2020/03/12/Rust-1.42.html#useful-line-numbers-in-option-and-result-panic-messages

This attribute is called `#[track_caller]`, which was originally proposed in
[RFC 2091][rfc-2091] way back in July of 2017! If you're writing a function
like `unwrap` that may panic, you can put this annotation on your functions,
and the default panic formatter will use its caller as the location in its
error message. For example, here is `unwrap` previously:

```rust
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
}
}
```

It now looks like this:

```rust
#[track_caller]
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
}
}
```

That's it!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you think we should also reiterate how this changes the output? or is that too much?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should show only the changed output, rather than the code sample. There doesn't appear to be anything different about how this annotation is applied compared to existing annotations, so having a multi-line code diff seems mostly just confusing.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...though an example that uses panic::Location might be helpful.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted to emphasize how simple this is to use, but if you wanted to come up with an example using Location, I'm not inherently opposed. I didn't show how the output was changed because we did that when it was added to unwrap.


If you are implementing a panic hook yourself, you can use the [caller] method
on `std::panic::Location` to get access to this information.

[rfc-2091]: https://github.com/rust-lang/rfcs/pull/2091
[caller]: https://doc.rust-lang.org/stable/std/panic/struct.Location.html#method.caller

### Library changes

Keeping with the theme of `const fn` improvements, [`std::mem::forget` is now
a `const fn`][forget]. Additionally, two new APIs were stabilized this release:

* [`Option::zip`][zip]
* [`vec::Drain::as_slice`][as_slice]

[forget]: https://github.com/rust-lang/rust/pull/73887/
[zip]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
[as_slice]: https://doc.rust-lang.org/stable/std/vec/struct.Drain.html#method.as_slice

See the [detailed release notes][notes] for more.

### Other changes

[relnotes-cargo]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-146-2020-08-27
[relnotes-clippy]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-146

There are other changes in the Rust 1.46.0 release: check out what changed in
[Rust][notes], [Cargo][relnotes-cargo], and [Clippy][relnotes-clippy].

## Contributors to 1.46.0

Many people came together to create Rust 1.46.0. We couldn't have done it
without all of you. [Thanks!](https://thanks.rust-lang.org/rust/1.46.0/)