Rustプログラミング言語は長い間、存在し得ない値を示すためにNever型(``!``)を使用してきました。たとえば、決して返らない関数の戻り値の型や、到達不能であることが証明されているブランチの値などです。長年にわたり、この型は不安定と見なされ、ナイトリービルドの機能ゲートの裏側でのみ利用可能でした。2026年8月24日、2年以上の作業の末、Rustコンパイラ貢献者「waffle」がプルリクエスト(rust-lang/rust#155499)をマージし、すべてのRustエディションでNever型を安定化しました。この変更はRust 1.100リリースで有効になります。
The stable Rust logo used throughout the language documentation, representing the never type stabilization in Rust 1.100.
この安定化により、ジェネリックコードとトレイト実装に影響を与える2つの具体的な変更がもたらされます。まず、Never型のフォールバックが変更されます。この変更以前は、コンパイラが具体的な型を推論できない場合、フォールバックとしてユニット型``()``(その唯一の値は``()``)を使用していました。新しい動作ではフォールバックが``!``自身になり、以前のフォールバック下でコンパイルされていたコードでは今、明示的な型注釈が必要になる場合があります。次に、標準ライブラリの型``Infallible`` — 不安定なNever型の回避策として以前は別の未居住型でした — が、現在``!``の型エイリアスとして定義されています。このエイリアスにより、オプティマイザは``!``の強制変換の利点を保持しつつ、既存のコードが名前で``Infallible``を参照し続けることができるようになります。
GitHub open‑graph image for the PR that introduced the never type stabilization, showing the PR title and comments.
これらの変更が影響がないわけではありません。Rustメンテナーはcraterツールをcrates.io上のすべての公開クレートに対して実行し、3,300のクレートで何らかの後退が見られることを発見しました。そのうち、7つのクレートは完全に壊れており、1,553つのクレートは古いフォールバック動作に依存していたコアライブラリへのバックポート修正によって修復されました。残りのクレートはすでに明示的な型指定を持っているか、依存関係が更新されるまで古いRustバージョン(1.99)を使い続けることができます。
ライブラリ作者およびアプリケーション開発者にとって、実際的な影響は明確です。Never型のフォールバックを``()``に依存していたコードは、明示的な戻り値の型または軽微なパッチが必要になります。Rustチームは多くのメンテナーと直接協力してバックポートパッチを提供し、一般的なガイダンスとして、変更が重要な依存関係を壊す場合はRust 1.99を使い続けるか、影響を受けたライブラリの修正済みバージョンに更新することを推奨しています。ほとんどの日常的なRustユーザーは差異に気付かないでしょう。なぜなら、Never型は主にジェネリックおよびトレイトレベルのコードで使用されるからです。
Never型自体には主に2つの用途があります。実用的な理由は、より効率的なジェネリックコードを可能にすることです。たとえば、変換が決して失敗しない場合、``FromStr``トレイトはその``Err``関連型を``!``に設定でき、コンパイラがエラーブランチを完全に廃棄できるようになります。哲学的な理由は、型推論器に無限ループ表現や値を生成しないその他の構造を一様に扱う方法を与えることです。``!``は他のどの型にも自動的に強制変換され、コンパイラはこれをデッドコード除去やその他の最適化に利用できます。
実際、開発者はジェネリックシグニチャ、トレイト実装、そしてエラー変異が不可能であることがわかっている``Result``型において``!``が現れるのを見るでしょう。この安定化により、``Infallible``は``!``と交換可能になりますが、``Infallible``を明示的に名前で参照しているコードは修正なしで引き続き動作します。
全体として、Never型の安定化は、Rustにおけるより予測可能で最適化可能な型システムへの重要な一歩を示します。伴うフォールバックと``Infallible``の変更は、エコシステムが最小限の破壊で前進し続けるように設計されています。