12月12日、Rustチームが「Announcing Rust 1.92.0」と題した記事を公開した。この記事では、Rust 1.92.0 における主要な変更点と改善点について詳しく紹介されている。
以下に、その内容を紹介する。
Rust 1.92.0 はどんなリリースか
今回の 1.92.0 は、「大きな新機能で派手に変わる」タイプのリリースというより、言語仕様とコンパイラ周辺をきちんと整えていく保守寄りのリリースである。
- never 型(
!)の安定化に向けた lint の強化 unused_must_useの挙動改善-Cpanic=abortでのバックトレース再有効化- 属性(
#[macro_export])の検証強化 - const コンテキストでの API 安定化
- ツール群(Rust 本体/Cargo/Clippy)の細かな改善
Rust 1.92.0 の入手方法
すでに rustup で Rust を管理している場合は、いつも通り次のコマンドで stable を更新すればよい。
$ rustup update stable
これから Rust を入れる場合は、公式サイトのインストールページから rustup を取得し、同様に更新すれば 1.92.0 が使えるようになる。
主な変更点
1. never 型関連の lint が deny-by-default に
言語チームとコンパイラチームは、プリミティブ型の ! として定義されている never 型の安定化作業を継続している。その一環として、次のlintルールが deny-by-default(デフォルトでエラー扱い)に変更された。
never_type_fallback_flowing_into_unsafedependency_on_unit_never_type_fallback
ポイントは次の通りだ。
- lint なので、
#[allow]で抑制は可能 - その crate を直接ビルドしたときにだけエラーになる(依存としてビルドされた場合は Cargo から警告が出るにとどまる)
- 将来の never 型安定化で壊れそうなコードを、事前にあぶり出すための仕組みである
Rust チームの見積もりでは、約 500 crate がこれらの lint に引っかかるとされている。ただし lint は「言語仕様としての互換性破壊」ではないため、このタイミングでエラーに昇格させることは許容可能と判断されている。
ただし実務的には、CI で突然ビルドエラーになりうる部分なので、プロジェクト全体で一度ビルドを回し、該当 lint が出ていないか早めに確認しておくのが安全だ。
2. unused_must_use が「起こり得ないエラー」を無視するように
unused_must_use は、#[must_use] が付いた戻り値を無視したときに警告を出す lint である。典型的には、Result を返す関数の戻り値をそのまま捨てるケースで警告が出る。
fn parse() -> Result<(), SomeError> {
// ...
}
fn main() {
parse(); // ← ここで unused_must_use が警告
}
一方で、エラー型が「そもそも値を作れない(uninhabited)」型の場合がある。例えば次のようなケースだ。
Result<(), Infallible>Result<(), !>(never 型)ControlFlow<UninhabitedType, ()>
この場合、「エラーが発生することが理論上ありえない」のに unused_must_use が警告を出してしまうのはノイズに近い。
Rust 1.92.0 では、このような「エラー型が uninhabited」である Result<(), UninhabitedType> や ControlFlow<UninhabitedType, ()> に対しては、unused_must_use が警告を出さなくなった。
use std::convert::Infallible;
fn f() -> Result<(), Infallible> {
Ok(())
}
fn main() {
f(); // 1.92.0 からは unused_must_use は警告を出さない
}
特に、「トレイトの associated error type が場合によっては Infallible になる」という設計で、この緩和は効いてくる。
エラーが起こり得ないとわかっているのに、let _ = f(); のようなコードで黙らせる必要が減るため、コードが少し素直に書けるようになる。
3. Linux で -Cpanic=abort でもバックトレースが復活
Linux 環境で -Cpanic=abort を指定したとき、長らく「バックトレースが取れない」問題が続いていた。
- Rust 1.22 までは
-Cpanic=abortでもバックトレースが動いていた - 1.23 で unwind table の生成が止まり、バックトレースが機能しなくなった
- 1.45 で
-Cforce-unwind-tables=yesという回避策が導入された
Rust 1.92 では、この回避策をユーザーが意識しなくても済むように、**-Cpanic=abort 時でもデフォルトで unwind table を生成する**ようになった。結果として、次のような振る舞いになる。
-Cpanic=abortでもバックトレースが取得可能になる- サイズなどの理由で unwind table を完全に消したい場合は、明示的に
-Cforce-unwind-tables=noを指定する
「軽量化のために panic=abort を使っているが、デバッグ時にはバックトレースも欲しい」というケースでは、わざわざビルドオプションを書き換えなくても済むようになる。
4. #[macro_export] の入力検証がより厳密に
ここ数リリースにわたり、コンパイラ内部での組み込み属性の処理が整理されてきた。本リリースでは、その一例として #[macro_export] に対する引数チェックが強化されている。
#[macro_export]に本来許されない引数を渡した場合- deny-by-default の lint として報告される
Rust には 100 を超える組み込み属性があり、それぞれエラーメッセージや警告の出方が微妙に違っていた。処理系の整理とともに、このあたりの診断メッセージがより一貫した形で出てくるようになりつつある。
普段あまり属性をいじらない場合は大きな影響はないが、マクロまわりをヘビーに使っているプロジェクトでは、ビルド時のエラー・警告メッセージが変わる可能性がある。
5. const コンテキストで使える API が拡大
本リリースでは、既存の一部 API が const コンテキストでも利用可能 になった。
これにより、「const fn や定数初期化の中で、これまで使えなかった標準ライブラリ API を使えるようになる」ケースが増える。
元記事では、どの API が該当するかの詳細な列挙は行われていないが、const 関連の最適化・表現力アップが継続して進んでいることがうかがえる。
6. その他の変更(Rust 本体/Cargo/Clippy)
細かい変更やバグ修正は、Rust 本体・Cargo・Clippy のそれぞれに多数入っている。関心のある部分だけ追いたい場合は、以下のリンクから直接 changelog を見るのが早い。
- Rust 本体の変更一覧: https://github.com/rust-lang/rust/releases/tag/1.92.0
- Cargo 1.92 の変更履歴: https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-192-2025-12-11
- Clippy の変更履歴: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-192
プロジェクトで独自に Clippy の lint レベルを上げている場合は、Clippy の changelog を一度チェックしておくと安心である。
まとめ
Rust 1.92.0 は、never 型安定化へ向けた準備、lint の改善、panic=abort でのバックトレース復活、属性チェックの厳格化など、言語とツールチェーンの「足場固め」に近いリリースである。
- CI で新しい deny-by-default lint によるエラーが出ていないか
Result<(), Infallible>などで不要なunused_must_useに悩まされていないか- Linux で
-Cpanic=abortを使っているのにバックトレースが欲しい場面がないか
といった観点で、自分のプロジェクトへの影響を軽く確認しておくとよいだろう。
詳細はAnnouncing Rust 1.92.0を参照していただきたい。